前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ESP32(WiFi&BLE)+4G摄像头语音视频模块-把拍摄的照片通过http POST上传到服务器,服务器接收图片并存储

ESP32(WiFi&BLE)+4G摄像头语音视频模块-把拍摄的照片通过http POST上传到服务器,服务器接收图片并存储

作者头像
杨奉武
发布2024-08-20 09:10:25
1200
发布2024-08-20 09:10:25
举报
文章被收录于专栏:知识分享

说明

这节是模组控制摄像头采集到图片以后, 通过HTTP  POST方式上传到服务器,

服务器接收以后存储起来.

拍摄室外

拍摄室内

测试

1,安装好手机卡,4G天线,摄像头

2,此功能需要web服务器,然后服务器上是使用PHP接收的数据

把这个文件夹放到自己的web服务器根目录

Windows:(根据自己的服务器配置!!!!)

Linux:(根据自己的服务器配置!!!!)

3,把这节的工程放到开发环境目录里面并解压

4,右键选择通过 Code 打开

5,在main函数, 把前面的mnifdv.cn 替换为自己的服务器ip地址

6,然后点击这个 进行编译

提示: 第一次编译时间有点长, 编译完这一次后面再编译就快了

7,下载到设备

8,下载完成以后打开串口监控助手(主要为了看运行日志)

9,服务器上PHP目录将会生成一个audioCamera文件夹

文件夹里面会生成以4G设备IMEI号的文件夹

文件夹里面是设备上报的图片,图片是以上报时间命名

程序说明

1,4G模组初始化,摄像头初始化

提示:当前摄像头设置的为1080P,但是实际摄像头达不到.

实际内部会切换为1600x1200

2, 采集图片并上传到服务器

代码语言:javascript
复制
static void http_camera_task(void *pvParameters)
{
    int len;

    camera_fb_t *fb = NULL;
    esp_err_t res = ESP_OK;
    size_t _jpg_buf_len;
    uint8_t *_jpg_buf;

    char data_time[70]="";//图片上报的时间
    char data_imei[70];//4G设备的imei
    char data_sn[70];//4G设备的sn
    char data_iccid[70];//4G设备的iccid
    char data_imsi[70];//4G设备的imsi
    char data_rssi[70];//设备的信号强度

    //时间
    time_t time1 = 0;
    time_t time_stamp;//时间戳
    struct tm timeinfo = { 0 };

    //http
    esp_http_client_config_t config = {
        .url = "http://mnifdv.cn/PHP/audio_camera.php",
        .method = HTTP_METHOD_POST,
        .event_handler = _http_event_handler,
        .timeout_ms = 6000,
    };

    while (true)
    {
        //获取时间
        time_stamp = time(&time1);//返回的是时间戳
        // gmtime_r(&time1, &timeinfo);//获取的是格林时间
        localtime_r(&time1, &timeinfo);//获取本地时间

        ESP_LOGI(TAG, "time_stamp:%ld y:%d,m:%d,d:%d %d:%d:%d",
        time_stamp,
        timeinfo.tm_year+1900,
        timeinfo.tm_mon+1, 
        timeinfo.tm_mday,
        timeinfo.tm_hour, 
        timeinfo.tm_min,
        timeinfo.tm_sec
        );
        
        fb = esp_camera_fb_get();//获取图片
        if (!fb)
        {
            ESP_LOGE(TAG, "Camera capture failed");
            res = ESP_FAIL;
            break;
        }
        if (fb->format != PIXFORMAT_JPEG)//如果获取的图片格式不是jpg转成jpg
        {
            bool jpeg_converted = frame2jpg(fb, 50, &_jpg_buf, &_jpg_buf_len);
            if (!jpeg_converted)
            {
                ESP_LOGE(TAG, "JPEG compression failed");
                esp_camera_fb_return(fb);
                res = ESP_FAIL;
            }
        }
        else
        {
            _jpg_buf_len = fb->len;
            _jpg_buf = fb->buf;
        }

        if (res == ESP_OK && (timeinfo.tm_year+1900)>2023)//拍照成功,同时获取到时间
        {
            ESP_LOGI(TAG, "image size: %zu bytes;width:%d;height:%d", fb->len,fb->width,fb->height);
            //初始化
            esp_http_client_handle_t esp_client = esp_http_client_init(&config);
            //设置HTTP请求头为image/jpg表示图片类型
            esp_http_client_set_header(esp_client, "Content-Type", "image/jpg");
            //上报图片拍照时间
            memset(data_time,0,sizeof(data_time));
            snprintf(data_time,sizeof(data_time),"%d-%02d-%02d %02d:%02d:%02d",timeinfo.tm_year+1900,timeinfo.tm_mon+1,timeinfo.tm_mday,timeinfo.tm_hour,timeinfo.tm_min,timeinfo.tm_sec);
            esp_http_client_set_header(esp_client, "Data-Time", data_time);
            //上报4G摄像头的imei
            memset(data_imei,0,sizeof(data_imei));
            snprintf(data_imei,sizeof(data_imei),"%s",modem_imei);
            esp_http_client_set_header(esp_client, "Data-Imei", data_imei);
            //上报4G摄像头的sn
            memset(data_sn,0,sizeof(data_sn));
            snprintf(data_sn,sizeof(data_sn),"%s",modem_sn);
            esp_http_client_set_header(esp_client, "Data-Sn", data_sn);
            //上报4G摄像头的iccid
            memset(data_iccid,0,sizeof(data_iccid));
            snprintf(data_iccid,sizeof(data_iccid),"%s",modem_iccid);
            esp_http_client_set_header(esp_client, "Data-Iccid", data_iccid);
            //上报4G摄像头的imsi
            memset(data_imsi,0,sizeof(data_imsi));
            snprintf(data_imsi,sizeof(data_imsi),"%s",modem_imsi);
            esp_http_client_set_header(esp_client, "Data-Imsi", data_imsi);
            //上报4G摄像头的信号强度
            memset(data_rssi,0,sizeof(data_rssi));
            snprintf(data_rssi,sizeof(data_rssi),"%d",modem_rssi);
            esp_http_client_set_header(esp_client, "Data-Rssi", data_rssi);
            
            //把图片放在body里面
            esp_http_client_set_post_field(esp_client, (const char *)fb->buf, fb->len);

            //发送post数据
            res = esp_http_client_perform(esp_client);

            //获取发送状态
            if (res == ESP_OK)
            {
                ESP_LOGI(TAG, "esp_http_client_get_status_code=%d",esp_http_client_get_status_code(esp_client));
            }
            else
            {
                ESP_LOGD(TAG, "esp_err: %s", esp_err_to_name(res));
            }

            ESP_ERROR_CHECK(esp_http_client_cleanup(esp_client));//清理
        }


        if (fb->format != PIXFORMAT_JPEG)
        {
            free(_jpg_buf);
        }
        esp_camera_fb_return(fb);
        if (res != ESP_OK)
        {
            break;
        }

        if ((timeinfo.tm_year+1900)>2023)//获取到时间
        {
            vTaskDelay(pdMS_TO_TICKS(10000));//延时10S拍照
        }
        else
        {
            vTaskDelay(pdMS_TO_TICKS(10));
        }
    }
    return res;
}

