gpt4 book ai didi

php - 无法使用 SIM800L+ESP32 发送大于 1449 个字符的 HTTP POST 负载

转载 作者:行者123 更新时间:2023-12-04 17:18:58 25 4
gpt4 key购买 nike

因此,我在 ESP32+SIM800L 设置上通过 HTTP POST 将数据发送到托管在 000WebHost 上的 php 脚本。我正在以 800Hz 的频率记录传感器数据并将其存储在一个字符数组中,例如:a[]=3&a[]=5&a[]=8... 这将成为我的 POST 请求的有效负载数组。

出于某种原因,我只能发送 161 个值,即内容长度大约为 1449。

代码有点长所以我在这里减少了它:我正在使用 TinyGSM 库

//Start GSM:
SerialAT.begin(115200, SERIAL_8N1, MODEM_RX, MODEM_TX);
SerialMon.println("Initializing modem...");


modem.init();
SerialMon.print(F("Connecting to "));
SerialMon.print(apn);
if (!modem.gprsConnect(apn, gprsUser, gprsPass)) {
SerialMon.println(" fail");
delay(10000);
return;
}
SerialMon.println(" success");

if (modem.isGprsConnected()) {
SerialMon.println("GPRS connected");
}

SerialMon.print("Connecting to ");
SerialMon.println(server);
if (!client.connect(server, port)) {
SerialMon.println(" fail");
delay(10000);
return;
}
SerialMon.println(" success");


// Record Sensor values for one second
//Send the character array to the httpPost function:
if (client.connect(server,port)) {
Serial.println("connected");
client.println("POST /upload.php? HTTP/1.1");
client.println("Host: epiblastic-reactor.000webhostapp.com");
client.println("User-Agent: TTGO-TCALL/1.0");
client.println("Content-Type: application/x-www-form-urlencoded;");
client.print("Content-Length: ");
client.println(String(acceldata).length());
client.println();
client.println(acceldata);


uint32_t timeout = millis();
while (client.connected() && millis() - timeout < 10000L) {
// Print available data
while (client.available()) {
char c = client.read();
SerialMon.print(c);
timeout = millis();
}

如果我发送超过 161 个值,串行监视器打印:

#Available: 0 on 1

不断地。

出了什么问题?有人可以帮帮我吗?

最佳答案

MTU以太网的字节数通常为 1500,但对于 SIM800,我相信它设置为 1460 字节(您可以使用 AT+CIPSEND? 检查该值)。 TinyGSM 使用的 TCP/HTTP 客户端似乎不会将超过一个 MTU 的数据分成 block ,因此用户有责任这样做。

这是一个关于如何在多个 block 中发送数据的示例。

代码已根据初始输入更新

#define ONE_CHUNK 1024  //you can change it as long as it is <= MTU

int payload_length = acceldata.length(); //assuming your data is already a String object
client.print("Content-Length: ");
client.println(payload_length);
client.println();

if (payload_length < ONE_CHUNK) { //less than ONE_CHUNK, send it
client.println(acceldata);
}
else { // more than ONE_CHUNK, break it into number of chunks
int chunks = payload_length / ONE_CHUNK;
for(int i = 0; i < chunks; i++){
client.print(acceldata.substring(i*ONE_CHUNK, (i*ONE_CHUNK)+ONE_CHUNK));
}
int last_chunk = payload_length - chunks * ONE_CHUNK;
if (last_chunk) {
client.println(acceldata.substring(payload_length-last_chunk, payload_length - 1));
}
}

关于php - 无法使用 SIM800L+ESP32 发送大于 1449 个字符的 HTTP POST 负载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67315656/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com