Проблема при получении данных от сервера (lamp), Wemos D1 R1.

w7a8n1y4a
Offline
Зарегистрирован: 18.09.2018

Привет всем! Уже неделю бьюсь над проблемой получения данных с сайта.

Как работает система:

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 сделан по фикально дендритной технологии.

 

 

 

 

Алексей.
Алексей. аватар
Offline
Зарегистрирован: 02.02.2018

Вы уверены что вам это нужно?
Запрос вы отправляете, только в запросе одна пустая строка лишняя, после заголовков должна быть одна пустая строка, а у вас две, не криминал, но мусор. Почему то вызываете client.flush() не перед чтением ответа, а когда совсем завершаете работу с клиентом. Начинаете читать ответ когда запрос ещё не отправлен или ответ ещё не готов и в цикл while (client.available()) просто не заходите и только.

Подскажите чем не устроил HTTPClient из библиотек?

w7a8n1y4a
Offline
Зарегистрирован: 18.09.2018

ДА!

Алексей, спасибо всё по делу. С 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: Пойду заниматься прерываниями.

 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

И да - замените вереницу дублирующегося кода:

 if (c == '4') {
            c2 = 4;

одной строчкой:

c2 = c - '0';