大佬们救救我,这个问题困扰我好几天了-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2293|回复: 8

[未解决] 大佬们救救我,这个问题困扰我好几天了

[复制链接]
发表于 2021-9-27 11:10 | 显示全部楼层 |阅读模式
我用的开发板是esp32-cam,用的arduion编程,我是想把拍到的照片上传到一个网站,这个网站要求上传图片要编码成base64数据,通过json格式化请求体,但是我图片的数据编码一直出错。

这个是我程序
static esp_err_t take_send_photo()
{
   //初始化相机并拍照
    Serial.println("Taking picture...");
    camera_fb_t * fb = NULL;
    fb = esp_camera_fb_get();//拍照数据流
    if (!fb) {
      Serial.println("Camera capture failed");
      return ESP_FAIL;
    }

    /**********************************************json格式传输**************************************/
    memset(data_json,'\0',strlen(data_json));//将数组清空
    strcat(data_json,"{");
    strcat(data_json,"\"image\":\"");
    strcat(data_json,base64::encode((uint8_t *)fb->buf,fb->len).c_str());//将照片数据进行base64编码
    strcat(data_json,"\"image_type\": \"BASE64\"");
    strcat(data_json,"\"group_id_list\": \"test01\"");
    strcat(data_json,"}");
    Serial.println(data_json);

    HTTPClient http; //定义服务器对象
    //设置请求url
    http.begin(post_url); //连接服务器
    //设置请求头部信息
    http.addHeader("Content-Type", "application/json"); //服务器上传选择格式选择为application/json
    //发起请求,并获取状态码
    int httpResponseCode = http.POST(data_json);//返回值为状态码 ,此时图片数据往服务器传输

    if(httpResponseCode>0){
        //获取post请求后的服务器响应信息,json格式
        String response = http.getString();  //获取对请求的响应  String为字符串格式 getString()获取响应数据
        Serial.print("Response Msg:");
        Serial.println(response);           // 打印服务器返回的信息

这个是串口返回的数据

这个是串口返回的数据

这个是串口返回的数据
发表于 2021-9-27 11:46 | 显示全部楼层
你自己搭一个TCP Server,检查发过来的数据有没有问题
发表于 2021-9-27 11:46 | 显示全部楼层
你自己搭一个TCP Server,检查发过来的数据有没有问题
发表于 2021-9-27 15:53 | 显示全部楼层
本帖最后由 ifeue 于 2021-9-27 15:57 编辑

你看一下fb->len是多大,是不是分不了那么大内存

String base64::encode(const uint8_t * data, size_t length)
{
    size_t size = base64_encode_expected_len(length) + 1;
    char * buffer = (char *) malloc(size);
    if(buffer) {
        base64_encodestate _state;
        base64_init_encodestate(&_state);
        int len = base64_encode_block((const char *) &data[0], length, &buffer[0], &_state);
        len = base64_encode_blockend((buffer + len), &_state);

        String base64 = String(buffer);
        free(buffer);
        return base64;
    }
    return String("-FAIL-");
}

点评

malloc分不了那么大,不过可以调用外置的SRAM  发表于 2021-9-27 16:01
 楼主| 发表于 2021-9-27 15:58 | 显示全部楼层
ifeue 发表于 2021-9-27 15:53
你看一下fb->len是多大,是不是分不了那么大内存

String base64::encode(const uint8_t * data, size_t le ...

好的我看下
 楼主| 发表于 2021-9-27 16:07 | 显示全部楼层
好像是超出范围了 fb->len居然有118278这么大
 楼主| 发表于 2021-9-28 15:19 | 显示全部楼层
ifeue 发表于 2021-9-27 15:53
你看一下fb->len是多大,是不是分不了那么大内存

String base64::encode(const uint8_t * data, size_t le ...

大佬们有啥办法成功编码,我把图片画质调低都不行。。。。
发表于 2021-9-29 08:39 | 显示全部楼层
千年破晓 发表于 2021-9-28 15:19
大佬们有啥办法成功编码,我把图片画质调低都不行。。。。

看看编译信息的最后部分,看你有多少SRAM可用。

如果不够可考虑外部存储 https://blog.csdn.net/libin55/article/details/108206159
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 23:35 , Processed in 0.086873 second(s), 22 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表