ESP8266 wifi gate

Подключение исполнительных устройств, датчиков, контроллеров.

Модератор: immortal

immortal
Сообщения: 1138
Зарегистрирован: Вт янв 29, 2013 9:16 am
Откуда: Белозерск
Благодарил (а): 16 раз
Поблагодарили: 400 раз
Контактная информация:

Re: ESP8266 wifi gate

Сообщение immortal » Чт окт 27, 2016 10:41 am

удалось подключиться только с помощью стандартной ESP8266WiFi.h
СпойлерПоказать

Код: Выделить всё

#include <ESP8266WiFi.h>
#include <DNSServer.h>
#include <ESP8266WebServer.h>
#include <EEPROM.h>
#include <ESP8266HTTPClient.h>

const int EEPROM_HTTP_SERVER=50;
const int EEPROM_DATA_FILTER=100;
const int EEPROM_BASE_URL=150;
const int EEPROM_SERIAL_RATE=200;
const int EEPROM_STRING_MAX=50;
const char* ssid = "AP-NAME";
const char* password = "AP-PASSWORD";


#include <Ticker.h>
Ticker ticker;
ESP8266WebServer server(80);

String http_server;
String data_filter;
String base_url;
int serial_rate = 0;

const int RATES_TOTAL = 8;
int serial_rates[RATES_TOTAL] = {9600,14400,19200,28800,38400,56000,57600,115200};

String latestSerialData;

const byte numChars = 200;
char receivedChars[numChars]; // an array to store the received data
boolean newData = false;

String URLEncode(String str)
{
    String encodedString="";
    char c;
    char code0;
    char code1;
    char code2;
    for (int i =0; i < str.length(); i++){
      c=str.charAt(i);
      if (c == ' '){
        encodedString+= '+';
      } else if (isalnum(c)){
        encodedString+=c;
      } else{
        code1=(c & 0xf)+'0';
        if ((c & 0xf) >9){
            code1=(c & 0xf) - 10 + 'A';
        }
        c=(c>>4)&0xf;
        code0=c+'0';
        if (c > 9){
            code0=c - 10 + 'A';
        }
        code2='\0';
        encodedString+='%';
        encodedString+=code0;
        encodedString+=code1;
        //encodedString+=code2;
      }
      yield();
    }
return encodedString;
}

void handleRoot() {
  String message = "<html><head><title>WiFi Gate</title></head><body><h1>WiFi Gate</h1>\n";
  message += "<form action='/' method='get'>Send data to serial:<br/><input type='text' name='data' id='data_field' value=''><input type='button' value='Send' onClick='sendData();'></form>";
  message += "<p>Data from serial: <span id='latestData'>";
  message += latestSerialData;
  message += "</span>\n";
  message += "<h2>Settings</h2><form action='/save' method='get'>Serial data hook URL:<br/><input type='text' name='server' value='";
  message += http_server;
  message += "' size='60'><br/>Serial rate:<br/><select name='serial'>";
     for (int i = 0; i < RATES_TOTAL; ++i)
            {
              message += "<option value='";
              message += i;
              message += "'";
              if (i==serial_rate) {
                message += " selected";
              }
              message += ">";
              message += serial_rates[i];
              message += "</option>";
            }     
  message += "</select><br/>Serial data filter (optional):<br/><input type='text' name='filter' value='";
  message += data_filter;  
  message += "' size='60'><br/>Base URL (optional):<br/><input type='text' name='base' value='";
  message += base_url;    
  message += "'size='60'><br/><input type='submit' value='Save settings'></form>";
  message += "</p>";  
  message += "<script language='javascript' src='https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js'></script>";  
  message += "<script language=\"javascript\">\n";
  message += "var status_timer;\n";
  message += "function sendData() {\n";
  message += "$.ajax({  url: \"/send?data=\"+encodeURIComponent($('#data_field').val())  }).done(function(data) { $('#data_field').val(''); });";
  message += "}\n";  
  message += "function updateStatus() {\n";
  message += "$.ajax({  url: \"/data\"  }).done(function(data) {  $('#latestData').html(data);status_timer=setTimeout('updateStatus();', 500); });";
  message += "}\n";
  message += "$(document).ready(function() {  updateStatus();   });\n";      
  message += "</script>";  
  message += "</body></html>";    
  server.send(200, "text/html", message);
}

