xref: /OK3568_Linux_fs/external/rk_pcba_test/echo_wlan_test.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  *  wlan_test.c  --  wlan test application
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  *  Copyright (c) 2017 Rockchip Electronics Co. Ltd.
5*4882a593Smuzhiyun  *  Author: Panzhenzhuan Wang <randy.wang@rock-chips.com>
6*4882a593Smuzhiyun  *
7*4882a593Smuzhiyun  * Licensed under the Apache License, Version 2.0 (the "License");
8*4882a593Smuzhiyun  * you may not use this file except in compliance with the License.
9*4882a593Smuzhiyun  * You may obtain a copy of the License at
10*4882a593Smuzhiyun  *
11*4882a593Smuzhiyun  * 	 http://www.apache.org/licenses/LICENSE-2.0
12*4882a593Smuzhiyun  *
13*4882a593Smuzhiyun  * Unless required by applicable law or agreed to in writing, software
14*4882a593Smuzhiyun  * distributed under the License is distributed on an "AS IS" BASIS,
15*4882a593Smuzhiyun  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16*4882a593Smuzhiyun  * See the License for the specific language governing permissions and
17*4882a593Smuzhiyun  * limitations under the License.
18*4882a593Smuzhiyun  */
19*4882a593Smuzhiyun //WLAN test program
20*4882a593Smuzhiyun #include <stdio.h>
21*4882a593Smuzhiyun 
22*4882a593Smuzhiyun //open()���ͷ�ļ�
23*4882a593Smuzhiyun #include <sys/types.h>
24*4882a593Smuzhiyun #include <sys/stat.h>
25*4882a593Smuzhiyun #include <fcntl.h>
26*4882a593Smuzhiyun 
27*4882a593Smuzhiyun //error���ͷ�ļ�
28*4882a593Smuzhiyun #include <errno.h>
29*4882a593Smuzhiyun #include <string.h>
30*4882a593Smuzhiyun #include "wlan_test.h"
31*4882a593Smuzhiyun 
32*4882a593Smuzhiyun #define LOG_TAG "wlan_test"
33*4882a593Smuzhiyun #include "common.h"
34*4882a593Smuzhiyun #define WLAN_PROC_ERR -45
35*4882a593Smuzhiyun 
36*4882a593Smuzhiyun #define WLAN_START_UP_COMMAND "ifconfig wlan0 up"
37*4882a593Smuzhiyun #define WLAN_MANAGE_START "wpa_supplicant -i wlan0 -c /etc/wpa_supplicant.conf &"
38*4882a593Smuzhiyun #define WLAN_SCAN_COMMAND "wpa_cli -i wlan0 scan 'wlan0'"
39*4882a593Smuzhiyun #define WLAN_SCAN_RESULT  "wpa_cli -i wlan0 scan_r | busybox awk 'NR>=3{print $5,$3}'"
40*4882a593Smuzhiyun #define SCAN_RESULT_FILE "/tmp/wlan_scan_result.txt"
41*4882a593Smuzhiyun 
42*4882a593Smuzhiyun #define AP_SUPPORT_CMD "iw list | busybox grep AP > %s"
43*4882a593Smuzhiyun #define AP_SUPPORT_FILE "/tmp/wlan_ap_result.txt"
44*4882a593Smuzhiyun #define SOFTAP_MSG "dmesg | grep SSID | tail -n 6 > %s"
45*4882a593Smuzhiyun #define MSG_FILE "/tmp/softap_start_msg.txt"
46*4882a593Smuzhiyun 
47*4882a593Smuzhiyun #ifdef PCBA_PX3SE
48*4882a593Smuzhiyun #define CONNECT_AP_CMD "wpa_supplicant -i wlan0 -c /data/wpa_conf &"
49*4882a593Smuzhiyun #define CONNECT_AP_STATUS "wpa_cli status > %s"
50*4882a593Smuzhiyun #define CONNECT_AP_RESULT_FILE "/tmp/wlan_connect_result.txt"
51*4882a593Smuzhiyun 
52*4882a593Smuzhiyun #define REPORT_SSID     "Rockchip" //ָ��ɨ��ĵ�wifi ssid����
53*4882a593Smuzhiyun #endif
54*4882a593Smuzhiyun 
55*4882a593Smuzhiyun //* 1���رպ�̨wpa_supplicant����
close_wpa_supplicant(void)56*4882a593Smuzhiyun static int close_wpa_supplicant(void)
57*4882a593Smuzhiyun {
58*4882a593Smuzhiyun     int test_flag = -1;
59*4882a593Smuzhiyun     char pid_buf[64];
60*4882a593Smuzhiyun     char cmd[64];
61*4882a593Smuzhiyun     FILE* pp;
62*4882a593Smuzhiyun     printf("====================function : %s start =================\n",__func__);
63*4882a593Smuzhiyun     pp = popen("ps |grep wpa_supplicant|awk 'NR==1 {print $1}'","r");
64*4882a593Smuzhiyun     //pp = popen("ps | grep wpa_supplicant | grep -v grep","r");
65*4882a593Smuzhiyun     //����ļ���ʧ�ܣ������������Ϣ
66*4882a593Smuzhiyun     if (!pp)
67*4882a593Smuzhiyun     {
68*4882a593Smuzhiyun         printf("%s popen err%s\n",__func__,strerror(errno));
69*4882a593Smuzhiyun         return -1;
70*4882a593Smuzhiyun     }
71*4882a593Smuzhiyun     memset(pid_buf,0,sizeof(pid_buf));
72*4882a593Smuzhiyun     fgets(pid_buf,sizeof(pid_buf),pp);
73*4882a593Smuzhiyun     pclose(pp);
74*4882a593Smuzhiyun     printf("Get pid_buf is: \t %s\n",pid_buf);
75*4882a593Smuzhiyun     sprintf(cmd,"kill -9 %d",atoi(pid_buf));
76*4882a593Smuzhiyun     printf("cmd is: %s\n",cmd);
77*4882a593Smuzhiyun     system(cmd);
78*4882a593Smuzhiyun     printf("====================function : %s finish =================\n",__func__);
79*4882a593Smuzhiyun     return 0;
80*4882a593Smuzhiyun }
81*4882a593Smuzhiyun 
82*4882a593Smuzhiyun /*
83*4882a593Smuzhiyun  * RSSI Levels as used by notification icon
84*4882a593Smuzhiyun  *
85*4882a593Smuzhiyun  * Level 4  -55 <= RSSI
86*4882a593Smuzhiyun  * Level 3  -66 <= RSSI < -55
87*4882a593Smuzhiyun  * Level 2  -77 <= RSSI < -67
88*4882a593Smuzhiyun  * Level 1  -88 <= RSSI < -78
89*4882a593Smuzhiyun  * Level 0         RSSI < -88
90*4882a593Smuzhiyun  */
calc_rssi_lvl(int rssi)91*4882a593Smuzhiyun static int calc_rssi_lvl(int rssi)
92*4882a593Smuzhiyun {
93*4882a593Smuzhiyun 	if (rssi >= -55)
94*4882a593Smuzhiyun 		return 4;
95*4882a593Smuzhiyun 	else if (rssi >= -66)
96*4882a593Smuzhiyun 		return 3;
97*4882a593Smuzhiyun 	else if (rssi >= -77)
98*4882a593Smuzhiyun 		return 2;
99*4882a593Smuzhiyun 	else if (rssi >= -88)
100*4882a593Smuzhiyun 		return 1;
101*4882a593Smuzhiyun 	else
102*4882a593Smuzhiyun 		return 0;
103*4882a593Smuzhiyun }
104*4882a593Smuzhiyun 
105*4882a593Smuzhiyun 
106*4882a593Smuzhiyun /* ��ɨ�赽��WiFi��Ϣ�����path��Ӧ�ļ�
107*4882a593Smuzhiyun  * ����ʾ��һ��WiFi���ֺ��ź�ǿ��
108*4882a593Smuzhiyun */
wlan_exec(const char * cmd,char * path)109*4882a593Smuzhiyun int wlan_exec(const char *cmd, char *path)
110*4882a593Smuzhiyun {
111*4882a593Smuzhiyun     char result_buf[128];
112*4882a593Smuzhiyun     char ssid[128];
113*4882a593Smuzhiyun     int signal_level;
114*4882a593Smuzhiyun     int ch=0;
115*4882a593Smuzhiyun     int fd;
116*4882a593Smuzhiyun 
117*4882a593Smuzhiyun      printf("=================== function :%s start======================\n\n",__func__);
118*4882a593Smuzhiyun 
119*4882a593Smuzhiyun     memset(result_buf, 0, sizeof(result_buf));
120*4882a593Smuzhiyun     memset(ssid, 0, sizeof(ssid));
121*4882a593Smuzhiyun     //��ʾ��һ��WiFi��Ϣ
122*4882a593Smuzhiyun     FILE *pp = popen(cmd, "r");
123*4882a593Smuzhiyun     //����ļ���ʧ�ܣ������������Ϣ
124*4882a593Smuzhiyun     if (!pp)
125*4882a593Smuzhiyun     {
126*4882a593Smuzhiyun         printf("%s popen err%s\n",__func__,strerror(errno));
127*4882a593Smuzhiyun         return -1;
128*4882a593Smuzhiyun     }
129*4882a593Smuzhiyun 
130*4882a593Smuzhiyun #ifdef PCBA_PX3SE
131*4882a593Smuzhiyun     /*chad.ma add below*/
132*4882a593Smuzhiyun     if (path != NULL) {
133*4882a593Smuzhiyun         fd = open(path, O_CREAT | O_WRONLY	| O_TRUNC);
134*4882a593Smuzhiyun         if (fd <0) {
135*4882a593Smuzhiyun             log_err("open %s fail, errno = %d\n", path, errno);
136*4882a593Smuzhiyun             return errno;
137*4882a593Smuzhiyun         }
138*4882a593Smuzhiyun     }
139*4882a593Smuzhiyun     /*chad.ma add up*/
140*4882a593Smuzhiyun #endif
141*4882a593Smuzhiyun 
142*4882a593Smuzhiyun 	while(!feof(pp))
143*4882a593Smuzhiyun 	{
144*4882a593Smuzhiyun 	    fscanf(pp,"%s",ssid);
145*4882a593Smuzhiyun 	    fscanf(pp,"%d",&signal_level);
146*4882a593Smuzhiyun 	    //�����ź�ǿ���ж�WiFi�Ƿ���������
147*4882a593Smuzhiyun 	    if(signal_level< -200||signal_level >=0)
148*4882a593Smuzhiyun         {
149*4882a593Smuzhiyun             printf("wlan scan result is null\n");
150*4882a593Smuzhiyun             return -1;
151*4882a593Smuzhiyun         }
152*4882a593Smuzhiyun #ifdef PCBA_PX3SE
153*4882a593Smuzhiyun         snprintf(result_buf,sizeof(result_buf),
154*4882a593Smuzhiyun                     "SSID:%s Signal Level:%d RSSI:%d\n",
155*4882a593Smuzhiyun                     ssid, signal_level, calc_rssi_lvl(signal_level));
156*4882a593Smuzhiyun         int w_len = write(fd, result_buf, strlen(result_buf));
157*4882a593Smuzhiyun 		if (w_len <= 0) {
158*4882a593Smuzhiyun 			log_err("Write %s fail, errno = %d\n", path, errno);
159*4882a593Smuzhiyun 			return errno;
160*4882a593Smuzhiyun 		}
161*4882a593Smuzhiyun #endif
162*4882a593Smuzhiyun 
163*4882a593Smuzhiyun 	    printf("SSID is: %s,signal level is: %d\n",ssid,signal_level);
164*4882a593Smuzhiyun 	    printf("SSID is: %s,rssi is: %d\n",ssid,calc_rssi_lvl(signal_level));
165*4882a593Smuzhiyun 	}
166*4882a593Smuzhiyun 	pclose(pp);
167*4882a593Smuzhiyun 
168*4882a593Smuzhiyun #ifdef PCBA_PX3SE
169*4882a593Smuzhiyun     close(fd);
170*4882a593Smuzhiyun #endif
171*4882a593Smuzhiyun 	printf("\n=================== function :%s finish======================\n",__func__);
172*4882a593Smuzhiyun 	return 0;
173*4882a593Smuzhiyun }
174*4882a593Smuzhiyun 
wlan_test(void * argv)175*4882a593Smuzhiyun void *wlan_test(void *argv)
176*4882a593Smuzhiyun {
177*4882a593Smuzhiyun     int test_flag=-1;
178*4882a593Smuzhiyun     char cmd[128];
179*4882a593Smuzhiyun     printf("===================Wlan test start======================\n");
180*4882a593Smuzhiyun     //sprintf(cmd,"aplay %s/wlan_test_start.wav",AUDIO_PATH);
181*4882a593Smuzhiyun     //system(cmd);
182*4882a593Smuzhiyun     //system("aplay /data/cfg/test/wlan_test_start.wav");
183*4882a593Smuzhiyun 
184*4882a593Smuzhiyun     //1���ȹرպ�̨wpa_supplicant���̣�Ȼ����ж��WLAN�����̼���Ȼ�����¼��������̼�
185*4882a593Smuzhiyun     test_flag = close_wpa_supplicant();
186*4882a593Smuzhiyun     system("echo 1 > /sys/class/rkwifi/driver");
187*4882a593Smuzhiyun 
188*4882a593Smuzhiyun     //2������wlan0�˿�
189*4882a593Smuzhiyun     int status = system(WLAN_START_UP_COMMAND);
190*4882a593Smuzhiyun 
191*4882a593Smuzhiyun     /* add by chad ma 20180629 below judge*/
192*4882a593Smuzhiyun     if(status == -1) {
193*4882a593Smuzhiyun         printf("system run error ....\n");
194*4882a593Smuzhiyun         goto fail;
195*4882a593Smuzhiyun     } else {
196*4882a593Smuzhiyun         log_info("exit status value = [0x%x]\n", status);
197*4882a593Smuzhiyun         if (WIFEXITED(status))
198*4882a593Smuzhiyun         {
199*4882a593Smuzhiyun             if (0 == WEXITSTATUS(status))
200*4882a593Smuzhiyun             {
201*4882a593Smuzhiyun                 log_info("run WLAN_START_UP_COMMAND successfully.\n");
202*4882a593Smuzhiyun                 //ret = 0;
203*4882a593Smuzhiyun             }
204*4882a593Smuzhiyun             else
205*4882a593Smuzhiyun             {
206*4882a593Smuzhiyun                 system("rfkill unblock wifi");
207*4882a593Smuzhiyun             }
208*4882a593Smuzhiyun         }
209*4882a593Smuzhiyun         else
210*4882a593Smuzhiyun         {
211*4882a593Smuzhiyun             log_info("exit status = [%d]\n", WEXITSTATUS(status));
212*4882a593Smuzhiyun 
213*4882a593Smuzhiyun             //ret = -1;
214*4882a593Smuzhiyun         }
215*4882a593Smuzhiyun     }
216*4882a593Smuzhiyun     sleep(2);
217*4882a593Smuzhiyun 
218*4882a593Smuzhiyun     //3���������������������wpa_supplicant
219*4882a593Smuzhiyun     system(WLAN_MANAGE_START);
220*4882a593Smuzhiyun     sleep(2);
221*4882a593Smuzhiyun 
222*4882a593Smuzhiyun     //4��ɨ����������
223*4882a593Smuzhiyun     system(WLAN_SCAN_COMMAND);
224*4882a593Smuzhiyun     sleep(3);
225*4882a593Smuzhiyun 
226*4882a593Smuzhiyun     //5����ʾ��WiFi��Ϣ
227*4882a593Smuzhiyun     test_flag = wlan_exec(WLAN_SCAN_RESULT,SCAN_RESULT_FILE);
228*4882a593Smuzhiyun     if(test_flag<0)
229*4882a593Smuzhiyun     {
230*4882a593Smuzhiyun         //��һ��scanʧ�ܣ���ִ��һ��;
231*4882a593Smuzhiyun         system(WLAN_SCAN_COMMAND);
232*4882a593Smuzhiyun         sleep(2);
233*4882a593Smuzhiyun         test_flag = wlan_exec(WLAN_SCAN_RESULT,SCAN_RESULT_FILE);
234*4882a593Smuzhiyun         if(test_flag<0)
235*4882a593Smuzhiyun         goto fail;
236*4882a593Smuzhiyun         //return -1;
237*4882a593Smuzhiyun     }
238*4882a593Smuzhiyun 
239*4882a593Smuzhiyun     printf("===================Wlan test success ======================\n");
240*4882a593Smuzhiyun     system("ifconfig wlan0 down");
241*4882a593Smuzhiyun     system("busybox killall wpa_supplicant");      //�ر����߹������wpa_supplicant
242*4882a593Smuzhiyun     return (void*)test_flag;
243*4882a593Smuzhiyun fail:
244*4882a593Smuzhiyun     printf("===================Wlan test failed======================\n");
245*4882a593Smuzhiyun     system("ifconfig wlan0 down");
246*4882a593Smuzhiyun     system("busybox killall wpa_supplicant");      //�ر����߹������wpa_supplicant
247*4882a593Smuzhiyun     return (void*)test_flag;
248*4882a593Smuzhiyun }
249*4882a593Smuzhiyun 
main(int argc,char * argv[])250*4882a593Smuzhiyun int main(int argc, char *argv[])
251*4882a593Smuzhiyun {
252*4882a593Smuzhiyun     int test_flag = 0,err_code = 0;
253*4882a593Smuzhiyun     char read_buf[128];
254*4882a593Smuzhiyun     int find_flag = 0;
255*4882a593Smuzhiyun     FILE *fp;
256*4882a593Smuzhiyun     char buf[COMMAND_VALUESIZE] = "wlan_test";
257*4882a593Smuzhiyun     char result[COMMAND_VALUESIZE] = RESULT_PASS;
258*4882a593Smuzhiyun     test_flag = (int)wlan_test(argv[0]);
259*4882a593Smuzhiyun     if(test_flag < 0)
260*4882a593Smuzhiyun     {
261*4882a593Smuzhiyun         strcpy(result,RESULT_FAIL);
262*4882a593Smuzhiyun         err_code = WLAN_PROC_ERR;
263*4882a593Smuzhiyun     }
264*4882a593Smuzhiyun 
265*4882a593Smuzhiyun #ifdef PCBA_PX3SE
266*4882a593Smuzhiyun     //��ɨ���������ļ��У�ɨ��ָ��ssid��signal
267*4882a593Smuzhiyun     fp = fopen(SCAN_RESULT_FILE, "r");
268*4882a593Smuzhiyun     memset(read_buf, 0 ,sizeof(read_buf));
269*4882a593Smuzhiyun      //����ļ���ʧ�ܣ������������Ϣ
270*4882a593Smuzhiyun     if (!fp)
271*4882a593Smuzhiyun     {
272*4882a593Smuzhiyun         printf("%s fopen err:%s\n",__func__,strerror(errno));
273*4882a593Smuzhiyun         return -1;
274*4882a593Smuzhiyun     }
275*4882a593Smuzhiyun 
276*4882a593Smuzhiyun     while(!feof(fp))
277*4882a593Smuzhiyun     {
278*4882a593Smuzhiyun         fgets(read_buf,sizeof(read_buf),fp);
279*4882a593Smuzhiyun         if(strstr(read_buf,REPORT_SSID)!= NULL)
280*4882a593Smuzhiyun         {
281*4882a593Smuzhiyun             find_flag = 1;
282*4882a593Smuzhiyun             //ע�⣺read_buf�Ὣһ�еĻس���Ҳ����ȥ������Ҫ��read_buf���и���
283*4882a593Smuzhiyun             int len = strlen(read_buf);
284*4882a593Smuzhiyun             if ( len < 128) {
285*4882a593Smuzhiyun                 //assert(len < 128);
286*4882a593Smuzhiyun                 read_buf[len - 1] = '\0';
287*4882a593Smuzhiyun                 printf("\n ###Found!!! %s ###\n",read_buf);
288*4882a593Smuzhiyun                 break;
289*4882a593Smuzhiyun             } else {
290*4882a593Smuzhiyun                 printf("%s ERROR!!! read to much from one line\n",__func__);
291*4882a593Smuzhiyun             }
292*4882a593Smuzhiyun         }
293*4882a593Smuzhiyun     }
294*4882a593Smuzhiyun     fclose(fp);
295*4882a593Smuzhiyun     //�����������Ƶ�buf��
296*4882a593Smuzhiyun     if (find_flag) {
297*4882a593Smuzhiyun         strcat(buf, ": ");
298*4882a593Smuzhiyun         strcat(buf, read_buf);
299*4882a593Smuzhiyun     }
300*4882a593Smuzhiyun 
301*4882a593Smuzhiyun     //ɾ��ɨ���ļ�
302*4882a593Smuzhiyun     //remove(SCAN_RESULT_FILE);
303*4882a593Smuzhiyun     printf("\n $$ %s :not found %s $$\n",buf , REPORT_SSID);
304*4882a593Smuzhiyun #endif
305*4882a593Smuzhiyun     send_msg_to_server(buf, result, err_code);
306*4882a593Smuzhiyun }
307