我有一台Arduino MKRNB 1500 (具有LTE-M网络功能)。我的代码使用websocket将消息上传到服务器。这些消息大约每秒上载800-1000字节。我的websocket服务器接受这些消息(我已经尝试使用浏览器客户端)。但是ArduinoHTTPClient库WebSocketClient拒绝发送超过128字节的消息。从那时起,Arduino就会挂起来。由于网络延迟,这意味着我每秒发送的字节不能超过600字节。这一限制看起来很随意,据我所知没有记录在案。使用下面的代码可以很容易地重现它。由于LTE-M的网络延迟约为150ms,因此不能更频繁地发送较小的消息。
如何发送更大的消息?
#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");
}
发布于 2020-01-14 01:33:03
检查ArduinoHttpClient库后,发现WebSocketClient.h文件在第89行定义了一个有限的缓冲区:
uint8_t iTxBuffer[128];
我把它改成
uint8_t iTxBuffer[4096];
问题就解决了。
https://stackoverflow.com/questions/59633872
复制相似问题