void handleData() {
  String message = "";
  message += latestSerialData;
  server.send(200, "text/plain", message);
}

String readStringEEPROM(int startIdx) {
    String res="";
    for (int i = 0; i < EEPROM_STRING_MAX; ++i)
    {
      byte sm=EEPROM.read(startIdx+i);
      if (sm>0) {
       res+= char(sm);        
      } else {
        break;
      }
    }
    //Serial.print("Read string: ");
    //Serial.println(res);
    return res;
}

void writeStringEEPROM(String str, int startIdx) {
          for (int i = 0; i < EEPROM_STRING_MAX; ++i)
          {
            EEPROM.write(startIdx+i, 0);
          }    
          for (int i = 0; i < str.length(); ++i)
            {
              EEPROM.write(startIdx+i, str[i]);
            }    
          EEPROM.commit();  
}

//This function will write a 2 byte integer to the eeprom at the specified address and address + 1
void writeIntEEPROM(unsigned int p_value, int p_address)
      {
      byte lowByte = ((p_value >> 0) & 0xFF);
      byte highByte = ((p_value >> 8) & 0xFF);

      EEPROM.write(p_address, lowByte);
      EEPROM.write(p_address + 1, highByte);
      }

//This function will read a 2 byte integer from the eeprom at the specified address and address + 1
unsigned int readIntEEPROM(int p_address)
      {
      byte lowByte = EEPROM.read(p_address);
      byte highByte = EEPROM.read(p_address + 1);

      return ((lowByte << 0) & 0xFF) + ((highByte << 8) & 0xFF00);
      }

void handleUpdateConfig() {
  for (uint8_t i=0; i<server.args(); i++){
    if (server.argName(i)=="server") {
      http_server=server.arg(i);
    }
    if (server.argName(i)=="filter") {
      data_filter=server.arg(i);
    }    
    if (server.argName(i)=="base") {
      base_url=server.arg(i);
    }
    if (server.argName(i)=="serial") {
      if (server.arg(i).toInt()!=serial_rate) {
       serial_rate=server.arg(i).toInt();
       Serial.begin(serial_rates[serial_rate]);
      }
    }
  }
  String message = "<html><body><script language='javascript'>tm=setTimeout(\"window.location.href='/';\",2000);</script>Data saved!</body></html>";  

  writeStringEEPROM(data_filter,EEPROM_DATA_FILTER);
  writeStringEEPROM(http_server,EEPROM_HTTP_SERVER);
  writeStringEEPROM(base_url, EEPROM_BASE_URL);
  writeIntEEPROM(serial_rate,EEPROM_SERIAL_RATE);
  
  
  server.send(200, "text/html", message);
}

void handleSend() {
  String message = "OK";
  for (uint8_t i=0; i<server.args(); i++){
    if (server.argName(i)=="data") {
      message += "; Sent: "+server.arg(i);      
      Serial.println(server.arg(i));
    }
  }
  server.send(200, "text/plain", message);
}

void handleNotFound(){
  String message = "File Not Found\n\n";
  message += "URI: ";
  message += server.uri();
  message += "\nMethod: ";
  message += (server.method() == HTTP_GET)?"GET":"POST";
  message += "\nArguments: ";
  message += server.args();
  message += "\n";
  for (uint8_t i=0; i<server.args(); i++){
    message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
  }
  server.send(404, "text/plain", message);
}

void tick()
{
  int state = digitalRead(BUILTIN_LED);  // get the current state of GPIO1 pin
  digitalWrite(BUILTIN_LED, !state);     // set pin to the opposite state
}
void setup() {
  Serial.begin(115200);
  delay(10);
  // Connect to WiFi network
  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
  // Start the server
  server.begin();
  Serial.println("Server started");
  // Print the IP address
  Serial.println(WiFi.localIP());
    
    ticker.attach(0.5, tick);
    ticker.detach();
    digitalWrite(BUILTIN_LED, HIGH);

    EEPROM.begin(512);

    data_filter=readStringEEPROM(EEPROM_DATA_FILTER);
    http_server=readStringEEPROM(EEPROM_HTTP_SERVER);
    base_url=readStringEEPROM(EEPROM_BASE_URL);
    serial_rate=readIntEEPROM(EEPROM_SERIAL_RATE);

    if ((serial_rates[serial_rate]!=9600) && (serial_rate<RATES_TOTAL)) {
     Serial.begin(serial_rates[serial_rate]);      
    }
    
    latestSerialData = "n/a";

  server.on("/", handleRoot);
  server.on("/send", handleSend);
  server.on("/data", handleData);
  server.on("/save", handleUpdateConfig);

  server.onNotFound(handleNotFound);

  server.begin();
  //Serial.println("HTTP server started");    

}

