Discriminator
New member
Судьба данного скетчика на усмотрение Администрации. Но "фишка" в следующем:
Из за всяких несостыковок с libm в SDK(отписывался тут, хотя и "ардуиновская" среда не решила проблем/тоже отписывался/), а так же по причине, что макет надо было накидать побыстрее - прибился на время к Arduino IDE (потом переделаю на SDK). Столкнулся с такой ситуацией:
Реализован некий сервер на ESP его задача принять информацию с нескольких разнородных датчиков и отдать микроконтроллеру. Варианта 2:
1. Принимаем информацию с датчиков, аккумулируем ее в некий единый блок и передаем на сервер.
2. Передаем каждый поток данных отдельно как есть, но предусматриваем как сделать чтоб каждый блок уходил целиком.
Пока был выбран второй вариант - чтоб избежать, по возможности, лишней обработки на сервере.
Играясь с размерами приемных буферов и количеством возможных клиентов на сервере удалось добиться(в рамках того что делаю), что сервер не вылетает и вроде как стабильно гонит данные. Но при начальных, хоть и избыточных, условиях, были неоднократные случаи вылета и перезагрузки "серверка", что вело к потере потока данных. Естественно "программная схема" клиента была изначально построена по семплу из IDE:
Вобщем, чуток поразмыслив, изменил схему на такую:
После этого соединение вроде как стало "само" восстанавливаться при перезагрузке серверной ESP-шки. Ну по тексту тут у меня заложен 10 секундный таймаут по недоступности сервера...
Маленький комментарий по остальной "специфике" - данный скетч про сериал-порту принимает данные с GPS/GLONASS датчика GL8088s и как есть передает их на "сервер". В начале есть некий диалог "снюхивания" с датчиком - там всего навсего даю посылку чтоб датчик выдавал только строки с текущими временем/датой и текущими координатами без излишней, для моей задачи, информации по спутникам и прочей фигне...
Из за всяких несостыковок с libm в SDK(отписывался тут, хотя и "ардуиновская" среда не решила проблем/тоже отписывался/), а так же по причине, что макет надо было накидать побыстрее - прибился на время к Arduino IDE (потом переделаю на SDK). Столкнулся с такой ситуацией:
Реализован некий сервер на ESP его задача принять информацию с нескольких разнородных датчиков и отдать микроконтроллеру. Варианта 2:
1. Принимаем информацию с датчиков, аккумулируем ее в некий единый блок и передаем на сервер.
2. Передаем каждый поток данных отдельно как есть, но предусматриваем как сделать чтоб каждый блок уходил целиком.
Пока был выбран второй вариант - чтоб избежать, по возможности, лишней обработки на сервере.
Играясь с размерами приемных буферов и количеством возможных клиентов на сервере удалось добиться(в рамках того что делаю), что сервер не вылетает и вроде как стабильно гонит данные. Но при начальных, хоть и избыточных, условиях, были неоднократные случаи вылета и перезагрузки "серверка", что вело к потере потока данных. Естественно "программная схема" клиента была изначально построена по семплу из IDE:
Код:
/*
* This sketch sends data via HTTP GET requests to data.sparkfun.com service.
*
* You need to get streamId and privateKey at data.sparkfun.com and paste them
* below. Or just customize this script to talk to other HTTP servers.
*
*/
#include <ESP8266WiFi.h>
const char* ssid = "your-ssid";
const char* password = "your-password";
const char* host = "data.sparkfun.com";
const char* streamId = "....................";
const char* privateKey = "....................";
void setup() {
Serial.begin(115200);
delay(10);
// We start by connecting to a 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");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
int value = 0;
void loop() {
delay(5000);
++value;
Serial.print("connecting to ");
Serial.println(host);
// Use WiFiClient class to create TCP connections
WiFiClient client;
const int httpPort = 80;
if (!client.connect(host, httpPort)) {
Serial.println("connection failed");
return;
}
// We now create a URI for the request
String url = "/input/";
url += streamId;
url += "?private_key=";
url += privateKey;
url += "&value=";
url += value;
Serial.print("Requesting URL: ");
Serial.println(url);
// This will send the request to the server
client.print(String("GET ") + url + " HTTP/1.1\r\n" +
"Host: " + host + "\r\n" +
"Connection: close\r\n\r\n");
delay(10);
// Read all the lines of the reply from server and print them to Serial
while(client.available()){
String line = client.readStringUntil('\r');
Serial.print(line);
}
Serial.println();
Serial.println("closing connection");
}
Вобщем, чуток поразмыслив, изменил схему на такую:
Код:
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#define SerialDebug 1 // set to true to get Serial output for debugging
const char* aSSID = "youSSID";
const char* aPassword = "youPassword";
int homePort = 23, astroport = 4242;
WiFiClient MeasClient;
IPAddress astroIP(192,168,4,1), classCMASK(255,255,255,0), astroGW(192,168,4,1);
long count;
void setup() {
Serial.begin(115200, SERIAL_8N1);
Serial.println("\r\nIN SETUP!!!\r\n");
while(1) {
Serial.print("$PSTMSETPAR,1201,0x01100000*\r\n$PSTMSAVEPAR\r\n");
if(!Serial.available()) { yield(); continue; }
size_t len = Serial.available();
uint8_t sbuf[len];
Serial.readBytes(sbuf, len);
if(strstr((const char *)sbuf, "$PSTMSAVEPAROK") || strstr((const char *)sbuf, "$PSTMSAVEPARERROR")) break;
delay(500);
}
WiFi.disconnect();
WiFi.mode(WIFI_STA);
// WiFi.begin(aSSID, aPassword);
WiFi.begin(aSSID);
count = millis();
}
void loop() {
uint8_t stat;
stat = WiFi.status();
if(stat != WL_CONNECTED && stat != WL_IDLE_STATUS) {
if(millis() - count > 10000) {
MeasClient.stop();
WiFi.disconnect();
WiFi.begin(aSSID);
count = millis();
}
}
if(stat == WL_CONNECTED || stat == WL_IDLE_STATUS) {
if(!MeasClient.connected()) {
if(MeasClient.connect(astroIP, astroport)) MeasClient.setNoDelay(true);
}
}
while(Serial.available()){
size_t len = Serial.available();
uint8_t sbuf[len];
Serial.readBytes(sbuf, len);
if(MeasClient.connected()) MeasClient.write(sbuf, len);
}
yield();
}
#if SerialDebug
void statuss(wl_status_t stat) {
switch(stat) {
case WL_NO_SHIELD: Serial.println("WL_NO_SHIELD"); break;
case WL_IDLE_STATUS: Serial.println("WL_IDLE_STATUS"); break;
case WL_NO_SSID_AVAIL: Serial.println("WL_NO_SSID_AVAIL"); break;
case WL_SCAN_COMPLETED: Serial.println("WL_SCAN_COMPLETED"); break;
case WL_CONNECTED: Serial.println("WL_CONNECTED"); break;
case WL_CONNECT_FAILED: Serial.println("WL_CONNECT_FAILED"); break;
case WL_CONNECTION_LOST: Serial.println("WL_CONNECTION_LOST"); break;
case WL_DISCONNECTED: Serial.println("WL_DISCONNECTED"); break;
default: {
Serial.print("Unknown connect status ");
Serial.println(stat);
} break;
}
}
#endif
Маленький комментарий по остальной "специфике" - данный скетч про сериал-порту принимает данные с GPS/GLONASS датчика GL8088s и как есть передает их на "сервер". В начале есть некий диалог "снюхивания" с датчиком - там всего навсего даю посылку чтоб датчик выдавал только строки с текущими временем/датой и текущими координатами без излишней, для моей задачи, информации по спутникам и прочей фигне...