1 /*
2 * Copyright (C) 2023 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15 #include "locator_required_data_manager.h"
16 #include "location_log.h"
17 #ifdef WIFI_ENABLE
18 #include "wifi_errcode.h"
19 #endif
20 #include "iservice_registry.h"
21
22 namespace OHOS {
23 namespace Location {
24 const uint32_t EVENT_START_SCAN = 0x0100;
25 const uint32_t EVENT_STOP_SCAN = 0x0200;
26 const uint32_t EVENT_GET_WIFI_LIST = 0x0300;
27 const uint32_t EVENT_REGISTER_WIFI_CALLBACK = 0x0400;
28 const uint32_t EVENT_UNREGISTER_WIFI_CALLBACK = 0x0500;
29 const int32_t DEFAULT_TIMEOUT_4S = 4000;
LocatorRequiredDataManager()30 LocatorRequiredDataManager::LocatorRequiredDataManager()
31 {
32 #ifdef WIFI_ENABLE
33 WifiInfoInit();
34 #endif
35 scanHandler_ = std::make_shared<ScanHandler>(AppExecFwk::EventRunner::Create(true, AppExecFwk::ThreadMode::FFRT));
36 wifiSdkHandler_ =
37 std::make_shared<WifiSdkHandler>(AppExecFwk::EventRunner::Create(true, AppExecFwk::ThreadMode::FFRT));
38 }
39
GetInstance()40 LocatorRequiredDataManager* LocatorRequiredDataManager::GetInstance()
41 {
42 static LocatorRequiredDataManager data;
43 return &data;
44 }
45
~LocatorRequiredDataManager()46 LocatorRequiredDataManager::~LocatorRequiredDataManager()
47 {
48 }
49
RegisterCallback(std::shared_ptr<LocatingRequiredDataConfig> & config,const sptr<IRemoteObject> & callback)50 __attribute__((no_sanitize("cfi"))) LocationErrCode LocatorRequiredDataManager::RegisterCallback(
51 std::shared_ptr<LocatingRequiredDataConfig>& config, const sptr<IRemoteObject>& callback)
52 {
53 sptr<ILocatingRequiredDataCallback> dataCallback = iface_cast<ILocatingRequiredDataCallback>(callback);
54 if (dataCallback == nullptr) {
55 LBSLOGE(LOCATOR, "%{public}s iface_cast ILocatingRequiredDataCallback failed!", __func__);
56 return ERRCODE_INVALID_PARAM;
57 }
58 if (config->GetType() == LocatingRequiredDataType::WIFI) {
59 #ifdef WIFI_ENABLE
60 std::unique_lock<std::mutex> lock(mutex_, std::defer_lock);
61 lock.lock();
62 callbacks_.push_back(dataCallback);
63 LBSLOGD(LOCATOR, "after RegisterCallback, callback size:%{public}s", std::to_string(callbacks_.size()).c_str());
64 bool needScan = false;
65 if (config->GetNeedStartScan() && (callbacks_.size() == 1 || !IsWifiCallbackRegistered())) {
66 needScan = true;
67 }
68 lock.unlock();
69 if (needScan) {
70 if (wifiSdkHandler_ != nullptr) {
71 wifiSdkHandler_->SendEvent(EVENT_REGISTER_WIFI_CALLBACK, 0, 0);
72 }
73 timeInterval_ = config->GetScanIntervalMs();
74 if (scanHandler_ != nullptr) {
75 AppExecFwk::InnerEvent::Pointer event = AppExecFwk::InnerEvent::Get(
76 EVENT_START_SCAN, config->GetFixNumber());
77 scanHandler_->SendEvent(event);
78 }
79 }
80 #endif
81 } else if (config->GetType() == LocatingRequiredDataType::BLUE_TOOTH) {
82 return ERRCODE_NOT_SUPPORTED;
83 }
84 return ERRCODE_SUCCESS;
85 }
86
UnregisterCallback(const sptr<IRemoteObject> & callback)87 LocationErrCode LocatorRequiredDataManager::UnregisterCallback(const sptr<IRemoteObject>& callback)
88 {
89 sptr<ILocatingRequiredDataCallback> dataCallback = iface_cast<ILocatingRequiredDataCallback>(callback);
90 if (dataCallback == nullptr) {
91 LBSLOGE(LOCATOR, "%{public}s iface_cast ILocatingRequiredDataCallback failed!", __func__);
92 return ERRCODE_SERVICE_UNAVAILABLE;
93 }
94 #ifdef WIFI_ENABLE
95 std::unique_lock<std::mutex> lock(mutex_, std::defer_lock);
96 lock.lock();
97 size_t i = 0;
98 for (; i < callbacks_.size(); i++) {
99 sptr<IRemoteObject> remoteObject = callbacks_[i]->AsObject();
100 if (remoteObject == callback) {
101 break;
102 }
103 }
104 if (callbacks_.size() <= i) {
105 LBSLOGD(GNSS, "scan callback is not in vector");
106 return ERRCODE_SUCCESS;
107 }
108 if (callbacks_.size() > 0) {
109 callbacks_.erase(callbacks_.begin() + i);
110 }
111 LBSLOGD(LOCATOR, "after UnregisterCallback, callback size:%{public}s", std::to_string(callbacks_.size()).c_str());
112 if (callbacks_.size() > 0) {
113 return ERRCODE_SUCCESS;
114 }
115 lock.unlock();
116 if (wifiSdkHandler_ != nullptr) {
117 wifiSdkHandler_->SendEvent(EVENT_UNREGISTER_WIFI_CALLBACK, 0, 0);
118 }
119 if (scanHandler_ != nullptr) {
120 scanHandler_->SendEvent(EVENT_STOP_SCAN, 0, 0);
121 }
122 #endif
123 return ERRCODE_SUCCESS;
124 }
125
126 #ifdef BLUETOOTH_ENABLE
127
GetLocatingRequiredDataByBtHost(const Bluetooth::BluetoothRemoteDevice & device)128 std::vector<std::shared_ptr<LocatingRequiredData>> LocatorBluetoothHost::GetLocatingRequiredDataByBtHost(
129 const Bluetooth::BluetoothRemoteDevice &device)
130 {
131 std::vector<std::shared_ptr<LocatingRequiredData>> result;
132 std::shared_ptr<LocatingRequiredData> info = std::make_shared<LocatingRequiredData>();
133 std::shared_ptr<BluetoothScanInfo> btData = std::make_shared<BluetoothScanInfo>();
134 btData->SetMac(device.GetDeviceAddr());
135 btData->SetDeviceName(device.GetDeviceName());
136 info->SetType(LocatingRequiredDataType::BLUE_TOOTH);
137 info->SetBluetoothScanInfo(btData);
138 result.push_back(info);
139 return result;
140 }
141
GetLocatingRequiredDataByBle(const Bluetooth::BleScanResult & result)142 std::vector<std::shared_ptr<LocatingRequiredData>> LocatorBleCallbackWapper::GetLocatingRequiredDataByBle(
143 const Bluetooth::BleScanResult &result)
144 {
145 std::vector<std::shared_ptr<LocatingRequiredData>> res;
146 std::shared_ptr<LocatingRequiredData> info = std::make_shared<LocatingRequiredData>();
147 std::shared_ptr<BluetoothScanInfo> btData = std::make_shared<BluetoothScanInfo>();
148 btData->SetMac(result.GetPeripheralDevice().GetDeviceAddr());
149 btData->SetDeviceName(result.GetPeripheralDevice().GetDeviceName());
150 btData->SetRssi(result.GetRssi());
151 info->SetType(LocatingRequiredDataType::BLUE_TOOTH);
152 info->SetBluetoothScanInfo(btData);
153 res.push_back(info);
154 return res;
155 }
156
OnStateChanged(const int transport,const int status)157 void LocatorBluetoothHost::OnStateChanged(const int transport, const int status) {}
158
OnDiscoveryStateChanged(int status)159 void LocatorBluetoothHost::OnDiscoveryStateChanged(int status) {}
160
OnDiscoveryResult(const Bluetooth::BluetoothRemoteDevice & device,int rssi,const std::string deviceName,int deviceClass)161 void LocatorBluetoothHost::OnDiscoveryResult(const Bluetooth::BluetoothRemoteDevice &device, int rssi,
162 const std::string deviceName, int deviceClass)
163 {
164 std::vector<std::shared_ptr<LocatingRequiredData>> result = GetLocatingRequiredDataByBtHost(device);
165 auto dataManager = LocatorRequiredDataManager::GetInstance();
166 dataManager->ReportData(result);
167 }
168
OnPairRequested(const Bluetooth::BluetoothRemoteDevice & device)169 void LocatorBluetoothHost::OnPairRequested(const Bluetooth::BluetoothRemoteDevice &device) {}
170
OnPairConfirmed(const Bluetooth::BluetoothRemoteDevice & device,int reqType,int number)171 void LocatorBluetoothHost::OnPairConfirmed(const Bluetooth::BluetoothRemoteDevice &device, int reqType, int number) {}
172
OnScanModeChanged(int mode)173 void LocatorBluetoothHost::OnScanModeChanged(int mode) {}
174
OnDeviceNameChanged(const std::string & deviceName)175 void LocatorBluetoothHost::OnDeviceNameChanged(const std::string &deviceName) {}
176
OnDeviceAddrChanged(const std::string & address)177 void LocatorBluetoothHost::OnDeviceAddrChanged(const std::string &address) {}
178
OnScanCallback(const Bluetooth::BleScanResult & result)179 void LocatorBleCallbackWapper::OnScanCallback(const Bluetooth::BleScanResult &result)
180 {
181 std::vector<std::shared_ptr<LocatingRequiredData>> res = GetLocatingRequiredDataByBle(result);
182 auto dataManager = LocatorRequiredDataManager::GetInstance();
183 dataManager->ReportData(res);
184 }
185
OnFoundOrLostCallback(const Bluetooth::BleScanResult & result,uint8_t callbackType)186 void LocatorBleCallbackWapper::OnFoundOrLostCallback(const Bluetooth::BleScanResult &result, uint8_t callbackType) {}
187
OnBleBatchScanResultsEvent(const std::vector<Bluetooth::BleScanResult> & results)188 void LocatorBleCallbackWapper::OnBleBatchScanResultsEvent(const std::vector<Bluetooth::BleScanResult> &results) {}
189
OnStartOrStopScanEvent(int32_t resultCode,bool isStartScan)190 void LocatorBleCallbackWapper::OnStartOrStopScanEvent(int32_t resultCode, bool isStartScan) {}
191
OnNotifyMsgReportFromLpDevice(const Bluetooth::UUID & btUuid,int msgType,const std::vector<uint8_t> & value)192 void LocatorBleCallbackWapper::OnNotifyMsgReportFromLpDevice(const Bluetooth::UUID &btUuid, int msgType,
193 const std::vector<uint8_t> &value) {}
194 #endif
195
196 #ifdef WIFI_ENABLE
WifiInfoInit()197 void LocatorRequiredDataManager::WifiInfoInit()
198 {
199 wifiScanPtr_ = Wifi::WifiScan::GetInstance(WIFI_SCAN_ABILITY_ID);
200 }
201
IsWifiCallbackRegistered()202 bool LocatorRequiredDataManager::IsWifiCallbackRegistered()
203 {
204 std::unique_lock<std::mutex> lock(wifiRegisteredMutex_);
205 return isWifiCallbackRegistered_;
206 }
207
SetIsWifiCallbackRegistered(bool isWifiCallbackRegistered)208 void LocatorRequiredDataManager::SetIsWifiCallbackRegistered(bool isWifiCallbackRegistered)
209 {
210 std::unique_lock<std::mutex> lock(wifiRegisteredMutex_);
211 isWifiCallbackRegistered_ = isWifiCallbackRegistered;
212 }
213
RegisterWifiCallBack()214 __attribute__((no_sanitize("cfi"))) bool LocatorRequiredDataManager::RegisterWifiCallBack()
215 {
216 LBSLOGD(LOCATOR, "%{public}s enter", __func__);
217 wifiScanEventCallback_.OnWifiScanStateChanged = LocatorWifiScanEventCallback::OnWifiScanStateChanged;
218 int32_t ret = RegisterWifiEvent(&wifiScanEventCallback_);
219 if (ret != Wifi::WIFI_OPT_SUCCESS) {
220 LBSLOGE(LOCATOR, "%{public}s WifiScan RegisterCallBack failed!", __func__);
221 SetIsWifiCallbackRegistered(false);
222 return false;
223 }
224 SetIsWifiCallbackRegistered(true);
225 return true;
226 }
227
UnregisterWifiCallBack()228 __attribute__((no_sanitize("cfi"))) bool LocatorRequiredDataManager::UnregisterWifiCallBack()
229 {
230 LBSLOGD(LOCATOR, "%{public}s enter", __func__);
231 int ret = UnRegisterWifiEvent(&wifiScanEventCallback_);
232 if (ret != Wifi::WIFI_OPT_SUCCESS) {
233 LBSLOGE(LOCATOR, "%{public}s WifiScan RegisterCallBack failed!", __func__);
234 return false;
235 }
236 SetIsWifiCallbackRegistered(false);
237 return true;
238 }
239
GetWifiScanList(std::vector<Wifi::WifiScanInfo> & wifiScanInfo)240 __attribute__((no_sanitize("cfi"))) void LocatorRequiredDataManager::GetWifiScanList(
241 std::vector<Wifi::WifiScanInfo>& wifiScanInfo)
242 {
243 std::shared_ptr<Wifi::WifiScan> ptrWifiScan = Wifi::WifiScan::GetInstance(WIFI_SCAN_ABILITY_ID);
244 if (ptrWifiScan == nullptr) {
245 LBSLOGE(LOCATOR, "%{public}s WifiScan get instance failed", __func__);
246 return;
247 }
248 int ret = ptrWifiScan->GetScanInfoList(wifiScanInfo);
249 if (ret != Wifi::WIFI_OPT_SUCCESS) {
250 LBSLOGE(LOCATOR, "GetScanInfoList failed");
251 return;
252 }
253 if (wifiSdkHandler_ != nullptr) {
254 wifiSdkHandler_->RemoveEvent(EVENT_GET_WIFI_LIST);
255 }
256 }
257
GetLocatingRequiredDataByWifi(const std::vector<Wifi::WifiScanInfo> & wifiScanInfo)258 std::vector<std::shared_ptr<LocatingRequiredData>> LocatorRequiredDataManager::GetLocatingRequiredDataByWifi(
259 const std::vector<Wifi::WifiScanInfo>& wifiScanInfo)
260 {
261 std::vector<std::shared_ptr<LocatingRequiredData>> res;
262 for (size_t i = 0; i < wifiScanInfo.size(); i++) {
263 std::shared_ptr<LocatingRequiredData> info = std::make_shared<LocatingRequiredData>();
264 std::shared_ptr<WifiScanInfo> wifiData = std::make_shared<WifiScanInfo>();
265 wifiData->SetSsid(wifiScanInfo[i].ssid);
266 wifiData->SetBssid(wifiScanInfo[i].bssid);
267 wifiData->SetRssi(wifiScanInfo[i].rssi);
268 wifiData->SetFrequency(wifiScanInfo[i].frequency);
269 wifiData->SetTimestamp(wifiScanInfo[i].timestamp);
270 info->SetType(LocatingRequiredDataType::WIFI);
271 info->SetWifiScanInfo(wifiData);
272 res.push_back(info);
273 }
274 return res;
275 }
276
OnWifiScanStateChanged(int state,int size)277 void LocatorWifiScanEventCallback::OnWifiScanStateChanged(int state, int size)
278 {
279 LBSLOGD(LOCATOR, "OnWifiScanStateChanged state=%{public}d", state);
280 if (state == 0) {
281 LBSLOGE(LOCATOR, "OnWifiScanStateChanged false");
282 }
283 auto dataManager = LocatorRequiredDataManager::GetInstance();
284 if (!dataManager->IsConnecting()) {
285 LBSLOGE(LOCATOR, "%{public}s no valid callback, return", __func__);
286 return;
287 }
288 std::vector<Wifi::WifiScanInfo> wifiScanInfo;
289 dataManager->GetWifiScanList(wifiScanInfo);
290 std::vector<std::shared_ptr<LocatingRequiredData>> result =
291 dataManager->GetLocatingRequiredDataByWifi(wifiScanInfo);
292 dataManager->ReportData(result);
293 return;
294 }
295 #endif
296
ReportData(const std::vector<std::shared_ptr<LocatingRequiredData>> & result)297 void LocatorRequiredDataManager::ReportData(const std::vector<std::shared_ptr<LocatingRequiredData>>& result)
298 {
299 std::unique_lock<std::mutex> lock(mutex_);
300 for (size_t i = 0; i < callbacks_.size(); i++) {
301 callbacks_[i]->OnLocatingDataChange(result);
302 }
303 }
304
StartWifiScan(int fixNumber,bool flag)305 __attribute__((no_sanitize("cfi"))) void LocatorRequiredDataManager::StartWifiScan(int fixNumber, bool flag)
306 {
307 if (!flag) {
308 if (scanHandler_ != nullptr) {
309 scanHandler_->RemoveEvent(EVENT_START_SCAN);
310 }
311 if (wifiSdkHandler_ != nullptr) {
312 wifiSdkHandler_->RemoveEvent(EVENT_GET_WIFI_LIST);
313 }
314 LBSLOGE(LOCATOR, "%{public}s no valid callback, return", __func__);
315 return;
316 }
317 if (!IsConnecting()) {
318 if (scanHandler_ != nullptr) {
319 scanHandler_->RemoveEvent(EVENT_START_SCAN);
320 }
321 if (wifiSdkHandler_ != nullptr) {
322 wifiSdkHandler_->RemoveEvent(EVENT_GET_WIFI_LIST);
323 }
324 return;
325 }
326 #ifdef WIFI_ENABLE
327 if (wifiScanPtr_ == nullptr) {
328 return;
329 }
330 int ret = wifiScanPtr_->Scan();
331 if (ret != Wifi::WIFI_OPT_SUCCESS) {
332 LBSLOGE(LOCATOR, "%{public}s WifiScan failed, ret=%{public}d", __func__, ret);
333 if (wifiSdkHandler_ != nullptr) {
334 wifiSdkHandler_->SendHighPriorityEvent(EVENT_GET_WIFI_LIST, 0, 0);
335 }
336 } else {
337 if (wifiSdkHandler_ != nullptr) {
338 wifiSdkHandler_->SendHighPriorityEvent(EVENT_GET_WIFI_LIST, 0, DEFAULT_TIMEOUT_4S);
339 }
340 }
341 #endif
342 if (fixNumber) {
343 return;
344 }
345 LBSLOGD(LOCATOR, "StartWifiScan timeInterval_=%{public}d", timeInterval_);
346 if (scanHandler_ != nullptr) {
347 scanHandler_->SendHighPriorityEvent(EVENT_START_SCAN, 0, timeInterval_);
348 }
349 }
350
IsConnecting()351 bool LocatorRequiredDataManager::IsConnecting()
352 {
353 std::unique_lock<std::mutex> lock(mutex_);
354 if (callbacks_.size() > 0) {
355 return true;
356 }
357 return false;
358 }
359
ScanHandler(const std::shared_ptr<AppExecFwk::EventRunner> & runner)360 ScanHandler::ScanHandler(const std::shared_ptr<AppExecFwk::EventRunner>& runner) : EventHandler(runner) {}
361
~ScanHandler()362 ScanHandler::~ScanHandler() {}
363
ProcessEvent(const AppExecFwk::InnerEvent::Pointer & event)364 void ScanHandler::ProcessEvent(const AppExecFwk::InnerEvent::Pointer& event)
365 {
366 auto dataManager = LocatorRequiredDataManager::GetInstance();
367 uint32_t eventId = event->GetInnerEventId();
368 int fixNumber = event->GetParam();
369 LBSLOGD(LOCATOR, "ScanHandler ProcessEvent event:%{public}d", eventId);
370 switch (eventId) {
371 case EVENT_START_SCAN: {
372 dataManager->StartWifiScan(fixNumber, true);
373 break;
374 }
375 case EVENT_STOP_SCAN: {
376 dataManager->StartWifiScan(fixNumber, false);
377 break;
378 }
379 default:
380 break;
381 }
382 }
383
WifiSdkHandler(const std::shared_ptr<AppExecFwk::EventRunner> & runner)384 WifiSdkHandler::WifiSdkHandler(const std::shared_ptr<AppExecFwk::EventRunner>& runner) : EventHandler(runner) {}
385
~WifiSdkHandler()386 WifiSdkHandler::~WifiSdkHandler() {}
387
ProcessEvent(const AppExecFwk::InnerEvent::Pointer & event)388 void WifiSdkHandler::ProcessEvent(const AppExecFwk::InnerEvent::Pointer& event)
389 {
390 auto dataManager = LocatorRequiredDataManager::GetInstance();
391 uint32_t eventId = event->GetInnerEventId();
392 LBSLOGD(LOCATOR, "WifiSdkHandler ProcessEvent event:%{public}d", eventId);
393 switch (eventId) {
394 case EVENT_GET_WIFI_LIST: {
395 std::vector<Wifi::WifiScanInfo> wifiScanInfo;
396 dataManager->GetWifiScanList(wifiScanInfo);
397 std::vector<std::shared_ptr<LocatingRequiredData>> result =
398 dataManager->GetLocatingRequiredDataByWifi(wifiScanInfo);
399 dataManager->ReportData(result);
400 break;
401 }
402 case EVENT_REGISTER_WIFI_CALLBACK: {
403 dataManager->RegisterWifiCallBack();
404 break;
405 }
406 case EVENT_UNREGISTER_WIFI_CALLBACK: {
407 dataManager->UnregisterWifiCallBack();
408 break;
409 }
410 default:
411 break;
412 }
413 }
414 } // namespace Location
415 } // namespace OHOS
416