void loop() {
  // put your main code here, to run repeatedly:
  server.handleClient();
  recvWithEndMarker();
  showNewData();  
}

void recvWithEndMarker() {
 static byte ndx = 0;
 char endMarker = '\n';
 char rc;
 while (Serial.available() > 0 && newData == false) {
  rc = Serial.read();
  if (rc != endMarker) {
  receivedChars[ndx] = rc;
  ndx++;
  if (ndx >= numChars) {
  ndx = numChars - 1;
  }
  }
  else {
  receivedChars[ndx] = '\0'; // terminate the string
  ndx = 0;
  newData = true;
  }
 }
}

void showNewData() {
 if (newData == true) {
  latestSerialData=receivedChars;
  if (latestSerialData.indexOf(data_filter)>=0) {
    //Serial.println("Matched!");
    HTTPClient http;
    String url = http_server;
    url += URLEncode(latestSerialData);
    http.begin(url);
    int httpCode = http.GET();
    http.end();
  } else if (latestSerialData.indexOf("GET /")>=0) {
    HTTPClient http;
    String url = latestSerialData;
    url.replace("GET /","");
    url.replace(" HTTP/1.0","");
    url = base_url + url;
    http.begin(url);
    int httpCode = http.GET();
    http.end();    
  }
  newData = false;
 }
}
За это сообщение автора immortal поблагодарили (всего 2):
Ruslan (Чт апр 27, 2017 9:31 pm) • batihor (Вс май 28, 2017 11:39 pm)
Рейтинг: 2.33%
Lubuntu на cubieboard2 + ds9490R
DietPi на Orange Pi PC + 1wire на esp8266 с прошивкой Homes-smart.ru
alekszander
Сообщения: 178
Зарегистрирован: Вс янв 05, 2014 5:37 am
Благодарил (а): 10 раз
Поблагодарили: 17 раз

Re: ESP8266 wifi gate

Сообщение alekszander » Сб окт 29, 2016 2:49 pm

Комрады направьте на путь истины. Как данные получаемые через Serial.print записать в мд?
Аватара пользователя
nick7zmail
Сообщения: 7573
Зарегистрирован: Пн окт 28, 2013 8:14 am
Откуда: Екатеринбург
Благодарил (а): 121 раз
Поблагодарили: 2010 раз

Re: ESP8266 wifi gate

Сообщение nick7zmail » Сб окт 29, 2016 5:44 pm

alekszander писал(а):Комрады направьте на путь истины. Как данные получаемые через Serial.print записать в мд?
Через mqtt или html-запросы к примеру
Raspberry Pi3+Broadlink+esp8266 (blynk)+AMS
Если вам помогло какое-либо сообщение - не забывайте пользоваться кнопкой "СПАСИБО".
:arrow: Услуги в профиле коннект
>>>>>Мой новый канал на ютутбе, подписывайтесь!<<<<<
immortal
Сообщения: 1138
Зарегистрирован: Вт янв 29, 2013 9:16 am
Откуда: Белозерск
Благодарил (а): 16 раз
Поблагодарили: 400 раз
Контактная информация:

Re: ESP8266 wifi gate

Сообщение immortal » Вс окт 30, 2016 11:25 am

alekszander писал(а):Комрады направьте на путь истины. Как данные получаемые через Serial.print записать в мд?
прописываем в модуле путь до сценария в МД http://192.168.1.20/objects/?script=wifigate&data=
создаем сценарий в МД
say("Получены данные:".$params['data']);

в данном случае выводит алиса полученные данные.
ну на сколько я понимаю, чтобы разобрать данные надо в сценарии что то вроде
допустим пересылаем параметры temp1, temp2
передаваемая строка типа:
"temp1":23.8,"temp2":25.1

$data = json_decode($params['data']));
$temp1 = $data->temp1;
$temp2 = $data->temp2;

