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