1 #include <unistd.h>
2 #include <stdio.h>
3 #include <string.h>
4 #include <errno.h>
5 #include <pthread.h>
6 #include <sys/prctl.h>
7 #include <sys/time.h>
8 #include <stdbool.h>
9
10 #include "Rk_wifi.h"
11 #include "Rk_softap.h"
12
13 struct wifi_info {
14 int ssid_len;
15 char ssid[512];
16 int psk_len;
17 char psk[512];
18 };
19
printf_system_time()20 static void printf_system_time()
21 {
22 struct timeval tv;
23 gettimeofday(&tv, NULL);
24
25 printf("--- time: %lld ms ---\n", tv.tv_sec * 1000 + tv.tv_usec/1000 + tv.tv_usec%1000);
26 }
27
ping_test()28 static void ping_test()
29 {
30 char line[2048];
31
32 while(1) {
33 sleep(1);
34 #if 0
35 if (RK_wifi_ping("www.baidu.com")) {
36 printf("ping ok\n");
37 printf_system_time();
38 rk_wifi_getConnectionInfo(NULL);
39 break;
40 }
41 //#else
42 memset(line, 0, sizeof(line));
43 RK_shell_exec("ping www.baidu.com -c 1", line, sizeof(line));
44 //RK_shell_exec("ping 8.8.8.8 -c 1", line, sizeof(line));
45 //usleep(100000);
46 printf("line: %s\n", line);
47 if (strstr(line, "PING www.baidu.com") && strstr(line, "bytes from")) {
48 //if (strstr(line, "PING 8.8.8.8") && strstr(line, "bytes from")) {
49 printf("ping ok\n");
50 printf_system_time();
51 rk_wifi_getConnectionInfo(NULL);
52 break;
53 }
54 #endif
55 usleep(100000);
56 }
57 }
58
printf_connect_info(RK_WIFI_INFO_Connection_s * info)59 static void printf_connect_info(RK_WIFI_INFO_Connection_s *info)
60 {
61 if(!info)
62 return;
63
64 printf(" id: %d\n", info->id);
65 printf(" bssid: %s\n", info->bssid);
66 printf(" ssid: %s\n", info->ssid);
67 printf(" freq: %d\n", info->freq);
68 printf(" mode: %s\n", info->mode);
69 printf(" wpa_state: %s\n", info->wpa_state);
70 printf(" ip_address: %s\n", info->ip_address);
71 printf(" mac_address: %s\n", info->mac_address);
72 }
73
74 /*****************************************************************
75 * wifi config *
76 *****************************************************************/
77 static volatile bool rkwifi_gonff = false;
78 static RK_WIFI_RUNNING_State_e wifi_state = 0;
rk_wifi_state_callback(RK_WIFI_RUNNING_State_e state,RK_WIFI_INFO_Connection_s * info)79 static int rk_wifi_state_callback(RK_WIFI_RUNNING_State_e state, RK_WIFI_INFO_Connection_s *info)
80 {
81 printf("%s state: %d\n", __func__, state);
82 printf_connect_info(info);
83
84 wifi_state = state;
85 if (state == RK_WIFI_State_CONNECTED) {
86 printf("RK_WIFI_State_CONNECTED\n");
87 //ping_test();
88 //RK_wifi_get_connected_ap_rssi();
89 } else if (state == RK_WIFI_State_CONNECTFAILED) {
90 printf("RK_WIFI_State_CONNECTFAILED\n");
91 } else if (state == RK_WIFI_State_CONNECTFAILED_WRONG_KEY) {
92 printf("RK_WIFI_State_CONNECTFAILED_WRONG_KEY\n");
93 } else if (state == RK_WIFI_State_OPEN) {
94 rkwifi_gonff = true;
95 printf("RK_WIFI_State_OPEN\n");
96 } else if (state == RK_WIFI_State_OFF) {
97 rkwifi_gonff = false;
98 printf("RK_WIFI_State_OFF\n");
99 } else if (state == RK_WIFI_State_DISCONNECTED) {
100 printf("RK_WIFI_State_DISCONNECTED\n");
101 } else if (state == RK_WIFI_State_SCAN_RESULTS) {
102 char *scan_r;
103 printf("RK_WIFI_State_SCAN_RESULTS\n");
104 scan_r = RK_wifi_scan_r();
105 //printf("%s\n", scan_r);
106 free(scan_r);
107 }
108
109 return 0;
110 }
111
rk_wifi_config_thread(void * arg)112 static void *rk_wifi_config_thread(void *arg)
113 {
114 struct wifi_info *info;
115
116 printf("rk_config_wifi_thread\n");
117
118 prctl(PR_SET_NAME,"rk_config_wifi_thread");
119
120 wifi_state = 0;
121
122 info = (struct wifi_info *) arg;
123 RK_wifi_register_callback(rk_wifi_state_callback);
124 RK_wifi_connect(info->ssid, info->psk);
125
126 printf("Exit wifi config thread\n");
127 return NULL;
128 }
129
130 /*****************************************************************
131 * airkiss wifi config test *
132 *****************************************************************/
rk_wifi_airkiss_start(void * data)133 void rk_wifi_airkiss_start(void *data)
134 {
135 int err = 0;
136 struct wifi_info info;
137 pthread_t tid = 0;
138
139 memset(&info, 0, sizeof(struct wifi_info));
140
141 printf("===== %s =====\n", __func__);
142
143 //if(RK_wifi_airkiss_start(info.ssid, info.psk) < 0)
144 // return;
145
146 wifi_state = 0;
147
148 err = pthread_create(&tid, NULL, rk_wifi_config_thread, &info);
149 if (err) {
150 printf("Error - pthread_create() return code: %d\n", err);
151 return;
152 }
153
154 while (!wifi_state)
155 sleep(1);
156 }
157
rk_wifi_airkiss_stop(void * data)158 void rk_wifi_airkiss_stop(void *data)
159 {
160 //RK_wifi_airkiss_stop();
161 }
162
163 /*****************************************************************
164 * softap wifi config test *
165 *****************************************************************/
rk_wifi_softap_state_callback(RK_SOFTAP_STATE state,const char * data)166 static int rk_wifi_softap_state_callback(RK_SOFTAP_STATE state, const char* data)
167 {
168 switch (state) {
169 case RK_SOFTAP_STATE_CONNECTTING:
170 printf("RK_SOFTAP_STATE_CONNECTTING\n");
171 break;
172 case RK_SOFTAP_STATE_DISCONNECT:
173 printf("RK_SOFTAP_STATE_DISCONNECT\n");
174 break;
175 case RK_SOFTAP_STATE_FAIL:
176 printf("RK_SOFTAP_STATE_FAIL\n");
177 break;
178 case RK_SOFTAP_STATE_SUCCESS:
179 printf("RK_SOFTAP_STATE_SUCCESS\n");
180 break;
181 default:
182 break;
183 }
184
185 return 0;
186 }
187
rk_wifi_softap_start(void * data)188 void rk_wifi_softap_start(void *data)
189 {
190 printf("%s enter\n", __func__);
191 RK_softap_register_callback(rk_wifi_softap_state_callback);
192 if (0 != RK_softap_start("Rockchip-SoftAp", RK_SOFTAP_TCP_SERVER)) {
193 return;
194 }
195 }
196
rk_wifi_softap_stop(void * data)197 void rk_wifi_softap_stop(void *data)
198 {
199 RK_softap_stop();
200 }
201
_rk_wifi_open(void * data)202 void _rk_wifi_open(void *data)
203 {
204 RK_wifi_register_callback(rk_wifi_state_callback);
205
206 if (RK_wifi_enable(1) < 0)
207 printf("RK_wifi_enable 1 fail!\n");
208 }
209
rk_wifi_close(void * data)210 void rk_wifi_close(void *data)
211 {
212 if (RK_wifi_enable(0) < 0)
213 printf("RK_wifi_enable 0 fail!\n");
214 }
215
216 static int wifi_cnt = 0;
wifi_test_onff_thread(void * arg)217 void *wifi_test_onff_thread(void *arg)
218 {
219 while (1) {
220 //open
221 RK_wifi_register_callback(rk_wifi_state_callback);
222 if (RK_wifi_enable(1) < 0)
223 printf("RK_wifi_enable 1 fail!\n");
224
225 while (rkwifi_gonff == false) {
226 sleep(1);
227 printf("%s: RKWIFI TURNING ON ...\n", __func__);
228 }
229
230 //scan
231 RK_wifi_scan();
232 sleep(1);
233
234 //close
235 printf("%s: RKWIFI DEINIT\n", __func__);
236 if (RK_wifi_enable(0) < 0)
237 printf("RK_wifi_enable 0 fail!\n");
238
239 while (rkwifi_gonff == true) {
240 sleep(1);
241 printf("%s: RKWIFI TURNING OFF ...\n", __func__);
242 }
243 printf("%s: RKWIFI TURN ONOFF CNT: [%d] \n", __func__, wifi_cnt++);
244 }
245 }
246
247 static pthread_t rkwifi_init_thread = 0;
rk_wifi_openoff_test(char * data)248 void rk_wifi_openoff_test(char *data)
249 {
250 printf("%s: ", __func__);
251
252 if (rkwifi_init_thread) {
253 printf("rkwifi_init_thread already exist\n");
254 return;
255 }
256
257 if (pthread_create(&rkwifi_init_thread, NULL, wifi_test_onff_thread, NULL)) {
258 printf("Createrkwifi_init_thread failed\n");
259 return;
260 }
261 }
262
rk_wifi_open(char * data)263 void rk_wifi_open(char *data)
264 {
265 printf("%s: ", __func__);
266
267 RK_wifi_register_callback(rk_wifi_state_callback);
268 if (RK_wifi_enable(1) < 0)
269 printf("RK_wifi_enable 1 fail!\n");
270 }
271
272 //9 input fish1:rk12345678
rk_wifi_connect(void * data)273 void rk_wifi_connect(void *data)
274 {
275 char *ssid = NULL, *psk = NULL;
276
277 if(data == NULL) {
278 printf("%s: invalid input\n", __func__);
279 return;
280 }
281
282 ssid = strtok(data, ":");
283 if(ssid)
284 psk = strtok(NULL, ":");
285
286 if (RK_wifi_connect(ssid, psk) < 0)
287 printf("RK_wifi_connect1 fail!\n");
288 }
289
rk_wifi_connect1(void * data)290 void rk_wifi_connect1(void *data)
291 {
292 char *ssid = NULL, *psk = NULL;
293
294 if (RK_wifi_connect1("1a~!@#%^*()=+]['\\\\\\\":\\/?.>,<", "12345678", WPA, 1) < 0)
295 printf("RK_wifi_connect1 fail!\n");
296
297 return;
298
299 if(data == NULL) {
300 printf("%s: invalid input\n", __func__);
301 return;
302 }
303
304 ssid = strtok(data, ":");
305 if(ssid)
306 psk = strtok(NULL, ":");
307
308 if (RK_wifi_connect(ssid, psk) < 0)
309 printf("RK_wifi_connect1 fail!\n");
310 }
311
rk_wifi_ping(void * data)312 void rk_wifi_ping(void *data)
313 {
314 if (!RK_wifi_ping("www.baidu.com"))
315 printf("RK_wifi_ping fail!\n");
316 }
317
rk_wifi_scan(void * data)318 void rk_wifi_scan(void *data)
319 {
320 if (RK_wifi_scan() < 0)
321 printf("RK_wifi_scan fail!\n");
322 }
323
rk_wifi_getSavedInfo(void * data)324 void rk_wifi_getSavedInfo(void *data)
325 {
326 RK_WIFI_SAVED_INFO_s *wsi;
327 int ap_cnt = 0;
328
329 RK_wifi_getSavedInfo(&wsi, &ap_cnt);
330 if (ap_cnt <= 0) {
331 printf("not found saved ap!\n");
332 return;
333 }
334
335 for (int i = 0; i < ap_cnt; i++) {
336 printf("id: %d, name: %s, bssid: %s, state: %s\n",
337 wsi[i].id,
338 wsi[i].ssid,
339 wsi[i].bssid,
340 wsi[i].state);
341 }
342
343 if (wsi != NULL)
344 free(wsi);
345 }
346
rk_wifi_getConnectionInfo(void * data)347 void rk_wifi_getConnectionInfo(void *data)
348 {
349 RK_WIFI_INFO_Connection_s info;
350
351 if(!RK_wifi_running_getConnectionInfo(&info))
352 printf_connect_info(&info);
353 }
354
rk_wifi_connect_with_ssid(void * data)355 void rk_wifi_connect_with_ssid(void *data)
356 {
357 if(data == NULL) {
358 printf("%s: ssid is null\n", __func__);
359 return;
360 }
361
362 if (RK_wifi_connect_with_ssid(data) < 0)
363 printf("RK_wifi_connect_with_ssid fail!\n");
364 }
365
rk_wifi_cancel(void * data)366 void rk_wifi_cancel(void *data)
367 {
368 if (RK_wifi_cancel() < 0)
369 printf("RK_wifi_cancel fail!\n");
370 }
371
rk_wifi_forget_with_ssid(void * data)372 void rk_wifi_forget_with_ssid(void *data)
373 {
374 if(data == NULL) {
375 printf("%s: ssid is null\n", __func__);
376 return;
377 }
378
379 if (RK_wifi_forget_with_ssid(data) < 0) {
380 printf("rk_wifi_forget_with_ssid fail!\n");
381 }
382 }
383
rk_wifi_disconnect(void * data)384 void rk_wifi_disconnect(void *data)
385 {
386 RK_wifi_disconnect_network();
387 }
388