Пока проверить и написать подробный мануал не могу ибо:
залил прошивку на ESP с помощью ArduinoIDE
прописал путь до моего МД http://192.168.1.20/objects/?script=wifigate&data=
запустил монитор порта в ArduinoIDE
посылаю из web интерфейса модуля в UART монитор порта получает данные.
посылаю из монитора порта, данные на модуль не приходят
Lubuntu на cubieboard2 + ds9490R
DietPi на Orange Pi PC + 1wire на esp8266 с прошивкой Homes-smart.ru
VladPTZ
Сообщения: 395
Зарегистрирован: Вт май 31, 2016 6:56 pm
Откуда: Россия Карелия Петрозаводск
Благодарил (а): 95 раз
Поблагодарили: 57 раз

Re: ESP8266 wifi gate

Сообщение VladPTZ » Вс окт 30, 2016 1:07 pm

Если я все правильно понял, вот еще прозрачный com порт через ESP wifi http://ez-gui.com/manual/multiwii-clear ... ui-how-to/
Сервер МД на x86 micro pc ssd + HDD, OC Debian, терминал Xiaomi Redmi note 7
Мои исходники для мд управляемых устройств https://github.com/vgamaev/ESPMDDEVICE
Аватара пользователя
sergejey
Site Admin
Сообщения: 4284
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 75 раз
Поблагодарили: 1559 раз
Контактная информация:

Re: ESP8266 wifi gate

Сообщение sergejey » Пн окт 31, 2016 12:01 pm

Вот ещё в копилку вариантов универсального шлюза: https://github.com/jeelabs/esp-link
Тут сразу MQTT на борту и есть возможность использовать как удалённый com-порт для перепрошивки.
За это сообщение автора sergejey поблагодарил:
Amarok (Пт май 12, 2017 1:21 pm)
Рейтинг: 1.16%

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
alekszander
Сообщения: 178
Зарегистрирован: Вс янв 05, 2014 5:37 am
Благодарил (а): 10 раз
Поблагодарили: 17 раз

Re: ESP8266 wifi gate

Сообщение alekszander » Пн окт 31, 2016 2:20 pm

sergejey писал(а):Вот ещё в копилку вариантов универсального шлюза: https://github.com/jeelabs/esp-link
Тут сразу MQTT на борту и есть возможность использовать как удалённый com-порт для перепрошивки.
Сергей, подскажите. Пытаюсь вытянуть значения, мало что получается. Точнее не получается ни чего...
скетчПоказать

Код: Выделить всё

//инициализация датчиков
int sensorPin0 = A0;
int sensorPin1 = A1;
int sensorPin2 = A2;
int sensorPin3 = A3;
int sensorPin4 = A4;
int sensorPin5 = A5;
//установка 0 значения
int sensorValue0 = 0;
int sensorValue1 = 0;
int sensorValue2 = 0;
int sensorValue3 = 0;
int sensorValue4 = 0;
int sensorValue5 = 0;

void setup() {
  Serial.begin(9600);
}
void loop() {
  //денежное дерево
  sensorValue0 = analogRead(sensorPin0);
  Serial.print("A0:");
  Serial.println(sensorValue0);
  delay(100);
  //олива
  sensorValue1 = analogRead(sensorPin1);
  Serial.print("A1:");
  Serial.println(sensorValue1);
  delay(100);
  //цветок невесты
  sensorValue2 = analogRead(sensorPin2);
  Serial.print("A2:");
  Serial.println(sensorValue2);
  delay(100);
  //орхидея травянистая
  sensorValue3 = analogRead(sensorPin3);
  Serial.print("A3:");
  Serial.println(sensorValue3);
  delay(100);
  //рождественник 1
  sensorValue4 = analogRead(sensorPin4);
  Serial.print("A4:");
  Serial.println(sensorValue4);
  delay(100);
  //орхидея драгоценная
  sensorValue5 = analogRead(sensorPin5);
  Serial.print("A5:");
  Serial.println(sensorValue5);
  delay(100);
}
 
На сервере мд создан скрипт, но данные не отображаются

Содержание скрипта

Код: Выделить всё

$data = json_decode($params['data']);
$A0 = $data->A0;
sg ('1.hum',$A0);
Вот такие данные в Xray

Код: Выделить всё

