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

2024-08-20 09:10:25 浏览数 (2)

说明

这节是模组控制摄像头采集到图片以后, 通过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-d-d d:d:d",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;
}

?>

.

0 人点赞