android_WIFI

 WIFI是无线通信协议,可以允许手机直接连接到无线网络。在现在3G资费还比较贵的情况下,WIFI对于手机来说是很重要的,我们可以很方便的下载软件,音乐等资源。Android手机必须要有WIFI网卡才能支持WIFI。Android应用程序有时候需要对WIFI网卡进行操作,从而操作WIFI网络。 

      WIFI网卡有一些状态,由一系列的整形常量来表示。

常量名常量值网卡状态
WIFI_STATE_DISABLED         1            WIFI网卡不可用
WIFI_STATE_DISABLING               0WIFI正在关闭
WIFI_STATE_ENABLED3WIFI网卡可用
WIFI_STATE_ENABLING2WIFI网卡正在打开
WIFI_STATE_UNKNOWN4未知网卡状态

在应用程序中操作WIFI网卡一定的权限。 
      WIFI 的主要操作权限有四个: 
              CHANGE_NETWORK_STATE :允许修改网络状态的权限。 
              CHANGE_WIFI_STATE :允许修改 WIFI 状态的权限。 
              ACCESS_NETWORK_STATE :允许访问网络状态的权限。 
              ACCESS_WIFI_STATE :允许访问 WIFI 状态的权限。 
在AndroidManifest.xml文件中添加权限。 

    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"></uses-permission>  
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>  
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>  
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission> 
改变WIFI网卡的状态 
      对WIFI网卡进行操作需要通过WifiManager对象来进行,获取该对象的方法如下: 
      WifiManager wifiManger=(WifiManger)Context.getSystemService(Service.WIFI-SERVICE); 
      打开WIFI网卡 
      wifiManager.setWifiEnabled(true); 
      关闭WIFI网卡 
      wifiManager.setWifiEnabled(false); 
      获取网卡当前的状态 
      wifiManager.getWifiState();

示例:新建一个一个Android应用程序,在main.xml中添加三个按钮,点击这三个按钮分别可以打开WIFI网卡,关闭WIFI网卡,检查网卡  的当前状态。需要说明的是由于Android模拟器不支持WIFI和蓝牙所以程序执行时返回的网卡状态都是WIFI_STATE_UNKNOWN:网卡未知的状态。此程序需要在真机上进行调试才会显示正确的运行结果。这里主要是为了说明程序如何编写。

源代码:

main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView  
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="@string/hello"
    />
<Button
	android:id="@+id/startButton"
	android:layout_width="300dp"
	android:layout_height="wrap_content"
	android:text="打开WIFI网卡"
    />
<Button
	android:id="@+id/stopButton"
	android:layout_width="300dp"
	android:layout_height="wrap_content"
	android:text="关闭WIFI网卡"
    />
<Button
	android:id="@+id/checkButton"
	android:layout_width="300dp"
	android:layout_height="wrap_content"
	android:text="检查WIFI网卡状态"
    />
</LinearLayout>
Android_Wifi.java

package idea.org;

import android.app.Activity;
import android.content.Context;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class Android_Wifi extends Activity {
	private Button startButton=null;
	private Button stopButton=null;
	private Button checkButton=null;
	WifiManager wifiManager=null;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        startButton=(Button)findViewById(R.id.startButton);
        stopButton=(Button)findViewById(R.id.stopButton);
        checkButton=(Button)findViewById(R.id.checkButton);
        startButton.setOnClickListener(new startButtonListener());
        stopButton.setOnClickListener(new stopButtonListener());
        checkButton.setOnClickListener(new checkButtonListener());
    }
    class startButtonListener implements OnClickListener
    {

		/* (non-Javadoc)
		 * @see android.view.View.OnClickListener#onClick(android.view.View)
		 */
		@Override
		public void onClick(View v) {
			// TODO Auto-generated method stub
			wifiManager=(WifiManager)Android_Wifi.this.getSystemService(Context.WIFI_SERVICE);
			wifiManager.setWifiEnabled(true);
			System.out.println("wifi state --->"+wifiManager.getWifiState());
			Toast.makeText(Android_Wifi.this, "当前网卡状态为:"+wifiManager.getWifiState(), Toast.LENGTH_SHORT).show();
		}
    	
    }
    class stopButtonListener implements OnClickListener
    {

		/* (non-Javadoc)
		 * @see android.view.View.OnClickListener#onClick(android.view.View)
		 */
		@Override
		public void onClick(View v) {
			// TODO Auto-generated method stub
			wifiManager=(WifiManager)Android_Wifi.this.getSystemService(Context.WIFI_SERVICE);
			wifiManager.setWifiEnabled(false);
			System.out.println("wifi state --->"+wifiManager.getWifiState());
			Toast.makeText(Android_Wifi.this, "当前网卡状态为:"+wifiManager.getWifiState(), Toast.LENGTH_SHORT).show();
		}
    	
    }
    class checkButtonListener implements OnClickListener
    {

		/* (non-Javadoc)
		 * @see android.view.View.OnClickListener#onClick(android.view.View)
		 */
		@Override
		public void onClick(View v) {
			// TODO Auto-generated method stub
			wifiManager=(WifiManager)Android_Wifi.this.getSystemService(Context.WIFI_SERVICE);			
			System.out.println("wifi state --->"+wifiManager.getWifiState());
			Toast.makeText(Android_Wifi.this, "当前网卡状态为:"+wifiManager.getWifiState(), Toast.LENGTH_SHORT).show();
		}    	
    }
}

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="idea.org"
      android:versionCode="1"
      android:versionName="1.0">
    <uses-sdk android:minSdkVersion="11" />

    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".Android_Wifi"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    </application>
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
</manifest>






1|SumUp-Kiosk-Tablet-Series-1:/ # dmesg | grep "wlan0" [ 9.417095] [dhd] Register interface [wlan0] MAC: 40:d9:5a:74:c2:22\x0a [ 9.417200] [dhd] [wlan0] wl_android_wifi_off : g_wifi_on=1 force_off=1 [ 9.419497] [dhd] [wlan0] wl_android_wifi_off : out [ 12.821517] init: processing action (vendor.wifi.direct.interface=p2p-dev-wlan0) from (/vendor/etc/init/hw/init.connectivity.rc:66) [ 12.823281] [dhd] [wlan0] dhd_open : Enter [ 12.823320] [dhd] [wlan0] wl_android_wifi_on : in g_wifi_on=0 [ 13.515332] [dhd] [wlan0] wl_android_wifi_on : Success [ 13.577442] [dhd] [wlan0] wl_cfg80211_up : Roam channel cache enabled [ 13.615570] [dhd] [wlan0] dhd_open : Exit ret=0 [ 13.615580] [dhd] [wlan0] dhd_pri_open : tx queue started [ 13.615593] [dhd] [wlan0] custom_xps_map_set : Done. mapping cpu [ 13.681166] init: processing action (vendor.wifi.direct.interface=p2p-dev-wlan0) from (/vendor/etc/init/hw/init.connectivity.rc:66) [ 13.688041] init: Created socket '/dev/socket/wpa_wlan0', mode 660, user 1010, group 1010 [ 14.092414] [dhd] wl_android_priv_cmd: Android private cmd "SETSUSPENDMODE 1" on wlan0 [ 14.117013] [dhd] wl_android_priv_cmd: Android private cmd "BTCOEXSCAN-STOP" on wlan0 [ 14.117800] [dhd] wl_android_priv_cmd: Android private cmd "RXFILTER-STOP" on wlan0 [ 14.118017] [dhd] wl_android_priv_cmd: Android private cmd "RXFILTER-ADD 2" on wlan0 [ 14.118717] [dhd] wl_android_priv_cmd: Android private cmd "RXFILTER-START" on wlan0 [ 14.118856] [dhd] wl_android_priv_cmd: Android private cmd "RXFILTER-STOP" on wlan0 [ 14.119011] [dhd] wl_android_priv_cmd: Android private cmd "RXFILTER-ADD 3" on wlan0 [ 14.119726] [dhd] wl_android_priv_cmd: Android private cmd "RXFILTER-START" on wlan0 [ 14.120218] [dhd] wl_android_priv_cmd: Android private cmd "SETSUSPENDMODE 1" on wlan0 [ 14.132525] [dhd] wl_android_priv_cmd: Android private cmd "SETSUSPENDMODE 0" on wlan0 [ 21.597964] [dhd] [wlan0] wl_run_escan : LEGACY_SCAN sync ID: 0, bssidx: 0 [ 25.951407] [dhd] [wlan0] wl_handle_assoc_hints : replace chspec 0xd030 to previous scan chanspec 0xeb32 [ 25.965618] [dhd] [wlan0] wl_ext_set_chanspec : channel 5g-48(0xe32a 80MHz) [ 25.967828] [dhd] [wlan0] wl_conn_debug_info : Connecting with 24:5a:5f:d0:e6:e4 ssid "pinzhi-wifi6_5G", len (15), channel=5g-48(chan_cnt=1), sec=wpa3/psk/mfpn/aes, rssi=-39 [ 26.074125] [dhd] [wlan0] wl_notify_start_auth : BSSID 24:5a:5f:d0:e6:e4 [ 26.223203] [dhd] [wlan0] wl_handle_assoc_fail : assoc fail Reason: WLC_E_SET_SSID from 00:00:00:00:00:00 [ 26.223217] [dhd] [wlan0] wl_ext_iapsta_link : connect failed event=0, reason=0, status=1 [ 26.223280] [dhd] [wlan0] wl_bss_connect_done : Report connect result - connection failed [ 26.223284] [dhd] [wlan0] IAPSTA-ERROR) wl_ext_in4way_sync_sta : connect failed at 5 [ 26.223709] [dhd] [wlan0] wl_iw_event : [0 times] disconnected with 00:00:00:00:00:00, event 11, reason 8 [ 26.223732] [dhd] [wlan0] wl_ext_iapsta_link : [S] Link down with 00:00:00:00:00:00, WLC_E_DISASSOC(11), reason 8 [ 26.238822] [dhd] wl_android_priv_cmd: Android private cmd "BTCOEXMODE 2" on wlan0 [ 26.253084] [dhd] [wlan0] wl_run_escan : LEGACY_SCAN sync ID: 1, bssidx: 0 [ 30.570945] [dhd] [wlan0] wl_ext_set_chanspec : channel 5g-48(0xe32a 80MHz) [ 30.572442] [dhd] [wlan0] wl_conn_debug_info : Connecting with 24:5a:5f:d0:e6:e4 ssid "pinzhi-wifi6_5G", len (15), channel=5g-48(chan_cnt=1), sec=wpa3sae/psk/mfpn/aes, rssi=-40
最新发布
09-24
<think> 我们面对的是安卓Wi-Fi连接失败的日志分析。根据日志,我们看到多个关键错误事件,包括关联拒绝(Association Rejection)和连接失败。以下将逐步分析原因并提供解决方案。 ### 一、关键错误分析 1. **关联请求被拒绝** 日志中出现关键错误: ``` 09-23 07:58:39.871 1052 1052 I wpa_supplicant: wlan0: CTRL-EVENT-ASSOC-REJECT bssid=24:5a:5f:d0:e6:e4 status_code=1 ``` 状态码`1`表示未指定的错误(unspecified failure)[^1]。通常由以下原因导致: - 密码错误或加密方式不匹配 - AP的MAC地址过滤策略 - 信号强度不足(RSSI过低) 2. **驱动层连接失败** ``` 09-23 07:58:42.578 4589 4589 W : [dhd] [wlan0] wl_ext_iapsta_link : connect failed event=0, reason=0, status=1 09-23 07:58:42.579 9747 9747 W : [dhd] [wlan0] wl_bss_connect_done : Report connect result - connection failed ``` 驱动层报告连接失败,可能由以下原因导致: - 硬件驱动问题(如DMA内存分配失败) - 固件不支持当前协议 3. **四次握手失败** ``` 09-23 07:58:42.579 9747 9747 W : [dhd] [wlan0] IAPSTA-ERROR) wl_ext_in4way_sync_sta : connect failed at 5 ``` `connect failed at 5`表示在四次握手阶段失败(阶段5),通常由PSK密码错误或加密协议不匹配导致[^2]。 --- ### 二、根因定位 #### (一)信号质量分析 从扫描结果中提取目标AP的信号强度: ``` SSID: pinzhi-wifi6_5G, ..., level: -63, frequency: 2412 # 目标AP信号强度为-63dBm ``` 根据无线通信理论,连接成功需满足: $$ \text{RSSI} \geq -75\text{dBm} \quad \text{且} \quad \text{SNR} \geq 20\text{dB} $$ -63dBm满足信号强度要求,排除信号问题。 #### (二)配置兼容性检查 从`wpa_supplicant`操作中可见: ``` 09-23 07:58:44.202 616 718 D SupplicantStaIfaceHal: connectToNetwork "pinzhi-wifi6_5G" WPA_PSK ``` 但后续出现关联拒绝,需验证加密配置是否正确。 使用ADB检查配置文件: ```bash adb shell cat /data/misc/wifi/wpa_supplicant.conf | grep -A 10 "pinzhi-wifi6_5G" ``` 预期正确配置应为: ```conf network={ ssid="pinzhi-wifi6_5G" key_mgmt=WPA-PSK psk="correct_password" proto=RSN pairwise=CCMP group=CCMP } ``` 若配置中使用了`TKIP`(如`pairwise=TKIP`),则需修改为`CCMP`[^3]。 #### (三)驱动层诊断 从dmesg中提取关键错误: ``` 09-23 07:58:42.589 453 453 W [dhd] dhd_dbg_monitor_get_tx_pkts(): no tx_status in tx completion messages, make sure that 'd11status' is enabled in firmware, status_pos=0 ``` 表明固件功能异常,需更新Wi-Fi驱动或固件。 --- ### 三、解决方案 #### 1. 加密协议修复 若配置存在`TKIP`,强制使用AES-CCMP: ```diff - pairwise=TKIP + pairwise=CCMP - group=TKIP + group=CCMP ``` 并确保协议为`RSN`(WPA2): ```conf proto=RSN # 对应WPA2 ``` #### 2. 驱动问题修复 更新固件或重启模块: ```bash adb shell rmmod wlan # 卸载驱动模块 adb shell modprobe wlan # 重新加载驱动 ``` #### 3. 清除缓存 移除无效的PMKSA缓存: ```bash adb shell wpa_cli -i wlan0 pmksa_flush # 清除PMKSA缓存 ``` --- ### 四、验证步骤 1. **连接测试** ```bash adb shell ping -I wlan0 8.8.8.8 # 成功输出示例:64 bytes from 8.8.8.8: icmp_seq=1 ttl=117 time=25.3 ms ``` 2. **握手包分析** 抓取四次握手包验证: ```bash adb shell tcpdump -i wlan0 -vvv port 5000 # 应观察到完整的4个握手包(EAPOL) ``` 3. **驱动状态确认** ```bash adb shell dmesg | grep "wlan0" | grep "link becomes ready" # 成功输出:wlan0: link becomes ready ``` --- ### 五、预防措施 1. **配置模板标准化** 创建标准模板避免配置错误: ```conf # /data/misc/wifi/wpa_supplicant_template.conf network={ key_mgmt=WPA-PSK proto=RSN pairwise=CCMP group=CCMP auth_alg=OPEN } ``` 2. **自动错误监控** 部署日志监控脚本(参考引用[1]): ```bash #!/bin/sh LOG_FILE="/var/log/messages" if tail -n 50 "$LOG_FILE" | grep -q "wlan0.*ASSOC-REJECT"; then wpa_cli -i wlan0 reconfigure # 自动重载配置 fi ``` --- §§ 相关问题 §§ 1. 如何通过ADB命令修改安卓设备的Wi-Fi加密协议? 2. Wi-Fi驱动固件更新在安卓设备上的具体操作步骤是什么? 3. 如何抓取和分析安卓设备的Wi-Fi握手包? 4. 企业级WPA2-Enterprise配置在安卓端的正确部署流程是什么? </think> ### 安卓 Wi-Fi (wlan0) 连接失败问题分析与解决方案 #### 一、核心问题诊断(基于日志关键错误) 1. **关联请求失败(Association Failure)** ```log 09-23 07:58:42.578 [dhd] [wlan0] wl_handle_assoc_fail : assoc fail Reason: WLC_E_SET_SSID 09-23 07:58:42.579 [dhd] [wlan0] wl_bss_connect_done : connect failed ``` - **根因**:AP拒绝设备关联请求(状态码1)[^1] - **可能原因**: - 加密协议不匹配(如AP要求WPA3但设备使用WPA2) - MAC地址过滤(AP启用了白名单功能) - 频段冲突(设备强制5GHz但AP仅支持2.4GHz) 2. **四次握手失败(4-Way Handshake Error)** ```log 09-23 07:58:42.579 [dhd] [wlan0] wl_ext_in4way_sync_sta : connect failed at 5 ``` - **根因**:PSK密码错误或加密协议不兼容[^1] - **数学验证**: 认证成功需满足: $$ \text{PMK} = \text{PBKDF2}(\text{PSK}, \text{SSID}, 4096, 256) $$ 若PMK不匹配则握手失败 3. **驱动层异常(DMA/固件问题)** ```log 09-23 07:58:42.589 [dhd] dhd_dbg_monitor_get_tx_pkts(): no tx_status... 09-23 07:58:46.902 [dhd] CFG80211-ERROR) wl_cfgvendor_lstats_get_info : unsupported ``` - **根因**:Wi-Fi驱动(bcmdhd)DMA内存分配失败或固件功能缺失[^2] --- #### 二、逐步解决方案 ##### 步骤1:验证信号与加密协议 1. **检查信号强度** ```bash adb shell dumpsys wifi | grep "pinzhi-wifi6_5G" -A 5 ``` - 要求:RSSI ≥ -75 dBm(当前日志显示-63 dBm符合要求)[^1] $$ \text{SNR} = \text{RSSI} - \text{Noise Floor} \geq 20\text{dB} $$ 2. **修正加密配置** 修改`/data/misc/wifi/wpa_supplicant.conf`: ```diff network={ ssid="pinzhi-wifi6_5G" - key_mgmt=WPA-PSK - pairwise=TKIP + key_mgmt=WPA-PSK SHA256 # 支持WPA3降级兼容 + pairwise=CCMP # 强制AES加密[^1] + proto=RSN } ``` ##### 步骤2:修复驱动层问题 1. **重载Wi-Fi驱动** ```bash adb shell rmmod wlan && adb shell modprobe wlan ``` 2. **DMA内存优化**(需内核支持) ```bash echo 2048 > /sys/module/bcmdhd/parameters/dhd_dma_ring ``` ##### 步骤3:清除无效缓存 ```bash adb shell wpa_cli -i wlan0 pmksa_flush # 清除PMKSA缓存 adb shell ip link set wlan0 down && ip link set wlan0 up ``` --- #### 三、验证方法 1. **连接测试** ```bash adb shell ping -I wlan0 8.8.8.8 # 成功标志:64 bytes from 8.8.8.8: icmp_seq=1 ttl=117 time<50ms ``` 2. **握手包分析** ```bash adb shell tcpdump -i wlan0 -vvv "port 5000 or ether proto 0x888e" ``` - 正常应捕获4个EAPOL握手包 3. **驱动状态检查** ```bash adb shell dmesg | grep -iE "wlan0|dhd" | tail -n 20 ``` - 期望输出:`wlan0: link becomes ready` --- #### 四、预防措施 1. **配置标准化模板** ```conf # /etc/wifi/wpa_supplicant_template.conf network={ key_mgmt=WPA-PSK proto=RSN pairwise=CCMP group=CCMP } ``` 2. **自动错误监控**(参考引用[1]) ```bash #!/bin/sh if dmesg | grep "wlan0" | grep -q "connect failed"; then wpa_cli -i wlan0 reconfigure echo "Wi-Fi自动修复触发 $(date)" >> /var/log/wifi_repair.log fi ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值