ArduinoHTTPClient websocket недокументированный максимальный размер сообщения? - PullRequest
0 голосов
/ 07 января 2020

У меня Arduino MKRNB 1500 (с возможностью сети LTE-M). Мой код использует веб-сокет для загрузки сообщений на сервер. Сообщения загружаются каждую секунду или около 800-1000 байт. Мой сервер веб-сокетов принимает эти сообщения (я пробовал с клиентом браузера). Но библиотека ArduinoHTTPClient WebSocketClient отказывается отправлять сообщения размером более 128 байт. Arduino просто висит с этого момента. Из-за задержки в сети это означает, что я не могу отправлять более 600 байт в секунду. Это ограничение кажется произвольным и не документировано, насколько я видел. Это может быть легко воспроизведено, используя следующий код. Более частая отправка небольших сообщений не возможна, поскольку задержка в сети LTE-M составляет около 150 мс.

Как я могу отправлять сообщения большего размера?

#include <ArduinoHttpClient.h>
#include <MKRNB.h> //For LTE-M or NB-IOT connections
#include "arduino_secrets.h"

// initialize the LTE-M library instance
NBClient nbClient;
GPRS gprs;
NB nbAccess;
char server[] = "echo.websocket.org";  // server address
const char PINNUMBER[] = "0000";  //  = SIM SECRET_PINNUMBER;
int port = 80; // port 80 is the default for HTTP
WebSocketClient client = WebSocketClient(nbClient, server, port);

int count = 120;

void setup() {
  Serial.begin(9600);
  // LTE-M connection
  Serial.println(F("Connecting to LTE-M network"));
  boolean connected = false;
  while (!connected) {
    if ((nbAccess.begin(PINNUMBER) == NB_READY) &&
        (gprs.attachGPRS() == GPRS_READY)) {
      connected = true;
    } else {
      Serial.println("Not connected");
      delay(1000);
    }
  }
}

void loop() {
  Serial.println("starting WebSocket client");
  client.begin();

  while (client.connected() and count <= 1000) {
    Serial.print("Sending hello ");
    Serial.println(count);

    // send a hello #
    client.beginMessage(TYPE_TEXT);
    client.print(count);
    client.print(": ");
    int i = 0;
    while (i<= count){
      client.print("X");
      i++;
    }
    client.endMessage();

    // increment count for next message
    count++;

    // check if a message is available to be received
    int messageSize = client.parseMessage();

    if (messageSize > 0) {
      Serial.println("Received a message:");
      Serial.println(client.readString());
    }
    delay(1000);
  }

  Serial.println("disconnected");
}

1 Ответ

0 голосов
/ 13 января 2020

После изучения библиотеки ArduinoHttpClient оказывается, что файл WebSocketClient.h имеет ограниченный буфер, определенный в строке 89:

uint8_t iTxBuffer[128];

Я изменил это на

uint8_t iTxBuffer[4096];

И проблема была решена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...