看来还是自己太天真。。
找到官方提供的历程,移植到工程里。发现后面还有一堆等待判断操作。
现将上面代码中的ret = rw_network_startConfig(CONFIG_EASY);替换为下面一片。
现可以正常与安卓APP对接。
app_demo_ctx.easywps_mode = CONFIG_EASY;
rw_network_startConfig(app_demo_ctx.easywps_mode);
rw_IpConfig_t ipinfo;
while(1) {
if (app_demo_ctx.rw_easywps_status == STATUS_OK) {
app_demo_ctx.rw_easywps_status = STATUS_INIT;
rw_network_init(&conn, DHCP_CLIENT, &ipinfo);
}else if (app_demo_ctx.rw_easywps_status == STATUS_FAIL) {
app_demo_ctx.rw_easywps_status = STATUS_INIT;
}
if (app_demo_ctx.rw_connect_status == STATUS_OK && app_demo_ctx.rw_ipquery_status == STATUS_OK) {
rw_easy_responseToAPP();
}else if (app_demo_ctx.rw_connect_status == STATUS_FAIL || app_demo_ctx.rw_ipquery_status == STATUS_FAIL) {
DPRINTF("reconnect and ipquery...\r\n");
rw_appdemo_context_init();
rw_sysDriverReset();
rw_network_init(&conn, DHCP_CLIENT, NULL);
}
rw_sysSleep(10);
推测分析一下工作机制
app_demo_ctx.easywps_mode = CONFIG_EASY;
rw_network_startConfig(app_demo_ctx.easywps_mode);
先将设备置于easyconfig模式下,在while(1)中等待一个特定的easyconfig的数据包。这时打开手机app按下start后,手机会发送这个easyconfig的数据包,这个数据包里应该包含当前手机连接上的wifi的SSID,BSSID,无线密码,无线通道等信息。同时,手机会在局域网中UDP广播“@LT_EASY_DEVICE@”字符串消息。
if (app_demo_ctx.rw_easywps_status == STATUS_OK) {
app_demo_ctx.rw_easywps_status = STATUS_INIT;
rw_network_init(&conn, DHCP_CLIENT, &ipinfo);
}
设备接收解析这个数据包之后会尝试连接手机连接上的这个Wifi,断点调试得知这个ipinfo里的信息就是需要连接的wifi信息。
if (app_demo_ctx.rw_connect_status == STATUS_OK && app_demo_ctx.rw_ipquery_status == STATUS_OK) {
rw_easy_responseToAPP();
}
连接到同一个wifi之后,尝试和手机进行通信。
void rw_easy_responseToAPP(void)
{
SOCKADDR_IN servAddr;
socklen_t addrlen;
int ret = 0 ;
uint8_t respone_easy[42]={0};
if (app_demo_ctx.easy_sockfd == INVAILD_SOCK_FD)
{
if((ret =RAK_UdpServer(55555)) >= 0) //rak easyconfig use local port 55555
{
app_demo_ctx.easy_sockfd = ret;
DPRINTF("RAK_UdpServer sockfd = %u creat \n\r",app_demo_ctx.easy_sockfd);
}else{
DPRINTF("RAK_UdpServer creat failed\n\r");
return;
}
rwSetFutureStamp((rw_stamp_t*)&app_demo_ctx.easy_rsptimeout, EASY_RSP_TIMEOUT);
}
ret = recvfrom(app_demo_ctx.easy_sockfd, temp_buf, MAX_RECV_PACKET_LEN, 0, (SOCKADDR_IN *)&servAddr, &addrlen);
if (ret <= 0 )
{
if(ret ==RW_ERR_SOCKET_INVAILD){
DPRINTF("recv fd = %u disconnect \n\r", app_demo_ctx.easy_sockfd);
close(app_demo_ctx.easy_sockfd);
app_demo_ctx.easy_sockfd = INVAILD_SOCK_FD; //close
}
}else
{
temp_buf[ret]= 0;
DPRINTF("recvfrom 0x%x:%d on sockfd=%d data_len=%d :%s\n\r", ntohl(servAddr.sin_addr), ntohs(servAddr.sin_port), app_demo_ctx.easy_sockfd, ret ,temp_buf);
if (0 == strncmp(temp_buf,"@LT_EASY_DEVICE@",16))
{
if (rwIsStampPassed((rw_stamp_t*)&app_demo_ctx.easy_rsptimeout))
{
DPRINTF("Easy response timeout ...stop rsponse\n\r");
return;
}
}else if(0 == strncmp(temp_buf,"@LT_WIFI_DEVICE@",16))
{
//提供本地发现服务
}else
{
return;
}
rw_getMacAddr((char*)&respone_easy[36]);
ret = sendto(app_demo_ctx.easy_sockfd, respone_easy, 42, 0, (SOCKADDR_IN *)&servAddr, sizeof(servAddr));
if (ret <= 0 )
{
DPRINTF("sendto data error code =%d\n\r",ret);
}else
{
DPRINTF("local Discovery Response\n\r");
}
}
return ;
}
以上为 rw_easy_responseToAPP(); 函数代码。主要功能就是打开UDP55555端口接收局域网中手机广播的@LT_EASY_DEVICE@字符串。如果比较正确就向手机发送自己的MAC地址(42字节前面36个全是0,最后六个放MAC)。
ret = sendto(app_demo_ctx.easy_sockfd, respone_easy, 42, 0, (SOCKADDR_IN *)&servAddr, sizeof(servAddr));
现在设备向手机发送MAC地址时,不知为何抓取不到数据包。上面这段应该是被执行了,app上可以显示,但是抓包工具获取不到。