blob: 0cf37fd004ffda6a4259be68a0b977ffe432e901 [file] [log] [blame]
b.liu15f456b2024-10-31 20:16:06 +08001#include <stdio.h>
2#include <pthread.h>
3#include <time.h>
4#include <sys/time.h>
5#include <unistd.h>
6#include <sys/un.h>
7#include <poll.h>
8#include <sys/socket.h>
9#include <netinet/in.h>
10#include <arpa/inet.h>
11#include <errno.h>
12#include <sys/ioctl.h>
13#include <net/if.h>
14#include <string.h>
15
16
17#include "sta_cli.h"
18#include "sta_ctrl.h"
b.liu06559f62024-11-01 18:48:22 +080019#include "mbtk_log.h"
20
b.liu15f456b2024-10-31 20:16:06 +080021//#include "sta_log.h"
22//#include "mbtk_string.h"
23
24#define STA_CLI_TIMEOUT 15000 // 15s
25#define UNIXSTR_PATH "/data/sta_cli_sock"
26#define SA struct sockaddr
27#define LISTENQ 1024 /* 2nd argument to listen() */
28#define STA_CMD_SEPARATED "#$#"
29#define STA_MAC_LEN 17 // xx:xx:xx:xx:xx:xx
30#define STA_SSID_MAX_LEN (32 * 5)
31
32
33#ifndef INFTIM
34#define INFTIM (-1) /* infinite poll timeout */
35#endif
36
37#define STA_TAG_IND "IND"
38#define STA_TAG_CMD "CMD"
39#define STA_TAG_CMD_SUCCESS "SUCCESS"
40#define STA_TAG_CMD_FAIL "FAIL"
41#define STA_TAG_CMD_FAIL_BUSY "FAIL-BUSY"
42#define STA_CMD_OPEN "OPEN"
43//#define STA_CMD_EXIT "EXIT"
44#define STA_CMD_CLOSE "CLOSE"
45#define STA_CMD_SCAN "SCAN"
46#define STA_CMD_STATUS "STATUS"
47#define STA_CMD_MIB "MIB"
48#define STA_CMD_RECONFIGURE "RECONFIGURE"
49#define STA_CMD_DISCONNECT "DISCONNECT"
50#define STA_CMD_RECONNECT "RECONNECT"
51#define STA_CMD_SAVE_CONFIG "SAVE_CONFIG"
52#define STA_CMD_SET_NETWORK "SET_NETWORK"
53#define STA_CMD_GET_NETWORK "GET_NETWORK"
54#define STA_CMD_REMOVE_NETWORK "REMOVE_NETWORK"
55#define STA_CMD_ADD_NETWORK "ADD_NETWORK"
56#define STA_CMD_DISABLE_NETWORK "DISABLE_NETWORK"
57#define STA_CMD_ENABLE_NETWORK "ENABLE_NETWORK"
58#define STA_CMD_SELECT_NETWORK "SELECT_NETWORK"
59#define STA_CMD_LIST_NETWORKS "LIST_NETWORKS"
60#define STA_CMD_REASSOCIATE "REASSOCIATE"
61#define STA_CMD_REATTACH "REATTACH"
62
63// /var/run/wpa_supplicant
64static sta_cli_cmd_id_enum sta_cli_cmd_id = CMD_ID_NON;
65static char sta_cli_cmd_reply[STA_BUF_SIZE];
66static pthread_cond_t cond;
67static pthread_mutex_t mutex;
68static int sta_cli_conn_fd = -1;
69static char sta_cli_buf[STA_BUF_SIZE];
70static bool sta_should_send_connected_msg = TRUE;
71//static bool sta_connected = FALSE;
72static bool sta_disconnectting = FALSE;
73//static pthread_mutex_t sta_mutex;
74
75
76
77int sta_cli_ssid_get(char *ssid)
78{
79 FILE *fd_tmp = NULL;
80
81 fd_tmp = popen("cat /etc/wifi/sta_network.conf | grep -w 'SSID' | cut -d '=' -f 2","r");
82
83 if(fd_tmp){
84 char buf[200] = {0};
85 fgets(ssid,200,fd_tmp);
86 pclose(fd_tmp);
87 if(strlen(ssid) > 0){
b.liu06559f62024-11-01 18:48:22 +080088 LOGE("test 100:%s, len:%d\n", ssid, strlen(ssid));
b.liu15f456b2024-10-31 20:16:06 +080089
90 }else{// Open wpa_supplicant
b.liu06559f62024-11-01 18:48:22 +080091 LOGE("test 101:%s\n", ssid);
b.liu15f456b2024-10-31 20:16:06 +080092 }
93 }else{
94
b.liu06559f62024-11-01 18:48:22 +080095 LOGE("test 102:%s\n");
b.liu15f456b2024-10-31 20:16:06 +080096 }
97
98 return 0;
99}
100
101int sta_cli_psk_get(char *psk)
102{
103 FILE *fd_tmp = NULL;
104
105 fd_tmp = popen("cat /etc/wifi/sta_network.conf | grep -w 'PASSWORD' | cut -d '=' -f 2","r");
106
107 if(fd_tmp){
108 char buf[200] = {0};
109 fgets(psk,200,fd_tmp);
110 pclose(fd_tmp);
111 if(strlen(psk) > 0){
b.liu06559f62024-11-01 18:48:22 +0800112 LOGE("test 100:%s\n", psk);
b.liu15f456b2024-10-31 20:16:06 +0800113
114 }else{// Open wpa_supplicant
b.liu06559f62024-11-01 18:48:22 +0800115 LOGE("test 101:%s\n", psk);
b.liu15f456b2024-10-31 20:16:06 +0800116 }
117 }else{
118
b.liu06559f62024-11-01 18:48:22 +0800119 LOGE("test 102:%s\n");
b.liu15f456b2024-10-31 20:16:06 +0800120 }
121
122 return 0;
123}
124
125
b.liu06559f62024-11-01 18:48:22 +0800126int sta_cli_ssid_set(char *ssid)
127{
128
129 char buf[100] = {0};
130 snprintf(buf, 100, "sed -i 's/SSID=.*$/SSID=%s/g' /etc/wifi/sta_network.conf", ssid);
131 LOGE("set ssid:%s", buf);
132 system(buf);
133
134
135 return 0;
136}
137
138int sta_cli_psk_set(char *psk)
139{
140
141 char buf[100] = {0};
142 snprintf(buf, 100, "sed -i 's/PASSWORD=.*$/PASSWORD=%s/g' /etc/wifi/sta_network.conf", psk);
143 LOGE("set ssid:%s", buf);
144 system(buf);
145
146
147 return 0;
148}
149
150
151
152
b.liu15f456b2024-10-31 20:16:06 +0800153
154static char*
155sta_cli_ssid_process
156(
157 const char *ssid,
158 char *result,
159 int len
160)
161{
162 bzero(result,len);
163 int ascii = 1;
164 int i;
165 for (i = 0; i < strlen(ssid); i++){
166 if (!isascii(ssid[i])){
b.liu06559f62024-11-01 18:48:22 +0800167 //LOGE("0x%02x\n",(unsigned char)ssid[i]);
b.liu15f456b2024-10-31 20:16:06 +0800168 //return 0;
169 ascii = 0;
170 break;
171 }
172 }
173
174 if(ascii)
175 {
176 snprintf(result,len,
177 "\"%s\"",ssid);
178 }else{
179 int pos = 0;
180 for (i = 0; i < strlen(ssid); i++){
b.liu06559f62024-11-01 18:48:22 +0800181 LOGE("0x%02x\n",(unsigned char)ssid[i]);
b.liu15f456b2024-10-31 20:16:06 +0800182 snprintf(result + pos,len - pos,
183 "%02x",(unsigned char)ssid[i]);
184 pos += 2;
185 }
186 }
187 return result;
188}
189
190
191static char*
192sta_cli_mac_get
193(
194 char *ifname,
195 char *mac,
196 size_t mac_len
197)
198{
199 struct ifreq ifreq;
200 int sock;
201 bzero(mac,mac_len);
202
203 if((sock=socket(AF_INET,SOCK_STREAM,0))<0)
204 {
b.liu06559f62024-11-01 18:48:22 +0800205 LOGE("socket:errno(%d)\n",errno);
b.liu15f456b2024-10-31 20:16:06 +0800206 return NULL;
207 }
208 strcpy(ifreq.ifr_name,ifname);
209 if(ioctl(sock,SIOCGIFHWADDR,&ifreq) <0)
210 {
b.liu06559f62024-11-01 18:48:22 +0800211 LOGE("ioctl:errno(%d)\n",errno);
b.liu15f456b2024-10-31 20:16:06 +0800212 return NULL;
213 }
214 snprintf(mac,mac_len,
215 "%02x%02x%02x%02x%02x%02x",
216 (unsigned char)ifreq.ifr_hwaddr.sa_data[0],
217 (unsigned char)ifreq.ifr_hwaddr.sa_data[1],
218 (unsigned char)ifreq.ifr_hwaddr.sa_data[2],
219 (unsigned char)ifreq.ifr_hwaddr.sa_data[3],
220 (unsigned char)ifreq.ifr_hwaddr.sa_data[4],
221 (unsigned char)ifreq.ifr_hwaddr.sa_data[5]);
222 return mac;
223}
224
225
226static char*
227sta_cli_sta_name_get
228(
229 char *name,
230 size_t name_len
231)
232{
233 bzero(name,name_len);
234
235 // Get host name.
236 FILE *stream = NULL;
237 char host[100];
238 bzero(host,100);
239 stream = popen("hostname","r");
240 if(stream != NULL)
241 {
242 fgets(host, 100, stream);
243 pclose(stream);
244 int index = str_indexof(host,"\n");
245 if(strlen(host) > 0
246 && index != 0)
247 {
248 if(index > 0)
249 {
250 host[index] = '\0';
251 }
252
253 // index < 0
254 // No "\n"
255 }
256 else // No data or empty line.
257 {
258 // Can not get host,set default to "MBTK".
259 memcpy(host,"MBTK",4);
260 }
261 }
262 else
263 {
264 // Can not get host,set default to "MBTK".
265 memcpy(host,"MBTK",4);
266 }
267
268 // Get mac address.
269 char mac[20];
270 if(NULL == sta_cli_mac_get("wlan0", mac, 20))
271 {
272 // Can not get mac,set default to current time.
273 time_t t;
274 t = time(NULL);
275 snprintf(mac,20,
276 "%ld",t);
277 }
278
279 snprintf(name,name_len,
280 "%s-%s",host,mac);
281
282 return name;
283}
284
285static void
286sta_cli_wpa_open_success
287(
288 void
289)
290{
291 char buf[100];
292 int len = snprintf(buf,100,
293 "%s-%s-%s"STA_CMD_SEPARATED,
294 STA_TAG_CMD,
295 STA_CMD_OPEN,
296 STA_TAG_CMD_SUCCESS);
297 buf[len] = '\0';
298 if(sta_cli_conn_fd != -1){
299 if(write(sta_cli_conn_fd,buf,len) != len){
b.liu06559f62024-11-01 18:48:22 +0800300 LOGE("Send open msg to client fail.\n");
b.liu15f456b2024-10-31 20:16:06 +0800301 }else{
b.liu06559f62024-11-01 18:48:22 +0800302 LOGE("Send open msg to client success.\n");
b.liu15f456b2024-10-31 20:16:06 +0800303 }
304 }else{
b.liu06559f62024-11-01 18:48:22 +0800305 LOGE("No client connected.\n");
b.liu15f456b2024-10-31 20:16:06 +0800306 }
307 sta_should_send_connected_msg = FALSE;
308}
309
310
311static void
312sta_cli_wpa_msg_cb
313(
314 char *msg
315)
316{
b.liu06559f62024-11-01 18:48:22 +0800317 LOGE("cmd_id = %d,[%s]\n",sta_cli_cmd_id,msg);
b.liu15f456b2024-10-31 20:16:06 +0800318
319// if(sta_cli_conn_fd != -1){
320// if(write(sta_cli_conn_fd,msg,strlen(msg)) != strlen(msg)){
b.liu06559f62024-11-01 18:48:22 +0800321// LOGE("Send msg to client fail.\n");
b.liu15f456b2024-10-31 20:16:06 +0800322// }else{
b.liu06559f62024-11-01 18:48:22 +0800323// LOGE("Send msg to client success.\n");
b.liu15f456b2024-10-31 20:16:06 +0800324// }
325// }else{
b.liu06559f62024-11-01 18:48:22 +0800326// LOGE("No client connected.\n");
b.liu15f456b2024-10-31 20:16:06 +0800327// }
328
329 // Send msg(CMD_OPEN_SUCCESS) to wifi_server.
330 if(sta_should_send_connected_msg) {
331 sta_cli_wpa_open_success();
332 }
333
334 // Connected to AP
335 if(str_contains(msg, "CTRL-EVENT-CONNECTED")){
336 //sta_connected = TRUE;
337 char sta_name[100];
338 sta_cli_sta_name_get(sta_name,100);
339 char cmd[200];
340 int size = snprintf(cmd,200,
341 "dhcpcd -h %s -o domain_name_servers --noipv4ll wlan0",sta_name);
342 //dhcpcd wlan0 -t 0 -o domain_name_servers --noipv4ll -b -G
343 cmd[size] = '\0';
344 if(sta_ctrl_system(cmd)){
345 char buf[100];
346 int len = snprintf(buf,100,
347 "%s-CONNECTED"STA_CMD_SEPARATED,
348 STA_TAG_IND);
349 buf[len] = '\0';
350 if(sta_cli_conn_fd != -1){
351 usleep(500);
352 if(write(sta_cli_conn_fd,buf,len) != len){
b.liu06559f62024-11-01 18:48:22 +0800353 LOGE("Send msg to client fail.\n");
b.liu15f456b2024-10-31 20:16:06 +0800354 }else{
b.liu06559f62024-11-01 18:48:22 +0800355 LOGE("Send msg to client success.\n");
b.liu15f456b2024-10-31 20:16:06 +0800356 }
357 }else{
b.liu06559f62024-11-01 18:48:22 +0800358 LOGE("No client connected.\n");
b.liu15f456b2024-10-31 20:16:06 +0800359 }
360 }
361 return;
362 }
363#if 1
364 else if(str_contains(msg, "CTRL-EVENT-DISCONNECTED")
365 && !str_contains(msg, "bssid=00:00:00:00:00:00")
366 && !sta_disconnectting)
367 {
368 //pthread_mutex_lock(&sta_mutex);
369 //if(sta_connected){
370 // Disconnected from AP
371 char buf[100];
372 int len = snprintf(buf,100,
373 "%s-DISCONNECTED"STA_CMD_SEPARATED,
374 STA_TAG_IND);
375 buf[len] = '\0';
376 if(sta_cli_conn_fd != -1){
377 if(write(sta_cli_conn_fd,buf,len) != len){
b.liu06559f62024-11-01 18:48:22 +0800378 LOGE("Send msg to client fail.\n");
b.liu15f456b2024-10-31 20:16:06 +0800379 }else{
b.liu06559f62024-11-01 18:48:22 +0800380 LOGE("Send msg to client success.\n");
b.liu15f456b2024-10-31 20:16:06 +0800381 }
382 }else{
b.liu06559f62024-11-01 18:48:22 +0800383 LOGE("No client connected.\n");
b.liu15f456b2024-10-31 20:16:06 +0800384 }
385 //sta_connected = FALSE;
386 //pthread_mutex_unlock(&sta_mutex);
387 return;
388 //}
389 //pthread_mutex_unlock(&sta_mutex);
390 }
391#endif
392
393 switch(sta_cli_cmd_id)
394 {
395 case CMD_ID_NON:
396 {
397
398 break;
399 }
400 case CMD_ID_SCAN:
401 {
402 if(str_contains(msg, "CTRL-EVENT-SCAN-RESULTS")){
b.liu06559f62024-11-01 18:48:22 +0800403 LOGE("Start resume thread.\n");
b.liu15f456b2024-10-31 20:16:06 +0800404 pthread_mutex_lock(&mutex);
405 pthread_cond_signal(&cond);
406 //pthread_cond_broadcast(&cond);
407 pthread_mutex_unlock(&mutex);
408 }
409 break;
410 }
411 default:
b.liu06559f62024-11-01 18:48:22 +0800412 LOGE("cmd_id[%d] unknown.\n",sta_cli_cmd_id);
b.liu15f456b2024-10-31 20:16:06 +0800413 break;
414 }
415}
416
417static void
418sta_cli_thread_pause
419(
420 long time /* ms */
421)
422{
423 struct timeval now_1;
424 struct timespec outtime;
425 int thread_id = pthread_self();
b.liu06559f62024-11-01 18:48:22 +0800426 LOGE("Thread(%ld) pause.\n",thread_id);
b.liu15f456b2024-10-31 20:16:06 +0800427 pthread_mutex_lock(&mutex);
428 gettimeofday(&now_1, NULL);
429 outtime.tv_sec = now_1.tv_sec + time / 1000;
430 outtime.tv_nsec = now_1.tv_usec * 1000;
431 pthread_cond_timedwait(&cond, &mutex, &outtime);
432 pthread_mutex_unlock(&mutex);
b.liu06559f62024-11-01 18:48:22 +0800433 LOGE("Thread(%ld) resume.\n",thread_id);
b.liu15f456b2024-10-31 20:16:06 +0800434}
435
436static bool
437sta_cli_is_empty_char(char ch)
438{
439 if(/*ch == ' ' || */ch == '\r' || ch == '\n'
440 || ch == '\t')
441 return TRUE;
442 else
443 return FALSE;
444}
445
446static char*
447sta_cli_value_get
448(
449 const char *data,
450 const char *key, // "key="
451 char *value,
452 int len
453)
454{
455 bzero(value,len);
456 char *ptr = strstr(data,key);
457 if(ptr)
458 {
459 ptr += strlen(key);
460 int i = 0;
461 while(*ptr != '\r' && *ptr != '\n')
462 {
463 if(i == len - 1)
464 return NULL;
465 value[i++] = *ptr++;
466 }
467 return value;
468 }else{
469 return NULL;
470 }
471}
472
473
474static sta_err_enum
475sta_cli_cmd_scan_parse
476(
477 const char *reply,
478 char *data,
479 size_t len
480)
481{
482 char *data_base = data;
b.liu06559f62024-11-01 18:48:22 +0800483 LOGE("SCAN:\n%s\n",reply);
b.liu15f456b2024-10-31 20:16:06 +0800484 bzero(data,len);
485 const char *ptr = reply;
486 bool start = FALSE;
487 int count = 0; // count for ',' by every line.
488 while(*ptr){
489 if(!start && *ptr == '\n'){
490 start = TRUE;
491 ptr++;
492 }
493
494 if(start){
495 if(sta_cli_is_empty_char(*ptr)){
496 if(*ptr == '\r' || *ptr == '\n'){
497 *data++ = '\r';
498 *data++ = '\n';
499 while(*++ptr == '\r' || *ptr == '\n')
500 ;
501 count = 0; // reset for next line.
502 }else{
503 if(count < 4) {
504 *data++ = ',';
505 count++;
506 while(*++ptr == ' ' || *ptr == '\t')
507 ;
508 } else {
509 *data++ = *ptr++;
510 }
511 }
512 }else{
513 *data++ = *ptr++;
514 }
515 }else{
516 ptr++;
517 }
518 }
519
b.liu06559f62024-11-01 18:48:22 +0800520 LOGE("SCAN 0:\n%s\n",data_base);
b.liu15f456b2024-10-31 20:16:06 +0800521
522 // Delete empty ssid line.
523 char *tmp = (char*)calloc(len,1);
524 memcpy(tmp,data_base,strlen(data_base));
525 bzero(data_base,len);
526
527 char *ptr_pre = tmp;
528 ptr = strstr(ptr_pre,"\r\n");
b.liu06559f62024-11-01 18:48:22 +0800529 LOGE("line:%s\n",ptr == NULL?"NULL":ptr);
b.liu15f456b2024-10-31 20:16:06 +0800530 char ssid[STA_BUF_SIZE] = {0};
531 char *p;
532 while(ptr)
533 {
b.liu06559f62024-11-01 18:48:22 +0800534 LOGE("Get line.\n");
b.liu15f456b2024-10-31 20:16:06 +0800535 // Get ssid.
536 if(*(ptr - 1) == ',') // No ssid
537 {
b.liu06559f62024-11-01 18:48:22 +0800538 LOGE("Delete one line.\n");
b.liu15f456b2024-10-31 20:16:06 +0800539 }else{
540 char s[STA_BUF_SIZE] = {0};
541 p = ptr - 1;
542 int len = 0;
543 while(*p-- != ','){
544 len++;
545 }
546 p += 2;
547 memcpy(s,p,len);
b.liu06559f62024-11-01 18:48:22 +0800548 LOGE("ssid = %s;s = %s\n",ssid,s);
b.liu15f456b2024-10-31 20:16:06 +0800549 if(str_contains(ssid,s))
550 {
b.liu06559f62024-11-01 18:48:22 +0800551 LOGE("Jump the same ssid:%s\n",s);
b.liu15f456b2024-10-31 20:16:06 +0800552 ptr_pre = ptr + 2;
553 ptr = strstr(ptr_pre,"\r\n");
554 continue;
555 }
556
557 if(strlen(ssid) > 0){
558 ssid[strlen(ssid)] = ',';
559 }
560 memcpy(ssid + strlen(ssid),s,len);
561
562 memcpy(data_base + strlen(data_base),ptr_pre,ptr + 2 - ptr_pre);
b.liu06559f62024-11-01 18:48:22 +0800563 LOGE("Copy ssid:\"%s\"\n",s);
b.liu15f456b2024-10-31 20:16:06 +0800564 }
565 ptr_pre = ptr + 2;
566 ptr = strstr(ptr_pre,"\r\n");
567 }
568
b.liu06559f62024-11-01 18:48:22 +0800569 LOGE("Scan parse end.\n");
b.liu15f456b2024-10-31 20:16:06 +0800570
571 free(tmp);
572 tmp = NULL;
573
b.liu06559f62024-11-01 18:48:22 +0800574 LOGE("SCAN 1:\n%s\n",data_base);
b.liu15f456b2024-10-31 20:16:06 +0800575
576 return STA_ERR_SUCCESS;
577}
578
579static sta_err_enum
580sta_cli_cmd_status_parse
581(
582 const char *reply,
583 char *data,
584 size_t data_len
585)
586{
b.liu06559f62024-11-01 18:48:22 +0800587 LOGE("STATUS:\n%s\n",reply);
b.liu15f456b2024-10-31 20:16:06 +0800588
589 bzero(data,data_len);
590
591// const char *ptr = reply;
592// while(*ptr){
593// if(*ptr == '\r' || *ptr == '\n'){
594// *data++ = '\r';
595// *data++ = '\n';
596// while(*++ptr == '\r' || *ptr == '\n')
597// ;
598// }else{
599// *data++ = *ptr++;
600// }
601// }
602
603#define BUF_SIZE 500
604 int len = 0;
605 char buf[BUF_SIZE];
606 char mac_ap[STA_MAC_LEN + 1];
607 int size;
608 if(sta_cli_value_get(reply,
609 "bssid=",
610 mac_ap,
611 STA_MAC_LEN + 1)) // Connected.
612 {
613 // State
614 memcpy(data + len,"1",1);
615 len += 1;
616
617 // mac_own
618 if(sta_cli_value_get(reply,
619 "\naddress=",
620 buf,
621 BUF_SIZE))
622 {
623 size = snprintf(data + len,data_len - len,
624 ",%s",buf);
625 len += size;
626 }else{
627 memcpy(data + len,",",1);
628 len += 1;
b.liu06559f62024-11-01 18:48:22 +0800629 LOGE("Not get own MAC address.\n");
b.liu15f456b2024-10-31 20:16:06 +0800630 }
631
632 // net_id
633 if(sta_cli_value_get(reply,
634 "\nid=",
635 buf,
636 BUF_SIZE))
637 {
638 size = snprintf(data + len,data_len - len,
639 ",%s",buf);
640 len += size;
641 }else{
642 memcpy(data + len,",",1);
643 len += 1;
b.liu06559f62024-11-01 18:48:22 +0800644 LOGE("Not get net id.\n");
b.liu15f456b2024-10-31 20:16:06 +0800645 }
646
647 // ssid
648 if(sta_cli_value_get(reply,
649 "\nssid=",
650 buf,
651 BUF_SIZE))
652 {
653 size = snprintf(data + len,data_len - len,
654 ",%s",buf);
655 len += size;
656 }else{
657 memcpy(data + len,",",1);
658 len += 1;
b.liu06559f62024-11-01 18:48:22 +0800659 LOGE("Not get ssid.\n");
b.liu15f456b2024-10-31 20:16:06 +0800660 }
661
662 // freq
663 if(sta_cli_value_get(reply,
664 "freq=",
665 buf,
666 BUF_SIZE))
667 {
668 int freq = atoi(buf);
669 int channel = (freq - 2412) / 5 + 1;
670 size = snprintf(data + len,data_len - len,
671 ",%d,%s",channel,buf);
672 len += size;
673 }else{
674 memcpy(data + len,",",1);
675 len += 1;
b.liu06559f62024-11-01 18:48:22 +0800676 LOGE("Not get freq.\n");
b.liu15f456b2024-10-31 20:16:06 +0800677 }
678
679 // auth
680 if(sta_cli_value_get(reply,
681 "key_mgmt=",
682 buf,
683 BUF_SIZE))
684 {
685 // WPA/WPA2
686 if(strncmp(buf,"WPA",3)== 0)
687 {
688 size = snprintf(data + len,data_len - len,
689 ",%d",2);
690 len += size;
691 }else{
692 if(sta_cli_value_get(reply,
693 "group_cipher=",
694 buf,
695 BUF_SIZE))
696 {
697 // Open
698 if(strncmp(buf,"NONE",4) == 0)
699 {
700 size = snprintf(data + len,data_len - len,
701 ",%d",0);
702 len += size;
703 }else{// WEP
704 size = snprintf(data + len,data_len - len,
705 ",%d",1);
706 len += size;
707 }
708 }else{
709 memcpy(data + len,",",1);
710 len += 1;
b.liu06559f62024-11-01 18:48:22 +0800711 LOGE("Not get group_cipher.\n");
b.liu15f456b2024-10-31 20:16:06 +0800712 }
713 }
714 }else{
715 memcpy(data + len,",",1);
716 len += 1;
b.liu06559f62024-11-01 18:48:22 +0800717 LOGE("Not get key_mgmt.\n");
b.liu15f456b2024-10-31 20:16:06 +0800718 }
719
720 // mac_ap
721 size = snprintf(data + len,data_len - len,
722 ",%s",mac_ap);
723 len += size;
724
725 // ip
726 if(sta_cli_value_get(reply,
727 "ip_address=",
728 buf,
729 BUF_SIZE))
730 {
731 size = snprintf(data + len,data_len - len,
732 ",%s",buf);
733 len += size;
734 }else{
735 memcpy(data + len,",",1);
736 len += 1;
b.liu06559f62024-11-01 18:48:22 +0800737 LOGE("Not get IP.\n");
b.liu15f456b2024-10-31 20:16:06 +0800738 }
739 }else{
740 memcpy(data + len,"0",1);
741 len += 1;
742
743 if(sta_cli_value_get(reply,
744 "\naddress=",
745 buf,
746 BUF_SIZE))
747 {
748 size = snprintf(data + len,data_len - len,
749 ",%s",buf);
750 len += size;
751
752 }else{
753 memcpy(data + len,",",1);
754 len += 1;
b.liu06559f62024-11-01 18:48:22 +0800755 LOGE("Not get MAC address.\n");
b.liu15f456b2024-10-31 20:16:06 +0800756 }
757
758 memcpy(data + len,",,,,,,,",7);
759 len += 7;
760 }
761
762 memcpy(data + len,"\r\n",2);
763 len += 2;
764 data[len] = '\0';
765
b.liu06559f62024-11-01 18:48:22 +0800766 LOGE("STATUS:\n%s\n",data);
b.liu15f456b2024-10-31 20:16:06 +0800767#undef BUF_SIZE
768 return STA_ERR_SUCCESS;
769}
770
771static sta_err_enum
772sta_cli_cmd_mib_parse
773(
774 const char *reply,
775 char *data,
776 size_t len
777)
778{
b.liu06559f62024-11-01 18:48:22 +0800779 LOGE("MIB:\n%s\n",reply);
b.liu15f456b2024-10-31 20:16:06 +0800780
781 memcpy(data,reply,strlen(reply));
782
783 return STA_ERR_SUCCESS;
784}
785
786static sta_err_enum
787sta_cli_cmd_list_network_parse
788(
789 const char *reply,
790 char *data,
791 size_t len
792)
793{
b.liu06559f62024-11-01 18:48:22 +0800794 LOGE("LIST_NETWORK:\n%s\n",reply);
b.liu15f456b2024-10-31 20:16:06 +0800795
796 bzero(data,len);
797 const char *ptr = reply;
798 bool start = FALSE;
799 bool skip = FALSE;
800 int count = 0; // count for ',' by every line.
801 while(*ptr){
802 if(!start && *ptr == '\n'){
803 start = TRUE;
804 ptr++;
805 }
806
807 if(start){
808 if(sta_cli_is_empty_char(*ptr)){
809 if(*ptr == '\r' || *ptr == '\n'){
810 *data++ = '\r';
811 *data++ = '\n';
812 while(*++ptr == '\r' || *ptr == '\n')
813 ;
814 count = 0;
815 skip = FALSE;
816 }else{
817 if(count < 1) {
818 *data++ = ',';
819 count++;
820 while(*++ptr == ' ' || *ptr == '\t')
821 ;
822 } else {
823 skip = TRUE;
824 ptr++;
825 }
826 }
827 }else{
828 if(!skip)
829 *data++ = *ptr++;
830 else
831 ptr++;
832 }
833 }else{
834 ptr++;
835 }
836 }
837
838 //memcpy(data,reply,strlen(reply));
839
b.liu06559f62024-11-01 18:48:22 +0800840 LOGE("LIST_NETWORK:\n%s\n",data);
b.liu15f456b2024-10-31 20:16:06 +0800841
842 return STA_ERR_SUCCESS;
843}
844
845static sta_err_enum
846sta_cli_process_cmd
847(
848 const char *cmd
849)
850{
851 sta_err_enum err = sta_ctrl_cmd_process(cmd,sta_cli_cmd_reply,STA_BUF_SIZE);
852 if(err == STA_ERR_SUCCESS){
853 if(strncmp(cmd,STA_CMD_SCAN,strlen(STA_CMD_SCAN)) == 0
854 && strncmp(sta_cli_cmd_reply,STA_TAG_CMD_FAIL_BUSY,strlen(STA_TAG_CMD_FAIL_BUSY)) == 0){
b.liu06559f62024-11-01 18:48:22 +0800855 LOGE("\"%s\" busy.\n",cmd);
b.liu15f456b2024-10-31 20:16:06 +0800856 return STA_ERR_SUCCESS;
857 }
858
859 if(strncmp(sta_cli_cmd_reply,STA_TAG_CMD_FAIL,strlen(STA_TAG_CMD_FAIL)) == 0){
b.liu06559f62024-11-01 18:48:22 +0800860 LOGE("\"%s\" fail.\n",cmd);
b.liu15f456b2024-10-31 20:16:06 +0800861 return STA_ERR_UNKNOWN;
862 }
b.liu06559f62024-11-01 18:48:22 +0800863 LOGE("[%s]:\n%s\n",cmd,sta_cli_cmd_reply);
b.liu15f456b2024-10-31 20:16:06 +0800864 }else{
b.liu06559f62024-11-01 18:48:22 +0800865 LOGE("[%s]:FAIL\n",cmd);
b.liu15f456b2024-10-31 20:16:06 +0800866 }
867 return err;
868}
869
870static sta_err_enum
871sta_cli_cmd_scan
872(
873 const char *cmd,
874 char *data,
875 size_t len
876)
877{
878 bzero(data,len);
879 sta_cli_cmd_id = CMD_ID_SCAN;
880 sta_err_enum err = sta_cli_process_cmd(cmd);
881 if(STA_ERR_SUCCESS == err){
882 if(strncmp(sta_cli_cmd_reply,"OK",2) == 0
883 || strncmp(sta_cli_cmd_reply,STA_TAG_CMD_FAIL_BUSY,strlen(STA_TAG_CMD_FAIL_BUSY)) == 0){// Is scanning ...
884 sta_cli_thread_pause(STA_CLI_TIMEOUT);
885
886 // Scan end.
887
888 sta_cli_cmd_id = CMD_ID_SCAN_RESULTS;
889 err = sta_cli_process_cmd("SCAN_RESULTS");
890 sta_cli_cmd_id = CMD_ID_NON;
891 if(STA_ERR_SUCCESS == err){
892 return sta_cli_cmd_scan_parse(sta_cli_cmd_reply,
893 data,
894 len);
895 }else{
b.liu06559f62024-11-01 18:48:22 +0800896 LOGE("SCAN_RESULTS cmd fail.\n");
b.liu15f456b2024-10-31 20:16:06 +0800897 return STA_ERR_UNKNOWN;
898 }
899 }else{
900 sta_cli_cmd_id = CMD_ID_NON;
b.liu06559f62024-11-01 18:48:22 +0800901 LOGE("SCAN cmd fail.\n");
b.liu15f456b2024-10-31 20:16:06 +0800902 return STA_ERR_UNKNOWN;
903 }
904 }else{
905 sta_cli_cmd_id = CMD_ID_NON;
b.liu06559f62024-11-01 18:48:22 +0800906 LOGE("SCAN cmd fail.\n");
b.liu15f456b2024-10-31 20:16:06 +0800907 return err;
908 }
909}
910
911
912static char*
913sta_cli_flag_get
914(
915 const char *ssid,
916 char *flag,
917 size_t len
918)
919{
920 sta_err_enum err;
921 char data[STA_BUF_SIZE];
922 bzero(flag,len);
923 err = sta_cli_cmd_scan("SCAN", data,STA_BUF_SIZE);
924 if(err == STA_ERR_SUCCESS){
925 if(strlen(data) == 0)
926 {
927 return NULL;
928 }
929 ssize_t end = str_indexof(data,ssid) - 1; // Point to ','
930 if(end > 0)
931 {
932 char *ptr = data + end - 1;// Jump the ','
933 int len = 0;
934 while(*ptr != ',' && ptr != data)
935 {
936 ptr--;
937 len++;
938 }
939 ptr++; // Point to flag.
940
941 memcpy(flag,ptr,len);
b.liu06559f62024-11-01 18:48:22 +0800942 LOGE("%s : %s\n",ssid,flag);
b.liu15f456b2024-10-31 20:16:06 +0800943 return flag;
944 }
945 }else{
b.liu06559f62024-11-01 18:48:22 +0800946 LOGE("SCAN_RESULTS cmd fail.");
b.liu15f456b2024-10-31 20:16:06 +0800947 return NULL;
948 }
949 return NULL;
950}
951
952
953static sta_err_enum
954sta_cli_cmd_status
955(
956 const char *cmd,
957 char *data,
958 size_t len
959)
960{
961 bzero(data,len);
962 sta_cli_cmd_id = CMD_ID_STATUS;
963 sta_err_enum err = sta_cli_process_cmd(cmd);
964 sta_cli_cmd_id = CMD_ID_NON;
965 if(STA_ERR_SUCCESS == err){
966 return sta_cli_cmd_status_parse(sta_cli_cmd_reply,
967 data,
968 len);
969 }else{
b.liu06559f62024-11-01 18:48:22 +0800970 LOGE("STATUS cmd fail.\n");
b.liu15f456b2024-10-31 20:16:06 +0800971 return err;
972 }
973}
974
975static sta_err_enum
976sta_cli_cmd_mib
977(
978 const char *cmd,
979 char *data,
980 size_t len
981)
982{
983 bzero(data,len);
984 sta_cli_cmd_id = CMD_ID_MIB;
985 sta_err_enum err = sta_cli_process_cmd(cmd);
986 sta_cli_cmd_id = CMD_ID_NON;
987 if(STA_ERR_SUCCESS == err){
988 return sta_cli_cmd_mib_parse(sta_cli_cmd_reply,
989 data,
990 len);
991 }else{
b.liu06559f62024-11-01 18:48:22 +0800992 LOGE("MIB cmd fail.\n");
b.liu15f456b2024-10-31 20:16:06 +0800993 return err;
994 }
995}
996
997static sta_err_enum
998sta_cli_cmd_reconfigure
999(
1000 const char *cmd
1001)
1002{
1003 sta_cli_cmd_id = CMD_ID_RECONFIGURE;
1004 sta_err_enum err = sta_cli_process_cmd(cmd);
1005 if(STA_ERR_SUCCESS == err){
1006 sta_cli_cmd_id = CMD_ID_NON;
1007 if(strncmp(sta_cli_cmd_reply,"OK",2) == 0){
1008 return STA_ERR_SUCCESS;
1009 }else{
b.liu06559f62024-11-01 18:48:22 +08001010 LOGE("RECONFIGURE cmd fail.\n");
b.liu15f456b2024-10-31 20:16:06 +08001011 return STA_ERR_UNKNOWN;
1012 }
1013 }else{
1014 sta_cli_cmd_id = CMD_ID_NON;
b.liu06559f62024-11-01 18:48:22 +08001015 LOGE("RECONFIGURE cmd fail.\n");
b.liu15f456b2024-10-31 20:16:06 +08001016 return err;
1017 }
1018}
1019
1020static sta_err_enum
1021sta_cli_cmd_disconnect
1022(
1023 const char *cmd
1024)
1025{
1026 sta_cli_cmd_id = CMD_ID_DISCONNECT;
1027 sta_err_enum err = sta_cli_process_cmd(cmd);
1028 if(STA_ERR_SUCCESS == err){
1029 sta_cli_cmd_id = CMD_ID_NON;
1030 if(strncmp(sta_cli_cmd_reply,"OK",2) == 0){
1031 return STA_ERR_SUCCESS;
1032 }else{
b.liu06559f62024-11-01 18:48:22 +08001033 LOGE("DISCONNECT cmd fail.\n");
b.liu15f456b2024-10-31 20:16:06 +08001034 return STA_ERR_UNKNOWN;
1035 }
1036 }else{
1037 sta_cli_cmd_id = CMD_ID_NON;
b.liu06559f62024-11-01 18:48:22 +08001038 LOGE("DISCONNECT cmd fail.\n");
b.liu15f456b2024-10-31 20:16:06 +08001039 return err;
1040 }
1041}
1042
1043static sta_err_enum
1044sta_cli_cmd_reconnect
1045(
1046 const char *cmd
1047)
1048{
1049 sta_cli_cmd_id = CMD_ID_RECONNECT;
1050 sta_err_enum err = sta_cli_process_cmd(cmd);
1051 if(STA_ERR_SUCCESS == err){
1052 sta_cli_cmd_id = CMD_ID_NON;
1053 if(strncmp(sta_cli_cmd_reply,"OK",2) == 0){
1054 return STA_ERR_SUCCESS;
1055 }else{
b.liu06559f62024-11-01 18:48:22 +08001056 LOGE("RECONNECT cmd fail.\n");
b.liu15f456b2024-10-31 20:16:06 +08001057 return STA_ERR_UNKNOWN;
1058 }
1059 }else{
1060 sta_cli_cmd_id = CMD_ID_NON;
b.liu06559f62024-11-01 18:48:22 +08001061 LOGE("RECONNECT cmd fail.\n");
b.liu15f456b2024-10-31 20:16:06 +08001062 return err;
1063 }
1064}
1065
1066
1067static sta_err_enum
1068sta_cli_cmd_save_config
1069(
1070 const char *cmd
1071)
1072{
1073 sta_cli_cmd_id = CMD_ID_SAVE_CONFIG;
1074 sta_err_enum err = sta_cli_process_cmd(cmd);
1075 if(STA_ERR_SUCCESS == err){
1076 sta_cli_cmd_id = CMD_ID_NON;
1077 if(strncmp(sta_cli_cmd_reply,"OK",2) == 0){
1078 return STA_ERR_SUCCESS;
1079 }else{
b.liu06559f62024-11-01 18:48:22 +08001080 LOGE("SAVE_CONFIG cmd fail.\n");
b.liu15f456b2024-10-31 20:16:06 +08001081 return STA_ERR_UNKNOWN;
1082 }
1083 }else{
1084 sta_cli_cmd_id = CMD_ID_NON;
b.liu06559f62024-11-01 18:48:22 +08001085 LOGE("SAVE_CONFIG cmd fail.\n");
b.liu15f456b2024-10-31 20:16:06 +08001086 return err;
1087 }
1088}
1089
1090static sta_err_enum
1091sta_cli_cmd_set_network_process
1092(
1093 char *c
1094)
1095{
b.liu06559f62024-11-01 18:48:22 +08001096 LOGE("cmd = %s\n",c);
b.liu15f456b2024-10-31 20:16:06 +08001097 char *ptr = c;
1098
1099 sta_cli_cmd_id = CMD_ID_SET_NETWORK;
1100 sta_err_enum err = STA_ERR_SUCCESS;
1101 char cmd[100];
1102 int index = str_indexof(ptr,"#");
1103 bzero(cmd,100);
1104 if(index > 0)
1105 {
1106 memcpy(cmd,ptr,index);
1107 ptr += (index + 1);
1108 }else
1109 {
1110 memcpy(cmd,ptr,strlen(ptr));
1111 ptr = NULL;
1112 }
1113
1114 while(TRUE)
1115 {
1116 err = sta_cli_process_cmd(c);
1117 if(STA_ERR_SUCCESS == err){
1118 if(strncmp(sta_cli_cmd_reply,"OK",2) == 0){
1119 //return STA_ERR_SUCCESS;
b.liu06559f62024-11-01 18:48:22 +08001120 LOGE("Success:%s\n",cmd);
b.liu15f456b2024-10-31 20:16:06 +08001121 }else{
b.liu06559f62024-11-01 18:48:22 +08001122 LOGE("Fail:%s\n",cmd);
b.liu15f456b2024-10-31 20:16:06 +08001123 sta_cli_cmd_id = CMD_ID_NON;
1124 return STA_ERR_UNKNOWN;
1125 }
1126 }else{
1127 sta_cli_cmd_id = CMD_ID_NON;
b.liu06559f62024-11-01 18:48:22 +08001128 LOGE("Fail:%s\n",cmd);
b.liu15f456b2024-10-31 20:16:06 +08001129 return err;
1130 }
1131
1132 if(ptr == NULL)
1133 break;
1134
b.liu06559f62024-11-01 18:48:22 +08001135 LOGE("ptr = %s",ptr);
b.liu15f456b2024-10-31 20:16:06 +08001136
1137 index = str_indexof(ptr,"#");
1138 bzero(cmd,100);
1139 if(index > 0)
1140 {
1141 memcpy(cmd,ptr,index);
1142 ptr += (index + 1);
1143 }else
1144 {
1145 memcpy(cmd,ptr,strlen(ptr));
1146 ptr = NULL;
1147 }
1148 }
1149
1150 sta_cli_cmd_id = CMD_ID_NON;
1151 return STA_ERR_SUCCESS;
1152}
1153
1154static sta_err_enum
1155sta_cli_cmd_set_network
1156(
1157 const char *cmd,
1158 const char *flag
1159)
1160{
b.liu06559f62024-11-01 18:48:22 +08001161 LOGE("cmd = %s\n",cmd);
b.liu15f456b2024-10-31 20:16:06 +08001162 char buf[500];
b.liu06559f62024-11-01 18:48:22 +08001163 LOGE("test11\n");
b.liu15f456b2024-10-31 20:16:06 +08001164 int index = str_indexof(cmd," psk ");
b.liu06559f62024-11-01 18:48:22 +08001165 LOGE("test12\n");
b.liu15f456b2024-10-31 20:16:06 +08001166 int net_id = atoi(cmd + strlen(STA_CMD_SET_NETWORK) + 1);
b.liu06559f62024-11-01 18:48:22 +08001167 LOGE("test13\n");
b.liu15f456b2024-10-31 20:16:06 +08001168 if(index > 0){ // Is set "psk"
b.liu06559f62024-11-01 18:48:22 +08001169 LOGE("test14\n");
b.liu15f456b2024-10-31 20:16:06 +08001170 char psk[64] = {0};
1171 int start = index + 5; // " psk "
1172 if(*(cmd + start) == '"')
1173 {
b.liu06559f62024-11-01 18:48:22 +08001174 LOGE("test15\n");
b.liu15f456b2024-10-31 20:16:06 +08001175 memcpy(psk,cmd + start + 1,strlen(cmd) - start - 2);
1176 }else{
b.liu06559f62024-11-01 18:48:22 +08001177 LOGE("test16\n");
b.liu15f456b2024-10-31 20:16:06 +08001178 memcpy(psk,cmd + start,strlen(cmd) - start);
1179 }
b.liu06559f62024-11-01 18:48:22 +08001180 LOGE("psk = %s\n",psk);
b.liu15f456b2024-10-31 20:16:06 +08001181
1182 // Set to OPEN (No psk)
1183 // SET_NETWORK <net_id> key_mgmt NONE
1184 if(strcmp(psk,"0") == 0)
1185 {
1186 int size = snprintf(buf,500,
1187 "%s %d key_mgmt NONE",
1188 STA_CMD_SET_NETWORK,
1189 net_id);
1190 buf[size] = '\0';
1191 return sta_cli_cmd_set_network_process(buf);
1192 }
1193
1194 // WEP
1195 // key_mgmt=NONE
1196 // auth_alg=OPEN SHARED
1197 // wep_key0="0123456789abc"
1198 if(flag && str_contains(flag, "WEP")
1199 &&(strlen(psk) == 5
1200 || strlen(psk) == 13
1201 || strlen(psk) == 10
1202 || strlen(psk) == 26))
1203 {
1204 int size = 0;
1205 if(strlen(psk) == 5
1206 || strlen(psk) == 13)
1207 {
1208 size = snprintf(buf,500,
1209 "%s %d key_mgmt NONE#%s %d auth_alg SHARED#%s %d wep_key0 \"%s\"",
1210 STA_CMD_SET_NETWORK,
1211 net_id,
1212 STA_CMD_SET_NETWORK,
1213 net_id,
1214 STA_CMD_SET_NETWORK,
1215 net_id,
1216 psk);
1217 }else{
1218 size = snprintf(buf,500,
1219 "%s %d key_mgmt NONE#%s %d auth_alg SHARED#%s %d wep_key0 %s",
1220 STA_CMD_SET_NETWORK,
1221 net_id,
1222 STA_CMD_SET_NETWORK,
1223 net_id,
1224 STA_CMD_SET_NETWORK,
1225 net_id,
1226 psk);
1227 }
1228
1229 buf[size] = '\0';
1230 return sta_cli_cmd_set_network_process(buf);
1231 }
1232
1233 // Default is "WPA/WPA2"
1234 int size = snprintf(buf,500,
1235 "%s#%s %d key_mgmt WPA-PSK",
1236 cmd,
1237 STA_CMD_SET_NETWORK,
1238 net_id);
1239 buf[size] = '\0';
1240 return sta_cli_cmd_set_network_process(buf);
1241 }
1242 else // SSID
1243 {
b.liu06559f62024-11-01 18:48:22 +08001244 LOGE("test21\n");
b.liu15f456b2024-10-31 20:16:06 +08001245 index = str_indexof(cmd," ssid ");
1246 char ssid[STA_BUF_SIZE] = {0};
1247 int start = index + 6; // " ssid "
1248 if(*(cmd + start) == '"')
1249 {
1250 memcpy(ssid,cmd + start + 1,strlen(cmd) - start - 2);
1251 }else{
1252 memcpy(ssid,cmd + start,strlen(cmd) - start);
1253 }
b.liu06559f62024-11-01 18:48:22 +08001254 LOGE("ssid = %s\n",ssid);
b.liu15f456b2024-10-31 20:16:06 +08001255
1256
1257 //char ssid_result[STA_SSID_MAX_LEN + 1];
1258 //sta_cli_ssid_process(ssid,ssid_result,STA_SSID_MAX_LEN + 2 + 1);
b.liu06559f62024-11-01 18:48:22 +08001259 // LOGE("test22, ssid_result: %s\n", ssid_result);
b.liu15f456b2024-10-31 20:16:06 +08001260 char cmd_result[STA_BUF_SIZE];
1261 int size = snprintf(cmd_result,STA_BUF_SIZE,
1262 "%s %d ssid %s",
1263 STA_CMD_SET_NETWORK,
1264 net_id,
1265 ssid);
1266 cmd_result[size] = '\0';
b.liu06559f62024-11-01 18:48:22 +08001267 LOGE("cmd = %s\n",cmd_result);
b.liu15f456b2024-10-31 20:16:06 +08001268
1269 return sta_cli_cmd_set_network_process(cmd);
1270 }
1271}
1272
1273
1274static sta_err_enum
1275sta_cli_cmd_get_network
1276(
1277 const char *cmd,
1278 char *value,
1279 int len
1280)
1281{
1282 bzero(value,len);
1283 sta_cli_cmd_id = CMD_ID_GET_NETWORK;
1284 sta_err_enum err = sta_cli_process_cmd(cmd);
1285 if(STA_ERR_SUCCESS == err){
1286 sta_cli_cmd_id = CMD_ID_NON;
1287
1288 char *tmp = sta_cli_cmd_reply;
1289 while(*tmp == '\"'){
1290 tmp++;
1291 }
1292 // Copy with '\0'
1293 memcpy(value,tmp,strlen(tmp) + 1);
1294
1295 tmp = value + strlen(value) -1;
1296 while(*tmp == '\"'){
1297 tmp = '\0';
1298 tmp--;
1299 }
1300
b.liu06559f62024-11-01 18:48:22 +08001301 LOGE("GET_NETWORK:%s.\n",value);
b.liu15f456b2024-10-31 20:16:06 +08001302 return STA_ERR_SUCCESS;
1303 }else{
1304 sta_cli_cmd_id = CMD_ID_NON;
b.liu06559f62024-11-01 18:48:22 +08001305 LOGE("GET_NETWORK cmd fail.\n");
b.liu15f456b2024-10-31 20:16:06 +08001306 return err;
1307 }
1308}
1309
1310static sta_err_enum
1311sta_cli_cmd_remove_network
1312(
1313 const char *cmd
1314)
1315{
1316 sta_cli_cmd_id = CMD_ID_REMOVE_NETWORK;
1317 sta_err_enum err = sta_cli_process_cmd(cmd);
1318 if(STA_ERR_SUCCESS == err){
1319 sta_cli_cmd_id = CMD_ID_NON;
1320 if(strncmp(sta_cli_cmd_reply,"OK",2) == 0){
1321 return STA_ERR_SUCCESS;
1322 }else{
b.liu06559f62024-11-01 18:48:22 +08001323 LOGE("REMOVE_NETWORK cmd fail.\n");
b.liu15f456b2024-10-31 20:16:06 +08001324 return STA_ERR_UNKNOWN;
1325 }
1326 }else{
1327 sta_cli_cmd_id = CMD_ID_NON;
b.liu06559f62024-11-01 18:48:22 +08001328 LOGE("REMOVE_NETWORK cmd fail.\n");
b.liu15f456b2024-10-31 20:16:06 +08001329 return err;
1330 }
1331}
1332
1333
1334static sta_err_enum
1335sta_cli_cmd_add_network
1336(
1337 const char *cmd
1338)
1339{
b.liu06559f62024-11-01 18:48:22 +08001340 LOGE("cmd = %s\n",cmd);
b.liu15f456b2024-10-31 20:16:06 +08001341 sta_cli_cmd_id = CMD_ID_ADD_NETWORK;
1342 sta_err_enum err = sta_cli_process_cmd(STA_CMD_ADD_NETWORK);
b.liu06559f62024-11-01 18:48:22 +08001343 LOGE("test1\n");
b.liu15f456b2024-10-31 20:16:06 +08001344 if(STA_ERR_SUCCESS == err){
1345 sta_cli_cmd_id = CMD_ID_NON;
1346 int net_id = atoi(sta_cli_cmd_reply);
b.liu06559f62024-11-01 18:48:22 +08001347 LOGE("test2\n");
b.liu15f456b2024-10-31 20:16:06 +08001348 if(net_id >= 0){ // Add network success.
1349 // Point to ssid
b.liu06559f62024-11-01 18:48:22 +08001350 LOGE("test3\n");
b.liu15f456b2024-10-31 20:16:06 +08001351 /*
1352 const char *ptr = cmd + strlen(STA_CMD_ADD_NETWORK) + 1;
1353
1354 //int index = str_indexof(ptr," ");
1355
1356 char *pass_ptr = cmd + strlen(cmd);
1357 while(*--pass_ptr != ' ')
1358 ;
1359 pass_ptr++; // Point to pass.
1360
1361
1362 char ssid[STA_BUF_SIZE] = {0};
b.liu06559f62024-11-01 18:48:22 +08001363 LOGE("test4\n");
b.liu15f456b2024-10-31 20:16:06 +08001364 memcpy(ssid,ptr,pass_ptr - ptr - 1);
1365 */
1366
1367 char buf[STA_BUF_SIZE] = {'\0'};
1368 char ssid[STA_BUF_SIZE] = {'\0'};
1369 char psk[STA_BUF_SIZE] = {'\0'};
1370 int len = 0;
b.liu06559f62024-11-01 18:48:22 +08001371 LOGE("test5\n");
b.liu15f456b2024-10-31 20:16:06 +08001372
1373 sta_cli_ssid_get(ssid);
1374 len = strlen(ssid);
1375 ssid[len - 1] = '\0';
1376
1377 sta_cli_psk_get(psk);
1378 len = strlen(psk);
1379 psk[len - 1] = '\0';
1380
1381
1382 int size = snprintf(buf,STA_BUF_SIZE,
1383 "%s %d ssid \"%s\"",
1384 STA_CMD_SET_NETWORK,
1385 net_id,
1386 ssid);
b.liu06559f62024-11-01 18:48:22 +08001387 LOGE("test6\n");
b.liu15f456b2024-10-31 20:16:06 +08001388 buf[size] = '\0';
1389
1390
1391 err = sta_cli_cmd_set_network(buf,NULL);
b.liu06559f62024-11-01 18:48:22 +08001392 LOGE("test7\n");
b.liu15f456b2024-10-31 20:16:06 +08001393 if(STA_ERR_SUCCESS == err){
1394 char flag[50];
1395 sta_cli_flag_get(ssid,flag,50);
1396 size = snprintf(buf,100,
1397 "%s %d psk \"%s\"",
1398 STA_CMD_SET_NETWORK,
1399 net_id,
1400 psk);
1401 buf[size] = '\0';
1402 err = sta_cli_cmd_set_network(buf,flag);
1403 if(STA_ERR_SUCCESS == err){
1404 return STA_ERR_SUCCESS;
1405 }
1406 }
1407
1408 if(err != STA_ERR_SUCCESS) // remove network
1409 {
1410 int size = snprintf(buf,STA_BUF_SIZE,
1411 "%s %d",
1412 STA_CMD_REMOVE_NETWORK,
1413 net_id);
1414 buf[size] = '\0';
1415 sta_cli_process_cmd(buf);
1416 }
1417
1418 return err;
1419 }else{
b.liu06559f62024-11-01 18:48:22 +08001420 LOGE("ADD_NETWORK cmd fail.\n");
b.liu15f456b2024-10-31 20:16:06 +08001421 return STA_ERR_UNKNOWN;
1422 }
1423 }else{
b.liu06559f62024-11-01 18:48:22 +08001424 LOGE("ADD_NETWORK cmd fail.\n");
b.liu15f456b2024-10-31 20:16:06 +08001425 sta_cli_cmd_id = CMD_ID_NON;
1426 return err;
1427 }
1428}
1429
1430static sta_err_enum
1431sta_cli_cmd_disable_network
1432(
1433 const char *cmd
1434)
1435{
1436 sta_cli_cmd_id = CMD_ID_DISABLE_NETWORK;
1437 sta_err_enum err = sta_cli_process_cmd(cmd);
1438 if(STA_ERR_SUCCESS == err){
1439 sta_cli_cmd_id = CMD_ID_NON;
1440 if(strncmp(sta_cli_cmd_reply,"OK",2) == 0){
1441 return STA_ERR_SUCCESS;
1442 }else{
b.liu06559f62024-11-01 18:48:22 +08001443 LOGE("DISABLE_NETWORK cmd fail.\n");
b.liu15f456b2024-10-31 20:16:06 +08001444 return STA_ERR_UNKNOWN;
1445 }
1446 }else{
1447 sta_cli_cmd_id = CMD_ID_NON;
b.liu06559f62024-11-01 18:48:22 +08001448 LOGE("DISABLE_NETWORK cmd fail.\n");
b.liu15f456b2024-10-31 20:16:06 +08001449 return err;
1450 }
1451}
1452
1453static sta_err_enum
1454sta_cli_cmd_enable_network
1455(
1456 const char *cmd
1457)
1458{
1459 sta_cli_cmd_id = CMD_ID_ENABLE_NETWORK;
1460 sta_err_enum err = sta_cli_process_cmd("ENABLE_NETWORK 1");
1461 if(STA_ERR_SUCCESS == err){
1462 sta_cli_cmd_id = CMD_ID_NON;
1463 if(strncmp(sta_cli_cmd_reply,"OK",2) == 0){
1464 return STA_ERR_SUCCESS;
1465 }else{
b.liu06559f62024-11-01 18:48:22 +08001466 LOGE("ENABLE_NETWORK cmd fail.\n");
b.liu15f456b2024-10-31 20:16:06 +08001467 return STA_ERR_UNKNOWN;
1468 }
1469 }else{
1470 sta_cli_cmd_id = CMD_ID_NON;
b.liu06559f62024-11-01 18:48:22 +08001471 LOGE("ENABLE_NETWORK cmd fail.\n");
b.liu15f456b2024-10-31 20:16:06 +08001472 return err;
1473 }
1474}
1475
1476static sta_err_enum
1477sta_cli_cmd_select_network
1478(
1479 const char *cmd
1480)
1481{
1482 sta_cli_cmd_id = CMD_ID_SELECT_NETWORK;
1483 sta_err_enum err = sta_cli_process_cmd("SELECT_NETWORK 1");
1484 if(STA_ERR_SUCCESS == err){
1485 sta_cli_cmd_id = CMD_ID_NON;
1486 if(strncmp(sta_cli_cmd_reply,"OK",2) == 0){
1487 return STA_ERR_SUCCESS;
1488 }else{
b.liu06559f62024-11-01 18:48:22 +08001489 LOGE("SELECT_NETWORK cmd fail.\n");
b.liu15f456b2024-10-31 20:16:06 +08001490 return STA_ERR_UNKNOWN;
1491 }
1492 }else{
1493 sta_cli_cmd_id = CMD_ID_NON;
b.liu06559f62024-11-01 18:48:22 +08001494 LOGE("SELECT_NETWORK cmd fail.\n");
b.liu15f456b2024-10-31 20:16:06 +08001495 return err;
1496 }
1497}
1498
1499static sta_err_enum
1500sta_cli_cmd_list_networks
1501(
1502 const char *cmd,
1503 char *data,
1504 size_t len
1505)
1506{
1507 bzero(data,len);
1508 sta_cli_cmd_id = CMD_ID_LIST_NETWORKS;
1509 sta_err_enum err = sta_cli_process_cmd(cmd);
1510 sta_cli_cmd_id = CMD_ID_NON;
1511 if(STA_ERR_SUCCESS == err){
1512 return sta_cli_cmd_list_network_parse(sta_cli_cmd_reply,
1513 data,
1514 len);
1515 }else{
b.liu06559f62024-11-01 18:48:22 +08001516 LOGE("LIST_NETWORKS cmd fail.\n");
b.liu15f456b2024-10-31 20:16:06 +08001517 return err;
1518 }
1519}
1520
1521static sta_err_enum
1522sta_cli_cmd_reassociate
1523(
1524 const char *cmd
1525)
1526{
1527 sta_cli_cmd_id = CMD_ID_REASSOCIATE;
1528 sta_err_enum err = sta_cli_process_cmd(cmd);
1529 if(STA_ERR_SUCCESS == err){
1530 sta_cli_cmd_id = CMD_ID_NON;
1531 if(strncmp(sta_cli_cmd_reply,"OK",2) == 0){
1532 return STA_ERR_SUCCESS;
1533 }else{
b.liu06559f62024-11-01 18:48:22 +08001534 LOGE("REASSOCIATE cmd fail.\n");
b.liu15f456b2024-10-31 20:16:06 +08001535 return STA_ERR_UNKNOWN;
1536 }
1537 }else{
1538 sta_cli_cmd_id = CMD_ID_NON;
b.liu06559f62024-11-01 18:48:22 +08001539 LOGE("REASSOCIATE cmd fail.\n");
b.liu15f456b2024-10-31 20:16:06 +08001540 return err;
1541 }
1542}
1543
1544static sta_err_enum
1545sta_cli_cmd_reattach
1546(
1547 const char *cmd
1548)
1549{
1550 sta_cli_cmd_id = CMD_ID_REATTACH;
1551 sta_err_enum err = sta_cli_process_cmd(cmd);
1552 if(STA_ERR_SUCCESS == err){
1553 sta_cli_cmd_id = CMD_ID_NON;
1554 if(strncmp(sta_cli_cmd_reply,"OK",2) == 0){
1555 return STA_ERR_SUCCESS;
1556 }else{
b.liu06559f62024-11-01 18:48:22 +08001557 LOGE("REATTACH cmd fail.\n");
b.liu15f456b2024-10-31 20:16:06 +08001558 return STA_ERR_UNKNOWN;
1559 }
1560 }else{
1561 sta_cli_cmd_id = CMD_ID_NON;
b.liu06559f62024-11-01 18:48:22 +08001562 LOGE("REATTACH cmd fail.\n");
b.liu15f456b2024-10-31 20:16:06 +08001563 return err;
1564 }
1565}
1566
1567static sta_err_enum
1568sta_cli_init
1569(
1570 void
1571)
1572{
1573 sta_err_enum result = STA_ERR_SUCCESS;
1574 if((result = sta_ctrl_driver_init(TRUE)) != STA_ERR_SUCCESS){
b.liu06559f62024-11-01 18:48:22 +08001575 LOGE("Driver init fail(%d).\n",result);
b.liu15f456b2024-10-31 20:16:06 +08001576 return result;
1577 }
1578
1579 if((result = sta_ctrl_wpa_init(
1580 "/etc/wifi/wpa_supplicant.conf",
1581 "wlan0",
1582 sta_cli_wpa_msg_cb)) != STA_ERR_SUCCESS){
b.liu06559f62024-11-01 18:48:22 +08001583 LOGE("wpa_supplicant init fail(%d).\n",result);
b.liu15f456b2024-10-31 20:16:06 +08001584 return result;
1585 }
1586 //pthread_mutex_init(&sta_mutex,NULL);
1587 return result;
1588}
1589
1590static sta_err_enum
1591sta_cli_deinit
1592(
1593 void
1594)
1595{
1596 sta_err_enum result = STA_ERR_SUCCESS;
1597 if((result = sta_ctrl_wpa_deinit()) != STA_ERR_SUCCESS){
b.liu06559f62024-11-01 18:48:22 +08001598 LOGE("sta_ctrl_wpa_deinit fail(%d).",result);
b.liu15f456b2024-10-31 20:16:06 +08001599 return result;
1600 }
1601
1602 if((result = sta_ctrl_driver_init(FALSE)) != STA_ERR_SUCCESS){
b.liu06559f62024-11-01 18:48:22 +08001603 LOGE("Driver close fail(%d).\n",result);
b.liu15f456b2024-10-31 20:16:06 +08001604 return result;
1605 }
1606 //pthread_mutex_destroy(&sta_mutex);
1607 return result;
1608}
1609
1610/**
1611* CMD-CLOSE-SUCCESS
1612* CMD-CLOSE-FAIL:2
1613*
1614* CMD-SCAN-XXX
1615*
1616* IND-XXX
1617*
1618*/
1619bool sta_cli_cmd_parse
1620(
1621 const char *cmd,
1622 char *reply,
1623 size_t reply_len
1624)
1625{
b.liu06559f62024-11-01 18:48:22 +08001626 LOGE("cmd:%s\n",cmd);
b.liu15f456b2024-10-31 20:16:06 +08001627 bzero(reply,reply_len);
1628 sta_err_enum err = STA_ERR_UNKNOWN;
1629 if(strncmp(cmd,(STA_CMD_OPEN),strlen(STA_CMD_OPEN)) == 0){
1630 // Will OPEN connection with wpa_supplicant.
1631 err = sta_cli_init();
1632 if(err == STA_ERR_SUCCESS){
1633 snprintf(reply,reply_len,
1634 "%s-%s-%s"STA_CMD_SEPARATED,
1635 STA_TAG_CMD,
1636 cmd,
1637 STA_TAG_CMD_SUCCESS);
1638 sta_should_send_connected_msg = FALSE;
1639 }else{
1640 snprintf(reply,reply_len,
1641 "%s-%s-%s:%d"STA_CMD_SEPARATED,
1642 STA_TAG_CMD,
1643 cmd,
1644 STA_TAG_CMD_FAIL,
1645 err);
1646 }
1647 }else if(strncmp(cmd,STA_CMD_CLOSE,strlen(STA_CMD_CLOSE)) == 0){
1648 err = sta_cli_deinit();
1649 if(err == STA_ERR_SUCCESS){
1650 snprintf(reply,reply_len,
1651 "%s-%s-%s"STA_CMD_SEPARATED,
1652 STA_TAG_CMD,
1653 cmd,
1654 STA_TAG_CMD_SUCCESS);
1655 sta_should_send_connected_msg = TRUE;
1656 }else{
1657 snprintf(reply,reply_len,
1658 "%s-%s-%s:%d"STA_CMD_SEPARATED,
1659 STA_TAG_CMD,
1660 cmd,
1661 STA_TAG_CMD_FAIL,
1662 err);
1663 }
1664 }else if(strncmp(cmd,STA_CMD_SCAN,strlen(STA_CMD_SCAN)) == 0){
1665 char data[STA_BUF_SIZE];
1666 err = sta_cli_cmd_scan(cmd, data,STA_BUF_SIZE);
1667 if(err == STA_ERR_SUCCESS){
1668 snprintf(reply,reply_len,
b.liu06559f62024-11-01 18:48:22 +08001669 "%s"STA_CMD_SEPARATED,
b.liu15f456b2024-10-31 20:16:06 +08001670 data);
1671 }else{
1672 snprintf(reply,reply_len,
1673 "%s-%s-%s:%d"STA_CMD_SEPARATED,
1674 STA_TAG_CMD,
1675 cmd,
1676 STA_TAG_CMD_FAIL,
1677 err);
1678 }
1679 }else if(strncmp(cmd,STA_CMD_STATUS,strlen(STA_CMD_STATUS)) == 0){
1680 char data[STA_BUF_SIZE];
1681 err = sta_cli_cmd_status(cmd, data,STA_BUF_SIZE);
1682 if(err == STA_ERR_SUCCESS){
1683 snprintf(reply,reply_len,
1684 "%s-%s-%s"STA_CMD_SEPARATED,
1685 STA_TAG_CMD,
1686 cmd,
1687 data);
1688 }else{
1689 snprintf(reply,reply_len,
1690 "%s-%s-%s:%d"STA_CMD_SEPARATED,
1691 STA_TAG_CMD,
1692 cmd,
1693 STA_TAG_CMD_FAIL,
1694 err);
1695 }
1696 }else if(strncmp(cmd,STA_CMD_MIB,strlen(STA_CMD_MIB)) == 0){
1697 char data[STA_BUF_SIZE];
1698 err = sta_cli_cmd_mib(cmd, data,STA_BUF_SIZE);
1699 if(err == STA_ERR_SUCCESS){
1700 snprintf(reply,reply_len,
1701 "%s-%s-%s"STA_CMD_SEPARATED,
1702 STA_TAG_CMD,
1703 cmd,
1704 data);
1705 }else{
1706 snprintf(reply,reply_len,
1707 "%s-%s-%s:%d"STA_CMD_SEPARATED,
1708 STA_TAG_CMD,
1709 cmd,
1710 STA_TAG_CMD_FAIL,
1711 err);
1712 }
1713 }else if(strncmp(cmd,STA_CMD_RECONFIGURE,strlen(STA_CMD_RECONFIGURE)) == 0){
1714 err = sta_cli_cmd_reconfigure(cmd);
1715 if(err == STA_ERR_SUCCESS){
1716 snprintf(reply,reply_len,
1717 "%s-%s-%s"STA_CMD_SEPARATED,
1718 STA_TAG_CMD,
1719 cmd,
1720 STA_TAG_CMD_SUCCESS);
1721 }else{
1722 snprintf(reply,reply_len,
1723 "%s-%s-%s:%d"STA_CMD_SEPARATED,
1724 STA_TAG_CMD,
1725 cmd,
1726 STA_TAG_CMD_FAIL,
1727 err);
1728 }
1729 }else if(strncmp(cmd,STA_CMD_DISCONNECT,strlen(STA_CMD_DISCONNECT)) == 0){
1730 sta_disconnectting = TRUE;
1731 err = sta_cli_cmd_disconnect(cmd);
1732 // Not reply(Reply after disconnecd).
1733#if 0
1734 if(err == STA_ERR_SUCCESS){
1735 snprintf(reply,reply_len,
1736 "%s-%s-%s"STA_CMD_SEPARATED,
1737 STA_TAG_CMD,
1738 cmd,
1739 STA_TAG_CMD_SUCCESS);
1740 }else{
1741 snprintf(reply,reply_len,
1742 "%s-%s-%s:%d"STA_CMD_SEPARATED,
1743 STA_TAG_CMD,
1744 cmd,
1745 STA_TAG_CMD_FAIL,
1746 err);
1747 }
1748#endif
1749 if(err == STA_ERR_SUCCESS)
1750 {
b.liu06559f62024-11-01 18:48:22 +08001751 LOGE("sta_cli_cmd_disconnect success.\n");
b.liu15f456b2024-10-31 20:16:06 +08001752 //pthread_mutex_lock(&sta_mutex);
1753 //if(sta_connected)
1754 //{
1755 #define GET_STATUS_MAX 5
1756 int count = 0;
1757 bool ok = FALSE;
1758 usleep(500);
1759 while(count++ < GET_STATUS_MAX)
1760 {
1761 sta_err_enum err = sta_cli_process_cmd(STA_CMD_STATUS);
1762 if(STA_ERR_SUCCESS == err){
1763 char mac_ap[STA_MAC_LEN + 1];
1764 if(!sta_cli_value_get(sta_cli_cmd_reply,
1765 "bssid=",
1766 mac_ap,
1767 STA_MAC_LEN + 1)) // Disconnected.
1768 {
b.liu06559f62024-11-01 18:48:22 +08001769 LOGE("Disconnected success.\n");
b.liu15f456b2024-10-31 20:16:06 +08001770 snprintf(reply,reply_len,
1771 "%s-%s-%s"STA_CMD_SEPARATED,
1772 STA_TAG_CMD,
1773 cmd,
1774 STA_TAG_CMD_SUCCESS);
1775 ok = TRUE;
1776 break;
1777 }else{ // Connected.
b.liu06559f62024-11-01 18:48:22 +08001778 LOGE("Not disconnected.Try again(STATUS).\n");
b.liu15f456b2024-10-31 20:16:06 +08001779 usleep(500);
1780 }
1781 }else{
b.liu06559f62024-11-01 18:48:22 +08001782 LOGE("STATUS cmd fail.\n");
b.liu15f456b2024-10-31 20:16:06 +08001783 break;
1784 }
1785 }
1786
1787 if(!ok) // fail
1788 {
b.liu06559f62024-11-01 18:48:22 +08001789 LOGE("Disconnect fail.\n");
b.liu15f456b2024-10-31 20:16:06 +08001790 snprintf(reply,reply_len,
1791 "%s-%s-%s:%d"STA_CMD_SEPARATED,
1792 STA_TAG_CMD,
1793 cmd,
1794 STA_TAG_CMD_FAIL,
1795 STA_ERR_UNKNOWN);
1796 }
1797 //sta_connected = FALSE;
1798 //}
1799 //pthread_mutex_unlock(&sta_mutex);
1800 }else{
b.liu06559f62024-11-01 18:48:22 +08001801 LOGE("sta_cli_cmd_disconnect fail.\n");
b.liu15f456b2024-10-31 20:16:06 +08001802 snprintf(reply,reply_len,
1803 "%s-%s-%s:%d"STA_CMD_SEPARATED,
1804 STA_TAG_CMD,
1805 cmd,
1806 STA_TAG_CMD_FAIL,
1807 err);
1808 }
1809 sta_disconnectting = FALSE;
1810 }else if(strncmp(cmd,STA_CMD_RECONNECT,strlen(STA_CMD_RECONNECT)) == 0){
1811 err = sta_cli_cmd_reconnect(cmd);
1812 if(err == STA_ERR_SUCCESS){
1813 snprintf(reply,reply_len,
1814 "%s-%s-%s"STA_CMD_SEPARATED,
1815 STA_TAG_CMD,
1816 cmd,
1817 STA_TAG_CMD_SUCCESS);
1818 }else{
1819 snprintf(reply,reply_len,
1820 "%s-%s-%s:%d"STA_CMD_SEPARATED,
1821 STA_TAG_CMD,
1822 cmd,
1823 STA_TAG_CMD_FAIL,
1824 err);
1825 }
1826 }else if(strncmp(cmd,STA_CMD_SAVE_CONFIG,strlen(STA_CMD_SAVE_CONFIG)) == 0){
1827 err = sta_cli_cmd_save_config(cmd);
1828 if(err == STA_ERR_SUCCESS){
1829 snprintf(reply,reply_len,
1830 "%s-%s-%s"STA_CMD_SEPARATED,
1831 STA_TAG_CMD,
1832 cmd,
1833 STA_TAG_CMD_SUCCESS);
1834 }else{
1835 snprintf(reply,reply_len,
1836 "%s-%s-%s:%d"STA_CMD_SEPARATED,
1837 STA_TAG_CMD,
1838 cmd,
1839 STA_TAG_CMD_FAIL,
1840 err);
1841 }
1842 }else if(strncmp(cmd,STA_CMD_SET_NETWORK,strlen(STA_CMD_SET_NETWORK)) == 0){
1843 err = sta_cli_cmd_set_network(cmd,NULL);
1844 if(err == STA_ERR_SUCCESS){
1845 snprintf(reply,reply_len,
1846 "%s-%s-%s"STA_CMD_SEPARATED,
1847 STA_TAG_CMD,
1848 cmd,
1849 STA_TAG_CMD_SUCCESS);
1850 }else{
1851 snprintf(reply,reply_len,
1852 "%s-%s-%s:%d"STA_CMD_SEPARATED,
1853 STA_TAG_CMD,
1854 cmd,
1855 STA_TAG_CMD_FAIL,
1856 err);
1857 }
1858 }else if(strncmp(cmd,STA_CMD_GET_NETWORK,strlen(STA_CMD_GET_NETWORK)) == 0){
1859 char data[100];
1860 err = sta_cli_cmd_get_network(cmd,data,100);
1861 if(err == STA_ERR_SUCCESS){
1862 snprintf(reply,reply_len,
1863 "%s-%s-%s"STA_CMD_SEPARATED,
1864 STA_TAG_CMD,
1865 cmd,
1866 data);
1867 }else{
1868 snprintf(reply,reply_len,
1869 "%s-%s-%s:%d"STA_CMD_SEPARATED,
1870 STA_TAG_CMD,
1871 cmd,
1872 STA_TAG_CMD_FAIL,
1873 err);
1874 }
1875 }else if(strncmp(cmd,STA_CMD_REMOVE_NETWORK,strlen(STA_CMD_REMOVE_NETWORK)) == 0){
1876 err = sta_cli_cmd_remove_network(cmd);
1877 if(err == STA_ERR_SUCCESS){
1878 snprintf(reply,reply_len,
1879 "%s-%s-%s"STA_CMD_SEPARATED,
1880 STA_TAG_CMD,
1881 cmd,
1882 STA_TAG_CMD_SUCCESS);
1883 }else{
1884 snprintf(reply,reply_len,
1885 "%s-%s-%s:%d"STA_CMD_SEPARATED,
1886 STA_TAG_CMD,
1887 cmd,
1888 STA_TAG_CMD_FAIL,
1889 err);
1890 }
1891 }else if(strncmp(cmd,STA_CMD_ADD_NETWORK,strlen(STA_CMD_ADD_NETWORK)) == 0){
1892 err = sta_cli_cmd_add_network(cmd);
1893 if(err == STA_ERR_SUCCESS){
1894 snprintf(reply,reply_len,
1895 "%s-%s-%s"STA_CMD_SEPARATED,
1896 STA_TAG_CMD,
1897 cmd,
1898 STA_TAG_CMD_SUCCESS);
1899 }else{
1900 snprintf(reply,reply_len,
1901 "%s-%s-%s:%d"STA_CMD_SEPARATED,
1902 STA_TAG_CMD,
1903 cmd,
1904 STA_TAG_CMD_FAIL,
1905 err);
1906 }
1907 }else if(strncmp(cmd,STA_CMD_DISABLE_NETWORK,strlen(STA_CMD_DISABLE_NETWORK)) == 0){
1908 err = sta_cli_cmd_disable_network(cmd);
1909 if(err == STA_ERR_SUCCESS){
1910 snprintf(reply,reply_len,
1911 "%s-%s-%s"STA_CMD_SEPARATED,
1912 STA_TAG_CMD,
1913 cmd,
1914 STA_TAG_CMD_SUCCESS);
1915 }else{
1916 snprintf(reply,reply_len,
1917 "%s-%s-%s:%d"STA_CMD_SEPARATED,
1918 STA_TAG_CMD,
1919 cmd,
1920 STA_TAG_CMD_FAIL,
1921 err);
1922 }
1923 }else if(strncmp(cmd,STA_CMD_ENABLE_NETWORK,strlen(STA_CMD_ENABLE_NETWORK)) == 0){
1924 err = sta_cli_cmd_enable_network(cmd);
1925 if(err == STA_ERR_SUCCESS){
1926 snprintf(reply,reply_len,
1927 "%s-%s-%s"STA_CMD_SEPARATED,
1928 STA_TAG_CMD,
1929 cmd,
1930 STA_TAG_CMD_SUCCESS);
1931 }else{
1932 snprintf(reply,reply_len,
1933 "%s-%s-%s:%d"STA_CMD_SEPARATED,
1934 STA_TAG_CMD,
1935 cmd,
1936 STA_TAG_CMD_FAIL,
1937 err);
1938 }
1939 }else if(strncmp(cmd,STA_CMD_SELECT_NETWORK,strlen(STA_CMD_SELECT_NETWORK)) == 0){
1940 err = sta_cli_cmd_select_network(cmd);
1941 if(err == STA_ERR_SUCCESS){
1942 snprintf(reply,reply_len,
1943 "%s-%s-%s"STA_CMD_SEPARATED,
1944 STA_TAG_CMD,
1945 cmd,
1946 STA_TAG_CMD_SUCCESS);
1947 }else{
1948 snprintf(reply,reply_len,
1949 "%s-%s-%s:%d"STA_CMD_SEPARATED,
1950 STA_TAG_CMD,
1951 cmd,
1952 STA_TAG_CMD_FAIL,
1953 err);
1954 }
1955 }else if(strncmp(cmd,STA_CMD_LIST_NETWORKS,strlen(STA_CMD_REASSOCIATE)) == 0){
1956 char data[STA_BUF_SIZE];
1957 err = sta_cli_cmd_list_networks(cmd, data,STA_BUF_SIZE);
1958
1959// char reply_tmp[STA_BUF_SIZE];
1960// memset(reply_tmp,0,STA_BUF_SIZE);
1961// char *reply_ptr = data;
1962// int index = 0;
1963// int pos = 0;
1964// while(*reply_ptr != '\0'){
1965// if(*reply_ptr == ','){
1966// index++;
1967// }
1968
1969// if(index == 3){
1970// if(*reply_ptr == '\n'){
1971// index = 0;
1972// reply_tmp[pos++] = '\r';
1973// reply_tmp[pos++] = '\n';
1974// }
1975// }else{
1976// reply_tmp[pos++] = *reply_ptr;
1977// }
1978
1979// reply_ptr++;
1980// }
1981
1982 if(err == STA_ERR_SUCCESS){
1983 snprintf(reply,reply_len,
1984 "%s-%s-%s"STA_CMD_SEPARATED,
1985 STA_TAG_CMD,
1986 cmd,
1987 data);
1988 }else{
1989 snprintf(reply,reply_len,
1990 "%s-%s-%s:%d"STA_CMD_SEPARATED,
1991 STA_TAG_CMD,
1992 cmd,
1993 STA_TAG_CMD_FAIL,
1994 err);
1995 }
1996 }else if(strncmp(cmd,STA_CMD_REASSOCIATE,strlen(STA_CMD_REASSOCIATE)) == 0){
1997 err = sta_cli_cmd_reassociate(cmd);
1998 if(err == STA_ERR_SUCCESS){
1999 snprintf(reply,reply_len,
2000 "%s-%s-%s"STA_CMD_SEPARATED,
2001 STA_TAG_CMD,
2002 cmd,
2003 STA_TAG_CMD_SUCCESS);
2004 }else{
2005 snprintf(reply,reply_len,
2006 "%s-%s-%s:%d"STA_CMD_SEPARATED,
2007 STA_TAG_CMD,
2008 cmd,
2009 STA_TAG_CMD_FAIL,
2010 err);
2011 }
2012 }else if(strncmp(cmd,STA_CMD_REATTACH,strlen(STA_CMD_REATTACH)) == 0){
2013 err = sta_cli_cmd_reattach(cmd);
2014 if(err == STA_ERR_SUCCESS){
2015 snprintf(reply,reply_len,
2016 "%s-%s-%s"STA_CMD_SEPARATED,
2017 STA_TAG_CMD,
2018 cmd,
2019 STA_TAG_CMD_SUCCESS);
2020 }else{
2021 snprintf(reply,reply_len,
2022 "%s-%s-%s:%d"STA_CMD_SEPARATED,
2023 STA_TAG_CMD,
2024 cmd,
2025 STA_TAG_CMD_FAIL,
2026 err);
2027 }
2028 }else{
b.liu06559f62024-11-01 18:48:22 +08002029 LOGE("Unknown cmd:%s\n",cmd);
b.liu15f456b2024-10-31 20:16:06 +08002030 return FALSE;
2031 }
2032 return TRUE;
2033}
2034
2035