ESP32 http client使用post方法推送图片代码解析

1.ESP32 http_client使用post方法推送图片代码解析

最新学习http_client的post方法,把自己对推送图片函数进行注释一下,共同学习。
源码在上一篇博客:https://editor.csdn.net/md/?articleId=128116094 第二部分“MQTT协议实现公网对讲”。

/推送图片*/
static esp_err_t take_send_photo()
{
Serial.println(“Taking picture…”);
camera_fb_t * fb = NULL;//定义图片指针
esp_err_t res = ESP_OK;

fb = esp_camera_fb_get();//拍照获取一帧图片
if (!fb) {
Serial.println(“Camera capture failed”);
return ESP_FAIL;
}

httpResponseString = “”;//定义字符串,保存服务器端返回的信息
esp_http_client_handle_t http_client;//定义httpClient,分配给HTTP客户端所用的内存
esp_http_client_config_t config_client = {0}; //esp_http_client_config_t结构体,这里主要是初始化了 URL 和http的一个事件
config_client.url = post_url; // 初始化URL
config_client.event_handler = _http_event_handler;// 初始化http的一个事件
config_client.method = HTTP_METHOD_POST;// 初始化http的POST方法
http_client = esp_http_client_init(&config_client);//创建httpClient
esp_http_client_set_post_field(http_client, (const char *)fb->buf, fb->len);//设置http发送的内容和长度,这里发送的是一帧图片
esp_http_client_set_header(http_client, “Content-Type”, “image/jpg”); //设置http头部字段
esp_http_client_set_header(http_client, “Authorization”, uid); //设置http头部字段
esp_http_client_set_header(http_client, “Authtopic”, topic); //设置http头部字段
esp_http_client_set_header(http_client, “wechatmsg”, wechatMsg); //设置http头部字段
esp_http_client_set_header(http_client, “wecommsg”, wecomMsg); //设置http头部字段
esp_http_client_set_header(http_client, “picpath”, urlPath); //设置http头部字段
esp_err_t err = esp_http_client_perform(http_client);//这个函数是重点,完成TCP发送和接收
if (err == ESP_OK) {
Serial.println(httpResponseString);//打印获取的URL
//json数据解析
StaticJsonDocument<200> doc; //声明一个JsonDocument对象
DeserializationError error = deserializeJson(doc, httpResponseString); //httpResponseString为传入的待解析的JSON字符串,存到doc数组中
if (error) {
Serial.print(F("deserializeJson() failed: "));
Serial.println(error.c_str());
}
String url = doc[“url”];//将httpResponseString中的"url"字符串找出赋值给字符串url
Serial.println(url);//打印获取的URL
}
esp_http_client_cleanup(http_client);//它将关闭连接(如果有的话)并释放分配给HTTP客户端的所有内存
esp_camera_fb_return(fb);//释放该帧图片内存
}

2. 上面esp32 client相关的结构体和函数在esp_http_client中定义:

C:\Users\Administrator\esp\esp-idf\components\esp_http_client
在这里插入图片描述

3.json数据相关函数和数据结构在Arduino的系统库中,需要安装.

C:\Users\Administrator\Documents\Arduino\libraries\ArduinoJson
在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用MicroPython代码ESP32-CAM推流到服务器的示例: ```python import network import time import uerrno import usocket as socket import ustruct as struct from machine import Pin from machine import UART from machine import PWM from machine import Timer from machine import ADC from machine import I2C from machine import RTC from machine import SPI import esp32 import os import gc import uasyncio as asyncio import picoweb import ulogging import sensor import image from machine import RTC rtc = RTC() rtc.init((2021, 1, 1, 0, 0, 0, 0, 0)) ssid = 'your_ssid' password = 'your_password' wlan = network.WLAN(network.STA_IF) # 连接WiFi def connect_wifi(): wlan.active(True) if not wlan.isconnected(): print('connecting to network...') wlan.connect(ssid, password) while not wlan.isconnected(): pass print('network config:', wlan.ifconfig()) # 连接WiFi connect_wifi() # 设置日志 logger = ulogging.getLogger('app') logger.setLevel(ulogging.INFO) # 初始化摄像头 sensor.reset() sensor.set_pixformat(sensor.RGB565) sensor.set_framesize(sensor.QVGA) sensor.set_vflip(True) sensor.run(1) # 初始化socket def start_server(): s = socket.socket() s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) s.bind(('0.0.0.0', 554)) s.listen(1) while True: conn, addr = s.accept() logger.info('Client connected from %s' % str(addr)) request = conn.recv(1024) logger.info('Request: %s' % request) response = b'' if request.startswith(b'OPTIONS'): # Respond to OPTIONS request response = b'RTSP/1.0 200 OK\r\nCSeq: 1\r\nPublic: OPTIONS, DESCRIBE, SETUP, TEARDOWN, PLAY, PAUSE\r\n\r\n' elif request.startswith(b'DESCRIBE'): # Respond to DESCRIBE request response = b'RTSP/1.0 200 OK\r\nCSeq: 2\r\nContent-Type: application/sdp\r\n\r\n' \ b'v=0\r\n' \ b'o=- 0 0 IN IP4 127.0.0.1\r\n' \ b's=ESP32CAM Video\r\n' \ b't=0 0\r\n' \ b'a=rtcp-unicast:reflection\r\n' \ b'm=video 0 RTP/AVP 96\r\n' \ b'a=rtpmap:96 H264/90000\r\n' \ b'a=fmtp:96 packetization-mode=1\r\n' elif request.startswith(b'SETUP'): # Respond to SETUP request response = b'RTSP/1.0 200 OK\r\nCSeq: 3\r\nTransport: RTP/AVP;unicast;client_port=5000-5001\r\n\r\n' elif request.startswith(b'PLAY'): # Respond to PLAY request response = b'RTSP/1.0 200 OK\r\nCSeq: 4\r\nRange: npt=0.000-\r\nSession: 1234567890\r\nRTP-Info: url=rtsp://192.168.1.2:554/\r\n\r\n' asyncio.get_event_loop().create_task(send_video(conn)) elif request.startswith(b'TEARDOWN'): # Respond to TEARDOWN request response = b'RTSP/1.0 200 OK\r\nCSeq: 5\r\n\r\n' conn.close() else: logger.error('Unknown request') conn.send(response) # 发送视频流 async def send_video(client): fps = 30 frame_interval = int(1000 / fps) while True: start_time = time.ticks_ms() img = sensor.snapshot() client.sendall(img.to_bytes()) end_time = time.ticks_ms() await asyncio.sleep_ms(frame_interval - (end_time - start_time)) # 启动服务器 start_server() ``` 在此示例中,我们使用了MicroPython的uasyncio模块来异步发送视频流。我们还使用ESP32-CAM的picoweb库来处理RTSP请求。在此示例中,我们将摄像头的视频流发送到客户端,并使用30帧每秒的帧率。你可以通过修改`fps`变量来更改帧率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值