wifi定时扫描流程

本文详细分析了Android系统中进行WiFi扫描时遇到的错误,从Java层的WificondControl到HAL层的IWifiScannerImpl,再到wpa_supplicant,最后到驱动内核层的过程。在Java层,出现了RuntimeException错误,而在HAL层和驱动内核层,扫描请求成功但存在超时情况。整个过程展示了WiFi扫描的交互流程和可能出现的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#if 1


--------- beginning of main

 

https://blog.csdn.net/zx54633089/article/details/110942431?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-0&spm=1001.2101.3001.4242

java端可参考上面链接

1.java端  WificondControl.scan(WificondControl.java:632)

进程号:2092


04-30 18:07:23.318  2092  2455 E WificondControl: scan wlan0
04-30 18:07:23.319  2092  2455 W System.err: simulator exception: java.lang.RuntimeException: error is here
04-30 18:07:23.320  2092  2455 D run stack: simulator
04-30 18:07:23.320  2092  2455 D run stack: java.lang.RuntimeException: error is here
04-30 18:07:23.320  2092  2455 D run stack:     at com.android.server.wifi.WificondControl.scan(WificondControl.java:632)
04-30 18:07:23.320  2092  2455 D run stack:     at com.android.server.wifi.WifiNative.scan(WifiNative.java:1169)
04-30 18:07:23.320  2092  2455 D run stack:     at com.android.server.wifi.scanner.WificondScannerImpl.startSingleScan(WificondScannerImpl.java:193)
04-30 18:07:23.320  2092  2455 D run stack:     at com.android.server.wifi.scanner.WifiScanningServiceImpl$WifiSingleScanStateMachine.tryToStartNewScan(WifiScanningServiceImpl.java:912)
04-30 18:07:23.320  2092  2455 D run stack:     at com.android.server.wifi.scanner.WifiScanningServiceImpl$WifiSingleScanStateMachine$DriverStartedState.processMessage(WifiScanningServiceImpl.java:635)
04-30 18:07:23.320  2092  2455 D run stack:     at com.android.internal.util.StateMachine$SmHandler.processMsg(StateMachine.java:993)
04-30 18:07:23.320  2092  2455 D run stack:     at com.android.internal.util.StateMachine$SmHandler.handleMessage(StateMachine.java:809)
04-30 18:07:23.320  2092  2455 D run stack:     at android.os.Handler.dispatchMessage(Handler.java:106)
04-30 18:07:23.320  2092  2455 D run stack:     at android.os.Looper.loop(Looper.java:193)
04-30 18:07:23.320  2092  2455 D run stack:     at android.os.HandlerThread.run(HandlerThread.java:65)

 

 

2.hal端

IWifiScannerImpl.aidl

// Request a single scan using a SingleScanSettings parcelable object.
  boolean scan(in SingleScanSettings scanSettings);

进程号:1898  进程号已经改变


--------- beginning of system
04-30 18:07:23.321  1898  1898 E wificond: NL80211_CMD_TRIGGER_SCAN not failed1: Success

