ESP32(WiFi&BLE)+4G摄像头语音视频模块-把拍摄的照片通过http POST上传到服务器,服务器接收图片并存储
<p><iframe name="ifd" src="https://mnifdv.cn/resource/cnblogs/product/audioCamera.html" frameborder="0" scrolling="auto" width="100%" height="1500"></iframe></p>
说明
这节是模组控制摄像头采集到图片以后, 通过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, 采集图片并上传到服务器
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, 服务器程序
<?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; } ?>
.