Проблема при получении данных от сервера (lamp), Wemos D1 R1.
- Войдите на сайт для отправки комментариев
Привет всем! Уже неделю бьюсь над проблемой получения данных с сайта.
Как работает система:
1)Сайт висит в инете под доменои http://habb.host хостингом выступает Raspberry pi 3.
2)Прошивка для wemos'a:
#include <ESP8266WiFi.h>
#include <OneWire.h>
#include <DallasTemperature.h>
DeviceAddress ad0 = {0x28, 0xFF, 0xB0, 0xF3, 0xC1, 0x17, 0x4, 0xE5};
DeviceAddress ad1 = {0x28, 0xFF, 0x68, 0xB, 0xC2, 0x17, 0x4, 0xC};
OneWire oneWire(D4);
DallasTemperature sensors(&oneWire);
/*
const char* ssid = "WOWA-HP_DACHA";
const char* password = "h40s-o7u6-mjib";
*//*
const char* ssid = "wan";
const char* password = "78146552";
*/
const char* ssid = "SilberHome";
const char* password = "32G#64a*";
const char* host = "habb.host";
float t0;
float t1;
int xir;
int tip;
int hirs;
int c0;
int c1;
int c2;
bool b;
void setup() {
xir = 0;
Serial.begin(115200);
sensors.begin();
pinMode(D15, OUTPUT);
pinMode(D3, OUTPUT);
pinMode(D13, INPUT);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.println("rabotai...");
}
}
int sensor(float t0, float t1, int xir, int hirs) {
int pit;
WiFiClient client;
if (client.connect(host, 80)) {
client.print("GET /chainik.php?");
client.print("k=");
client.print("eU839q2lwMcIEPaJj0bZ");
client.print("&");
client.print("t0=");
client.print(t0);
client.print("&");
client.print("t1=");
client.print(t1);
client.print("&");
client.print("xir=");
client.print(xir);
client.print("&");
client.print("hirs=");
client.print(hirs);
client.println(" HTTP/1.1");
client.print( "Host:" );
client.println(host);
client.println( "Connection: close" );
client.println();
client.println();
Serial.print("GET /chainik.php?");
Serial.print("k=");
Serial.print("eU839q2lwMcIEPaJj0bZ");
Serial.print("&");
Serial.print("t0=");
Serial.print(t0);
Serial.print("&");
Serial.print("t1=");
Serial.print(t1);
Serial.print("&");
Serial.print("xir=");
Serial.print(xir);
Serial.print("&");
Serial.print("hirs=");
Serial.print(hirs);
Serial.println(" HTTP/1.1");
Serial.print( "Host:" );
Serial.println(host);
Serial.println( "Connection: close" );
Serial.println();
Serial.println();
delay(200);
while (client.available()) {
char c = client.read();
Serial.print(c);
if (client.available() == 2) {
if (c == '0') {
c0 = 0;
}
if (c == '1') {
c0 = 1;
}
if (c == '2') {
c0 = 2;
}
if (c == '3') {
c0 = 3;
}
}
if (client.available() == 1) {
if ((c == '0') || (c == '1') || (c == '2') || (c == '3') || (c == '4') || (c == '5') || (c == '6') || (c == '7') || (c == '8') || (c == '9')) {
if (c == '0') {
c1 = 0;
}
if (c == '1') {
c1 = 1;
}
if (c == '2') {
c1 = 2;
}
if (c == '3') {
c1 = 3;
}
if (c == '4') {
c1 = 4;
}
if (c == '5') {
c1 = 5;
}
if (c == '6') {
c1 = 6;
}
if (c == '7') {
c1 = 7;
}
if (c == '8') {
c1 = 8;
}
if (c == '9') {
c1 = 9;
}
}
}
if (client.available() == 0) {
if ((c == '0') || (c == '1') || (c == '2') || (c == '3') || (c == '4') || (c == '5') || (c == '6') || (c == '7') || (c == '8') || (c == '9')) {
if (c == '0') {
c2 = 0;
}
if (c == '1') {
c2 = 1;
}
if (c == '2') {
c2 = 2;
}
if (c == '3') {
c2 = 3;
}
if (c == '4') {
c2 = 4;
}
if (c == '5') {
c2 = 5;
}
if (c == '6') {
c2 = 6;
}
if (c == '7') {
c2 = 7;
}
if (c == '8') {
c2 = 8;
}
if (c == '9') {
c2 = 9;
}
}
}
}
pit = c0 * 100 + c1 * 10 + c2;
client.stop();
client.flush();
}
//Serial.print(pit);
return pit;
}
void loop() {
delay(5000);
sensors.requestTemperatures();
t0 = sensors.getTempC(ad0);
t1 = sensors.getTempC(ad1);
if ((t1 < 70) && (t0 < 105) && (t0 > -60) && (t1 > -60)) {
tip = sensor(t0, t1, xir, hirs);
b = digitalRead(D13);
hirs = tip % 100;
xir = tip / 100;
if (b == 1) {
xir = 1;
}
if (xir == 0) {
digitalWrite(D3, LOW);
digitalWrite(D15, LOW);
}
if (xir == 1) {
digitalWrite(D3, HIGH);
digitalWrite(D15, HIGH);
if (t0 >= 96) {
digitalWrite(D3, LOW);
digitalWrite(D15, LOW);
xir = 0;
}
}
if (xir == 2) {
if (t0 <= hirs) {
digitalWrite(D3, HIGH);
digitalWrite(D15, HIGH);
}
if (t0 >= hirs) {
digitalWrite(D3, LOW);
digitalWrite(D15, LOW);
}
}
if (xir == 3) {
digitalWrite(D3, HIGH);
digitalWrite(D15, HIGH);
if (t0 >= 96) {
xir = 2;
digitalWrite(D3, LOW);
digitalWrite(D15, LOW);
}
}
} else {
xir = 5;
tip = sensor(t0, t1, xir, hirs);
digitalWrite(D3, LOW);
digitalWrite(D15, LOW);
}
}
3)Код страницы:
<?php
$kl = 'eU839q2lwMcIEPaJj0bZ';
$connect_db = require_once("connect_db.php");
if($connect_db == false){
echo "ошибка подключения к connect_db.php";
}
if(isset($_GET['k'])){
$k = $_GET['k'];
if($k == $kl ){
$t0 = $_GET['t0'];
$t1 = $_GET['t1'];
$xir = $_GET['xir'];
$hirs = $_GET['hirs'];
$yng = date("H:i:s");
mysqli_query($connect_subd,"UPDATE `otpravlenie` SET `znach` = '$xir' WHERE `otpravlenie`.`id` = 2;");
mysqli_query($connect_subd,"UPDATE `otpravlenie` SET `znach` = '$hirs' WHERE `otpravlenie`.`id` = 3;");
mysqli_query($connect_subd,"INSERT INTO `chainik_db` (`id`, `t0`, `t1`, `data`) VALUES (NULL, '$t0', '$t1', '$yng');");
}
}
$informazia = mysqli_query($connect_subd, "SELECT * FROM `otpravlenie` WHERE `id` = 1");
$gimp = mysqli_fetch_assoc($informazia);
$qid = $gimp['znach'];
echo $qid;
?>
4)В SilberHome висит raspberry pi 3, адрес соответственно статика со стороны провайдера и статика на локальный ip для wemos'a.
5)При конекте c SilberHome все работает отлично считываются данные со страницы и отсылается GET запрос с данными.
Проблема: При конекте с Любой другой сеткой wifi имеем: рабочую отправку GET, но не рабочее считывание данных со страницы http://www.habb.host/chainik.php.
Кто шарит в чём проблема в wemos'e или в lamp на raspberry pi3, может кто сталкивался.
МБ: Имеет смысл поменять способ обмена данными между сервером и wemos'ом?
P.S: Ещё не разобрался с прерываниями просьба не винить за баг с кнопкой на D13.
P.S.S: Код для php сделан по фикально дендритной технологии.
Вы уверены что вам это нужно?
Запрос вы отправляете, только в запросе одна пустая строка лишняя, после заголовков должна быть одна пустая строка, а у вас две, не криминал, но мусор. Почему то вызываете client.flush() не перед чтением ответа, а когда совсем завершаете работу с клиентом. Начинаете читать ответ когда запрос ещё не отправлен или ответ ещё не готов и в цикл while (client.available()) просто не заходите и только.
Подскажите чем не устроил HTTPClient из библиотек?
ДА!
Алексей, спасибо всё по делу. С WiFi.client не получается как не крути даже после увеличения задержки и правильной постановки client.flush(), но идея с HTTPClient'ом оказалась рабочей, ниже полный скетч:
#include <Arduino.h> #include <ESP8266WiFi.h> #include <ESP8266HTTPClient.h> #include <OneWire.h> #include <DallasTemperature.h> DeviceAddress ad0 = {0x28, 0xFF, 0xB0, 0xF3, 0xC1, 0x17, 0x4, 0xE5}; DeviceAddress ad1 = {0x28, 0xFF, 0x68, 0xB, 0xC2, 0x17, 0x4, 0xC}; OneWire oneWire(D4); DallasTemperature sensors(&oneWire); /* const char* ssid = "WOWA-HP_DACHA"; const char* password = "h40s-o7u6-mjib"; */ const char* ssid = "wan"; const char* password = "78146552"; /* const char* ssid = "SilberHome"; const char* password = "32G#64a*"; */ float t0; float t1; int xir; int tip; int hirs; int c0; int c1; int c2; bool b; WiFiClient client; void setup() { Serial.begin(115200); sensors.begin(); WiFi.begin(ssid, password); pinMode(D15, OUTPUT); pinMode(D3, OUTPUT); pinMode(D13, INPUT); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } } int sensor(float t0, float t1, int xir, int hirs){ int pit; String Link, t0S, t1S, xirS, hirsS; HTTPClient http; t0S = String(t0); t1S = String(t1); xirS = String(xir); hirsS = String(hirs); Link = "http://habb.host/chainik.php?k=eU839q2lwMcIEPaJj0bZ&t0=" + t0S + "&t1=" + t1S + "&xir=" + xirS + "&hirs=" + hirsS ; http.begin(Link); http.addHeader("Content-Type", "application/json"); int httpCode = http.GET(); if (httpCode == HTTP_CODE_OK) { String response = http.getString(); pit = response.toInt(); } http.end(); return pit; } void loop() { delay(5000); sensors.requestTemperatures(); t0 = sensors.getTempC(ad0); t1 = sensors.getTempC(ad1); if ((t1 < 70) && (t0 < 105) && (t0 > -60) && (t1 > -60)) { tip = sensor(t0, t1, xir, hirs); b = digitalRead(D13); hirs = tip % 100; xir = tip / 100; if (b == 1) { xir = 1; } if (xir == 0) { digitalWrite(D3, LOW); digitalWrite(D15, LOW); } if (xir == 1) { digitalWrite(D3, HIGH); digitalWrite(D15, HIGH); if (t0 >= 96) { digitalWrite(D3, LOW); digitalWrite(D15, LOW); xir = 0; } } if (xir == 2) { if (t0 <= hirs) { digitalWrite(D3, HIGH); digitalWrite(D15, HIGH); } if (t0 >= hirs) { digitalWrite(D3, LOW); digitalWrite(D15, LOW); } } if (xir == 3) { digitalWrite(D3, HIGH); digitalWrite(D15, HIGH); if (t0 >= 96) { xir = 2; digitalWrite(D3, LOW); digitalWrite(D15, LOW); } } } else { xir = 5; tip = sensor(t0, t1, xir, hirs); digitalWrite(D3, LOW); digitalWrite(D15, LOW); } }P.S: Пойду заниматься прерываниями.
И да - замените вереницу дублирующегося кода:
if (c == '4') { c2 = 4;одной строчкой: