Android 有关WIFI的命令以及解决wifi异常的办法
一、关闭wifi命令 adb shell svc wifi disable
二、打开wifi命令 adb shell svc wifi enable
三、查看wifi连接状态
xxx:/ # ifconfig wlan0
wlan0 Link encap:Ethernet HWaddr bc:9d:42:08:07:96
UP BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:1 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:1578 TX bytes:2798
xxx:/ # ifconfig wlan0
wlan0 Link encap:Ethernet HWaddr bc:9d:42:08:07:96
inet addr:172.20.10.3 Bcast:172.20.10.15 Mask:255.255.255.240
inet6 addr: fe80::be9d:42ff:fe08:796/64 Scope: Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:8 errors:0 dropped:0 overruns:0 frame:0
TX packets:14 errors:0 dropped:1 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:3206 TX bytes:5230
三、扫描热点
wpa_cli -i wlan0 scan
wpa_cli -i wlan0 scan_results
四、添加热点
wpa_cli -i wlan0 add_network 0
wpa_cli -i wlan0 set_network 0 ssid "fuckyouwifi"
wpa_cli -i wlan0 set_network 0 psk "8582665"
wpa_cli -i wlan0 save_config
wpa_cli -i wlan0 add_network 1
wpa_cli -i wlan0 set_network 1 ssid "shitwifi"
wpa_cli -i wlan0 set_network 1 psk "8952555"
wpa_cli -i wlan0 save_config
五、连接wifi
wpa_cli -i wlan0 list_network //列出可用wifi
wpa_cli -i wlan0 select_network 0 //选择第0个热点
wpa_cli -i wlan0 enable_network 0 //使能第0个热点
dhcptool wlan0 //启用动态地址分配
ifconfig wlan0 up //打开wifi ,自动连接到已经连接的wifi设备,在px30 buildroot上测试ok
六、断开wifi
ifconfig wlan0 down
killall wpa_supplicant
wpa_cli -i wlan0 disconnect //断开连接,但是是用ifconfig还是可以看到wlan0设备
与 disconnect
命令相反的命令是 reconnect
或 reassociate
七、删除已保存热点
wpa_cli -i wlan0 list_network
wpa_cli -i wlan0 remove_network 0 //删除第0个热点
wpa_cli -i wlan0 save_config
八、实际应用,检测wifi是否正常工作,如果wifi连接有异常就重新安装wifi module
int system_returnval(const char * cmd, char *pRetMsg, int msg_len)
{
FILE * fp;
char * p = NULL;
int ret = -1;
if (cmd == NULL || pRetMsg == NULL || msg_len < 0)
{
printf("Param Error!\n");
return -1;
}
if ((fp = popen(cmd, "r") ) == NULL)
{
printf("Popen Error!\n");
return -2;
}
else
{
memset(pRetMsg, 0, msg_len);
while(fgets(pRetMsg, msg_len, fp) != NULL)
{
printf("Msg:%s",pRetMsg); //print all info
if (strstr(pRetMsg, "BROADCAST MULTICAST") != NULL)
ret = 0;
if (strstr(pRetMsg, "UP BROADCAST MULTICAST") != NULL)
ret = 1;
if (strstr(pRetMsg, "UP BROADCAST RUNNING MULTICAST") != NULL)
{
ret = 2;
}
}
if ( pclose(fp) == -1)
{
printf("close popenerror!\n");
return -3;
}
//pRetMsg[strlen(pRetMsg)-1] = '\0';
pRetMsg[strlen(pRetMsg)] = '\0';
return ret;
}
}
int scan_wifi_results(const char * cmd)
{
FILE * fp;
char * p = NULL;
int ret = -1,number=0;
char pRetMsg[800] = {0};
if ((fp = popen(cmd, "r") ) == NULL)
{
printf("Popen Error!\n");
return -2;
}
else
{
memset(pRetMsg, 0, 800);
while(fgets(pRetMsg, 800, fp) != NULL)
{
number++;
ALOGI("[%d]:%s",number,pRetMsg); //print all info
}
if ( pclose(fp) == -1)
{
printf("close popenerror!\n");
return -3;
}
return number;
}
}
if(loop_number%6 == 0)
{
ALOGD("*************begin to detect wifi status*************");
memset(temp_data, 0, strlen(temp_data));
ret = system_returnval(IFCONFIGWLAN0, temp_data, sizeof(temp_data));
switch(ret)
{
case 0:
ALOGD("WFII STATUS : BROADCAST MULTICAST");
connected = 0;
break;
case 1:
ALOGD("WFII STATUS : UP BROADCAST MULTICAST,connected=%d reset_time=%d ",connected,reset_time / 2);
if((connected == 2 )&&(( reset_time / 2) > SET_RESET_TIME))
{
wifi_number = scan_wifi_results("wpa_cli -iwlan0 scan_results");
if( wifi_number < 2 )
{
ALOGD("remove 8821cu ko");
system("rmmod 8821cu");
usleep(2500000);
ALOGD("insmod /system/lib/modules/8821cu.ko");
system("insmod /system/lib/modules/8821cu.ko");
reset_time= 0;
connected =1;
}else
{
connected =1;
ALOGD("wifi_number=%d,wifi is working ok, no need to reset!",wifi_number);
}
}
break;
case 2:
ALOGD("WFII STATUS : UP BROADCAST RUNNING MULTICAST");
reset_time= 0;
connected = 2;
break;
default :
connected = 0;
ALOGD("WFII STATUS : UNKNOW");
break;
}
ALOGD("*************detect wifi status end*************ret=%d,reset_time=%d ",ret,reset_time / 2);
}
九、参考文章