a:2:{s:6:" script" ; s:8:" wifigate" ; s:4:" data" ; s:7:" A1:281 " ; }  
Аватара пользователя
sergejey
Site Admin
Сообщения: 4284
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 75 раз
Поблагодарили: 1559 раз
Контактная информация:

Re: ESP8266 wifi gate

Сообщение sergejey » Пн окт 31, 2016 4:36 pm

Возможно, ошибка в json_decode. я не уверен, что строка типа "A1:281" будет преобразовываться в объект $data->A1.

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
Ruslan
Сообщения: 37
Зарегистрирован: Чт апр 09, 2015 7:11 pm
Благодарил (а): 7 раз
Поблагодарили: 1 раз

Re: ESP8266 wifi gate

Сообщение Ruslan » Чт апр 27, 2017 9:58 pm

У меня получилось переслать такую строку [11112&Val2=335553] c этим кодом:
immortal писал(а):удалось подключиться только с помощью стандартной ESP8266WiFi.h
СпойлерПоказать

Код: Выделить всё

#include <ESP8266WiFi.h>
#include <DNSServer.h>
#include <ESP8266WebServer.h>
#include <EEPROM.h>
#include <ESP8266HTTPClient.h>

const int EEPROM_HTTP_SERVER=50;
const int EEPROM_DATA_FILTER=100;
const int EEPROM_BASE_URL=150;
const int EEPROM_SERIAL_RATE=200;
const int EEPROM_STRING_MAX=50;
const char* ssid = "AP-NAME";
const char* password = "AP-PASSWORD";


#include <Ticker.h>
Ticker ticker;
ESP8266WebServer server(80);

String http_server;
String data_filter;
String base_url;
int serial_rate = 0;

const int RATES_TOTAL = 8;
int serial_rates[RATES_TOTAL] = {9600,14400,19200,28800,38400,56000,57600,115200};

String latestSerialData;

const byte numChars = 200;
char receivedChars[numChars]; // an array to store the received data
boolean newData = false;

String URLEncode(String str)
{
    String encodedString="";
    char c;
    char code0;
    char code1;
    char code2;
    for (int i =0; i < str.length(); i++){
      c=str.charAt(i);
      if (c == ' '){
        encodedString+= '+';
      } else if (isalnum(c)){
        encodedString+=c;
      } else{
        code1=(c & 0xf)+'0';
        if ((c & 0xf) >9){
            code1=(c & 0xf) - 10 + 'A';
        }
        c=(c>>4)&0xf;
        code0=c+'0';
        if (c > 9){
            code0=c - 10 + 'A';
        }
        code2='\0';
        encodedString+='%';
        encodedString+=code0;
        encodedString+=code1;
        //encodedString+=code2;
      }
      yield();
    }
return encodedString;
}

void handleRoot() {
  String message = "<html><head><title>WiFi Gate</title></head><body><h1>WiFi Gate</h1>\n";
  message += "<form action='/' method='get'>Send data to serial:<br/><input type='text' name='data' id='data_field' value=''><input type='button' value='Send' onClick='sendData();'></form>";
  message += "<p>Data from serial: <span id='latestData'>";
  message += latestSerialData;
  message += "</span>\n";
  message += "<h2>Settings</h2><form action='/save' method='get'>Serial data hook URL:<br/><input type='text' name='server' value='";
  message += http_server;
  message += "' size='60'><br/>Serial rate:<br/><select name='serial'>";
     for (int i = 0; i < RATES_TOTAL; ++i)
            {
              message += "<option value='";
              message += i;
              message += "'";
              if (i==serial_rate) {
                message += " selected";
              }
              message += ">";
              message += serial_rates[i];
              message += "</option>";
            }     
  message += "</select><br/>Serial data filter (optional):<br/><input type='text' name='filter' value='";
  message += data_filter;  
  message += "' size='60'><br/>Base URL (optional):<br/><input type='text' name='base' value='";
  message += base_url;    
  message += "'size='60'><br/><input type='submit' value='Save settings'></form>";
  message += "</p>";  
  message += "<script language='javascript' src='https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js'></script>";  
  message += "<script language=\"javascript\">\n";
  message += "var status_timer;\n";
  message += "function sendData() {\n";
  message += "$.ajax({  url: \"/send?data=\"+encodeURIComponent($('#data_field').val())  }).done(function(data) { $('#data_field').val(''); });";
  message += "}\n";  
  message += "function updateStatus() {\n";
  message += "$.ajax({  url: \"/data\"  }).done(function(data) {  $('#latestData').html(data);status_timer=setTimeout('updateStatus();', 500); });";
  message += "}\n";
  message += "$(document).ready(function() {  updateStatus();   });\n";      
  message += "</script>";  
  message += "</body></html>";    
  server.send(200, "text/html", message);
}

