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;
LocatorRequiredDataManager()26 LocatorRequiredDataManager::LocatorRequiredDataManager()
27 {
28 #ifdef WIFI_ENABLE
29 WifiInfoInit();
30 #endif
31 #ifdef BLUETOOTH_ENABLE
32 BleInfoInit();
33 #endif
34 scanHandler_ = std::make_shared<ScanHandler>(AppExecFwk::EventRunner::Create(true));
35 }
36
~LocatorRequiredDataManager()37 LocatorRequiredDataManager::~LocatorRequiredDataManager()
38 {
39 }
40
RegisterCallback(std::shared_ptr<LocatingRequiredDataConfig> & config,const sptr<IRemoteObject> & callback)41 __attribute__((no_sanitize("cfi"))) LocationErrCode LocatorRequiredDataManager::RegisterCallback(
42 std::shared_ptr<LocatingRequiredDataConfig>& config, const sptr<IRemoteObject>& callback)
43 {
44 sptr<ILocatingRequiredDataCallback> dataCallback = iface_cast<ILocatingRequiredDataCallback>(callback);
45 if (dataCallback == nullptr) {
46 LBSLOGE(LOCATOR, "%{public}s iface_cast ILocatingRequiredDataCallback failed!", __func__);
47 return ERRCODE_INVALID_PARAM;
48 }
49 if (config->GetType() == LocatingRequiredDataType::WIFI) {
50 #ifdef WIFI_ENABLE
51 if (!isWifiCallbackRegistered()) {
52 bool ret = RegisterWifiCallBack();
53 if (!ret) {
54 LBSLOGE(LOCATOR, "%{public}s WifiScan RegisterCallBack failed!", __func__);
55 return ERRCODE_SERVICE_UNAVAILABLE;
56 }
57 }
58 std::unique_lock<std::mutex> lock(mutex_, std::defer_lock);
59 lock.lock();
60 callbacks_.push_back(dataCallback);
61 LBSLOGD(LOCATOR, "after RegisterCallback, callback size:%{public}s", std::to_string(callbacks_.size()).c_str());
62 if (config->GetNeedStartScan() && callbacks_.size() == 1) {
63 timeInterval_ = config->GetScanIntervalMs();
64 if (scanHandler_ != nullptr) {
65 scanHandler_->SendEvent(EVENT_START_SCAN, 0, 0);
66 }
67 }
68 lock.unlock();
69 #endif
70 } else if (config->GetType() == LocatingRequiredDataType::BLUE_TOOTH) {
71 return ERRCODE_NOT_SUPPORTED;
72 }
73 return ERRCODE_SUCCESS;
74 }
75
UnregisterCallback(const sptr<IRemoteObject> & callback)76 LocationErrCode LocatorRequiredDataManager::UnregisterCallback(const sptr<IRemoteObject>& callback)
77 {
78 sptr<ILocatingRequiredDataCallback> dataCallback = iface_cast<ILocatingRequiredDataCallback>(callback);
79 if (dataCallback == nullptr) {
80 LBSLOGE(LOCATOR, "%{public}s iface_cast ILocatingRequiredDataCallback failed!", __func__);
81 return ERRCODE_SERVICE_UNAVAILABLE;
82 }
83 std::unique_lock<std::mutex> lock(mutex_);
84 size_t i = 0;
85 for (; i < callbacks_.size(); i++) {
86 sptr<IRemoteObject> remoteObject = callbacks_[i]->AsObject();
87 if (remoteObject == callback) {
88 break;
89 }
90 }
91 if (callbacks_.size() > 0) {
92 callbacks_.erase(callbacks_.begin() + i);
93 }
94 LBSLOGD(LOCATOR, "after UnregisterCallback, callback size:%{public}s", std::to_string(callbacks_.size()).c_str());
95 if (scanHandler_ != nullptr && callbacks_.size() == 0) {
96 scanHandler_->SendEvent(EVENT_STOP_SCAN, 0, 0);
97 }
98 return ERRCODE_SUCCESS;
99 }
100
101 #ifdef BLUETOOTH_ENABLE
BleInfoInit()102 void LocatorRequiredDataManager::BleInfoInit()
103 {
104 std::shared_ptr<LocatorBleCallbackWapper> callback = std::make_shared<LocatorBleCallbackWapper>();
105 bleCentralManager_ = std::make_shared<Bluetooth::BleCentralManager>(callback);
106 bluetoothHost_ = &Bluetooth::BluetoothHost::GetDefaultHost();
107 }
108
GetLocatingRequiredDataByBtHost(const Bluetooth::BluetoothRemoteDevice & device)109 std::vector<std::shared_ptr<LocatingRequiredData>> LocatorBluetoothHost::GetLocatingRequiredDataByBtHost(
110 const Bluetooth::BluetoothRemoteDevice &device)
111 {
112 std::vector<std::shared_ptr<LocatingRequiredData>> result;
113 std::shared_ptr<LocatingRequiredData> info = std::make_shared<LocatingRequiredData>();
114 std::shared_ptr<BluetoothScanInfo> btData = std::make_shared<BluetoothScanInfo>();
115 btData->SetMac(device.GetDeviceAddr());
116 btData->SetDeviceName(device.GetDeviceName());
117 info->SetType(LocatingRequiredDataType::BLUE_TOOTH);
118 info->SetBluetoothScanInfo(btData);
119 result.push_back(info);
120 return result;
121 }
122
GetLocatingRequiredDataByBle(const Bluetooth::BleScanResult & result)123 std::vector<std::shared_ptr<LocatingRequiredData>> LocatorBleCallbackWapper::GetLocatingRequiredDataByBle(
124 const Bluetooth::BleScanResult &result)
125 {
126 std::vector<std::shared_ptr<LocatingRequiredData>> res;
127 std::shared_ptr<LocatingRequiredData> info = std::make_shared<LocatingRequiredData>();
128 std::shared_ptr<BluetoothScanInfo> btData = std::make_shared<BluetoothScanInfo>();
129 btData->SetMac(result.GetPeripheralDevice().GetDeviceAddr());
130 btData->SetDeviceName(result.GetPeripheralDevice().GetDeviceName());
131 btData->SetRssi(result.GetRssi());
132 info->SetType(LocatingRequiredDataType::BLUE_TOOTH);
133 info->SetBluetoothScanInfo(btData);
134 res.push_back(info);
135 return res;
136 }
137
OnStateChanged(const int transport,const int status)138 void LocatorBluetoothHost::OnStateChanged(const int transport, const int status) {}
139
OnDiscoveryStateChanged(int status)140 void LocatorBluetoothHost::OnDiscoveryStateChanged(int status) {}
141
OnDiscoveryResult(const Bluetooth::BluetoothRemoteDevice & device)142 void LocatorBluetoothHost::OnDiscoveryResult(const Bluetooth::BluetoothRemoteDevice &device)
143 {
144 std::vector<std::shared_ptr<LocatingRequiredData>> result = GetLocatingRequiredDataByBtHost(device);
145 auto dataManager = DelayedSingleton<LocatorRequiredDataManager>::GetInstance();
146 if (dataManager == nullptr) {
147 LBSLOGE(NETWORK, "ProcessEvent: dataManager is nullptr");
148 return;
149 }
150 dataManager->ReportData(result);
151 }
152
OnPairRequested(const Bluetooth::BluetoothRemoteDevice & device)153 void LocatorBluetoothHost::OnPairRequested(const Bluetooth::BluetoothRemoteDevice &device) {}
154
OnPairConfirmed(const Bluetooth::BluetoothRemoteDevice & device,int reqType,int number)155 void LocatorBluetoothHost::OnPairConfirmed(const Bluetooth::BluetoothRemoteDevice &device, int reqType, int number) {}
156
OnScanModeChanged(int mode)157 void LocatorBluetoothHost::OnScanModeChanged(int mode) {}
158
OnDeviceNameChanged(const std::string & deviceName)159 void LocatorBluetoothHost::OnDeviceNameChanged(const std::string &deviceName) {}
160
OnDeviceAddrChanged(const std::string & address)161 void LocatorBluetoothHost::OnDeviceAddrChanged(const std::string &address) {}
162
OnScanCallback(const Bluetooth::BleScanResult & result)163 void LocatorBleCallbackWapper::OnScanCallback(const Bluetooth::BleScanResult &result)
164 {
165 std::vector<std::shared_ptr<LocatingRequiredData>> res = GetLocatingRequiredDataByBle(result);
166 auto dataManager = DelayedSingleton<LocatorRequiredDataManager>::GetInstance();
167 if (dataManager == nullptr) {
168 LBSLOGE(NETWORK, "ProcessEvent: dataManager is nullptr");
169 return;
170 }
171 dataManager->ReportData(res);
172 }
173
OnBleBatchScanResultsEvent(const std::vector<Bluetooth::BleScanResult> & results)174 void LocatorBleCallbackWapper::OnBleBatchScanResultsEvent(const std::vector<Bluetooth::BleScanResult> &results) {}
175
OnStartOrStopScanEvent(int32_t resultCode,bool isStartScan)176 void LocatorBleCallbackWapper::OnStartOrStopScanEvent(int32_t resultCode, bool isStartScan) {}
177
OnNotifyMsgReportFromLpDevice(const Bluetooth::UUID & btUuid,int msgType,const std::vector<uint8_t> & value)178 void LocatorBleCallbackWapper::OnNotifyMsgReportFromLpDevice(const Bluetooth::UUID &btUuid, int msgType,
179 const std::vector<uint8_t> &value) {}
180 #endif
181
182 #ifdef WIFI_ENABLE
WifiInfoInit()183 void LocatorRequiredDataManager::WifiInfoInit()
184 {
185 wifiScanPtr_ = Wifi::WifiScan::GetInstance(WIFI_SCAN_ABILITY_ID);
186 wifiScanEventCallback_ =
187 sptr<LocatorWifiScanEventCallback>(new (std::nothrow) LocatorWifiScanEventCallback());
188 bool ret = RegisterWifiCallBack();
189 if (!ret) {
190 LBSLOGE(LOCATOR, "%{public}s WifiScan RegisterCallBack failed!", __func__);
191 }
192 int32_t result;
193 auto samgrProxy = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
194 if (samgrProxy == nullptr) {
195 LBSLOGE(LOCATOR, "%{public}s samgrProxy is nullptr!", __func__);
196 return;
197 }
198 saStatusListener_ = sptr<WifiServiceStatusChange>(new WifiServiceStatusChange());
199 if (saStatusListener_ == nullptr) {
200 LBSLOGE(LOCATOR, "%{public}s saStatusListener_ is nullptr!", __func__);
201 return;
202 }
203 result = samgrProxy->SubscribeSystemAbility(static_cast<int32_t>(WIFI_SCAN_ABILITY_ID), saStatusListener_);
204 LBSLOGI(LOCATOR, "%{public}s SubcribeSystemAbility result is %{public}d!", __func__, result);
205 }
206
isWifiCallbackRegistered()207 bool LocatorRequiredDataManager::isWifiCallbackRegistered()
208 {
209 std::unique_lock<std::mutex> lock(wifiRegisteredMutex_);
210 return isWifiCallbackRegistered_;
211 }
212
ResetCallbackRegisteredStatus()213 void LocatorRequiredDataManager::ResetCallbackRegisteredStatus()
214 {
215 std::unique_lock<std::mutex> lock(wifiRegisteredMutex_);
216 isWifiCallbackRegistered_ = false;
217 }
218
RegisterWifiCallBack()219 __attribute__((no_sanitize("cfi"))) bool LocatorRequiredDataManager::RegisterWifiCallBack()
220 {
221 LBSLOGD(LOCATOR, "%{public}s enter", __func__);
222 if (wifiScanPtr_ == nullptr || wifiScanEventCallback_ == nullptr) {
223 LBSLOGE(LOCATOR, "%{public}s param unexpected.", __func__);
224 return false;
225 }
226 std::vector<std::string> events = {EVENT_STA_SCAN_STATE_CHANGE};
227 std::unique_lock<std::mutex> lock(wifiRegisteredMutex_);
228 int ret = wifiScanPtr_->RegisterCallBack(wifiScanEventCallback_, events);
229 if (ret != Wifi::WIFI_OPT_SUCCESS) {
230 LBSLOGE(LOCATOR, "%{public}s WifiScan RegisterCallBack failed!", __func__);
231 return false;
232 }
233 isWifiCallbackRegistered_ = true;
234 return true;
235 }
236
OnWifiScanStateChanged(int state)237 __attribute__((no_sanitize("cfi"))) void LocatorWifiScanEventCallback::OnWifiScanStateChanged(int state)
238 {
239 LBSLOGD(LOCATOR, "OnWifiScanStateChanged state=%{public}d", state);
240 if (state == 0) {
241 LBSLOGE(LOCATOR, "OnWifiScanStateChanged false");
242 return;
243 }
244 std::vector<Wifi::WifiScanInfo> wifiScanInfo;
245 std::shared_ptr<Wifi::WifiScan> ptrWifiScan = Wifi::WifiScan::GetInstance(WIFI_SCAN_ABILITY_ID);
246 if (ptrWifiScan == nullptr) {
247 LBSLOGE(LOCATOR, "%{public}s WifiScan get instance failed", __func__);
248 return;
249 }
250 int ret = ptrWifiScan->GetScanInfoList(wifiScanInfo);
251 if (ret != Wifi::WIFI_OPT_SUCCESS) {
252 LBSLOGE(LOCATOR, "GetScanInfoList failed");
253 return;
254 }
255 std::vector<std::shared_ptr<LocatingRequiredData>> result = GetLocatingRequiredDataByWifi(wifiScanInfo);
256 auto dataManager = DelayedSingleton<LocatorRequiredDataManager>::GetInstance();
257 if (dataManager == nullptr) {
258 LBSLOGE(NETWORK, "ProcessEvent: dataManager is nullptr");
259 return;
260 }
261 dataManager->ReportData(result);
262 return;
263 }
264
GetLocatingRequiredDataByWifi(const std::vector<Wifi::WifiScanInfo> & wifiScanInfo)265 std::vector<std::shared_ptr<LocatingRequiredData>> LocatorWifiScanEventCallback::GetLocatingRequiredDataByWifi(
266 const std::vector<Wifi::WifiScanInfo>& wifiScanInfo)
267 {
268 std::vector<std::shared_ptr<LocatingRequiredData>> res;
269 for (size_t i = 0; i < wifiScanInfo.size(); i++) {
270 std::shared_ptr<LocatingRequiredData> info = std::make_shared<LocatingRequiredData>();
271 std::shared_ptr<WifiScanInfo> wifiData = std::make_shared<WifiScanInfo>();
272 wifiData->SetSsid(wifiScanInfo[i].ssid);
273 wifiData->SetBssid(wifiScanInfo[i].bssid);
274 wifiData->SetRssi(wifiScanInfo[i].rssi);
275 wifiData->SetFrequency(wifiScanInfo[i].frequency);
276 wifiData->SetTimestamp(wifiScanInfo[i].timestamp);
277 info->SetType(LocatingRequiredDataType::WIFI);
278 info->SetWifiScanInfo(wifiData);
279 res.push_back(info);
280 }
281 return res;
282 }
283 #endif
284
ReportData(const std::vector<std::shared_ptr<LocatingRequiredData>> & result)285 void LocatorRequiredDataManager::ReportData(const std::vector<std::shared_ptr<LocatingRequiredData>>& result)
286 {
287 std::unique_lock<std::mutex> lock(mutex_);
288 for (size_t i = 0; i < callbacks_.size(); i++) {
289 callbacks_[i]->OnLocatingDataChange(result);
290 }
291 }
292
StartWifiScan(bool flag)293 __attribute__((no_sanitize("cfi"))) void LocatorRequiredDataManager::StartWifiScan(bool flag)
294 {
295 if (!flag) {
296 if (scanHandler_ != nullptr) {
297 scanHandler_->RemoveEvent(EVENT_START_SCAN);
298 }
299 return;
300 }
301 #ifdef WIFI_ENABLE
302 if (wifiScanPtr_ == nullptr) {
303 return;
304 }
305 int ret = wifiScanPtr_->Scan();
306 if (ret != Wifi::WIFI_OPT_SUCCESS) {
307 LBSLOGE(LOCATOR, "%{public}s WifiScan failed, ret=%{public}d", __func__, ret);
308 return;
309 }
310 #endif
311 LBSLOGD(LOCATOR, "StartWifiScan timeInterval_=%{public}d", timeInterval_);
312 if (scanHandler_ != nullptr) {
313 scanHandler_->SendHighPriorityEvent(EVENT_START_SCAN, 0, timeInterval_);
314 }
315 }
316
IsConnecting()317 bool LocatorRequiredDataManager::IsConnecting()
318 {
319 std::unique_lock<std::mutex> lock(mutex_);
320 if (callbacks_.size() > 0) {
321 return true;
322 }
323 return false;
324 }
325
ScanHandler(const std::shared_ptr<AppExecFwk::EventRunner> & runner)326 ScanHandler::ScanHandler(const std::shared_ptr<AppExecFwk::EventRunner>& runner) : EventHandler(runner) {}
327
~ScanHandler()328 ScanHandler::~ScanHandler() {}
329
ProcessEvent(const AppExecFwk::InnerEvent::Pointer & event)330 void ScanHandler::ProcessEvent(const AppExecFwk::InnerEvent::Pointer& event)
331 {
332 auto dataManager = DelayedSingleton<LocatorRequiredDataManager>::GetInstance();
333 if (dataManager == nullptr) {
334 LBSLOGE(NETWORK, "ProcessEvent: dataManager is nullptr");
335 return;
336 }
337 uint32_t eventId = event->GetInnerEventId();
338 LBSLOGI(LOCATOR, "ScanHandler ProcessEvent event:%{public}d", eventId);
339 switch (eventId) {
340 case EVENT_START_SCAN: {
341 dataManager->StartWifiScan(true);
342 break;
343 }
344 case EVENT_STOP_SCAN: {
345 dataManager->StartWifiScan(false);
346 break;
347 }
348 default:
349 break;
350 }
351 }
352
OnAddSystemAbility(int32_t systemAbilityId,const std::string & deviceId)353 void WifiServiceStatusChange::OnAddSystemAbility(int32_t systemAbilityId, const std::string& deviceId)
354 {
355 LBSLOGI(LOCATOR, "WifiServiceStatusChange::OnAddSystemAbility systemAbilityId :%{public}d", systemAbilityId);
356 DelayedSingleton<LocatorRequiredDataManager>::GetInstance()->RegisterWifiCallBack();
357 }
358
OnRemoveSystemAbility(int32_t systemAbilityId,const std::string & deviceId)359 void WifiServiceStatusChange::OnRemoveSystemAbility(int32_t systemAbilityId, const std::string& deviceId)
360 {
361 LBSLOGI(LOCATOR, "WifiServiceStatusChange::OnRemoveSystemAbility systemAbilityId :%{public}d", systemAbilityId);
362 DelayedSingleton<LocatorRequiredDataManager>::GetInstance()->ResetCallbackRegisteredStatus();
363 }
364 } // namespace Location
365 } // namespace OHOS
366