找回密码
 立即注册
首页 业界区 安全 《ESP32-S3使用指南—IDF版 V1.6》第五十六章 网络摄像 ...

《ESP32-S3使用指南—IDF版 V1.6》第五十六章 网络摄像头实验

迎脾 昨天 11:35
第五十六章 网络摄像头实验
1)实验平台:正点原子DNESP32S3开发板
2)章节摘自【正点原子】ESP32-S3使用指南—IDF版 V1.6
3)购买链接:https://detail.tmall.com/item.htm?&id=768499342659
4)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boards/esp32/ATK-DNESP32S3.html
5)正点原子官方B站:https://space.bilibili.com/394620890
6)正点原子DNESP32S3开发板技术交流群:132780729
1.jpeg

2.png

网络摄像头是传统摄像机与网络视频技术相结合的新一代产品,除了具备一般传统摄像机所有的图像捕捉功能外,机内还内置了数字化压缩控制器和基于WEB的操作系统,使得视频数据经压缩加密后,通过局域网,internet或无线网络送至终端用户。而远端用户可在PC上使用标准的网络浏览器,根据网络摄像机的IP地址,对网络摄像机进行访问,实时监控目标现场的情况,并可对图像资料实时编辑和存储,同时还可以控制摄像机的云台和镜头,进行全方位地监控。本章的实验是以网络调试助手作为客户端,开发板作为服务器。服务器把摄像头处理的数据使用网卡发送至服务器当中,并且在服务器实时更新图像。
本章分为如下几个部分:
56.1 ATK-MC5640&MC2640简介
56.2 硬件设计
56.3 软件设计
56.4 下载验证
56.1 ATK-MC5640&MC2640简介
本实验支持正点原子5640和2640模块,这两个模块的相关资料可在正点原子提供的《ATK-MC2640模块用户手册_V1.1》和《ATK-MC5640模块用户手册V1.0》用户手册查看。
56.2 硬件设计
1.例程功能
本章实验功能简介:开发板主控芯片通过SCCB协议对ATK-MC5640/ ATK-MC2640模块中的摄像头传感器进行配置等通讯,并通过CAMERA接口获取ATK-MC5640/ ATK-MC2640模块输出的JPEG图像数据,然后将获取到的图像实时的发往至正点原子自研的ATK-XCAM软件。
2.硬件资源
1)LED灯
LED-IO1
2)XL9555
IIC_INT-IO0(需在P5连接IO0)
IIC_SDA-IO41
IIC_SCL-IO42
3)SPILCD
CS-IO21
SCK-IO12
SDA-IO11
DC-IO40(在P5端口,使用跳线帽将IO_SET和LCD_DC相连)
PWR- IO1_3(XL9555)
RST- IO1_2(XL9555)
4)CAMERA
OV_SCL-IO38
OV_SDA- IO39
VSYNC- IO47
HREF- IO48
PCLK- IO45
D0- IO4
D1- IO5
D2- IO6
D3- IO7
D4- IO15
D5- IO16
D6- IO17
D7- IO18
RESET-IO0_5(XL9555)
PWDN-IO0_4(XL9555)
3.原理图
CAMERA接口与ESP32-S3的连接关系,如下图所示:
3.png

图56.2.1 CAMERA接口与ESP32-S3的连接电路图
56.3 软件设计
56.3.1 程序流程图
程序流程图能帮助我们更好的理解一个工程的功能和实现的过程,对学习和设计工程有很好的主导作用。下面看看本实验的程序流程图:
4.png