void handleData() {
  String message = "";
  message += latestSerialData;
  server.send(200, "text/plain", message);
}

String readStringEEPROM(int startIdx) {
    String res="";
    for (int i = 0; i < EEPROM_STRING_MAX; ++i)
    {
      byte sm=EEPROM.read(startIdx+i);
      if (sm>0) {
       res+= char(sm);        
      } else {
        break;
      }
    }
    //Serial.print("Read string: ");
    //Serial.println(res);
    return res;
}

void writeStringEEPROM(String str, int startIdx) {
          for (int i = 0; i < EEPROM_STRING_MAX; ++i)
          {
            EEPROM.write(startIdx+i, 0);
          }    
          for (int i = 0; i < str.length(); ++i)
            {
              EEPROM.write(startIdx+i, str[i]);
            }    
          EEPROM.commit();  
}

//This function will write a 2 byte integer to the eeprom at the specified address and address + 1
void writeIntEEPROM(unsigned int p_value, int p_address)
      {
      byte lowByte = ((p_value >> 0) & 0xFF);
      byte highByte = ((p_value >> 8) & 0xFF);

      EEPROM.write(p_address, lowByte);
      EEPROM.write(p_address + 1, highByte);
      }

//This function will read a 2 byte integer from the eeprom at the specified address and address + 1
unsigned int readIntEEPROM(int p_address)
      {
      byte lowByte = EEPROM.read(p_address);
      byte highByte = EEPROM.read(p_address + 1);

      return ((lowByte << 0) & 0xFF) + ((highByte << 8) & 0xFF00);
      }

void handleUpdateConfig() {
  for (uint8_t i=0; i<server.args(); i++){
    if (server.argName(i)=="server") {
      http_server=server.arg(i);
    }
    if (server.argName(i)=="filter") {
      data_filter=server.arg(i);
    }    
    if (server.argName(i)=="base") {
      base_url=server.arg(i);
    }
    if (server.argName(i)=="serial") {
      if (server.arg(i).toInt()!=serial_rate) {
       serial_rate=server.arg(i).toInt();
       Serial.begin(serial_rates[serial_rate]);
      }
    }
  }
  String message = "<html><body><script language='javascript'>tm=setTimeout(\"window.location.href='/';\",2000);</script>Data saved!</body></html>";  

  writeStringEEPROM(data_filter,EEPROM_DATA_FILTER);
  writeStringEEPROM(http_server,EEPROM_HTTP_SERVER);
  writeStringEEPROM(base_url, EEPROM_BASE_URL);
  writeIntEEPROM(serial_rate,EEPROM_SERIAL_RATE);
  
  
  server.send(200, "text/html", message);
}

void handleSend() {
  String message = "OK";
  for (uint8_t i=0; i<server.args(); i++){
    if (server.argName(i)=="data") {
      message += "; Sent: "+server.arg(i);      
      Serial.println(server.arg(i));
    }
  }
  server.send(200, "text/plain", message);
}

void handleNotFound(){
  String message = "File Not Found\n\n";
  message += "URI: ";
  message += server.uri();
  message += "\nMethod: ";
  message += (server.method() == HTTP_GET)?"GET":"POST";
  message += "\nArguments: ";
  message += server.args();
  message += "\n";
  for (uint8_t i=0; i<server.args(); i++){
    message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
  }
  server.send(404, "text/plain", message);
}

