我根据 RTOS SDK 进行UDP 例子测试 代码如下:
1. 设置ESP8266 为 SotfAP mode
Code: Select all
void Set_wifi_softAP(void)
{
struct ip_info info;
struct softap_config cfg;
wifi_softap_get_config(&cfg);
strcpy((char *)cfg.ssid, "ESP8266_Mrtech_RTOS");
cfg.ssid_len = strlen((char*)cfg.ssid);
//strcpy((char *)cfg.password, "123456789");// password should be more than 8~63 charater
//cfg.authmode = AUTH_WPA2_PSK; // make password mode working
wifi_softap_set_config_current(&cfg);
wifi_set_opmode(SOFTAP_MODE);
wifi_softap_dhcps_stop();
IP4_ADDR(&info.ip, 192, 168, 101, 1);
IP4_ADDR(&info.gw, 192, 168, 101, 1);
IP4_ADDR(&info.netmask, 255, 255, 255, 0);
wifi_set_ip_info(SOFTAP_IF, &info);
dhcps_lease_test();
wifi_softap_dhcps_start();
}
2. 新建一个 TestUDPTask 函数
Code: Select all
void TestUPDtask(void *pvParameters)
{
struct sockaddr_in server_addr, client_addr;
socklen_t client_len;
int server_sock;
char * udp_msg;
int ret;
int nNetTimeout = 1000;
udp_msg = (char *)malloc(UDP_DATA_LEN); //UDP_DATA_LEN = 2048
//bzero(&server_addr, sizeof(struct sockaddr_in)); /* Zero out structure */
memset(&server_addr, 0, sizeof(struct sockaddr_in));/* Zero out structure */
server_addr.sin_family = AF_INET; /* Internet address family IPV4 */
server_addr.sin_addr.s_addr = INADDR_ANY; /* Any incoming interface */
server_addr.sin_port = htons(LOCAL_UDP_PORT); /* Local port =1200*/
server_addr.sin_len = sizeof(server_addr);
do{
server_sock = socket(AF_INET, SOCK_STREAM, 0);/* Create a socket steam type */
if (server_sock == -1)
{
printf("creat a socket fail !!!");
asm("break 1,1");
}
}while(server_sock == -1);
printf("creat socket success !!!");
do{
ret = bind(server_sock, (struct sockaddr *)(&server_addr), sizeof(struct sockaddr));/* Bind a socket */
if (ret != 0)
{
printf("bind a socket fail !!!");
asm("break 1,1");
}
} while(ret != 0);
printf("bind socket success !!!");
for (;;)
{
memset(udp_msg, 0, UDP_DATA_LEN);
memset(&client_addr, 0, sizeof(client_addr));
setsockopt(server_sock, SOL_SOCKET, SO_RCVTIMEO,100, sizeof(int));
client_len = sizeof(struct sockaddr_in);
ret = recvfrom(server_sock, (uint8 *)udp_msg, UDP_DATA_LEN, 0, (struct sockaddr *)&client_addr, (socklen_t *)client_len);
//client_addr.sin_port = 1200;
if (ret > 0){
printf("ESP8266 UDP task > recv %d Bytes from Port %d %s\n", ret, ntohs(client_addr.sin_port), inet_ntoa(client_addr.sin_addr));
}
else{
printf("ESP8266 UDP task >receive nothing!!");
}
sendto(server_sock, (uint8 *)udp_msg, ret, 0, (struct sockaddr *)&client_addr, client_len);
}
if (udp_msg){
free(udp_msg);
udp_msg = NULL;
}
closesocket(server_sock);/* Close socket*/
}
3. 主函数user_init() 中创建Task
Code: Select all
void RAMFUNC user_init(void)
{
#ifdef ESP8266_GDBSTUB
gdbstub_init();
#endif
uart_init_new();
Set_wifi_softAP();
xTaskCreate(TestUPDtask, (signed char *)"TestUDP", 256, NULL, 2, NULL);
}
结果 启动后,串口一直打印 以下信息!!!!!
Code: Select all
d€?炧噑n'済?炷湝渓?ccgn冧c涿{r'沴刲 €?哙弐'g渙?靹溰?刣bcg'?b靸rso娩噹lg噺驌l筘?鋌?儧倱`貃o?熰莧oo渘?鋵湝躼滌c#ng?b|?{r'沴刲 焸凔熰噑o?靹湝??#bog?巆靸s{g冹菑db儍n??rson??鋵軠??d`?g??{r'g渙?靹溰??l`?踘|?熰剝{損`蹆泜'銓抈c{b?咪s踓?炧噑n'済弻軠?瀸?ccno媚#鋬;so沝宭`{ls???$鞆屒d専銊cl刢l`{empty
mode : softAP(5e:cf:7f:07:0d:7d)
dhcp server start:(ip:192.168.101.1,mask:255.255.255.0,gw:192.168.101.1)
add if1
bcn 100
creat socket success !!!bind socket success !!!Fatal exception (9):
epc1=0x40268ff0
epc2=0x00000000
epc3=0x4024c16a
epcvaddr=0x00000001
depc=0x00000000
rtn_add=0x3fff5050
ets Jan 8 2013,rst cause:2, boot mode:(3,6)
load 0x40100000, len 30576, room 16
tail 0
chksum 0xb0
load 0x3ffe8000, len 1164, room 8
tail 4
chksum 0xd1
load 0x3ffe8490, len 1124, room 4
tail 0
chksum 0x98
csum 0x98
屆諄MEM CHECK FAIL!!!
请问是什么问题!!!!