android_wifi

wifi权限

<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"/>

wifi处理类
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
public  class  WifiUtil {  
     //定义一个WifiManager对象  
     private  WifiManager mWifiManager;  
     //定义一个WifiInfo对象  
     private  WifiInfo mWifiInfo;  
     //扫描出的网络连接列表  
     private  List<ScanResult> mWifiList;  
     //网络连接列表  
     private  List<WifiConfiguration> mWifiConfigurations;  
     WifiLock mWifiLock;  
     public  WifiAdmin(Context context){  
         //取得WifiManager对象  
         mWifiManager=(WifiManager) context.getSystemService(Context.WIFI_SERVICE);  
         //取得WifiInfo对象  
         mWifiInfo=mWifiManager.getConnectionInfo();  
     }  
     //打开wifi  
     public  void  openWifi(){  
         if (!mWifiManager.isWifiEnabled()){  
             mWifiManager.setWifiEnabled( true );  
         }  
     }  
     //关闭wifi  
     public  void  closeWifi(){  
         if (!mWifiManager.isWifiEnabled()){  
             mWifiManager.setWifiEnabled( false );  
         }  
     }  
      // 检查当前wifi状态    
     public  int  checkState() {    
         return  mWifiManager.getWifiState();    
     }    
     //锁定wifiLock  
     public  void  acquireWifiLock(){  
         mWifiLock.acquire();  
     }  
     //解锁wifiLock  
     public  void  releaseWifiLock(){  
         //判断是否锁定  
         if (mWifiLock.isHeld()){  
             mWifiLock.acquire();  
         }  
     }  
     //创建一个wifiLock  
     public  void  createWifiLock(){  
         mWifiLock=mWifiManager.createWifiLock( "test" );  
     }  
     //得到配置好的网络  
     public  List<WifiConfiguration> getConfiguration(){  
         return  mWifiConfigurations;  
     }  
     //指定配置好的网络进行连接  
     public  void  connetionConfiguration( int  index){  
         if (index>mWifiConfigurations.size()){  
             return  ;  
         }  
         //连接配置好指定ID的网络  
         mWifiManager.enableNetwork(mWifiConfigurations.get(index).networkId,  true );  
     }  
     public  void  startScan(){  
         mWifiManager.startScan();  
         //得到扫描结果  
         mWifiList=mWifiManager.getScanResults();  
         //得到配置好的网络连接  
         mWifiConfigurations=mWifiManager.getConfiguredNetworks();  
     }  
     //得到网络列表  
     public  List<ScanResult> getWifiList(){  
         return  mWifiList;  
     }  
     //查看扫描结果  
     public  StringBuffer lookUpScan(){  
         StringBuffer sb= new  StringBuffer();  
         for ( int  i= 0 ;i<mWifiList.size();i++){  
             sb.append( "Index_"  new  Integer(i +  1 ).toString() +  ":" );  
              // 将ScanResult信息转换成一个字符串包    
             // 其中把包括:BSSID、SSID、capabilities、frequency、level    
             sb.append((mWifiList.get(i)).toString()).append( "\n" );  
         }  
         return  sb;    
     }  
     public  String getMacAddress(){  
         return  (mWifiInfo== null )? "NULL" :mWifiInfo.getMacAddress();  
     }  
     public  String getBSSID(){  
         return  (mWifiInfo== null )? "NULL" :mWifiInfo.getBSSID();  
     }  
     public  int  getIpAddress(){  
         return  (mWifiInfo== null )? 0 :mWifiInfo.getIpAddress();  
     }  
     //得到连接的ID  
     public  int  getNetWordId(){  
         return  (mWifiInfo== null )? 0 :mWifiInfo.getNetworkId();  
     }  
     //得到wifiInfo的所有信息  
     public  String getWifiInfo(){  
         return  (mWifiInfo== null )? "NULL" :mWifiInfo.toString();  
     }  
     //添加一个网络并连接  
     public  void  addNetWork(WifiConfiguration configuration){  
         int  wcgId=mWifiManager.addNetwork(configuration);  
         mWifiManager.enableNetwork(wcgId,  true );  
     }  
     //断开指定ID的网络  
     public  void  disConnectionWifi( int  netId){  
         mWifiManager.disableNetwork(netId);  
         mWifiManager.disconnect();  
     }  
}
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、付费专栏及课程。

余额充值