void tick()
{
  int state = digitalRead(BUILTIN_LED);  // get the current state of GPIO1 pin
  digitalWrite(BUILTIN_LED, !state);     // set pin to the opposite state
}
void setup() {
  Serial.begin(115200);
  delay(10);
  // Connect to WiFi network
  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
  // Start the server
  server.begin();
  Serial.println("Server started");
  // Print the IP address
  Serial.println(WiFi.localIP());
    
    ticker.attach(0.5, tick);
    ticker.detach();
    digitalWrite(BUILTIN_LED, HIGH);

    EEPROM.begin(512);

    data_filter=readStringEEPROM(EEPROM_DATA_FILTER);
    http_server=readStringEEPROM(EEPROM_HTTP_SERVER);
    base_url=readStringEEPROM(EEPROM_BASE_URL);
    serial_rate=readIntEEPROM(EEPROM_SERIAL_RATE);

    if ((serial_rates[serial_rate]!=9600) && (serial_rate<RATES_TOTAL)) {
     Serial.begin(serial_rates[serial_rate]);      
    }
    
    latestSerialData = "n/a";

  server.on("/", handleRoot);
  server.on("/send", handleSend);
  server.on("/data", handleData);
  server.on("/save", handleUpdateConfig);

  server.onNotFound(handleNotFound);

  server.begin();
  //Serial.println("HTTP server started");    

}

void loop() {
  // put your main code here, to run repeatedly:
  server.handleClient();
  recvWithEndMarker();
  showNewData();  
}

void recvWithEndMarker() {
 static byte ndx = 0;
 char endMarker = '\n';
 char rc;
 while (Serial.available() > 0 && newData == false) {
  rc = Serial.read();
  if (rc != endMarker) {
  receivedChars[ndx] = rc;
  ndx++;
  if (ndx >= numChars) {
  ndx = numChars - 1;
  }
  }
  else {
  receivedChars[ndx] = '\0'; // terminate the string
  ndx = 0;
  newData = true;
  }
 }
}

void showNewData() {
 if (newData == true) {
  latestSerialData=receivedChars;
  if (latestSerialData.indexOf(data_filter)>=0) {
    //Serial.println("Matched!");
    HTTPClient http;
    String url = http_server;
    url += URLEncode(latestSerialData);
    http.begin(url);
    int httpCode = http.GET();
    http.end();
  } else if (latestSerialData.indexOf("GET /")>=0) {
    HTTPClient http;
    String url = latestSerialData;
    url.replace("GET /","");
    url.replace(" HTTP/1.0","");
    url = base_url + url;
    http.begin(url);
    int httpCode = http.GET();
    http.end();    
  }
  newData = false;
 }
}
Заработал но не совсем. Получилось принять с помощью такого скрипта:

Код: Выделить всё

$dt1=$params['Val1'];
$dt2=$params['Val2'];
DebMes("Get_IoT receive data");
DebMes("V1=".$dt1);
DebMes("V2=".$dt2); 
с такими настройками "гейта"
1.PNG
1.PNG (10.25 КБ) 7337 просмотров
Но скрипт не смог разобрать строку на переменные.
В Debud получил во такую запись:
21:24:11 0.79522900 V2=
21:24:11 0.79493300 V1=11112&Val2=335553
21:24:11 0.79444200 Get_IoT receive data

Если в "гейте" добавить фильтр тогда этот фильтр тоже пересылается в скрипт.

При этом если забить в строку адреса браузера следующее [http://192.168.1.10/objects/?script=Get ... al2=454545]
Получаю как надо:
21:12:37 0.00679200 V2=454545
21:12:37 0.00648500 V1=232
21:12:37 0.00598400 Get_IoT receive data

Подскажите что я не так делаю?
И еще, для чего - Base URL (optional):
RaspBerry Pi 2 | MajorDoMo lastUpdate:27/04/2017
Аватара пользователя
Genplane
Сообщения: 32
Зарегистрирован: Чт авг 18, 2016 11:43 am
Откуда: Калининград
Благодарил (а): 37 раз
Поблагодарили: 1 раз

Re: ESP8266 wifi gate

Сообщение Genplane » Вс май 14, 2017 12:45 pm

Собрал и подключил с помощью @Amarok описанную сборку. Давно собирался подружить свои Ардуинки (около десятка) с Мажордомо. Спасибо огромное @sergejey за этот функционал. Только не смогли отправить команду на serial Ардуинки, С неё приходит исправно и расшифровывается. А то, что отправляется с WiFi Gate на Ардуинку в консоли не отображается. Или не должно и надо просто смотреть на реакцию Ардуинки (пока не проверял)?
Windows 7, MiniPC, MegaD, Arduino
Ответить