Arduino GET请求解析大数据

时间:2020-04-21 23:41:47

标签: http parsing arduino embedded microcontroller

在将图像转换为1位BMP图像,然后将该BMP图像转换为十六进制值后,我试图解析从Web服务器接收到的十六进制值。 Arduino nano IoT 33通过HTTP GET请求接收此数据。这些数据基本上用于更新连接到Arduino的eInk显示。目的是用我想要的任何图像无线更新显示。我可以成功地将数据发送到Arduino,由于接收到的数据的大小,解析该数据需要花费大量时间。接收到的数据的Content-Length平均为80540。

我已经尝试了以下讨论中提到的代码,但是,庞大的数据使处理过程缓慢到Arduino不能执行任何操作而IDE崩溃的地步。

https://forum.arduino.cc/index.php?topic=49357.0

https://forum.arduino.cc/index.php?topic=281897.0

我在下面附加了一个屏幕截图,其中显示了我收到的部分数据。

是否可以使用任何方式或任何库来解析这些大数据并将其保存到可用于更新eInk显示的数组中?一个响应将不胜感激。

enter image description here

3 个答案:

答案 0 :(得分:0)

正如评论已经指出的那样,32KB RAM不足以容纳平均80KB的存储空间。除了选择其他微控制器之外,您还可以尝试将图像拆分为多个块(也许是8K?),将每个块都传输到自己的GET请求中,然后在请求下一个块之前在显示器上绘制每个块。

答案 1 :(得分:0)

鉴于内存和CPU限制,可以采用几种方法。我假设您可以为其中一些修改服务器代码(或在中间放置一个代理,以相应地修改响应)。

您可能需要实现其中的一种以上,以解决董事会的局限性。

通过客户请求整理响应

Arduino客户端可以请求数据块并在请求下一个数据块之前对其进行处理。可以通过“分页”请求或使用标头Transfer-Encoding: chunked

在服务器响应中使用更高效的编码

示例响应将单个八位字节编码为六个字符(例如0xff,)。

更改为二进制响应会将示例80KB减少到大约14KB。可以返回一个简单的二进制转储。例如HTTP响应(带有Content-Type: application/octet-stream标头)可以具有纯二进制有效载荷。

如果您需要将响应保留为文本,那么即使使用base 64编码,也比当前的十六进制编码更具存储效率。

在服务器响应中使用压缩编码(例如RLE)

这不是通过HTTP压缩来压缩响应有效负载,因为Arduino可能没有内存或CPU来处理它。

相反,“运行长度编码”可能会压缩有效负载以足以适合内存占用量。高效的RLE解码器应该能够使用少量的RAM / CPU。

RLE通常非常适合1位图像的压缩。

答案 2 :(得分:0)

我通过这段代码解析 HTML 数据

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

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //physical mac address
byte myserver[] = { 199, 166, 222, 111}; //

EthernetClient client;

void setup() {

  Ethernet.begin(mac);
  Serial.begin(9600);
  
}

void loop() {

  delay(1000);
 
  if (client.connect(myserver, 8081)) {  
    Serial.println("connected");
    client.println("GET /adress HTTP/1.0"); //GET request
    client.println(); //end of get request

  }
  else {
    Serial.println("connection failed"); 
    Serial.println();
  }

  while (client.connected() && !client.available()) delay(100); 
  while (client.connected() || client.available()) { 

    char webdata = client.read(); 
     // parse webdata as string
  }

  Serial.println("disconnecting.");
  client.stop(); //stop client

}

我用 W5100 以太网屏蔽来做

相关问题