金牌会员
 
- 积分
- 1342
- 金钱
- 1342
- 注册时间
- 2021-4-28
- 在线时间
- 504 小时
|

楼主 |
发表于 2022-7-31 20:42:33
|
显示全部楼层
//网络摄像头任务
void netcamera_task(void *arg)
{
err_t err;
struct netconn *conn;
static ip_addr_t ipaddr;
u8 remot_addr[4];
static u16_t port;
u8 res=0;
u32 *tbuf;
LWIP_UNUSED_ARG(arg);
conn = netconn_new(NETCONN_TCP); //创建一个TCP链接
netconn_bind(conn,IP_ADDR_ANY,8088); //绑定端口 8088号端口
netconn_listen(conn); //进入监听模式
while(1) //等待连接
{
err=netconn_accept(conn,&newconn); //接收连接请求
if(err==ERR_OK) //成功检测到连接
{
if (client_init(newconn) != ERR_OK)
{
netconn_close(newconn);
netconn_delete(newconn);
}
newconn->recv_timeout = 10; /* 防止阻塞 */
netconn_getaddr(newconn,&ipaddr,&port,0); //获取远端IP地址和端口号
remot_addr[3]=(uint8_t)(ipaddr.addr>>24);
remot_addr[2]=(uint8_t)(ipaddr.addr>>16);
remot_addr[1]=(uint8_t)(ipaddr.addr>>8);
remot_addr[0]=(uint8_t)(ipaddr.addr);
printf("主机%d.%d.%d.%d连接上网络摄像头服务器,主机端口号为:%d\r\n",\
remot_addr[0],remot_addr[1],remot_addr[2],remot_addr[3],port);
g_tcp_server_flag |= 1 << 0;
camera_init();
delay_ms(1000); //此延时一定要加!!
while(1) //开始视频传输
{
res=netcam_fifo_read(&tbuf); //读取FIFO中的数据
if(res) //有数据要发送
{
err=netconn_write(newconn,tbuf,NETCAM_LINE_SIZE*4,NETCONN_COPY);//发送数据
if((err==ERR_CLSD)||(err==ERR_RST))//关闭连接,或者重启网络
{
camera_deinit();//复位网络摄像头
netconn_close(newconn);
netconn_delete(newconn);
g_tcp_server_flag = 0;
printf("主机:%d.%d.%d.%d断开与视频服务器的连接\r\n",\
remot_addr[0], remot_addr[1],remot_addr[2],remot_addr[3]);
break;
}
}else
{
OSTimeDlyHMSM(0,0,0,10);//延时2ms
}
}
}
}
}
void tcp_recv_thread(void *arg)
{
err_t recv_err;
struct pbuf *q;
uint32_t data_len = 0;
OS_CPU_SR cpu_sr = 0; /* 定义一开关中断变量 */
LWIP_UNUSED_ARG(arg); /* 防止报错 */
while(1)
{
if ((g_tcp_server_flag & TCP_SERVER_EN_FLAG) == TCP_SERVER_EN_FLAG)
{
struct netbuf *recvbuf;
// newconn->recv_timeout = 10;
/* 接收端 */
if ((recv_err = netconn_recv(clientaddr.conn[1],&recvbuf)) == ERR_OK) /* 接收数据不为空 */
{
OS_ENTER_CRITICAL(); /* 进入临界区 */
memset(tcp_server_recvbuf,0,TCP_SERVER_RX_BUFSIZE); /* 接收缓冲区清零 */
for(q = recvbuf->p;q != NULL;q = q->next) /* 遍寻下一个pbuf */
{
if (q ->len > (TCP_SERVER_RX_BUFSIZE - data_len))
{
memcpy(tcp_server_recvbuf + data_len,q ->payload,(TCP_SERVER_RX_BUFSIZE - data_len));
}
else
{
memcpy(tcp_server_recvbuf + data_len,q ->payload,q ->len);
}
data_len += q->len;
if (data_len > TCP_SERVER_RX_BUFSIZE) /* 超过TCP接收数组 */
{
break; /* 跳出 */
}
}
OS_EXIT_CRITICAL(); /* 退出临界区 */
data_len = 0;
printf("%s\r\n",tcp_server_recvbuf);
netbuf_delete(recvbuf);
}
else if (recv_err == ERR_CLSD)
{
netconn_close(clientaddr.conn[1]);
netconn_delete(clientaddr.conn[1]);
printf("客户端主机:%d.%d.%d.%d断开连接\r\n",lwipdev.remoteip[0],lwipdev.remoteip[1], lwipdev.remoteip[2],lwipdev.remoteip[3]);
break;
}
}
OSTimeDlyHMSM(0,0,0,500);
}
} |
|