Statistics: Posted by donsbin — Thu Jun 16, 2016 8:28 am
Code:
xQueueHandle MsgQueue; /*创建队列句柄*/
MsgQueue = xQueueCreate(2,sizeof(u16)); //
/******************************************************************************
* FunctionName : udpServer_Task
* Description : UDP任务机制
* Parameters :
* Returns :
* Remarks : 通过队列发送消息
*******************************************************************************/
void udpServer_Task(void *pvParameters)
{
LOCAL int32 sock_fd;
LOCAL int nNetTimeout = 1000; //3s
u8 ret,scanNum = 0;
u16 MsgType = 0xFF;
struct sockaddr_in server_addr;
struct sockaddr_in remoteAddr;
printf("create UDP server!\r\n");
char fromlen;
for(;;)
{
while(1)
{
vTaskDelay(3000/portTICK_RATE_MS);
if (wifi_station_get_connect_status() == STATION_GOT_IP)//
break;
}
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = INADDR_ANY;
server_addr.sin_port = htons(6666);
server_addr.sin_len = sizeof(server_addr);
do{
sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
if (sock_fd == -1)
{
printf("ESP8266 UDP task > failed to create sock!\n");
vTaskDelay(1000/portTICK_RATE_MS);
}
}while(sock_fd == -1);
printf("ESP8266 UDP task > socket OK!\n");
do{
ret = bind(sock_fd, (struct sockaddr *)&server_addr, sizeof(server_addr));
if (ret != 0)
{
printf("ESP8266 UDP task > captdns_task failed to bind sock!\n");
vTaskDelay(1000/portTICK_RATE_MS);
}
}while(ret != 0);
printf("ESP8266 UDP task > bind OK!\n");
memset(&remoteAddr, 0, sizeof(remoteAddr));
setsockopt(sock_fd, SOL_SOCKET, SO_RCVTIMEO, /*0*/&nNetTimeout,sizeof(int));
fromlen = sizeof(struct sockaddr_in);
while(1)
{
vTaskDelay(10 / portTICK_RATE_MS);
char *udp_msg = (char *)zalloc(256);
memset(&remoteAddr, 0, sizeof(remoteAddr));
fromlen = sizeof(struct sockaddr_in);
ret = recvfrom(sock_fd, (uint8 *)udp_msg, 256, 0,(struct sockaddr*)&remoteAddr,(socklen_t *)&fromlen);
if (ret > 0 && ret != 0xFF)
{
MsgType = 0xFF;
if(xQueueSendToBack( MsgQueue, ( void *)&MsgType, 0 ) != pdPASS)/* UDP接收到数据后发送消息队列就会出现程序错误 */
printf("send channel msg error!~\r\n");
else
printf("send channel msg success~\r\n");
}
free(udp_msg);
//if(xQueueSendToBack( MsgQueue, ( void *)&MsgType, 0 ) != pdPASS)/* 没有收到数据调用不会出错 */
// ;
}
close(sock_fd);
}
}
Statistics: Posted by donsbin — Wed Jun 15, 2016 8:33 pm