3, 服务器程序

代码语言:javascript
复制
<?php

$getPostDataArry = apache_request_headers();

try 
{
    $data_time = $getPostDataArry['Data-Time'];//时间
    $data_imei = $getPostDataArry['Data-Imei'];//设备的IMEI
    $data_sn = $getPostDataArry['Data-Sn'];//设备的SN码
    $data_iccid = $getPostDataArry['Data-Iccid'];//设备sim卡的ICCID
    $data_imsi = $getPostDataArry['Data-Imsi'];//设备sim卡的IMSI
    $data_rssi = $getPostDataArry['Data-Rssi'];//设备的4G信号强度
    
    //在当前路径创建一个audio_camera文件夹
    if(is_dir("audio_camera") === false ){
        mkdir("audio_camera",0777);
    }
    
    /*使用设备上传的imei创建一个文件夹*/
    if(is_dir("./audio_camera/".$data_imei) === false )
    {
        mkdir("./audio_camera/".$data_imei,0777);
    }
    
    //接受数据流
    $stream = file_get_contents('php://input');
    //数据流转化为png格式,并保存在指定的位置
    $len = file_put_contents("./audio_camera/".$data_imei."/" . $data_time . ".png", $stream);
    
    
    $ret = array('code'=>'OK','imei'=>$data_imei);//组合成key-value形式的数组
    echo json_encode($ret);//把数组转为json格式
} catch (Exception $e) {
    echo $e;
}

?>

.

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-08-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 说明
    • 这节是模组控制摄像头采集到图片以后, 通过HTTP  POST方式上传到服务器,
      • 服务器接收以后存储起来.
        • 拍摄室外
          • 拍摄室内
          • 测试
            • 1,安装好手机卡,4G天线,摄像头
              • 2,此功能需要web服务器,然后服务器上是使用PHP接收的数据
                • 把这个文件夹放到自己的web服务器根目录
                • Windows:(根据自己的服务器配置!!!!)
                • Linux:(根据自己的服务器配置!!!!)
              • 3,把这节的工程放到开发环境目录里面并解压
                • 4,右键选择通过 Code 打开
                  • 5,在main函数, 把前面的mnifdv.cn 替换为自己的服务器ip地址
                    • 6,然后点击这个 进行编译
                      • 提示: 第一次编译时间有点长, 编译完这一次后面再编译就快了
                    • 7,下载到设备
                      • 8,下载完成以后打开串口监控助手(主要为了看运行日志)
                        • 9,服务器上PHP目录将会生成一个audioCamera文件夹
                          • 文件夹里面会生成以4G设备IMEI号的文件夹
                            • 文件夹里面是设备上报的图片,图片是以上报时间命名
                            • 程序说明
                              • 1,4G模组初始化,摄像头初始化
                                • 提示:当前摄像头设置的为1080P,但是实际摄像头达不到.
                                • 实际内部会切换为1600x1200
                              • 2, 采集图片并上传到服务器
                                • 3, 服务器程序
                                相关产品与服务
                                对象存储
                                对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
                                领券
                                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档