/* * 硬件平台相关,UDP监听端口数据接收处理函数 */ void wifilan_recv_callbk(void *arg, char *pdata, unsigned short len) { airkiss_lan_ret_t ret = airkiss_lan_recv(pdata, len, &akconf); airkiss_lan_ret_t packret; switch (ret) { case AIRKISS_LAN_SSDP_REQ: airkiss_udp.remote_port = DEFAULT_LAN_PORT; lan_buf_len = sizeof(lan_buf); packret = airkiss_lan_pack(AIRKISS_LAN_SSDP_RESP_CMD, DEVICE_TYPE, DEVICE_ID, 0, 0, lan_buf, &lan_buf_len, &akconf); if (packret != AIRKISS_LAN_PAKE_READY) { uart0_sendStr("Pack lan packet error!\r\n"); return; } packret = espconn_sent(&ptrairudpconn, lan_buf, lan_buf_len); if (packret != 0) { uart0_sendStr("LAN UDP Send err!\r\n"); } else { // close the udp 12476 } break; default: uart0_sendStr("Pack is not ssdq req!\r\n"); break; } }
LOCAL void ICACHE_FLASH_ATTR airkiss_wifilan_recv_callbk(void *arg, char *pdata, unsigned short len) { uint16 i; remot_info* pcon_info = NULL; airkiss_lan_ret_t ret = airkiss_lan_recv(pdata, len, &akconf); airkiss_lan_ret_t packret; switch (ret){ case AIRKISS_LAN_SSDP_REQ: espconn_get_connection_info(&pssdpudpconn, &pcon_info, 0); os_printf("remote ip: %d.%d.%d.%d \r\n",pcon_info->remote_ip[0],pcon_info->remote_ip[1], pcon_info->remote_ip[2],pcon_info->remote_ip[3]); os_printf("remote port: %d \r\n",pcon_info->remote_port); pssdpudpconn.proto.udp->remote_port = pcon_info->remote_port; memcpy(pssdpudpconn.proto.udp->remote_ip,pcon_info->remote_ip,4); ssdp_udp.remote_port = DEFAULT_LAN_PORT; lan_buf_len = sizeof(lan_buf); packret = airkiss_lan_pack(AIRKISS_LAN_SSDP_RESP_CMD, DEVICE_TYPE, DEVICE_ID, 0, 0, lan_buf, &lan_buf_len, &akconf); if (packret != AIRKISS_LAN_PAKE_READY) { os_printf("Pack lan packet error!"); return; } os_printf("\r\n\r\n"); for (i=0; i<lan_buf_len; i++) os_printf("%c",lan_buf[i]); os_printf("\r\n\r\n"); packret = espconn_sendto(&pssdpudpconn, lan_buf, lan_buf_len); if (packret != 0) { os_printf("LAN UDP Send err!"); } break; default: os_printf("Pack is not ssdq req!%d\r\n",ret); break; } }
static void ak_discovery_thread(void *arg) { UNUSED_PARAMETER( arg ); OSStatus err; struct sockaddr_t addr; socklen_t addr_len = sizeof(addr); struct timeval_t t; int udp_fd = -1 ; fd_set readfds; char *buf = NULL; ssize_t len = 0; int ret; buf = (char*)malloc( 1024 ); require_action( buf, exit, err = kNoMemoryErr ); /*Establish a UDP port to receive any data sent to this port*/ udp_fd = socket( AF_INET, SOCK_DGRM, IPPROTO_UDP ); require_action( IsValidSocket( udp_fd ), exit, err = kNoResourcesErr ); addr.s_ip = INADDR_ANY; addr.s_port = LOCAL_UDP_PORT; err = bind(udp_fd, &addr, sizeof(addr)); require_noerr( err, exit ); t.tv_sec = 5; t.tv_usec = 0; while(1) { //udp_broadcast_log( "broadcast now!" ); FD_ZERO( &readfds ); FD_SET( udp_fd, &readfds ); require_action( select( udp_fd + 1, &readfds, NULL, NULL, &t) >= 0, exit, err = kConnectionErr ); /* recv wlan data, and send back */ if( FD_ISSET( udp_fd, &readfds ) ) { memset(buf, 0x0, 1024); len = recvfrom( udp_fd, buf, 1024, 0, &addr, &addr_len); require_action( len >= 0, exit, err = kConnectionErr ); airkiss_log("Airkiss discover request received, length=%d", len); ret = airkiss_lan_recv(buf, len, &akconf); switch (ret){ case AIRKISS_LAN_SSDP_REQ: len = 1024; ret = airkiss_lan_pack(AIRKISS_LAN_SSDP_RESP_CMD, _appid, _deviceid, 0, 0, buf, (unsigned short *)&len, &akconf); require_action( ret == AIRKISS_LAN_PAKE_READY, exit, err = kMalformedErr ); len = sendto( udp_fd, buf, len, 0, &addr, sizeof(addr) ); require_action( len >= 0, exit, err = kConnectionErr ); break; default: airkiss_log("Pack is not ssdq req!"); break; } } if(_started == false) goto exit; } exit: if( err != kNoErr ) airkiss_log("Airkiss discover thread exit with err: %d", err); if(buf) free(buf); SocketClose( &udp_fd ); mico_rtos_delete_thread(NULL); }