RAK439 easyconfig连接失败的问题



  • 在之前的测试中使用RAK439做AP(上位机主动连接它与它通讯)或是做客户端(它和上位机都同时连接路由器通讯)都可以正常使用。
    现想添加easyconfig功能,用来适应连接各种不同路由器的情况。

    初始化代码如下:
    int ret = 0;
    wifi_init_params(&params);
    ret =rw_sysDriverInit(&params);
    if(ret != RW_OK)
    {
    DPRINTF("RAK module platform init...failed code=%d\r\n", ret);
    return -1;
    }
    rw_getLibVersion(libVersion);
    DPRINTF("rak wifi LibVersion:%s\r\n", libVersion);
    rw_getMacAddr(module_mac);
    DPRINTF("rak wifi module-MAC:%02X:%02X:%02X:%02X:%02X:%02X\r\n", module_mac[0],module_mac[1],module_mac[2],module_mac[3],module_mac[4],module_mac[5]);
    rw_appdemo_context_init();

    	rw_WlanNetworkInfoList_t scan_info;     
    	
    	while(0)
    	{
    		rw_wlanNetworkScan(NULL, 0);    
    		rw_wlanGetScanInfo(&scan_info);   
    		printf("scan num = %d\r\n", scan_info.num);
    		if(scan_info.num > 0)
    		{
    			rw_WlanNetworkInfo_t * info_array= scan_info.WlanNetworkInfo;
    			for(int i=0;i<scan_info.num;i++)
    			{
    				printf("Num[%d] SSID %s \r\n",i,info_array[i].ssid);
    			}
    			vPortFree(scan_info.WlanNetworkInfo);
    			while(1);
    		}
    		systimer->delayms(500);
    	}
    	//ret = rw_network_startSTA();
    	//ret = rw_network_startAP();
    	ret = rw_network_startConfig(CONFIG_EASY);
    	
    	
    	return ret;
    

    忽略扫描部分的代码。
    现在的情况是把ret = rw_network_startConfig(CONFIG_EASY);去掉,打开ret = rw_network_startSTA();或是ret = rw_network_startAP();都是可以正常使用的。说明整体配置都应该是没问题的。

    为了使用easyconfig功能,使用ret = rw_network_startConfig(CONFIG_EASY);而注释掉其他模式的代码。使用官网提供的安卓APP测试。

    操作流程:
    下载程序复位开发板。
    使用手机连接到测试路由器。
    打开easyconfigdemo。
    输入现在连接上的路由器密码。start开始配置。

    现象就是操作失败,配置超时。使用debug断点也发现配置时并没有进入到static void wps_easy_callback(rw_WlanEasyConfigWpsResponse_t* info , int status)回调函数中。

    问题:在代码中是不是只需要调用rw_network_startConfig(CONFIG_EASY);即可?还需要做其他操作吗?望各大牛指导。
    目前官网也没有提供一个详细文档说明easyconfig的使用方法。函数文档也只是稍微提了一下有这个功能。希望能够尽快完善。


  • administrators

    关于easyconfig我们有提供示例代码,就在官网提供的示例代码内。



  • 看来还是自己太天真。。
    找到官方提供的历程,移植到工程里。发现后面还有一堆等待判断操作。

    现将上面代码中的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上可以显示,但是抓包工具获取不到。


登录后回复
 

与 RAK支持中心 的连接断开,我们正在尝试重连,请耐心等待