新手上路
- 积分
- 48
- 金钱
- 48
- 注册时间
- 2018-10-14
- 在线时间
- 5 小时
|

楼主 |
发表于 2018-10-27 21:45:45
|
显示全部楼层
/******************************************************************************/
//网络摄像头任务
void NetCamera_Task(void *arg)
{
OS_ERR os_err;
err_t lwip_err;
u8 res=0;
struct netconn *tcp_conn;
struct netconn *server_conn;
ip_addr_t ipaddr;
u16 port;
u32 *tbuf;
CPU_SR_ALLOC();
LWIP_UNUSED_ARG(arg);
NetCamera_CloseFLAG=0; //初始化标志;
server_conn=netconn_new(NETCONN_TCP); //创建 netconn_tcp服务器链接
netconn_bind(server_conn,IP_ADDR_ANY,8080); //将本机IP,端口绑定至服务器链接
lwip_err=netconn_listen(server_conn); //服务器进入监听状态
if(lwip_err==ERR_OK)
{
while(NetCamera_CloseFLAG==0) //如果收到请求,自动关闭
{
server_conn->recv_timeout =10; //10ms,设置监听超时,防止阻塞线程
lwip_err=netconn_accept(server_conn,&tcp_conn); //获取服务器监听到的链接
server_conn->recv_timeout =0; //取消超时,永不超时
if(lwip_err==ERR_OK)
{
netconn_getaddr(tcp_conn,&ipaddr,&port,0); //获取IP,端口号(远端)
printf("\r\n远程客户端: IP: %d.%d.%d.%d Port: %04d已连接!\r\n",ip4_addr1(&ipaddr),ip4_addr2(&ipaddr),ip4_addr3(&ipaddr),ip4_addr4(&ipaddr),port); //打印远端IP,端口号
NetCamera_Init(); //初始化网络摄像头
delay_ms(1000); //延时100ms,必须延时
while(1)
{
OS_CRITICAL_ENTER();
res=netcam_fifo_read(&tbuf); //将NetCamera数据读入FIFO
OS_CRITICAL_EXIT();
if(res) //读取到数据
{
lwip_err=netconn_write(tcp_conn,tbuf,NETCAM_LINE_SIZE*4,NETCONN_COPY); //netconn发送数据(复制)
}else lwip_err=netconn_err(tcp_conn); //获取netconn_err
if(lwip_err==ERR_CLSD||lwip_err==ERR_RST||NetCamera_CloseFLAG)
{
NetCamera_DeInit(); //关闭NetCamera摄像头
netconn_close(tcp_conn); //关闭netconn链接
netconn_delete(tcp_conn); //删除tcp_conn链接
printf("\r\n断开链接: IP: %d.%d.%d.%d;\r\n",ip4_addr1(&ipaddr),ip4_addr2(&ipaddr),ip4_addr3(&ipaddr),ip4_addr4(&ipaddr));
break; //跳出
}
OSTimeDlyHMSM(0,0,0,2,OS_OPT_TIME_HMSM_STRICT,&os_err); //周期2ms
}
}
OSTimeDlyHMSM(0,0,0,200,OS_OPT_TIME_HMSM_STRICT,&os_err); //200ms
}
netconn_close(server_conn); //关闭服务器链接
netconn_delete(server_conn); //失败,删除服务器链接
TCP_Server_Clear_TimeWait(); //强制删除 timewait pcb块
}else printf("\r\nserver_conn链接创建失败: %d\r\n",lwip_err);
NetCamera_CloseFLAG=0; //已关闭,清除请求
while(1)OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_HMSM_STRICT,&os_err); //网络摄像头进入关闭态
}
/******************************************************************************/ |
|