04-30 18:07:23.364  1898  1898 D callstack: #00 pc 000207c5  /system/bin/wificond (android::wificond::ScanUtils::Scan(unsigned int, bool, int, std::__1::vector<std::__1::vector<unsigned char, std::__1::allocator<unsigned char>>, std::__1::allocator<std::__1::vector<unsigned char, std::__1::allocator<unsigned char>>>> const&, std::__1::vector<unsigned int, std::__1::allocator<unsigned int>> const&, int*)+592)
04-30 18:07:23.365  1898  1898 D callstack: #01 pc 0002e3a3  /system/bin/wificond (android::wificond::ScannerImpl::scan(com::android::server::wifi::wificond::SingleScanSettings const&, bool*)+554)
04-30 18:07:23.365  1898  1898 D callstack: #02 pc 00031a11  /system/bin/wificond (android::net::wifi::BnWifiScannerImpl::onTransact(unsigned int, android::Parcel const&, android::Parcel*, unsigned int)+288)
04-30 18:07:23.365  1898  1898 D callstack: #03 pc 0003613f  /system/lib/libbinder.so (android::BBinder::transact(unsigned int, android::Parcel const&, android::Parcel*, unsigned int)+70)
04-30 18:07:23.365  1898  1898 D callstack: #04 pc 0003d99f  /system/lib/libbinder.so (android::IPCThreadState::executeCommand(int)+410)
04-30 18:07:23.365  1898  1898 D callstack: #05 pc 0003d72b  /system/lib/libbinder.so (android::IPCThreadState::getAndExecuteCommand()+106)
04-30 18:07:23.365  1898  1898 D callstack: #06 pc 0003dce5  /system/lib/libbinder.so (android::IPCThreadState::handlePolledCommands()+12)
04-30 18:07:23.365  1898  1898 D callstack: #07 pc 0001f3cf  /system/bin/wificond ((anonymous namespace)::WatchFdCallback::handleEvent(int, int, void*)+26)
04-30 18:07:23.365  1898  1898 D callstack: #08 pc 0002b0c7  /system/bin/wificond (android::Looper::pollInner(int)+630)
04-30 18:07:23.365  1898  1898 D callstack: #09 pc 0002adcf  /system/bin/wificond (android::Looper::pollOnce(int, int*, int*, void**)+26)
04-30 18:07:23.365  1898  1898 D callstack: #10 pc 0001f261  /system/bin/wificond (android::wificond::LooperBackedEventLoop::Poll()+24)
04-30 18:07:23.365  1898  1898 D callstack: #11 pc 0001233f  /system/bin/wificond (main+726)
04-30 18:07:23.365  1898  1898 D callstack: #12 pc 0008bc15  /system/lib/libc.so (__libc_init+48)
04-30 18:07:23.365  1898  1898 D callstack: #13 pc 00012013  /system/bin/wificond (_start_main+46)
04-30 18:07:23.365  1898  1898 D callstack: #14 pc 0000031e  <anonymous:a9f78000>

04-30 18:07:23.365  1898  1898 E wificond: NL80211_CMD_TRIGGER_SCAN not failed2: Success

 

3.wpa_supplicant

由hal发送 NL80211_CMD_TRIGGER_SCAN netlink消息,wpa_supplicant接收消息

进程号:2756  进程号再次发生改变

04-30 18:07:23.373  2756  2756 I wpa_supplicant: nl80211: Drv Event 33 (NL80211_CMD_TRIGGER_SCAN) received for wlan0
04-30 18:07:23.374  2756  2756 I wpa_supplicant: wlan0: nl80211: Scan trigger

 

 


04-30 18:07:23.374  1898  1898 E wificond: NL80211_CMD_TRIGGER_SCAN not failed5: Success

//hal端的日志

04-30 18:07:24.941  2756  2756 I wpa_supplicant: nl80211: Drv Event 34 (NL80211_CMD_NEW_SCAN_RESULTS) received for wlan0
04-30 18:07:24.941  2756  2756 E wpa_supplicant: wlan0: nl80211: New scan results available
04-30 18:07:24.941  2756  2756 I wpa_supplicant: nl80211: Scan probed for SSID ''
#endif

4.驱动 内核层

04-30 18:07:23.374  2756  2756 I wpa_supplicant: wlan0: nl80211: Scan trigger

通过网络通讯,再把scan的需求 发送给内核

由内核来完成scan动作,然后上报scan结果。

NL80211_CMD_TRIGGER_SCAN 33号命令是由wificond发送出去的

但是当此事件超时时,wpa_supplicant也会发送NL80211_CMD_TRIGGER_SCAN命令

内核的响应是广播,所以 wificond,wpa_supplicant都能接收到相应命令的响应。

static inline int genlmsg_reply(struct sk_buff *skb, struct genl_info *info)
{
    return genlmsg_unicast(genl_info_net(info), skb, info->snd_portid);
}

 

 

 

 

 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值