首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用ESP- ESP32将图像从ESP32服务器发送到ESP32

使用ESP- ESP32将图像从ESP32服务器发送到ESP32
EN

Stack Overflow用户
提问于 2021-04-19 09:22:04
回答 1查看 709关注 0票数 0

我正试图用WIFI和ESP-以色列国防军从一个node.js服务器发送一个图像到ESP32芯片。我相信这种传输发生在TCP/IP连接上。我能够使用http请求或下面所示的http_perform_as_stream_reader函数发送常规文本数据。但是当涉及到从node.js服务器传输图像时,我无法做到这一点。我好像在客户端收到垃圾。最终目标是将图像保存到ESP32上的save文件中。这是我的密码:

服务器端:

代码语言:javascript
复制
const {imageprocess, convertToBase64} = require('../canvas');
const fs = require('fs');
const express = require('express');
const router = express.Router();
const path = require('path');

const imageFile = path.resolve(__dirname, "../images/file31.png")

router.get('/', funcAllStream)

module.exports = router;


function funcAllStream(req, res, next){
        newStream(res, imageFile)
}

function newStream(res, imageFile){
  var readStream = fs.createReadStream(imageFile);
  readStream.on('data', chunk => {
    res.send(chunk.toString('hex'));
  })
}

客户端(C++):

代码语言:javascript
复制
static void http_perform_as_stream_reader(void)
{
    char *buffer = malloc(MAX_HTTP_RECV_BUFFER + 1);
    esp_http_client_config_t config = {
        .url = "http://192.168.1.155:8085/api?file=image1.png"
    };
    esp_http_client_handle_t client = esp_http_client_init(&config); //calls esp_http_client_init from standard ESP32 component esp_http_client
    esp_err_t err;
    if ((err = esp_http_client_open(client, 0)) != ESP_OK) {
        return;
    }
    int content_length =  esp_http_client_fetch_headers(client); //calls esp_http_client_fetch_headers from standard ESP32 component esp_http_client
    int total_read_len = 0, read_len;
    if (total_read_len < content_length && content_length <= MAX_HTTP_RECV_BUFFER) {//MAX_HTTP_RECV_BUFFER defined to be larger than image1.png file on server side
        read_len = esp_http_client_read(client, buffer, content_length); //calls esp_http_client_read from standard ESP32 component esp_http_client
        if (read_len <= 0) {
            ESP_LOGE(TAG, "Error read data");
        }
        buffer[read_len] = 0;
    }
    esp_http_client_close(client);
    esp_http_client_cleanup(client);
    free(buffer);
}

http_perform_as_stream_reader();

在客户端,我确保为缓冲区分配了比图像文件大小更大的空间。当我打印出客户端缓冲区中存储的内容时,我会看到绝对的垃圾。服务器端发送如下所示的缓冲区流:

代码语言:javascript
复制
<Buffer 89 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52 00 00 00 64 00 00 00 64 08 06 00 00 00 70 e2 95 54 00 00 00 06 62 4b 47 44 00 ff 00 ff 00 ff a0 bd a7 ...>

这是客户端缓冲区在接收数据之前的样子:

代码语言:javascript
复制
���?Lv�~sN\
L��8J��s-�z���a�{�;�����\���~�Y���Di�2���]��|^,�x��N�݁�����`2g����n�w��b�Y�^���a���&��wtD�>n@�PQT�(�.z��(9,�?İ�

这是客户端缓冲区在接收数据后的样子:

代码语言:javascript
复制
HTTP/1.1 200 OK
X-Powered-By: Express
Content-Type: application/octet-stream
Content-Length: 4517
ETag: W/"11a5-IhqwFPYLgC+NRfikTwS2exLtCWQ"
Date: Mon, 19 Apr 2021 16:15:48 GMT
Connection: keep-alive

�PNG

那么,如何确保客户端缓冲区实际上从服务器端以正确的格式接收正确的数据?最后,我希望将数据存储在客户端的spiffs文件中,并打开该文件以显示从node.js服务器传输的图像。

更新:在服务器端将数据转换为十六进制格式后,我可以确认客户端接收到正确的十六进制字符串。这就是我在服务器端和客户端看到的:

代码语言:javascript
复制
89504e470d0a1a0a0000000d4948445200000064000000 ... 0fcc3c0ff03b8c85cc0643044ae0000000049454e44ae426082

启动和结束签名与png文件的签名一致。

我已经将客户端缓冲区设置为10000 (内容长度为9037字节)。不过,我还是收到了两块的六角线。在我的客户端代码中,函数http_perform_as_stream_reader从ESP组件esp_http_client调用esp_http_client_fetch_headers,后者反过来从lwip/src/api/sockets.c调用lwip_rec_tcp函数。由于我已经将缓冲区容量设置为10000 (相当大的数量),所以esp_http_client_fetch_headers将从十六进制字符串中获取相当大的块和头。然后,当http_perform_as_stream_reader函数调用esp_http_client_read函数时,它再次调用lwip_rec_tcp,后者现在运行do .循环,直到检索剩余的服务器端数据为止。由于lwip_rec_tcp将所有数据存储在缓冲区中,该缓冲区的存储容量很低(当然不是我在代码中为它设置的10000 ),所以第一个数据块会被最后的数据块覆盖。那么,如何确保client->response->buffer指针捕获所有数据块,而不修改lwip_rec_tcp以包括将数据上载到do .同时循环?

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67159281

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档