数码之家

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

搜索
查看: 22|回复: 0

《DNESP32S3使用指南-IDF版_V1.6》第五十六章 网络摄像头实验

[复制链接]
发表于 6 小时前 | 显示全部楼层 |阅读模式
第五十六章 网络摄像头实验

网络摄像头是传统摄像机与网络视频技术相结合的新一代产品,除了具备一般传统摄像机所有的图像捕捉功能外,机内还内置了数字化压缩控制器和基于WEB的操作系统,使得视频数据经压缩加密后,通过局域网,internet或无线网络送至终端用户。而远端用户可在PC上使用标准的网络浏览器,根据网络摄像机的IP地址,对网络摄像机进行访问,实时监控目标现场的情况,并可对图像资料实时编辑和存储,同时还可以控制摄像机的云台和镜头,进行全方位地监控。本章的实验是以网络调试助手作为客户端,开发板作为服务器。服务器把摄像头处理的数据使用网卡发送至服务器当中,并且在服务器实时更新图像。
本章分为如下几个部分:
56.1 ATK-MC5640&MC2640简介
56.2 硬件设计
56.3 软件设计
56.4 下载验证


56.1 ATK-MC5640&MC2640简介
本实验支持正点原子56402640模块,这两个模块的相关资料可在正点原子提供的《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. 硬件资源
1LED
LED-IO1
2XL9555
IIC_INT-IO0(需在P5连接IO0)
IIC_SDA-IO41
IIC_SCL-IO42
3SPILCD
CS-IO21
SCK-IO12
SDA-IO11
DC-IO40(在P5端口,使用跳线帽将IO_SETLCD_DC相连)
PWR- IO1_3XL9555)
RST- IO1_2XL9555)
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_5XL9555)
  PWDN-IO0_4XL9555)
3. 原理图
CAMERA接口与ESP32-S3的连接关系,如下图所示:
56.2.1 CAMERA接口与ESP32-S3的连接电路图
56.3 软件设计
56.3.1 程序流程图
程序流程图能帮助我们更好的理解一个工程的功能和实现的过程,对学习和设计工程有很好的主导作用。下面看看本实验的程序流程图:
56.3.1.1 程序流程图
56.3.2 程序解析
在本章节中,我们主要关注两个文件:lwip_demo.clwip_demo.hlwip_demo.h文件主要声明了lwip_demo函数,这部分相对简单,所以我们暂不详细解释。主要关注点是lwip_demo.c文件中的函数。在lwip_demo函数中,我们配置了相关的TCPClient参数,并创建了一个名为lwip_send_thread的发送数据线程。这个线程通过调用scokec函数来发送数据到服务器。接下来,我们将分别详细解释lwip_demo函数和lwip_send_thread任务。
/* 需要自己设置远程IP地址 */
#define IP_ADDR   "192.168.2.245"
#define LWIP_DEMO_RX_BUFSIZE         100        /* 最大接收数据长度 */
#define LWIP_DEMO_PORT               8080          /* 连接的本地端口号 */
#define LWIP_SEND_THREAD_PRIO        10         /* 发送数据线程优先级 */
/* 接收数据缓冲区 */
uint8_t g_lwip_demo_recvbuf[LWIP_DEMO_RX_BUFSIZE];
/* 数据发送标志位 */
uint8_t g_lwip_send_flag;
int g_sock = -1;
int g_lwip_connect_state = 0;
static void lwip_send_thread(void *arg);
/**
* @brief       发送数据线程
* @param      
* @retval      
*/
void lwip_data_send(void)
{
xTaskCreate(lwip_send_thread, "lwip_send_thread", 2 * 1024,
NULL, LWIP_SEND_THREAD_PRIO, NULL);
}
/**
* @brief       lwip_demo实验入口
* @param      
* @retval      
*/
void lwip_demo(void)
{
    int err;
    struct sockaddr_in atk_client_addr;
    int recv_data_len;
    char *tbuf;
   
    lwip_data_send();                                  /* 创建发送数据线程 */
   
    while (1)
    {
sock_start:
        g_lwip_connect_state = 0;
        atk_client_addr.sin_family = AF_INET;              /* 表示IPv4网络协议 */
        atk_client_addr.sin_port = htons(LWIP_DEMO_PORT);       /* 端口号 */
        atk_client_addr.sin_addr.s_addr = inet_addr(IP_ADDR);   /* 远程IP地址 */
        g_sock = socket(AF_INET, SOCK_STREAM, 0);/* 可靠数据流交付服务既是TCP协议 */
        memset(&(atk_client_addr.sin_zero), 0,
               sizeof(atk_client_addr.sin_zero));
        
        tbuf = malloc(200);                                     /* 申请内存 */
        sprintf((char *)tbuf, "Port:%d", LWIP_DEMO_PORT);       /* 客户端端口号 */
        lcd_show_string(5, 170, 200, 16, 16, tbuf, MAGENTA);
        
        /* 连接远程IP地址 */
        err = connect(g_sock, (struct sockaddr *)&atk_client_addr,
sizeof(struct sockaddr));
        if (err == -1)
        {
            lcd_show_string(5, 190, 200, 16, 16, "State:Disconnect", MAGENTA);
            g_sock = -1;
            closesocket(g_sock);
            free(tbuf);
            vTaskDelay(10);
            goto sock_start;
        }
        lcd_show_string(5,190,200,16,16,"State:Connection Successful",MAGENTA);
        g_lwip_connect_state = 1;
        
        while (1)
        {
            recv_data_len = recv(g_sock,g_lwip_demo_recvbuf,
                                 LWIP_DEMO_RX_BUFSIZE,0);
            if (recv_data_len <= 0 )
            {
                closesocket(g_sock);
                g_sock = -1;
                lcd_fill(5, 190, lcd_self.width,320, WHITE);
                lcd_show_string(5,190, 00,16,16,"State:Disconnect", MAGENTA);
                free(tbuf);
                goto sock_start;
            }
            vTaskDelay(1);
        }
    }
}
/**
* @brief       发送数据线程函数
* @param       pvParameters : 传入参数(未用到)
* @retval      
*/
void lwip_send_thread(void *pvParameters)
{
    pvParameters = pvParameters;
   
    camera_fb_t *camera_frame = NULL;
    while (1)
    {
        if (g_lwip_connect_state == 1) /* 有数据要发送 */
        {
            camera_frame = esp_camera_fb_get();
            write(g_sock, camera_frame->buf, camera_frame->len);
            esp_camera_fb_return(camera_frame);
        }
        
        vTaskDelay(1);
    }
}
在上述源码中,首先创建了一个用于发送ESP32-S3设备数据的任务。然后,对TCPClient进行网络参数配置,并调用connect函数来建立与远程服务器的连接。当连接成功时,系统将进入接收轮询任务。如果出现断开连接的情况,系统将尝试重新连接服务器。在发送线程中,发送数据前会检查连接标志位。如果标志位有效,则通过write函数发送摄像头图像数据。
56.4 下载验证
在程序中,首先需要设置好能够连接的网络账号和密码。然后,使用笔记本电脑作为终端,确保它与ESP32-S3设备处于同一网络段内。当ESP32-S3设备成功连接到网络时,它的LCD显示屏上会显示相应的内容:
56.4.1 设备连接到网络时,LCD显示的信息
打开视频传输上位机,然后配置网络参数,如TCPServer协议、端口号等,最后点击连接,如下图所示。
56.4.1 视频传输上位机显示内容

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

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

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-10-23 15:42 , Processed in 0.140400 second(s), 6 queries , Gzip On, Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

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