xref: /OK3568_Linux_fs/docs/cn/Linux/Wifibt/WIFIBT编程接口/最新WIFI接口说明.txt (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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);