鸿蒙 WiFi 扫描流程(1)
上一篇记录了WiFi 的打开流程,这里我们继续看,WiFi使能后,如何发起扫描?代码还是用的 鸿蒙OpenHarmony4.0基线代码。
foundation/communication/wifi/wifi/services/wifi_standard/wifi_hal/wifi_hal_sta_interface.c
WifiErrorNo Start(void)
{LOGI("Ready to start wifi");if (StartSupplicant() != WIFI_HAL_SUCCESS) {LOGE("wpa_supplicant start failed!");return WIFI_HAL_OPEN_SUPPLICANT_FAILED;}LOGI("wpa_supplicant start successfully!");if (AddWpaIface(0) != WIFI_HAL_SUCCESS) {LOGE("Failed to add wpa interface!");StopWpaAndWpaHal(0);return WIFI_HAL_CONN_SUPPLICANT_FAILED;}if (ConnectSupplicant() != WIFI_HAL_SUCCESS) {LOGE("SupplicantHal connect wpa_supplicant failed!");StopWpaAndWpaHal(0);return WIFI_HAL_CONN_SUPPLICANT_FAILED;}
#ifdef HDI_INTERFACE_SUPPORTif (HdiStart() != WIFI_HAL_SUCCESS) {LOGE("[STA] Start hdi failed!");return WIFI_HAL_FAILED;}if (RegisterHdiStaCallbackEvent() != WIFI_HAL_SUCCESS) {LOGE("[STA] Start RegisterHdiStaCallbackEvent failed!");return WIFI_HAL_FAILED;}
#endifLOGI("Start wifi successfully");return WIFI_HAL_SUCCESS;
}
上段代码我们知道,如果使能成功后就会返回 WIFI_HAL_SUCCESS,那看下那个地方去判断这个返回值,这里的 WIFI_HAL_SUCCESS 值是 0,表示 Success;
foundation/communication/wifi/wifi/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/sta_state_machine.cpp
void StaStateMachine::StartWifiProcess()
{WifiSettings::GetInstance().SetWifiState(static_cast<int>(WifiState::ENABLING));staCallback.OnStaOpenRes(OperateResState::OPEN_WIFI_OPENING);int res;if (WifiOprMidState::RUNNING == WifiConfigCenter::GetInstance().GetWifiScanOnlyMidState()) {res = static_cast<int>(WIFI_IDL_OPT_OK);} else {res = WifiStaHalInterface::GetInstance().StartWifi(); ---> 此时成功后,返回值是 0;}if (res == static_cast<int>(WIFI_IDL_OPT_OK)) { ---> 就走到这里来了WIFI_LOGI("Start wifi successfully!");if (WifiStaHalInterface::GetInstance().WpaAutoConnect(false) != WIFI_IDL_OPT_OK) {WIFI_LOGI("The automatic Wpa connection is disabled failed.");}/* callback the InterfaceService that wifi is enabled successfully. */ ---> 通知给相应的接口服务WifiSettings::GetInstance().SetWifiState(static_cast<int>(WifiState::ENABLED));staCallback.OnStaOpenRes(OperateResState::OPEN_WIFI_SUCCEED);/* Sets the MAC address of WifiSettings. */std::string mac;if ((WifiStaHalInterface::GetInstance().GetStaDeviceMacAddress(mac)) == WIFI_IDL_OPT_OK) {WifiSettings::GetInstance().SetMacAddress(mac);std::string realMacAddress;WifiSettings::GetInstance().GetRealMacAddress(realMacAddress);if (realMacAddress.empty()) {WifiSettings::GetInstance().SetRealMacAddress(mac);}} else {WIFI_LOGI("GetStaDeviceMacAddress failed!");}
#ifndef OHOS_ARCH_LITEWIFI_LOGI("Register netsupplier");WifiNetAgent::GetInstance().OnStaMachineWifiStart();
#endif/* Initialize Connection Information. */InitWifiLinkedInfo();InitLastWifiLinkedInfo();WifiSettings::GetInstance().SaveLinkedInfo(linkedInfo);SyncDeviceConfigToWpa();
#ifndef OHOS_ARCH_LITEChipCapability::GetInstance().InitializeChipCapability();
#endif/* The current state of StaStateMachine transfers to SeparatedState after* enable supplicant.*/SwitchState(pSeparatedState); ---> 切换状态机} else {/* Notify the InterfaceService that wifi is failed to enable wifi. */LOGE("StartWifi failed, and errcode is %d.", res);WifiSettings::GetInstance().SetWifiState(static_cast<int>(WifiState::DISABLED));WifiSettings::GetInstance().SetUserLastSelectedNetworkId(INVALID_NETWORK_ID);staCallback.OnStaOpenRes(OperateResState::OPEN_WIFI_FAILED);}
}
这里我们看如何callback 的
// 更新状态
WifiSettings::GetInstance().SetWifiState(static_cast<int>(WifiState::ENABLED));
// 主要找到 staCallback 里面的 OnStaOpenRes 方法
staCallback.OnStaOpenRes(OperateResState::OPEN_WIFI_SUCCEED);
// 我们看下这个staCallback 是何时被赋值的,在 sta_state_machine.cpp 类里面找到如下:
void StaStateMachine::RegisterStaServiceCallback(const StaServiceCallback &callbacks)
{WIFI_LOGI("RegisterStaServiceCallback.");staCallback = callbacks;
}
// 那何时注册的呢?在往回找:
//foundation/communication/wifi/wifi/services/wifi_standard/wifi_framework/wifi_manage/wifi_sta/sta_service.cpp
ErrCode StaService::InitStaService(const StaServiceCallback &callbacks)
{RegisterStaServiceCallback(callbacks);
}
void StaService::RegisterStaServiceCallback(const StaServiceCallback &callbacks) const
{LOGI("Enter StaService::RegisterStaServiceCallback.");if (pStaStateMachine == nullptr) {LOGE("pStaStateMachine is null.\n");return;}pStaStateMachine->RegisterStaServiceCallback(callbacks); ---> 注册到上面的 sta_state_machine.cpp 类里面
}
// 再往回找,看谁调用StaService::InitStaService 方法,这里我就省去流程了,最终可以发现在 wifi_manager.cpp 类里面
// 传的参数都是 WifiManager::GetInstance().GetStaCallback(),所以直接看WifiManager里面的GetStaCallback方法
StaServiceCallback WifiManager::GetStaCallback()
{return mStaCallback; ---> 就是这个
}// staCallback.OnStaOpenRes(OperateResState::OPEN_WIFI_SUCCEED); 也就是回掉WifiManager::mStaCallback::OnStaOpenRes方法
// foundation/communication/wifi/wifi/services/wifi_standard/wifi_framework/wifi_manage/wifi_manager.cpp
void WifiManager::InitStaCallback(void)
{mStaCallback.OnStaOpenRes = DealStaOpenRes; ---》 初始化成这个,那我们就看这个mStaCallback.OnStaCloseRes = DealStaCloseRes;mStaCallback.OnStaConnChanged = DealStaConnChanged;mStaCallback.OnWpsChanged = DealWpsChanged;mStaCallback.OnStaStreamChanged = DealStreamChanged;mStaCallback.OnStaRssiLevelChanged = DealRssiChanged;return;
}
// OPEN_WIFI_SUCCEED 值是 1
void WifiManager::DealStaOpenRes(OperateResState state)
{ // OPEN_WIFI_OPENING = 0, OPEN_WIFI_SUCCEED = 1, OPEN_WIFI_FAILED = 2;WIFI_LOGI("Enter DealStaOpenRes: %{public}d", static_cast<int>(state));WifiEventCallbackMsg cbMsg;cbMsg.msgCode = WIFI_CBK_MSG_STATE_CHANGE;if (state == OperateResState::OPEN_WIFI_OPENING) {cbMsg.msgData = static_cast<int>(WifiState::ENABLING);WifiInternalEventDispatcher::GetInstance().AddBroadCastMsg(cbMsg);return;}if ((state == OperateResState::OPEN_WIFI_FAILED) || (state == OperateResState::OPEN_WIFI_DISABLED)) {WIFI_LOGE("DealStaOpenRes:wifi open failed!");WifiConfigCenter::GetInstance().SetWifiMidState(WifiOprMidState::OPENING, WifiOprMidState::CLOSED);DealStaCloseRes(state);return;}WIFI_LOGI("DealStaOpenRes:wifi open successfully!");WifiConfigCenter::GetInstance().SetWifiMidState(WifiOprMidState::OPENING, WifiOprMidState::RUNNING);WifiConfigCenter::GetInstance().SetStaLastRunState(true);if (WifiConfigCenter::GetInstance().GetAirplaneModeState() == MODE_STATE_OPEN) {WifiConfigCenter::GetInstance().SetWifiStateWhenAirplaneMode(true);}
#ifdef FEATURE_P2P_SUPPORTWifiOprMidState p2pState = WifiConfigCenter::GetInstance().GetP2pMidState();WIFI_LOGI("DealStaOpenRes, current p2p state:%{public}d", p2pState);if (p2pState == WifiOprMidState::CLOSED) {WifiManager::GetInstance().AutoStartP2pService(AutoStartOrStopServiceReason::TYRTO_ENABLE_P2P_WHEN_WIFI_OPENED);}
#endifcbMsg.msgData = static_cast<int>(WifiState::ENABLED);WifiInternalEventDispatcher::GetInstance().AddBroadCastMsg(cbMsg);AutoStartEnhanceService();CheckAndStartScanService(); ---> 和扫描相关的if (WifiSettings::GetInstance().CheckScanOnlyAvailable() &&WifiManager::GetInstance().GetLocationModeByDatashare(WIFI_SCAN_ABILITY_ID)) {WifiConfigCenter::GetInstance().SetWifiScanOnlyMidState(WifiOprMidState::RUNNING);}
}// 看扫描相关的 CheckAndStartScanService 方法:
void WifiManager::CheckAndStartScanService(void)
{WifiOprMidState scanState = WifiConfigCenter::GetInstance().GetScanMidState();WIFI_LOGI("CheckAndStartScanService scanState: %{public}d", static_cast<int>(scanState));if (scanState != WifiOprMidState::CLOSED) {/* If the scanning function is enabled when the STA is not enabled, you need to start the scheduledscanning function immediately when the STA is enabled. */IScanService *pService = WifiServiceManager::GetInstance().GetScanServiceInst();if (pService != nullptr) {pService->OnClientModeStatusChanged(static_cast<int>(OperateResState::DISCONNECT_DISCONNECTED));}return;}if (!WifiConfigCenter::GetInstance().SetScanMidState(scanState, WifiOprMidState::OPENING)) {WIFI_LOGW("Failed to set scan mid state opening! may be other activity has been operated");return;}ErrCode errCode = WIFI_OPT_FAILED;do {if (WifiServiceManager::GetInstance().CheckAndEnforceService(WIFI_SERVICE_SCAN) < 0) {WIFI_LOGE("Load %{public}s service failed!", WIFI_SERVICE_SCAN);break;}IScanService *pService = WifiServiceManager::GetInstance().GetScanServiceInst(); ---> 这个就是scan_interface.cppif (pService == nullptr) {WIFI_LOGE("Create %{public}s service failed!", WIFI_SERVICE_SCAN);break;}errCode = pService->RegisterScanCallbacks(WifiManager::GetInstance().GetScanCallback());if (errCode != WIFI_OPT_SUCCESS) {WIFI_LOGE("Register scan service callback failed!");break;}errCode = pService->Init(); ----> 主要看下这个if (errCode != WIFI_OPT_SUCCESS) {WIFI_LOGE("init scan service failed, ret %{public}d!", static_cast<int>(errCode));break;}IEnhanceService *pEnhanceService = WifiServiceManager::GetInstance().GetEnhanceServiceInst();if (pEnhanceService == nullptr) {WIFI_LOGE("Create %{public}s service failed!", WIFI_SERVICE_ENHANCE);break;}errCode = pService->SetEnhanceService(pEnhanceService);if (errCode != WIFI_OPT_SUCCESS) {WIFI_LOGE("SetEnhanceService failed, ret %{public}d!", static_cast<int>(errCode));break;}} while (0);if (errCode != WIFI_OPT_SUCCESS) {WifiConfigCenter::GetInstance().SetScanMidState(WifiOprMidState::OPENING, WifiOprMidState::CLOSED);WifiServiceManager::GetInstance().UnloadService(WIFI_SERVICE_SCAN);}return;
}
pService->Init() 看下初始化扫描服务foundation/communication/wifi/wifi/services/wifi_standard/wifi_framework/wifi_manage/wifi_scan/scan_interface.cpp
ErrCode ScanInterface::Init()
{WIFI_LOGI("Enter ScanInterface::Init.\n");pScanService = new (std::nothrow)ScanService(); ---> 创建可一个 ScanService,初始化参数if (pScanService == nullptr) {WIFI_LOGE("New ScanService failed.\n");return WIFI_OPT_INVALID_PARAM;}if (!(pScanService->InitScanService(mScanSerivceCallbacks))) { ---> 对应上面传下来的注册参数WIFI_LOGE("InitScanService failed.\n");delete pScanService;pScanService = nullptr;return WIFI_OPT_INVALID_PARAM;}return WIFI_OPT_SUCCESS;
}//foundation/communication/wifi/wifi/services/wifi_standard/wifi_framework/wifi_manage/wifi_scan/scan_service.cpp
bool ScanService::InitScanService(const IScanSerivceCallbacks &scanSerivceCallbacks)
{WIFI_LOGI("Enter ScanService::InitScanService.\n");mScanSerivceCallbacks = scanSerivceCallbacks;pScanStateMachine = new (std::nothrow) ScanStateMachine(); ---> 状态机if (pScanStateMachine == nullptr) {WIFI_LOGE("Alloc pScanStateMachine failed.\n");return false;}if (!pScanStateMachine->InitScanStateMachine()) {WIFI_LOGE("InitScanStateMachine failed.\n");return false;}if (!pScanStateMachine->EnrollScanStatusListener(std::bind(&ScanService::HandleScanStatusReport, this, std::placeholders::_1))) {WIFI_LOGE("ScanStateMachine_->EnrollScanStatusListener failed.\n");return false;}pScanMonitor = new (std::nothrow) ScanMonitor(); ---> 消息监视if (pScanMonitor == nullptr) {WIFI_LOGE("Alloc pScanMonitor failed.\n");return false;}if (!pScanMonitor->InitScanMonitor()) {WIFI_LOGE("InitScanMonitor failed.\n");return false;}
#ifndef OHOS_ARCH_LITEif (standByListerner.Init()) {WIFI_LOGE("standByListerner Init failed.");}
#endifif ((WifiStaHalInterface::GetInstance().GetSupportFrequencies(SCAN_BAND_24_GHZ, freqs2G) != WIFI_IDL_OPT_OK) ||(WifiStaHalInterface::GetInstance().GetSupportFrequencies(SCAN_BAND_5_GHZ, freqs5G) != WIFI_IDL_OPT_OK) ||(WifiStaHalInterface::GetInstance().GetSupportFrequencies(SCAN_BAND_5_GHZ_DFS_ONLY, freqsDfs) !=WIFI_IDL_OPT_OK)) {WIFI_LOGE("GetSupportFrequencies failed.\n");}ChannelsTable chanTbs;(void)WifiSettings::GetInstance().GetValidChannels(chanTbs);if (chanTbs[BandType::BAND_2GHZ].size() == 0) {WIFI_LOGI("Update valid channels!");std::vector<int32_t> supp2Gfreqs(freqs2G.begin(), freqs2G.end());std::vector<int32_t> supp5Gfreqs(freqs5G.begin(), freqs5G.end());for (auto iter = supp2Gfreqs.begin(); iter != supp2Gfreqs.end(); iter++) {int32_t channel = FrequencyToChannel(*iter);if (channel == INVALID_FREQ_OR_CHANNEL) {continue;}chanTbs[BandType::BAND_2GHZ].push_back(channel);}for (auto iter = supp5Gfreqs.begin(); iter != supp5Gfreqs.end(); iter++) {int32_t channel = FrequencyToChannel(*iter);if (channel == INVALID_FREQ_OR_CHANNEL) {continue;}chanTbs[BandType::BAND_5GHZ].push_back(channel);}if (WifiSettings::GetInstance().SetValidChannels(chanTbs)) {WIFI_LOGE("%{public}s, fail to SetValidChannels", __func__);}}pScanMonitor->SetScanStateMachine(pScanStateMachine);pScanStateMachine->SendMessage(static_cast<int>(CMD_SCAN_PREPARE)); ---> 状态机里面处理 CMD_SCAN_PREPAREGetScanControlInfo();return true;
}
我们到状态机里面看下如何处理这个消息 CMD_SCAN_PREPARE
foundation/communication/wifi/wifi/services/wifi_standard/wifi_framework/wifi_manage/wifi_scan/scan_state_machine.cpp
bool ScanStateMachine::InitState::ExecuteStateMsg(InternalMessage *msg)
{WIFI_LOGI("Enter ScanStateMachine::InitState::ExecuteStateMsg.\n");if (msg == nullptr) {WIFI_LOGE("msg is null.\n");return true;}switch (msg->GetMessageName()) {case CMD_SCAN_PREPARE:LoadDriver(); ---> 执行这个方法return true;// 看下LoadDriver() 方法:
void ScanStateMachine::InitState::LoadDriver()
{WIFI_LOGI("Enter ScanStateMachine::LoadDriver.\n");pScanStateMachine->SwitchState(pScanStateMachine->hardwareReadyState); ---> 状态切换为 HardwareReadyStatepScanStateMachine->ReportStatusChange(SCAN_STARTED_STATUS); ---> 上报 SCAN_STARTED_STATUS = 0, /* Started successfully */WIFI_LOGI("Start Scan Service Success.\n");
}void ScanStateMachine::ReportStatusChange(ScanStatus status)
{WIFI_LOGI("Enter ScanStateMachine::ReportStatusChange.\n");ScanStatusReport scanStatusReport;scanStatusReport.status = status;if (scanStatusReportHandler) {scanStatusReportHandler(scanStatusReport); ---> 看这个}
}
// foundation/communication/wifi/wifi/services/wifi_standard/wifi_framework/wifi_manage/wifi_scan/scan_service.cpp
void ScanService::HandleScanStatusReport(ScanStatusReport &scanStatusReport)
{WIFI_LOGI("Enter ScanService::HandleScanStatusReport.\n");switch (scanStatusReport.status) {case SCAN_STARTED_STATUS: {if (pScanStateMachine == nullptr) {WIFI_LOGE("HandleScanStatusReport-SCAN_STARTED_STATUS pScanStateMachine is null\n");return;}scanStartedFlag = true;/* Pno scan maybe has started, stop it first. */pScanStateMachine->SendMessage(CMD_STOP_PNO_SCAN); ---》 先停止PNO扫描mScanSerivceCallbacks.OnScanStartEvent(); ---> 更新下状态SystemScanProcess(true); ---> 看这个方法break;}
// 跟着流程继续往下看:
void ScanService::SystemScanProcess(bool scanAtOnce)
{WIFI_LOGI("Enter ScanService::SystemScanProcess, scanAtOnce:%{public}d.", scanAtOnce);StopSystemScan();int state = WifiSettings::GetInstance().GetScreenState();WIFI_LOGI("Screen state(1:OPEN, 2:CLOSE): %{public}d.", state); ---> 屏幕状态决定哪种扫描模式if (state == MODE_STATE_OPEN) {{std::unique_lock<std::mutex> lock(scanControlInfoMutex);int i = 0;for (auto iter = scanControlInfo.scanIntervalList.begin(); iter != scanControlInfo.scanIntervalList.end(); ++iter) {if (iter->scanScene ==SCAN_SCENE_ALL && iter->scanMode ==ScanMode::SYSTEM_TIMER_SCAN && iter->isSingle ==false) {WIFI_LOGI("iter[%{public}d]: intervalMode:%{public}d, interval:%{public}d, count:%{public}d",i++, iter->intervalMode, iter->interval, iter->count);systemScanIntervalMode.scanIntervalMode.intervalMode = iter->intervalMode;systemScanIntervalMode.scanIntervalMode.interval = iter->interval;systemScanIntervalMode.scanIntervalMode.count = iter->count;systemScanIntervalMode.expScanCount = 0;}}}// 上面的参数配置好后,执行系统调度扫描StartSystemTimerScan(scanAtOnce);} else {if (!BeginPnoScan()) {WIFI_LOGE("BeginPnoScan failed.");return;}}return;
}
看下扫描模式有哪些,这里的是 SYSTEM_TIMER_SCAN
enum class ScanMode {APP_FOREGROUND_SCAN = 0, /* Scan initiated by the foreground application */APP_BACKGROUND_SCAN = 1, /* Scan initiated by background applications */SYS_FOREGROUND_SCAN = 2, /* System foreground scan */SYS_BACKGROUND_SCAN = 3, /* System background scan */ALL_EXTERN_SCAN = 4, /* All external scans, including the first four */PNO_SCAN = 5, /* PNO scan */SYSTEM_TIMER_SCAN = 6, /* Scheduled system scan */ANYTIME_SCAN = 7, /* Scan at any time */BAND_24GHZ_SCAN = 8, /* 2.4 GHz scan */BAND_5GHZ_SCAN = 9, /* 5G scan */SCAN_MODE_MAX /* Invalid value */
接着看上面提到的这个方法: StartSystemTimerScan(scanAtOnce);
void ScanService::StartSystemTimerScan(bool scanAtOnce)
{WIFI_LOGI("Enter ScanService::StartSystemTimerScan, scanAtOnce: %{public}d.", scanAtOnce);ErrCode rlt = ApplyScanPolices(ScanType::SCAN_TYPE_SYSTEMTIMER); ---> 决定是否允许以及如何对Wi-Fi进行扫描操作的一些判断if (rlt != WIFI_OPT_SUCCESS) {return;}struct timespec times = { 0, 0 };clock_gettime(CLOCK_MONOTONIC, ×);int64_t nowTime =static_cast<int64_t>(times.tv_sec) * SECOND_TO_MILLI_SECOND + times.tv_nsec / SECOND_TO_MICRO_SECOND;int sinceLastScan = 0;if (lastSystemScanTime != 0) {sinceLastScan = nowTime - lastSystemScanTime;}/** The scan is performed immediately, the first scan is required,* or the time since the last scan is longer than the scan interval.*/int scanTime = SYSTEM_SCAN_INIT_TIME;if (systemScanIntervalMode.scanIntervalMode.interval > 0) {scanTime = systemScanIntervalMode.scanIntervalMode.interval;}if (scanAtOnce || (lastSystemScanTime == 0) || (sinceLastScan >= systemScanIntervalMode.scanIntervalMode.interval)) {if (Scan(false) != WIFI_OPT_SUCCESS) { ---> 发起扫描WIFI_LOGE("Scan failed.");}lastSystemScanTime = nowTime;} else {scanTime = systemScanIntervalMode.scanIntervalMode.interval - sinceLastScan;}// 上面都是对扫描时间的一些逻辑WIFI_LOGI("StartSystemTimerScan, scanTime: %{public}d, interval:%{public}d, count:%{public}d",scanTime,systemScanIntervalMode.scanIntervalMode.interval,systemScanIntervalMode.scanIntervalMode.count);pScanStateMachine->StartTimer(static_cast<int>(SYSTEM_SCAN_TIMER), scanTime * SECOND_TO_MILLI_SECOND); ---》 启动一个定时器return;
}
两个参数,前者是实际的扫描时间,后者是最大的扫描时间,这里是10s
pScanStateMachine->StartTimer(static_cast(SYSTEM_SCAN_TIMER), scanTime * SECOND_TO_MILLI_SECOND);
继续看下发起的扫描 Scan(false)
foundation/communication/wifi/wifi/services/wifi_standard/wifi_framework/wifi_manage/wifi_scan/scan_service.cpp
ErrCode ScanService::Scan(bool externFlag)
{WIFI_LOGI("Enter ScanService::Scan, externFlag:%{public}d.\n", externFlag); ---> 传下来的是falseif (!scanStartedFlag) {WIFI_LOGE("Scan service has not started.\n");return WIFI_OPT_FAILED;}if (externFlag) { ---> 这里没有额外的ErrCode rlt = ApplyScanPolices(ScanType::SCAN_TYPE_EXTERN);if (rlt != WIFI_OPT_SUCCESS) {return rlt;}}ScanConfig scanConfig;/** Invoke the interface provided by the configuration center to obtain the* hidden network list.*/if (!GetHiddenNetworkSsidList(scanConfig.hiddenNetworkSsid)) { ---> 发现是否有隐藏网络WIFI_LOGE("GetHiddenNetworkSsidList failed.\n");}scanConfig.scanBand = SCAN_BAND_BOTH_WITH_DFS;scanConfig.fullScanFlag = true;scanConfig.externFlag = externFlag;scanConfig.scanStyle = SCAN_TYPE_HIGH_ACCURACY;if (!SingleScan(scanConfig)) { ---> 发起单词扫描,这个和Android 扫描差不多 WIFI_LOGE("SingleScan failed.\n");return WIFI_OPT_FAILED;}return WIFI_OPT_SUCCESS;
}
// 继续看 发起单次扫描:
bool ScanService::SingleScan(ScanConfig &scanConfig)
{WIFI_LOGI("Enter ScanService::SingleScan.\n");#ifndef OHOS_ARCH_LITEif (!standByListerner.AllowScan()) {WIFI_LOGE("Scan not allowed when device in standby state.\n");return WIFI_OPT_FAILED;}
#endifGetAllowBandFreqsControlInfo(scanConfig.scanBand, scanConfig.scanFreqs);if ((scanConfig.scanBand == SCAN_BAND_UNSPECIFIED) && (scanConfig.scanFreqs.empty())) {WIFI_LOGE("Have no allowed band or freq.\n");return false;}InterScanConfig interConfig;interConfig.fullScanFlag = scanConfig.fullScanFlag;interConfig.hiddenNetworkSsid.assign(scanConfig.hiddenNetworkSsid.begin(), scanConfig.hiddenNetworkSsid.end());interConfig.scanStyle = scanConfig.scanStyle;/* Specified frequency */if (scanConfig.scanBand == SCAN_BAND_UNSPECIFIED) {interConfig.scanFreqs.assign(scanConfig.scanFreqs.begin(), scanConfig.scanFreqs.end());/** When band is SCAN_BAND_BOTH_WITH_DFS, need to scan all frequency,* scanFreqs can be empty.*/} else if (scanConfig.scanBand != SCAN_BAND_BOTH_WITH_DFS) {/* Converting frequency bands to frequencies. */if (!GetBandFreqs(scanConfig.scanBand, interConfig.scanFreqs)) {WIFI_LOGE("GetBandFreqs failed.\n");return false;}}/* Save the configuration. */int requestIndex = StoreRequestScanConfig(scanConfig, interConfig);if (requestIndex == MAX_SCAN_CONFIG_STORE_INDEX) {WIFI_LOGE("StoreRequestScanConfig failed.\n");return false;}std::unique_lock<std::mutex> lock(scanConfigMapMutex);if (pScanStateMachine == nullptr) {WIFI_LOGE("pScanStateMachine is null.\n");return false;}/* Construct a message. */InternalMessage *interMessage =pScanStateMachine->CreateMessage(static_cast<int>(CMD_START_COMMON_SCAN), requestIndex);if (interMessage == nullptr) {scanConfigMap.erase(requestIndex);WIFI_LOGE("CreateMessage failed.\n");return false;}if (!AddScanMessageBody(interMessage, interConfig)) {scanConfigMap.erase(requestIndex);MessageManage::GetInstance().ReclaimMsg(interMessage);WIFI_LOGE("AddScanMessageBody failed.\n");return false;}pScanStateMachine->SendMessage(interMessage);return true;
}
这篇文章先记录到这里,下篇文章接着 SingleScan 方法往下看,看如何和HAL交互。