OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 190|回复: 2

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

[复制链接]

1196

主题

1210

帖子

2

精华

超级版主

Rank: 8Rank: 8

积分
5157
金钱
5157
注册时间
2019-5-8
在线时间
1286 小时
发表于 昨天 09:10 | 显示全部楼层 |阅读模式
第五十六章 网络摄像头实验

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


2.jpg

3.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的连接关系,如下图所示:

第五十六章 网络摄像头实验1074.png
图56.2.1 CAMERA接口与ESP32-S3的连接电路图

56.3 软件设计

56.3.1 程序流程图
程序流程图能帮助我们更好的理解一个工程的功能和实现的过程,对学习和设计工程有很好的主导作用。下面看看本实验的程序流程图:

第五十六章 网络摄像头实验1218.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. <font size="3">/* 需要自己设置远程IP地址 */</font>
  2. <font size="3">#define IP_ADDR   "192.168.2.245"</font>

  3. <font size="3">#define LWIP_DEMO_RX_BUFSIZE         100               /* 最大接收数据长度 */</font>
  4. <font size="3">#define LWIP_DEMO_PORT               8080                 /* 连接的本地端口号 */</font>
  5. <font size="3">#define LWIP_SEND_THREAD_PRIO        10                /* 发送数据线程优先级 */</font>
  6. <font size="3">/* 接收数据缓冲区 */</font>
  7. <font size="3">uint8_t g_lwip_demo_recvbuf[LWIP_DEMO_RX_BUFSIZE]; </font>

  8. <font size="3">/* 数据发送标志位 */</font>
  9. <font size="3">uint8_t g_lwip_send_flag;</font>
  10. <font size="3">int g_sock = -1;</font>
  11. <font size="3">int g_lwip_connect_state = 0;</font>
  12. <font size="3">static void lwip_send_thread(void *arg);</font>


  13. <font size="3">/**</font>
  14. <font size="3"> * @brief       发送数据线程</font>
  15. <font size="3"> * [url=home.php?mod=space&uid=271674]@param[/url]       无</font>
  16. <font size="3"> * @retval      无</font>
  17. <font size="3"> */</font>
  18. <font size="3">void lwip_data_send(void)</font>
  19. <font size="3">{</font>
  20. <font size="3">xTaskCreate(lwip_send_thread, "lwip_send_thread", 2 * 1024, </font>
  21. <font size="3">NULL, LWIP_SEND_THREAD_PRIO, NULL);</font>
  22. <font size="3">}</font>

  23. <font size="3">/**</font>
  24. <font size="3"> * @brief       lwip_demo实验入口</font>
  25. <font size="3"> * @param       无</font>
  26. <font size="3"> * @retval      无</font>
  27. <font size="3"> */</font>
  28. <font size="3">void lwip_demo(void)</font>
  29. <font size="3">{</font>
  30. <font size="3">    int err;</font>
  31. <font size="3">    struct sockaddr_in atk_client_addr;</font>
  32. <font size="3">    int recv_data_len;</font>
  33. <font size="3">    char *tbuf;</font>
  34. <font size="3">    </font>
  35. <font size="3">    lwip_data_send();                                                /* 创建发送数据线程 */</font>
  36. <font size="3">    </font>
  37. <font size="3">    while (1)</font>
  38. <font size="3">    {</font>
  39. <font size="3">sock_start:</font>
  40. <font size="3">        g_lwip_connect_state = 0;</font>
  41. <font size="3">        atk_client_addr.sin_family = AF_INET;              /* 表示IPv4网络协议 */</font>
  42. <font size="3">        atk_client_addr.sin_port = htons(LWIP_DEMO_PORT);       /* 端口号 */</font>
  43. <font size="3">        atk_client_addr.sin_addr.s_addr = inet_addr(IP_ADDR);   /* 远程IP地址 */</font>
  44. <font size="3">        g_sock = socket(AF_INET, SOCK_STREAM, 0);/* 可靠数据流交付服务既是TCP协议 */</font>
  45. <font size="3">        memset(&(atk_client_addr.sin_zero), 0,</font>
  46. <font size="3">               sizeof(atk_client_addr.sin_zero));</font>
  47. <font size="3">        </font>
  48. <font size="3">        tbuf = malloc(200);                                     /* 申请内存 */</font>
  49. <font size="3">        sprintf((char *)tbuf, "Port:%d", LWIP_DEMO_PORT);       /* 客户端端口号 */</font>
  50. <font size="3">        lcd_show_string(5, 170, 200, 16, 16, tbuf, MAGENTA);</font>
  51. <font size="3">        </font>
  52. <font size="3">        /* 连接远程IP地址 */</font>
  53. <font size="3">        err = connect(g_sock, (struct sockaddr *)&atk_client_addr, </font>
  54. <font size="3">sizeof(struct sockaddr));</font>

  55. <font size="3">        if (err == -1)</font>
  56. <font size="3">        {</font>
  57. <font size="3">            lcd_show_string(5, 190, 200, 16, 16, "State<img src="static/image/smiley/default/biggrin.gif" border="0" smilieid="3" alt=":D">isconnect", MAGENTA);</font>
  58. <font size="3">            g_sock = -1;</font>
  59. <font size="3">            closesocket(g_sock);</font>
  60. <font size="3">            free(tbuf);</font>
  61. <font size="3">            vTaskDelay(10);</font>
  62. <font size="3">            goto sock_start;</font>
  63. <font size="3">        }</font>

  64. <font size="3">        lcd_show_string(5,190,200,16,16,"State:Connection Successful",MAGENTA);</font>
  65. <font size="3">        g_lwip_connect_state = 1;</font>
  66. <font size="3">        </font>
  67. <font size="3">        while (1)</font>
  68. <font size="3">        {</font>
  69. <font size="3">            recv_data_len = recv(g_sock,g_lwip_demo_recvbuf,</font>
  70. <font size="3">                                 LWIP_DEMO_RX_BUFSIZE,0);</font>
  71. <font size="3">            if (recv_data_len <= 0 )</font>
  72. <font size="3">            {</font>
  73. <font size="3">                closesocket(g_sock);</font>
  74. <font size="3">                g_sock = -1;</font>
  75. <font size="3">                lcd_fill(5, 190, lcd_self.width,320, WHITE);</font>
  76. <font size="3">                lcd_show_string(5,190, 00,16,16,"State<img src="static/image/smiley/default/biggrin.gif" border="0" smilieid="3" alt=":D">isconnect", MAGENTA);</font>
  77. <font size="3">                free(tbuf);</font>
  78. <font size="3">                goto sock_start;</font>
  79. <font size="3">            }</font>

  80. <font size="3">            vTaskDelay(1);</font>
  81. <font size="3">        }</font>
  82. <font size="3">    }</font>
  83. <font size="3">}</font>

  84. <font size="3">/**</font>
  85. <font size="3"> * @brief       发送数据线程函数</font>
  86. <font size="3"> * @param       pvParameters : 传入参数(未用到)</font>
  87. <font size="3"> * @retval      无</font>
  88. <font size="3"> */</font>
  89. <font size="3">void lwip_send_thread(void *pvParameters)</font>
  90. <font size="3">{</font>
  91. <font size="3">    pvParameters = pvParameters;</font>
  92. <font size="3">    </font>
  93. <font size="3">    camera_fb_t *camera_frame = NULL;</font>
  94. <font size="3">    while (1)</font>
  95. <font size="3">    {</font>
  96. <font size="3">        if (g_lwip_connect_state == 1) /* 有数据要发送 */</font>
  97. <font size="3">        {</font>
  98. <font size="3">            camera_frame = esp_camera_fb_get();</font>
  99. <font size="3">            write(g_sock, camera_frame->buf, camera_frame->len);</font>
  100. <font size="3">            esp_camera_fb_return(camera_frame);</font>
  101. <font size="3">        }</font>
  102. <font size="3">        </font>
  103. <font size="3">        vTaskDelay(1);</font>
  104. <font size="3">    }</font>
  105. <font size="3">}</font>