图56.3.1.1 程序流程图
56.3.2 程序解析
在本章节中,我们主要关注两个文件:lwip_demo.c和lwip_demo.h。lwip_demo.h文件主要声明了lwip_demo函数,这部分相对简单,所以我们暂不详细解释。主要关注点是lwip_demo.c文件中的函数。在lwip_demo函数中,我们配置了相关的TCPClient参数,并创建了一个名为lwip_send_thread的发送数据线程。这个线程通过调用scokec函数来发送数据到服务器。接下来,我们将分别详细解释lwip_demo函数和lwip_send_thread任务。
  1. /* 需要自己设置远程IP地址 */
  2. #define IP_ADDR   "192.168.2.245"
  3. #define LWIP_DEMO_RX_BUFSIZE         100               /* 最大接收数据长度 */
  4. #define LWIP_DEMO_PORT               8080                 /* 连接的本地端口号 */
  5. #define LWIP_SEND_THREAD_PRIO        10                /* 发送数据线程优先级 */
  6. /* 接收数据缓冲区 */
  7. uint8_t g_lwip_demo_recvbuf[LWIP_DEMO_RX_BUFSIZE];
  8. /* 数据发送标志位 */
  9. uint8_t g_lwip_send_flag;
  10. int g_sock = -1;
  11. int g_lwip_connect_state = 0;
  12. static void lwip_send_thread(void *arg);
  13. /**
  14. * @brief       发送数据线程
  15. * @param       无
  16. * @retval      无
  17. */
  18. void lwip_data_send(void)
  19. {
  20. xTaskCreate(lwip_send_thread, "lwip_send_thread", 2 * 1024,
  21. NULL, LWIP_SEND_THREAD_PRIO, NULL);
  22. }
  23. /**
  24. * @brief       lwip_demo实验入口
  25. * @param       无
  26. * @retval      无
  27. */
  28. void lwip_demo(void)
  29. {
  30.     int err;
  31.     struct sockaddr_in atk_client_addr;
  32.     int recv_data_len;
  33.     char *tbuf;
  34.    
  35.     lwip_data_send();                                                /* 创建发送数据线程 */
  36.    
  37.     while (1)
  38.     {
  39. sock_start:
  40.         g_lwip_connect_state = 0;
  41.         atk_client_addr.sin_family = AF_INET;              /* 表示IPv4网络协议 */
  42.         atk_client_addr.sin_port = htons(LWIP_DEMO_PORT);       /* 端口号 */
  43.         atk_client_addr.sin_addr.s_addr = inet_addr(IP_ADDR);   /* 远程IP地址 */
  44.         g_sock = socket(AF_INET, SOCK_STREAM, 0);/* 可靠数据流交付服务既是TCP协议 */
  45.         memset(&(atk_client_addr.sin_zero), 0,
  46.                sizeof(atk_client_addr.sin_zero));
  47.         
  48.         tbuf = malloc(200);                                     /* 申请内存 */
  49.         sprintf((char *)tbuf, "Port:%d", LWIP_DEMO_PORT);       /* 客户端端口号 */
  50.         lcd_show_string(5, 170, 200, 16, 16, tbuf, MAGENTA);
  51.         
  52.         /* 连接远程IP地址 */
  53.         err = connect(g_sock, (struct sockaddr *)&atk_client_addr,
  54. sizeof(struct sockaddr));
  55.         if (err == -1)
  56.         {
  57.             lcd_show_string(5, 190, 200, 16, 16, "State:Disconnect", MAGENTA);
  58.             g_sock = -1;
  59.             closesocket(g_sock);
  60.             free(tbuf);
  61.             vTaskDelay(10);
  62.             goto sock_start;
  63.         }
  64.         lcd_show_string(5,190,200,16,16,"State:Connection Successful",MAGENTA);
  65.         g_lwip_connect_state = 1;
  66.         
  67.         while (1)
  68.         {
  69.             recv_data_len = recv(g_sock,g_lwip_demo_recvbuf,
  70.                                  LWIP_DEMO_RX_BUFSIZE,0);
  71.             if (recv_data_len <= 0 )
  72.             {
  73.                 closesocket(g_sock);
  74.                 g_sock = -1;
  75.                 lcd_fill(5, 190, lcd_self.width,320, WHITE);
  76.                 lcd_show_string(5,190, 00,16,16,"State:Disconnect", MAGENTA);
  77.                 free(tbuf);
  78.                 goto sock_start;
  79.             }
  80.             vTaskDelay(1);
  81.         }
  82.     }
  83. }
  84. /**
  85. * @brief       发送数据线程函数
  86. * @param       pvParameters : 传入参数(未用到)
  87. * @retval      无
  88. */
  89. void lwip_send_thread(void *pvParameters)
  90. {
  91.     pvParameters = pvParameters;
  92.    
  93.     camera_fb_t *camera_frame = NULL;
  94.     while (1)
  95.     {
  96.         if (g_lwip_connect_state == 1) /* 有数据要发送 */
  97.         {
  98.             camera_frame = esp_camera_fb_get();
  99.             write(g_sock, camera_frame->buf, camera_frame->len);
  100.             esp_camera_fb_return(camera_frame);
  101.         }
  102.         
  103.         vTaskDelay(1);
  104.     }
  105. }
复制代码
在上述源码中,首先创建了一个用于发送ESP32-S3设备数据的任务。然后,对TCPClient进行网络参数配置,并调用connect函数来建立与远程服务器的连接。当连接成功时,系统将进入接收轮询任务。如果出现断开连接的情况,系统将尝试重新连接服务器。在发送线程中,发送数据前会检查连接标志位。如果标志位有效,则通过write函数发送摄像头图像数据。
56.4 下载验证
在程序中,首先需要设置好能够连接的网络账号和密码。然后,使用笔记本电脑作为终端,确保它与ESP32-S3设备处于同一网络段内。当ESP32-S3设备成功连接到网络时,它的LCD显示屏上会显示相应的内容:
5.png

图56.4.1 设备连接到网络时,LCD显示的信息
打开视频传输上位机,然后配置网络参数,如TCPServer协议、端口号等,最后点击连接,如下图所示。
6.png

图56.4.1 视频传输上位机显示内容

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册