Почему "убивает" WebSocket?

Нет ответов
Zhyravlev_AS
Offline
Зарегистрирован: 03.04.2013

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

Для отладки, играюсь с RGB лентой. Все работает прикрасно, но есть одно но, - если мы шлем данные потоком (не с задержкой в 500 и более мс.) то сервер (ардуино) разрывают соединение. Еще проблема, или баг, но он мне не нравиться. Если в цикле loop() не отправлять данные клиенту (хоть пустую строку, см 73-75 строку), то сервер так же разрывает соединние. Подскажите, как поправить эти две проблемы?

Библиотека https://github.com/ejeklint/ArduinoWebsocketServer

Вот весь скетч:

#include <SPI.h>
#include <Ethernet.h>

#define MAX_FRAME_LENGTH 64
#define PIN_R 3
#define PIN_G 5
#define PIN_B 6

#include <WebSocket.h>
#include <ArduinoJson.h>

byte mac[] = { 0x52, 0x4F, 0x43, 0x4B, 0x45, 0x54 };
byte ip[] = { 192, 168, 0 , 202 };

// Create a Websocket server
WebSocketServer wsServer;

void onConnect(WebSocket &socket) {
  Serial.println("onConnect called");
}

void onData(WebSocket &socket, char* dataString, byte frameLength) {

  socket.send(dataString, strlen(dataString));

  StaticJsonBuffer<200> jsonBuffer;
  JsonObject& root = jsonBuffer.parseObject(dataString);

  if (!root.success()) {
    Serial.println("parseObject() failed");
    return;
  }

  int r = root["r"];
  int g = root["g"];
  int b = root["b"];

  analogWrite(PIN_R, r);
  analogWrite(PIN_G, g);
  analogWrite(PIN_B, b);
}

void onDisconnect(WebSocket &socket) {
  Serial.println("onDisconnect called");
}

void setup() {
  
  Serial.begin(9600);

  while (!Serial) {
    ; // wait serial port initialization
  }

  pinMode(PIN_R, OUTPUT);
  pinMode(PIN_G, OUTPUT);
  pinMode(PIN_B, OUTPUT);
  
  Ethernet.begin(mac, ip);
  
  wsServer.registerConnectCallback(&onConnect);
  wsServer.registerDataCallback(&onData);
  wsServer.registerDisconnectCallback(&onDisconnect);  
  wsServer.begin();
  
  delay(100);
}

void loop() {
  // Should be called for each loop.
  wsServer.listen();
  
  if (wsServer.connectionCount() > 0) {
    wsServer.send("", 0);
  }
  
  delay(100);
}