1*4882a593SmuzhiyunRK平台WIFI API说明 2*4882a593Smuzhiyun 3*4882a593Smuzhiyuntest/ 测试源码目录 4*4882a593Smuzhiyuninclude/ API头文件目录 5*4882a593Smuzhiyunlibrkwifibt.so WiFi应用依赖库 6*4882a593Smuzhiyun 7*4882a593Smuzhiyun//test目录说明: 8*4882a593Smuzhiyun//RK WiFi自测程序,WiFi相关API的使用可参考rk_wifi_test.c 9*4882a593Smuzhiyunmain.c 10*4882a593Smuzhiyunrk_wifi_test.c 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun//SOFTAP相关的实现源码 13*4882a593Smuzhiyunsoftap/ 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun//编程注意事项: 16*4882a593Smuzhiyun1. RK_wifi_register_callback:切记不要在WiFi的回调函数里面做任何耗时或阻塞的操作,它仅仅反馈WiFi的状态; 17*4882a593Smuzhiyun2. RK_wifi_enable(0/1): 打开或关闭时,一定要等待RK_WIFI_State_OPEN/RK_WIFI_State_OFF事件反馈,再做下一步操作; 18*4882a593Smuzhiyun3. RK_wifi_scan_r/RK_wifi_getSavedInfo 这两个API会返回数据给应用,切记要释放返回的指针,防止内存泄露,参考rk_wifi_test.c 19*4882a593Smuzhiyun4. RK_wifi_enable之前要注册RK_wifi_register_callback回调,监听连接的状态。 20*4882a593Smuzhiyun5. RK_wifi_connect是非阻塞函数,返回不等于连接成功,要在callback里面确认上一次的连接结果,否则下一次connect调用不会被执行。 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun//其它 23*4882a593Smuzhiyun如果库或程序运行错误请确保buildroot配置确保如下配置打开: 24*4882a593SmuzhiyunBR2_PACKAGE_WPA_SUPPLICANT_WPA_CLIENT_SO 25*4882a593SmuzhiyunBR2_PACKAGE_BLUEZ5_UTILS 26*4882a593Smuzhiyun 27*4882a593Smuzhiyun//错误示范: 28*4882a593Smuzhiyun 29*4882a593Smuzhiyun 30*4882a593SmuzhiyunAPI说明: 31*4882a593Smuzhiyun//EVENT 事件回调函数,事件如下: 32*4882a593Smuzhiyuntypedef enum { 33*4882a593Smuzhiyun RK_WIFI_State_IDLE = 0, 34*4882a593Smuzhiyun RK_WIFI_State_CONNECTING, 35*4882a593Smuzhiyun RK_WIFI_State_CONNECTFAILED, 36*4882a593Smuzhiyun RK_WIFI_State_CONNECTFAILED_WRONG_KEY, 37*4882a593Smuzhiyun RK_WIFI_State_CONNECTED, 38*4882a593Smuzhiyun RK_WIFI_State_DISCONNECTED, 39*4882a593Smuzhiyun RK_WIFI_State_OPEN, 40*4882a593Smuzhiyun RK_WIFI_State_OFF, 41*4882a593Smuzhiyun RK_WIFI_State_SCAN_RESULTS, 42*4882a593Smuzhiyun RK_WIFI_State_DHCP_OK, 43*4882a593Smuzhiyun} RK_WIFI_RUNNING_State_e; 44*4882a593Smuzhiyunint RK_wifi_register_callback(RK_wifi_state_callback cb); 45*4882a593Smuzhiyun 46*4882a593Smuzhiyun//获取当前WiFi状态 47*4882a593Smuzhiyunint RK_wifi_running_getState(RK_WIFI_RUNNING_State_e* pState); 48*4882a593Smuzhiyun 49*4882a593Smuzhiyun//获取当前WiFi的详细信息: 50*4882a593Smuzhiyuntypedef struct { 51*4882a593Smuzhiyun int id; 52*4882a593Smuzhiyun char bssid[BSSID_BUF_LEN]; 53*4882a593Smuzhiyun char ssid[SSID_BUF_LEN]; 54*4882a593Smuzhiyun int freq; 55*4882a593Smuzhiyun char mode[20]; 56*4882a593Smuzhiyun char wpa_state[20]; 57*4882a593Smuzhiyun char ip_address[20]; 58*4882a593Smuzhiyun char mac_address[20]; 59*4882a593Smuzhiyun int reason; 60*4882a593Smuzhiyun} RK_WIFI_INFO_Connection_s; 61*4882a593Smuzhiyunint RK_wifi_running_getConnectionInfo(RK_WIFI_INFO_Connection_s* pInfo); 62*4882a593Smuzhiyun 63*4882a593Smuzhiyun//打开关闭WIFI 64*4882a593Smuzhiyunint RK_wifi_enable(int enable); 65*4882a593Smuzhiyun 66*4882a593Smuzhiyun//发起扫描: 67*4882a593Smuzhiyunint RK_wifi_scan(void); 68*4882a593Smuzhiyun 69*4882a593Smuzhiyun//获取扫描结果,以json格式返回 70*4882a593Smuzhiyunchar* RK_wifi_scan_r(void); 71*4882a593Smuzhiyun 72*4882a593Smuzhiyun//连接WiFi 73*4882a593Smuzhiyunint RK_wifi_connect(char* ssid, const char* psk); 74*4882a593Smuzhiyun 75*4882a593Smuzhiyun//连接WEP加密的WiFi 76*4882a593Smuzhiyunint RK_wifi_connect_wep(char* ssid, const char* psk); 77*4882a593Smuzhiyun 78*4882a593Smuzhiyun//断开WiFi 79*4882a593Smuzhiyunint RK_wifi_disconnect_network(void); 80*4882a593Smuzhiyun 81*4882a593Smuzhiyun//忘记之前连接SSID 82*4882a593Smuzhiyunint RK_wifi_forget_with_ssid(char *ssid); 83*4882a593Smuzhiyun 84*4882a593Smuzhiyun//取消正在连接的WiFi 85*4882a593Smuzhiyunint RK_wifi_cancel(void); 86*4882a593Smuzhiyun 87*4882a593Smuzhiyun//获取之前连接过的WiFi, ap_cnt为之前连过的个数 88*4882a593Smuzhiyuntypedef struct { 89*4882a593Smuzhiyun int id; 90*4882a593Smuzhiyun char bssid[BSSID_BUF_LEN]; 91*4882a593Smuzhiyun char ssid[SSID_BUF_LEN]; 92*4882a593Smuzhiyun char state[STATE_BUF_LEN]; 93*4882a593Smuzhiyun} RK_WIFI_SAVED_INFO_s; 94*4882a593Smuzhiyunint RK_wifi_getSavedInfo(RK_WIFI_SAVED_INFO_s **pInfo, int *ap_cnt); 95*4882a593Smuzhiyun 96*4882a593Smuzhiyun//连接之前连接过的WiFi,参数为SSID 97*4882a593Smuzhiyunint RK_wifi_connect_with_ssid(char* ssid); 98*4882a593Smuzhiyun 99*4882a593Smuzhiyun//恢复WiFi出厂设置 100*4882a593Smuzhiyunint RK_wifi_reset(void); 101*4882a593Smuzhiyun 102*4882a593Smuzhiyun//SOFTAP模式下获取WIFI扫描结果,以json格式返回 103*4882a593Smuzhiyunchar *RK_wifi_scan_for_softap(void) 104*4882a593Smuzhiyun 105*4882a593Smuzhiyun 106*4882a593Smuzhiyun//SOFTAP功能开源,源码参考test/softap/softap.c 107*4882a593Smuzhiyun//回调event 108*4882a593Smuzhiyuntypedef enum { 109*4882a593Smuzhiyun RK_SOFTAP_STATE_IDLE=0, 110*4882a593Smuzhiyun RK_SOFTAP_STATE_CONNECTTING, 111*4882a593Smuzhiyun RK_SOFTAP_STATE_SUCCESS, 112*4882a593Smuzhiyun RK_SOFTAP_STATE_FAIL, 113*4882a593Smuzhiyun RK_SOFTAP_STATE_DISCONNECT, 114*4882a593Smuzhiyun} RK_SOFTAP_STATE; 115*4882a593Smuzhiyunint RK_softap_register_callback(RK_SOFTAP_STATE_CALLBACK cb) 116*4882a593Smuzhiyun 117*4882a593Smuzhiyun//启动热点,psk为空则为不加密,IP网关地址(暂未使用,softap固定为:10.201.126.1,可以根据实际需求更改) 118*4882a593Smuzhiyunint wifi_start_hostapd(char *ssid, char *psk, char *ip) 119*4882a593Smuzhiyun 120*4882a593Smuzhiyun//关闭热点 121*4882a593Smuzhiyunint wifi_stop_hostapd(void) 122*4882a593Smuzhiyun 123*4882a593Smuzhiyun//SOFTAP配网DEMO 124*4882a593Smuzhiyun//启动一个名为name的热点,并开始配网流程,正常情况下手机在setting界面找到并连接上面启动的热点 125*4882a593Smuzhiyunint RK_softap_start(char *name, RK_SOFTAP_SERVER_TYPE server_type) 126*4882a593Smuzhiyun{ 127*4882a593Smuzhiyun //打开WiFi 128*4882a593Smuzhiyun RK_wifi_enable(1); 129*4882a593Smuzhiyun //启动热点 130*4882a593Smuzhiyun wifi_start_hostapd(name, NULL, NULL); 131*4882a593Smuzhiyun //启动跟手机数据交互服务,依赖手机APK端的实现,根据实际需求修改 132*4882a593Smuzhiyun startTcpServer(); 133*4882a593Smuzhiyun 134*4882a593Smuzhiyun return 0; 135*4882a593Smuzhiyun} 136*4882a593Smuzhiyun 137*4882a593Smuzhiyun//startTcpServer启动一个跟手机交互的线程,端口:#define SOCKET_PORT 8443 138*4882a593Smuzhiyunstatic void *threadAccept(void *arg) 139*4882a593Smuzhiyun{ 140*4882a593Smuzhiyun ... ... 141*4882a593Smuzhiyun while (1) 142*4882a593Smuzhiyun fd_client = accept(fd_server, (struct sockaddr *)&addr_client, &len_addr_client); 143*4882a593Smuzhiyun handleRequest(fd_client); 144*4882a593Smuzhiyun if (strstr(buf, REQUEST_WIFI_LIST)) { 145*4882a593Smuzhiyun //收到手机侧的获取WiFi列表命令 146*4882a593Smuzhiyun sendWifiList(fd_client, buf); 147*4882a593Smuzhiyun RK_wifi_scan(); 148*4882a593Smuzhiyun RK_wifi_scan_for_softap(); 149*4882a593Smuzhiyun send(fd, send_msg, sizeof(send_msg), 0); 150*4882a593Smuzhiyun } else if (strstr(buf, REQUEST_WIFI_SET_UP)) { 151*4882a593Smuzhiyun //收到手机侧的获取WiFi列表命令 152*4882a593Smuzhiyun wifiSetup(fd_client, buf); 153*4882a593Smuzhiyun //解析手机发来的ssid/psk,然后调用连接API 154*4882a593Smuzhiyun RK_wifi_connect(softap_ssid, softap_psk); 155*4882a593Smuzhiyun } else if (strstr(buf, REQUEST_IS_WIFI_CONNECTED)) { 156*4882a593Smuzhiyun isWifiConnected(fd_client, buf); 157*4882a593Smuzhiyun //手机侧循环发送获取WiFi的连接状态 158*4882a593Smuzhiyun if (!RK_wifi_running_getConnectionInfo(&info)) { 159*4882a593Smuzhiyun if (strncmp(info.wpa_state, "COMPLETED", 9) == 0) //如果连接成功 160*4882a593Smuzhiyun isConn = 1; 161*4882a593Smuzhiyun } 162*4882a593Smuzhiyun snprintf(msg, sizeof(msg), HTTP_RESPOSE_MESSAGE, 1, isConn ? "1" : "0"); 163*4882a593Smuzhiyun send(fd, msg, sizeof(msg), 0) //发送成功的信息给手机 164*4882a593Smuzhiyun } else if (strstr(buf, REQUEST_POST_CONNECT_RESULT)) { 165*4882a593Smuzhiyun //收到手机侧的配网完成指令 166*4882a593Smuzhiyun doConnectResult(fd_client, buf); 167*4882a593Smuzhiyun wifi_stop_hostapd();//关闭热点 168*4882a593Smuzhiyun } 169*4882a593Smuzhiyun ... ... 170*4882a593Smuzhiyun} 171*4882a593Smuzhiyun 172*4882a593Smuzhiyun//关闭配网 173*4882a593Smuzhiyunint RK_softap_stop(void);