复制代码
在上述源码中,首先创建了一个用于发送ESP32-S3设备数据的任务。然后,对TCPClient进行网络参数配置,并调用connect函数来建立与远程服务器的连接。当连接成功时,系统将进入接收轮询任务。如果出现断开连接的情况,系统将尝试重新连接服务器。在发送线程中,发送数据前会检查连接标志位。如果标志位有效,则通过write函数发送摄像头图像数据。

56.4 下载验证
在程序中,首先需要设置好能够连接的网络账号和密码。然后,使用笔记本电脑作为终端,确保它与ESP32-S3设备处于同一网络段内。当ESP32-S3设备成功连接到网络时,它的LCD显示屏上会显示相应的内容:

第五十六章 网络摄像头实验4947.png
图56.4.1 设备连接到网络时,LCD显示的信息

打开视频传输上位机,然后配置网络参数,如TCPServer协议、端口号等,最后点击连接,如下图所示。

第五十六章 网络摄像头实验5027.png
图56.4.1 视频传输上位机显示内容
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2019-4-20
在线时间
4 小时
发表于 昨天 09:54 | 显示全部楼层
为什么ESP32-S3使用指南—IDF版中,没有BLE的相关章节?Arduino版的有BLE的相关内容,但是Arduino使用的是CPP,所使用的函数跟IDF差异很大的,ESP32-S3使用指南—IDF版是否会加入BLE的相关章节?

一个把正点原子开发板搓到冒烟的原子的铁粉,非常感谢!
回复 支持 反对

使用道具 举报

1196

主题

1210

帖子

2

精华

超级版主

Rank: 8Rank: 8

积分
5157
金钱
5157
注册时间
2019-5-8
在线时间
1286 小时
 楼主| 发表于 昨天 10:13 | 显示全部楼层
skyzone2000 发表于 2025-11-22 09:54
为什么ESP32-S3使用指南—IDF版中,没有BLE的相关章节?Arduino版的有BLE的相关内容,但是Arduino使用的是C ...

您好,感谢您的支持,关于您提到的问题,后续会在教程里进行更新,敬请期待
回复 支持 反对

使用道具 举报

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

本版积分规则


关闭

原子哥极力推荐上一条 /1 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-11-23 00:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表