1 /*
2 * Copyright (C) 2021-2022 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
16 #include "ble_adapter.h"
17
18 #include <algorithm>
19 #include <chrono>
20 #include <condition_variable>
21 #include <map>
22 #include <mutex>
23
24 #include "adapter_manager.h"
25 #include "base_observer_list.h"
26 #include "ble_feature.h"
27 #include "ble_utils.h"
28 #include "btm.h"
29 #include "btstack.h"
30 #include "class_creator.h"
31 #include "compat.h"
32 #include "interface_profile_gatt_client.h"
33 #include "interface_profile_manager.h"
34 #include "log.h"
35 #include "log_util.h"
36 #include "securec.h"
37
38 namespace OHOS {
39 namespace bluetooth {
40 struct BleAdapter::impl {
41 class GattClientCallback : public IGattClientCallback {
42 public:
GattClientCallback(BleAdapter & bleAdapter)43 explicit GattClientCallback(BleAdapter &bleAdapter) : bleAdapter_(bleAdapter)
44 {}
~GattClientCallback()45 ~GattClientCallback()
46 {}
OnConnectionStateChanged(int state,int newState)47 void OnConnectionStateChanged(int state, int newState) override
48 {
49 LOG_DEBUG("%{public}s:%{public}d:%{public}s state:%{public}d", __FILE__, __LINE__, __FUNCTION__, newState);
50 }
51
OnServicesChanged(const std::vector<Service> & services)52 void OnServicesChanged(const std::vector<Service> &services) override
53 {
54 LOG_DEBUG("%{public}s:%{public}d:%{public}s", __FILE__, __LINE__, __FUNCTION__);
55 }
56
OnCharacteristicRead(int ret,const Characteristic & characteristic)57 void OnCharacteristicRead(int ret, const Characteristic &characteristic) override
58 {
59 LOG_DEBUG("%{public}s:%{public}d:%{public}s ret : %{public}d", __FILE__, __LINE__, __FUNCTION__, ret);
60 std::lock_guard<std::mutex> lock(bleAdapter_.pimpl->mutexRemoteName_);
61 if (GattStatus::GATT_SUCCESS == ret) {
62 std::string name(characteristic.value_.get(), characteristic.value_.get() + characteristic.length_);
63 bleAdapter_.pimpl->remoteDeviceName_ = name;
64 bleAdapter_.pimpl->readCharacteristicFlag_ = true;
65 } else {
66 bleAdapter_.pimpl->readCharacteristicFlag_ = false;
67 }
68 bleAdapter_.pimpl->cvfull_.notify_all();
69 }
70
OnCharacteristicWrite(int ret,const Characteristic & characteristic)71 void OnCharacteristicWrite(int ret, const Characteristic &characteristic) override
72 {
73 LOG_DEBUG("%{public}s:%{public}d:%{public}s", __FILE__, __LINE__, __FUNCTION__);
74 }
75
OnCharacteristicChanged(const Characteristic & characteristic)76 void OnCharacteristicChanged(const Characteristic &characteristic) override
77 {
78 LOG_DEBUG("%{public}s:%{public}d:%{public}s", __FILE__, __LINE__, __FUNCTION__);
79 }
80
OnDescriptorRead(int ret,const Descriptor & descriptor)81 void OnDescriptorRead(int ret, const Descriptor &descriptor) override
82 {
83 LOG_DEBUG("%{public}s:%{public}d:%{public}s", __FILE__, __LINE__, __FUNCTION__);
84 }
85
OnDescriptorWrite(int ret,const Descriptor & descriptor)86 void OnDescriptorWrite(int ret, const Descriptor &descriptor) override
87 {
88 LOG_DEBUG("%{public}s:%{public}d:%{public}s", __FILE__, __LINE__, __FUNCTION__);
89 }
90
OnMtuChanged(int state,int mtu)91 void OnMtuChanged(int state, int mtu) override
92 {
93 LOG_DEBUG("%{public}s:%{public}d:%{public}s", __FILE__, __LINE__, __FUNCTION__);
94 }
95
OnConnectionParameterChanged(int interval,int latency,int timeout,int status)96 void OnConnectionParameterChanged(int interval, int latency, int timeout, int status) override
97 {
98 LOG_DEBUG("%{public}s:%{public}d:%{public}s", __FILE__, __LINE__, __FUNCTION__);
99 }
100
OnServicesDiscovered(int status)101 void OnServicesDiscovered(int status) override
102 {
103 LOG_DEBUG("%{public}s:%{public}d:%{public}s", __FILE__, __LINE__, __FUNCTION__);
104 }
105
OnReadRemoteRssiValue(const RawAddress & addr,int rssi,int status)106 void OnReadRemoteRssiValue(const RawAddress &addr, int rssi, int status) override
107 {
108 LOG_DEBUG("%{public}s:%{public}d:%{public}s", __FILE__, __LINE__, __FUNCTION__);
109 }
110
111 private:
112 BleAdapter &bleAdapter_;
113 };
114 impl(BleAdapter &bleAdapter);
115 impl(const impl &);
116 impl &operator=(const impl &);
117 ~impl();
118
119 std::recursive_mutex syncMutex_ {};
120 std::unique_ptr<BaseObserverList<IAdapterBleObserver>> observer_ =
121 std::make_unique<BaseObserverList<IAdapterBleObserver>>();
122 std::unique_ptr<BaseObserverList<IBlePeripheralCallback>> blePeripheralCallback_ =
123 std::make_unique<BaseObserverList<IBlePeripheralCallback>>();
124
125 std::mutex mutexRpa_ {};
126 std::mutex mutexAdvAdnScan_ {};
127 std::mutex mutexRemoteName_ {};
128 std::condition_variable cvfull_ {};
129
130 std::unique_ptr<GattClientCallback> gattClientcallback_ {};
131 IProfileGattClient *gattClientService_ {};
132 std::string remoteDeviceName_ {};
133 std::recursive_mutex peerDevlistMutex_ {};
134 std::recursive_mutex bleAdvMutex_ {};
135 std::recursive_mutex bleCenMutex_ {};
136 std::map<std::string, BlePeripheralDevice> peerConnDeviceList_ {};
137 bool btmEnableFlag_ = false;
138 bool readCharacteristicFlag_ = false;
139
140 std::unique_ptr<BleAdvertiserImpl> bleAdvertiser_ = nullptr;
141 std::unique_ptr<BleCentralManagerImpl> bleCentralManager_ = nullptr;
142 std::unique_ptr<BleSecurity> bleSecurity_ = nullptr;
143 BtmAclCallbacks btmAclCb_ {};
144 };
145
impl(BleAdapter & bleAdapter)146 BleAdapter::impl::impl(BleAdapter &bleAdapter) : gattClientcallback_(std::make_unique<GattClientCallback>(bleAdapter))
147 {}
148
~impl()149 BleAdapter::impl::~impl()
150 {}
151
BleAdapter()152 BleAdapter::BleAdapter() : utility::Context(ADAPTER_NAME_BLE, "5.0"), pimpl(std::make_unique<BleAdapter::impl>(*this))
153 {
154 LOG_DEBUG("[BleAdapter] %{public}s:Create", Name().c_str());
155 }
156
~BleAdapter()157 BleAdapter::~BleAdapter()
158 {
159 LOG_DEBUG("[BleAdapter] %{public}s:Destroy", Name().c_str());
160
161 pimpl->bleAdvertiser_ = nullptr;
162 pimpl->bleCentralManager_ = nullptr;
163 pimpl->bleSecurity_ = nullptr;
164 }
165
Enable()166 void BleAdapter::Enable()
167 {
168 LOG_DEBUG("[BleAdapter] %{public}s:%{public}s", __func__, Name().c_str());
169
170 GetDispatcher()->PostTask(std::bind(&BleAdapter::EnableTask, this));
171 }
172
EnableTask()173 bool BleAdapter::EnableTask()
174 {
175 LOG_DEBUG("[BleAdapter] %{public}s", __func__);
176
177 std::lock_guard<std::recursive_mutex> lk(pimpl->syncMutex_);
178 bool ret = (BTM_Enable(LE_CONTROLLER) == BT_SUCCESS);
179 if (!ret) {
180 pimpl->btmEnableFlag_ = false;
181 LOG_ERROR("[BleAdapter] %{public}s:BTM enable failed!", __func__);
182 } else {
183 pimpl->btmEnableFlag_ = true;
184 LoadConfig();
185 ret = (InitBtmAndGap() == BT_SUCCESS);
186 LOG_DEBUG("[BleAdapter] %{public}s:BTM enable successfully!", __func__);
187 }
188
189 GetContext()->OnEnable(ADAPTER_NAME_BLE, ret);
190
191 return ret;
192 }
193
InitBtmAndGap()194 int BleAdapter::InitBtmAndGap()
195 {
196 int ret = RegisterCallbackToBtm();
197 if (ret != BT_SUCCESS) {
198 LOG_ERROR("[BleAdapter] %{public}s:RegisterCallbackToBtm failed!", __func__);
199 }
200
201 ret = SetLocalIrkAndIdentityAddrToBtm();
202 if (ret != BT_SUCCESS) {
203 LOG_ERROR("[BleAdapter] %{public}s:SetLocalIrkAndIdentityAddrToBtm failed!", __func__);
204 }
205
206 ret = SetRpaAddrAndTypeToBtm();
207 if (ret != BT_SUCCESS) {
208 LOG_ERROR("[BleAdapter] %{public}s:SetRpaAddrAndTypeToBtm failed!", __func__);
209 }
210
211 GAP_LeSecMode1Level level1 = static_cast<GAP_LeSecMode1Level>(BleConfig::GetInstance().GetBleModel1Level());
212 GAP_LeSecMode2Level level2 = static_cast<GAP_LeSecMode2Level>(BleConfig::GetInstance().GetBleModel2Level());
213 ret = GAPIF_LeSetSecurityMode(level1, level2);
214 if (ret == BT_NOT_SUPPORT) {
215 ret = GAPIF_LeSetSecurityMode(LE_MODE_1_LEVEL_3, level2);
216 if (ret != BT_SUCCESS) {
217 LOG_ERROR("[BleAdapter] %{public}s:GAP_LeSetSecurityMode failed!", __func__);
218 }
219 }
220
221 RegisterBleSecurityCallback(*pimpl->observer_.get());
222
223 ret = GAPIF_LeSetMinEncKeySize(GAP_ENC_KEY_MIN_SIZE);
224 if (ret != BT_SUCCESS) {
225 LOG_ERROR("[BleAdapter] %{public}s:GAP_LeSetMinEncKeySize failed!", __func__);
226 }
227
228 ret = BleProperties::GetInstance().SetBondableMode(GAP_BONDABLE_MODE);
229 if (ret != BT_SUCCESS) {
230 LOG_ERROR("[BleAdapter] %{public}s:SetBondableMode failed!", __func__);
231 }
232
233 /// Save all peer paired devices to BTM
234 std::vector<std::string> pairedAddrList = BleConfig::GetInstance().GetPairedAddrList();
235 ReadPeerDeviceInfoFromConf(pairedAddrList);
236 SavePeerDevices2BTM(pimpl->peerConnDeviceList_);
237 return ret;
238 }
239
Disable()240 void BleAdapter::Disable()
241 {
242 LOG_DEBUG("[BleAdapter] %{public}s:%{public}s", __func__, Name().c_str());
243
244 GetDispatcher()->PostTask(std::bind(&BleAdapter::DisableTask, this));
245 }
246
DisableTask()247 bool BleAdapter::DisableTask()
248 {
249 LOG_DEBUG("[BleAdapter] %{public}s", __func__);
250
251 std::lock_guard<std::recursive_mutex> lk(pimpl->syncMutex_);
252 if (!pimpl->btmEnableFlag_) {
253 GetContext()->OnDisable(ADAPTER_NAME_BLE, pimpl->btmEnableFlag_);
254 return false;
255 }
256
257 SavePeerDeviceInfoToConf(pimpl->peerConnDeviceList_);
258 ClearPeerDeviceInfo();
259 int ret = BleProperties::GetInstance().SetBondableMode(GAP_BONDABLE_MODE_NON);
260 if (ret != BT_SUCCESS) {
261 LOG_ERROR("[BleAdapter] %{public}s:SetBondableMode failed!", __func__);
262 }
263
264 StartOrStopAdvAndScan(STOP_ADV_TYPE_ALL, STOP_SCAN_TYPE_NOR);
265 if (BleFeature::GetInstance().IsLeExtendedAdvertisingSupported()) {
266 ExAdvClearHandle();
267 }
268 ClearScanResultInfo();
269 DeregisterAllCallback();
270 ClearScannerIdInfo();
271
272 ret = (BTM_Disable(LE_CONTROLLER) == BT_SUCCESS);
273 if (!ret) {
274 LOG_ERROR("[BleAdapter] %{public}s:BTM Disable failed!", __func__);
275 } else {
276 LOG_DEBUG("[BleAdapter] %{public}s:BTM Disable successfully!", __func__);
277 }
278 GetContext()->OnDisable(ADAPTER_NAME_BLE, ret);
279 return ret;
280 }
281
NotifyAllWaitContinue() const282 void BleAdapter::NotifyAllWaitContinue() const
283 {
284 LOG_DEBUG("[BleAdapter] %{public}s", __func__);
285
286 pimpl->cvfull_.notify_all();
287 }
288
PostEnable()289 void BleAdapter::PostEnable()
290 {
291 LOG_DEBUG("[BleAdapter] %{public}s:%{public}s", __func__, Name().c_str());
292
293 if (!pimpl->btmEnableFlag_) {
294 GetDispatcher()->PostTask(std::bind(&BleAdapter::PostEnableTask, this));
295 return;
296 }
297
298 int ret = SetBleRoles();
299 if (ret != BT_SUCCESS) {
300 LOG_ERROR("[BleAdvertiserImpl] %{public}s:Set ble roles failed!.", __func__);
301 }
302
303 GetDispatcher()->PostTask(std::bind(&BleAdapter::PostEnableTask, this));
304 }
305
PostEnableTask() const306 bool BleAdapter::PostEnableTask() const
307 {
308 LOG_DEBUG("[BleAdapter] %{public}s", __func__);
309
310 return true;
311 }
312
StartOrStopAdvAndScan(const STOP_ALL_ADV_TYPE & stopAllAdvType,const STOP_SCAN_TYPE & scanType,bool isStartAdvAndScan) const313 void BleAdapter::StartOrStopAdvAndScan(
314 const STOP_ALL_ADV_TYPE &stopAllAdvType, const STOP_SCAN_TYPE &scanType, bool isStartAdvAndScan) const
315 {
316 LOG_DEBUG("[BleAdapter] %{public}s", __func__);
317 std::lock_guard<std::recursive_mutex> lk(pimpl->syncMutex_);
318 std::unique_lock<std::recursive_mutex> bleAdvlk(pimpl->bleAdvMutex_);
319 if ((pimpl->bleAdvertiser_ != nullptr) &&
320 (pimpl->bleAdvertiser_->GetAdvertisingStatus() == ADVERTISE_FAILED_ALREADY_STARTED)) {
321 std::unique_lock<std::mutex> lock(pimpl->mutexAdvAdnScan_);
322 pimpl->bleAdvertiser_->StartOrStopAllAdvertising(stopAllAdvType, isStartAdvAndScan);
323 if (pimpl->cvfull_.wait_for(lock, std::chrono::seconds(BLE_THREAD_WAIT_TIMEOUT)) == std::cv_status::timeout) {
324 LOG_ERROR("[BleAdapter] %{public}s:StartOrStopAdvAndScan timeout!", __func__);
325 }
326 }
327 bleAdvlk.unlock();
328
329 std::unique_lock<std::recursive_mutex> bleCenlk(pimpl->bleCenMutex_);
330 if (pimpl->bleCentralManager_ != nullptr) {
331 if (pimpl->bleCentralManager_->GetScanStatus() == SCAN_FAILED_ALREADY_STARTED) {
332 std::unique_lock<std::mutex> lock(pimpl->mutexAdvAdnScan_);
333 pimpl->bleCentralManager_->StartOrStopScan(scanType, isStartAdvAndScan);
334 if (pimpl->cvfull_.wait_for(lock, std::chrono::seconds(BLE_THREAD_WAIT_TIMEOUT)) ==
335 std::cv_status::timeout) {
336 LOG_ERROR("[BleAdapter] %{public}s:StartOrStopAdvAndScan timeout!", __func__);
337 }
338 }
339 }
340 bleCenlk.unlock();
341 }
342
ExAdvClearHandle() const343 void BleAdapter::ExAdvClearHandle() const
344 {
345 LOG_DEBUG("[BleAdapter] %{public}s", __func__);
346
347 std::unique_lock<std::mutex> lock(pimpl->mutexAdvAdnScan_);
348 if (pimpl->bleAdvertiser_ != nullptr) {
349 pimpl->bleAdvertiser_->GAPExAdvClearHandle();
350 if (pimpl->cvfull_.wait_for(lock, std::chrono::seconds(BLE_THREAD_WAIT_TIMEOUT)) == std::cv_status::timeout) {
351 LOG_ERROR("[BleAdapter] %{public}s:ExAdvClearHandle timeout!", __func__);
352 }
353 }
354 }
355
LoadConfig() const356 void BleAdapter::LoadConfig() const
357 {
358 LOG_DEBUG("[BleAdapter] %{public}s", __func__);
359
360 bool ret = BleProperties::GetInstance().LoadBleConfigInfo();
361 if (!ret) {
362 LOG_ERROR("[BleAdapter] %{public}s:LoadBleConfigInfo File failed!", __func__);
363 } else {
364 LOG_DEBUG("[BleAdapter] %{public}s:LoadBleConfigInfo File success!", __func__);
365 }
366
367 ret &= BleProperties::GetInstance().ConfigBleProperties();
368 ret &= BleProperties::GetInstance().GetAddrFromController();
369 if (ret) {
370 BTM_SetOwnAddressType(BLE_ADDR_TYPE::BLE_ADDR_TYPE_PUBLIC);
371 }
372
373 if (!ret) {
374 LOG_ERROR("[BleAdapter] %{public}s:ConfigBleProperties File failed!", __func__);
375 BleProperties::GetInstance().SaveDefaultValues();
376 } else {
377 LOG_DEBUG("[BleAdapter] %{public}s:ConfigBleProperties File success!", __func__);
378 }
379 }
380
DeregisterAllCallback() const381 int BleAdapter::DeregisterAllCallback() const
382 {
383 LOG_DEBUG("[BleAdapter] %{public}s", __func__);
384
385 DeregisterBleSecurityCallback();
386 DeregisterBleAdvertiserCallback();
387 DeregisterBleCentralManagerCallback();
388 return DeregisterCallbackToBtm();
389 }
390
GenResPriAddrResult(uint8_t result,const uint8_t addr[BT_ADDRESS_SIZE],void * context)391 void BleAdapter::GenResPriAddrResult(uint8_t result, const uint8_t addr[BT_ADDRESS_SIZE], void *context)
392 {
393 HILOGI("ResPriAddr: %{public}s", GetEncryptAddr(RawAddress::ConvertToString(addr).GetAddress()).c_str());
394
395 auto *adapter = static_cast<BleAdapter *>(context);
396 std::unique_lock<std::mutex> lock(adapter->pimpl->mutexRpa_);
397 BtAddr btAddr;
398 (void)memcpy_s(&btAddr.addr, BT_ADDRESS_SIZE, addr, BT_ADDRESS_SIZE);
399 btAddr.type = BLE_ADDR_TYPE_RANDOM;
400 int ret = BTM_SetLeRandomAddress(&btAddr);
401 if (ret != BT_SUCCESS) {
402 LOG_ERROR("[BleAdapter] %{public}s:GenResPriAddrResult failed!", __func__);
403 }
404 BTM_SetOwnAddressType(BLE_ADDR_TYPE_RANDOM);
405
406 adapter->pimpl->cvfull_.notify_all();
407 }
408
SetRpaAddrAndTypeToBtm()409 int BleAdapter::SetRpaAddrAndTypeToBtm()
410 {
411 LOG_DEBUG("[BleAdapter] %{public}s", __func__);
412
413 /// btm set address type and rpa address
414 int ret = BT_SUCCESS;
415 switch (BleConfig::GetInstance().GetBleAddrType()) {
416 case BLE_ADDR_TYPE_RPA: {
417 std::unique_lock<std::mutex> lock(pimpl->mutexRpa_);
418 ret = GAPIF_LeGenResPriAddr(&BleAdapter::GenResPriAddrResult, this);
419 if (ret != BT_SUCCESS) {
420 LOG_ERROR("[BleAdapter] %{public}s:GAP_LeGenResPriAddrAsync failed!", __func__);
421 }
422 if (pimpl->cvfull_.wait_for(lock, std::chrono::seconds(BLE_THREAD_WAIT_TIMEOUT)) ==
423 std::cv_status::timeout) {
424 LOG_ERROR("[BleAdapter] %{public}s:GAP_LeGenResPriAddrAsync timeout!", __func__);
425 }
426 break;
427 }
428 case BLE_ADDR_TYPE_PUBLIC:
429 default:
430 BTM_SetOwnAddressType(BleConfig::GetInstance().GetBleLocalAddrType());
431 break;
432 }
433 return ret;
434 }
435
SetLocalIrkAndIdentityAddrToBtm() const436 int BleAdapter::SetLocalIrkAndIdentityAddrToBtm() const
437 {
438 LOG_DEBUG("[BleAdapter] %{public}s", __func__);
439
440 std::string irk = BleConfig::GetInstance().GetLocalIrk();
441 if (irk.empty()) {
442 std::vector<uint8_t> key;
443 BleUtils::Rand16hex(key);
444 BleConfig::GetInstance().SetLocalIrk(BleUtils::ConvertIntToHexString(key));
445 irk = BleUtils::ConvertIntToHexString(key);
446 }
447 std::vector<uint8_t> vec;
448 BleUtils::ConvertHexStringToInt(irk, vec);
449 BtmKey btmKey;
450 if (memcpy_s(btmKey.key, KEY_SIZE, &vec[0], vec.size()) != EOK) {
451 LOG_DEBUG("[BleAdapter] %{public}s:memcpy_s btmKey failed!", __func__);
452 return BT_OPERATION_FAILED;
453 }
454 BTM_SetLocalIdentityResolvingKey(&btmKey);
455 /// check public address
456 std::string addr = BleConfig::GetInstance().GetLocalAddress();
457 int ret = BT_SUCCESS;
458 std::string invalidMacAddress(INVALID_MAC_ADDRESS);
459 if ((addr.empty()) || (invalidMacAddress.compare(addr) == 0)) {
460 std::vector<uint8_t>().swap(vec);
461 BleUtils::GetRandomAddress(vec, false);
462 addr = RawAddress::ConvertToString(&vec[0]).GetAddress();
463 BleConfig::GetInstance().SetBleLocalAddrType(BLE_ADDR_TYPE::BLE_ADDR_TYPE_RANDOM);
464 BTM_SetOwnAddressType(BLE_ADDR_TYPE::BLE_ADDR_TYPE_RANDOM);
465 HILOGI("GAP_LeSetStaticIdentityAddr random addr = %{public}s!", GetEncryptAddr(addr).c_str());
466 ret = GAPIF_LeSetStaticIdentityAddr(&vec[0]);
467 if (ret != BT_SUCCESS) {
468 LOG_DEBUG("[BleAdapter] %{public}s:GAP_LeSetStaticIdentityAddr failed!", __func__);
469 }
470 }
471
472 if (!BleConfig::GetInstance().SetLocalIdentityAddr(addr)) {
473 LOG_DEBUG("[BleAdapter] %{public}s:SetLocalIdentityAddr failed!", __func__);
474 }
475 return ret;
476 }
477
GetLocalAddress() const478 std::string BleAdapter::GetLocalAddress() const
479 {
480 LOG_DEBUG("[BleAdapter] %{public}s", __func__);
481
482 std::lock_guard<std::recursive_mutex> lk(pimpl->syncMutex_);
483 return BleProperties::GetInstance().GetLocalAddress();
484 }
485
GetLocalName() const486 std::string BleAdapter::GetLocalName() const
487 {
488 LOG_DEBUG("[BleAdapter] %{public}s", __func__);
489
490 std::lock_guard<std::recursive_mutex> lk(pimpl->syncMutex_);
491 return BleProperties::GetInstance().GetLocalName();
492 }
493
SetLocalName(const std::string & name) const494 bool BleAdapter::SetLocalName(const std::string &name) const
495 {
496 LOG_DEBUG("[BleAdapter] %{public}s:SetLocalName %{public}s", __func__, name.c_str());
497
498 std::lock_guard<std::recursive_mutex> lk(pimpl->syncMutex_);
499 return BleProperties::GetInstance().SetLocalName(name);
500 }
501
GetDeviceName(const RawAddress & device) const502 std::string BleAdapter::GetDeviceName(const RawAddress &device) const
503 {
504 LOG_DEBUG("[BleAdapter] %{public}s", __func__);
505
506 std::string remoteName = "";
507
508 if (!Compat::CompatCheck(CompatType::COMPAT_REJECT_NAME_REQUEST, device.GetAddress())) {
509 int appID = RegisterGattClientApplication(device);
510 remoteName = ReadRemoteDeviceNameByGatt(device, appID);
511 DeregisterGattClientApplication(appID);
512 }
513
514 if (!remoteName.empty()) {
515 return remoteName;
516 }
517
518 if (pimpl->bleCentralManager_ != nullptr) {
519 remoteName = pimpl->bleCentralManager_->GetDeviceName(device.GetAddress());
520 }
521
522 if (remoteName.empty()) {
523 std::lock_guard<std::recursive_mutex> lk(pimpl->peerDevlistMutex_);
524 auto it = pimpl->peerConnDeviceList_.find(device.GetAddress());
525 if (it != pimpl->peerConnDeviceList_.end()) {
526 remoteName = it->second.GetName();
527 }
528 }
529 return remoteName;
530 }
531
RegisterGattClientApplication(const RawAddress & addr) const532 int BleAdapter::RegisterGattClientApplication(const RawAddress &addr) const
533 {
534 pimpl->gattClientService_ =
535 static_cast<IProfileGattClient *>(IProfileManager::GetInstance()->GetProfileService(PROFILE_NAME_GATT_CLIENT));
536 if (pimpl->gattClientService_ != nullptr) {
537 return pimpl->gattClientService_->RegisterSharedApplication(
538 *pimpl->gattClientcallback_, addr, BTTransport::ADAPTER_BLE);
539 }
540
541 return RET_NO_SUPPORT;
542 }
543
DeregisterGattClientApplication(int appID) const544 void BleAdapter::DeregisterGattClientApplication(int appID) const
545 {
546 pimpl->gattClientService_ =
547 static_cast<IProfileGattClient *>(IProfileManager::GetInstance()->GetProfileService(PROFILE_NAME_GATT_CLIENT));
548 if (pimpl->gattClientService_ == nullptr) {
549 return;
550 }
551 pimpl->gattClientService_->DeregisterApplication(appID);
552 }
553
ReadRemoteDeviceNameByGatt(const RawAddress & addr,int appID) const554 std::string BleAdapter::ReadRemoteDeviceNameByGatt(const RawAddress &addr, int appID) const
555 {
556 std::string name = "";
557 pimpl->gattClientService_ =
558 static_cast<IProfileGattClient *>(IProfileManager::GetInstance()->GetProfileService(PROFILE_NAME_GATT_CLIENT));
559 if (pimpl->gattClientService_ == nullptr) {
560 return name;
561 }
562
563 std::lock_guard<std::recursive_mutex> lk(pimpl->syncMutex_);
564 bool isAclConnect = false;
565
566 std::unique_lock<std::recursive_mutex> peerlk(pimpl->peerDevlistMutex_);
567 auto it = pimpl->peerConnDeviceList_.find(addr.GetAddress());
568 if (it != pimpl->peerConnDeviceList_.end()) {
569 isAclConnect = it->second.IsAclConnected();
570 LOG_DEBUG("[BleAdapter] isAclConnect %{public}d ", isAclConnect);
571 }
572 peerlk.unlock();
573
574 if (isAclConnect) {
575 std::unique_lock<std::mutex> lock(pimpl->mutexRemoteName_);
576 // Device name
577 LOG_DEBUG("Get device name from gatt. %{public}d", appID);
578 Uuid uuid = Uuid::ConvertFrom16Bits(GATT_UUID_GAP_DEVICE_NAME);
579 pimpl->gattClientService_->Connect(appID, true);
580 pimpl->gattClientService_->ReadCharacteristicByUuid(appID, uuid);
581 if (pimpl->cvfull_.wait_for(lock, std::chrono::seconds(BLE_THREAD_WAIT_TIMEOUT)) ==
582 std::cv_status::timeout) {
583 LOG_ERROR("[BleAdapter] %{public}s:ReadRemoteDeviceNameByGatt timeout!", __func__);
584 pimpl->gattClientService_->Disconnect(appID);
585 return name;
586 }
587 if (pimpl->readCharacteristicFlag_) {
588 pimpl->gattClientService_->Disconnect(appID);
589 }
590 return pimpl->remoteDeviceName_;
591 }
592 return name;
593 }
594
GetDeviceUuids(const RawAddress & device) const595 std::vector<Uuid> BleAdapter::GetDeviceUuids(const RawAddress &device) const
596 {
597 LOG_DEBUG("[BleAdapter] %{public}s", __func__);
598
599 std::lock_guard<std::recursive_mutex> lk(pimpl->peerDevlistMutex_);
600 std::vector<Uuid> uuids;
601 auto it = pimpl->peerConnDeviceList_.find(device.GetAddress());
602 if (it != pimpl->peerConnDeviceList_.end()) {
603 uuids = it->second.GetServiceUUID();
604 }
605 return uuids;
606 }
607
GetPairedDevices() const608 std::vector<RawAddress> BleAdapter::GetPairedDevices() const
609 {
610 LOG_DEBUG("[BleAdapter] %{public}s", __func__);
611
612 std::lock_guard<std::recursive_mutex> lk(pimpl->peerDevlistMutex_);
613 std::vector<RawAddress> pairedList;
614 for (auto it = pimpl->peerConnDeviceList_.begin(); it != pimpl->peerConnDeviceList_.end(); it++) {
615 if (BLE_PAIR_PAIRED == it->second.GetPairedStatus()) {
616 RawAddress rawAddr(it->second.GetRawAddress());
617 pairedList.push_back(rawAddr);
618 }
619 }
620 return pairedList;
621 }
622
GetConnectedDevices() const623 std::vector<RawAddress> BleAdapter::GetConnectedDevices() const
624 {
625 LOG_DEBUG("[BleAdapter] %{public}s", __func__);
626
627 std::lock_guard<std::recursive_mutex> lk(pimpl->peerDevlistMutex_);
628 std::vector<RawAddress> pairedList;
629 for (auto it = pimpl->peerConnDeviceList_.begin(); it != pimpl->peerConnDeviceList_.end(); it++) {
630 RawAddress rawAddr(it->second.GetRawAddress());
631 pairedList.push_back(rawAddr);
632 }
633 return pairedList;
634 }
635
StartPair(const RawAddress & device)636 bool BleAdapter::StartPair(const RawAddress &device)
637 {
638 HILOGI("addr: %{public}s", GetEncryptAddr(device.GetAddress()).c_str());
639
640 std::lock_guard<std::recursive_mutex> lk(pimpl->syncMutex_);
641 if (pimpl->bleSecurity_ == nullptr) {
642 LOG_ERROR("[BleAdapter] %{public}s:failed", __func__);
643 return false;
644 }
645
646 uint8_t peerAddrType = GetPeerDeviceAddrType(RawAddress(device.GetAddress()));
647 std::unique_lock<std::recursive_mutex> peerlk(pimpl->peerDevlistMutex_);
648 auto it = pimpl->peerConnDeviceList_.find(device.GetAddress());
649 if (it != pimpl->peerConnDeviceList_.end()) {
650 peerAddrType = it->second.GetAddressType();
651 if (BLE_PAIR_PAIRING == it->second.GetPairedStatus()) {
652 LOG_ERROR("[BleAdapter] %{public}s:StartPair failed, because of PAIR_NONE or PAIRING!", __func__);
653 return false;
654 }
655 }
656 peerlk.unlock();
657
658 int ret = pimpl->bleSecurity_->StartPair(device, peerAddrType);
659 if (!ret) {
660 LOG_ERROR("[BleAdapter] %{public}s:failed", __func__);
661 return false;
662 }
663 LePairingStatus(device);
664 return true;
665 }
666
CancelPairing(const RawAddress & device)667 bool BleAdapter::CancelPairing(const RawAddress &device)
668 {
669 HILOGI("addr: %{public}s", GetEncryptAddr(device.GetAddress()).c_str());
670
671 std::lock_guard<std::recursive_mutex> lk(pimpl->syncMutex_);
672 std::unique_lock<std::recursive_mutex> peerlk(pimpl->peerDevlistMutex_);
673 auto it = pimpl->peerConnDeviceList_.find(device.GetAddress());
674 if (it != pimpl->peerConnDeviceList_.end()) {
675 int pairState = it->second.GetPairedStatus();
676 peerlk.unlock();
677 if ((BLE_PAIR_PAIRED == pairState) || (BLE_PAIR_CANCELING == pairState) || (BLE_PAIR_NONE == pairState)) {
678 HILOGE("CancelPairing failed, because of BLE_PAIR_NONE, PAIR_PAIRED or PAIR_CANCELING! %{public}d",
679 pairState);
680 return false;
681 }
682
683 if (pimpl->bleSecurity_ == nullptr) {
684 return false;
685 }
686
687 if (BT_SUCCESS == pimpl->bleSecurity_->CancelPairing(device)) {
688 peerlk.lock();
689 it->second.SetPairedStatus(BLE_PAIR_CANCELING);
690 peerlk.unlock();
691 } else {
692 LOG_ERROR("[BleAdapter] %{public}s:CancelPairing failed, because of gap cancel pair failed!", __func__);
693 return false;
694 }
695 } else {
696 LOG_ERROR("[BleAdapter] %{public}s:CancelPairing failed, because of not find the remote device!", __func__);
697 return false;
698 }
699
700 return true;
701 }
702
RemovePairWithDisConnect(const RawAddress & device,bool isDisconnect) const703 bool BleAdapter::RemovePairWithDisConnect(const RawAddress &device, bool isDisconnect) const
704 {
705 std::lock_guard<std::recursive_mutex> lk(pimpl->syncMutex_);
706 std::unique_lock<std::recursive_mutex> peerlk(pimpl->peerDevlistMutex_);
707 auto it = pimpl->peerConnDeviceList_.find(device.GetAddress());
708 bool isAclConnect = it->second.IsAclConnected();
709 int connectionHandle = it->second.GetConnectionHandle();
710 int addrType = it->second.GetAddressType();
711 if ((it == pimpl->peerConnDeviceList_.end()) || (it->second.GetPairedStatus() != BLE_PAIR_PAIRED)) {
712 LOG_ERROR("[BleAdapter] %{public}s:RemovePair failed, because of not find the paired device!", __func__);
713 return false;
714 }
715 peerlk.unlock();
716
717 BleConfig::GetInstance().RemovePairedDevice(device.GetAddress());
718
719 if (isAclConnect && isDisconnect) {
720 int ret = BTM_AclDisconnect(connectionHandle, BTM_ACL_DISCONNECT_REASON);
721 if (ret != BT_SUCCESS) {
722 LOG_ERROR("[BleAdapter] %{public}s:BTM_AclDisconnect failed!", __func__);
723 }
724 }
725
726 // Del pair device from BTM
727 StartOrStopAdvAndScan(STOP_ADV_TYPE_RESOLVING_LIST, STOP_SCAN_TYPE_RESOLVING_LIST);
728 BtAddr btAddr;
729 (void)memset_s(&btAddr, sizeof(btAddr), 0x00, sizeof(btAddr));
730 btAddr.type = addrType;
731 device.ConvertToUint8(btAddr.addr);
732 BTM_RemoveLePairedDevice(&btAddr);
733 StartOrStopAdvAndScan(STOP_ADV_TYPE_RESOLVING_LIST, STOP_SCAN_TYPE_RESOLVING_LIST, true);
734
735 if (isDisconnect) {
736 peerlk.lock();
737 pimpl->peerConnDeviceList_.erase(device.GetAddress());
738 peerlk.unlock();
739 }
740 BleConfig::GetInstance().Save();
741
742 std::vector<RawAddress> removeDevices;
743 removeDevices.push_back(device);
744 AdapterManager::GetInstance()->OnPairDevicesRemoved(BTTransport::ADAPTER_BLE, removeDevices);
745
746 if (pimpl->blePeripheralCallback_ != nullptr) {
747 pimpl->blePeripheralCallback_->ForEach([device](IBlePeripheralCallback &observer) {
748 observer.OnPairStatusChanged(ADAPTER_BLE, device, BLE_PAIR_NONE);
749 });
750 }
751 return true;
752 }
753
RemovePair(const RawAddress & device)754 bool BleAdapter::RemovePair(const RawAddress &device)
755 {
756 HILOGI("addr: %{public}s", GetEncryptAddr(device.GetAddress()).c_str());
757
758 return RemovePairWithDisConnect(device);
759 }
760
RemoveAllPairs()761 bool BleAdapter::RemoveAllPairs()
762 {
763 LOG_DEBUG("[BleAdapter] %{public}s", __func__);
764
765 std::lock_guard<std::recursive_mutex> lk(pimpl->syncMutex_);
766 std::unique_lock<std::recursive_mutex> peerlk(pimpl->peerDevlistMutex_);
767 std::vector<RawAddress> removeDevices;
768 auto it = pimpl->peerConnDeviceList_.begin();
769 while (it != pimpl->peerConnDeviceList_.end()) {
770 if (it->second.GetPairedStatus() != BLE_PAIR_PAIRED) {
771 it++;
772 continue;
773 }
774
775 std::string addr = it->second.GetRawAddress().GetAddress();
776 BleConfig::GetInstance().RemovePairedDevice(addr);
777 removeDevices.push_back(it->second.GetRawAddress());
778
779 int ret = BT_SUCCESS;
780 if (it->second.IsAclConnected()) {
781 ret = BTM_AclDisconnect(it->second.GetConnectionHandle(), BTM_ACL_DISCONNECT_REASON);
782 }
783 if (ret != BT_SUCCESS) {
784 LOG_ERROR("[BleAdapter] %{public}s:BTM_AclDisconnect failed!", __func__);
785 }
786 pimpl->peerConnDeviceList_.erase(it++);
787 }
788 peerlk.unlock();
789
790 // Del all paired devices from BTM
791 StartOrStopAdvAndScan(STOP_ADV_TYPE_RESOLVING_LIST, STOP_SCAN_TYPE_RESOLVING_LIST);
792 BTM_SetLePairedDevices(nullptr, 0);
793 StartOrStopAdvAndScan(STOP_ADV_TYPE_RESOLVING_LIST, STOP_SCAN_TYPE_RESOLVING_LIST, true);
794
795 if (!removeDevices.empty()) {
796 BleConfig::GetInstance().Save();
797 AdapterManager::GetInstance()->OnPairDevicesRemoved(BTTransport::ADAPTER_BLE, removeDevices);
798 }
799 return true;
800 }
801
IsRemovePairedDevice(const RawAddress & device) const802 bool BleAdapter::IsRemovePairedDevice(const RawAddress &device) const
803 {
804 LOG_DEBUG("[BleAdapter] %{public}s", __func__);
805
806 std::lock_guard<std::recursive_mutex> lk(pimpl->peerDevlistMutex_);
807 auto it = pimpl->peerConnDeviceList_.find(device.GetAddress());
808 if (it != pimpl->peerConnDeviceList_.end()) {
809 return false;
810 }
811 return true;
812 }
813
IsBondedFromLocal(const RawAddress & device) const814 bool BleAdapter::IsBondedFromLocal(const RawAddress &device) const
815 {
816 LOG_DEBUG("[BleAdapter] %{public}s", __func__);
817
818 std::lock_guard<std::recursive_mutex> lk(pimpl->peerDevlistMutex_);
819 bool isBondedFromLocal = false;
820 auto it = pimpl->peerConnDeviceList_.find(device.GetAddress());
821 if (it != pimpl->peerConnDeviceList_.end()) {
822 isBondedFromLocal = it->second.IsAclEncrypted();
823 }
824 return isBondedFromLocal;
825 }
826
SetDevicePasskey(const RawAddress & device,int passkey,bool accept) const827 bool BleAdapter::SetDevicePasskey(const RawAddress &device, int passkey, bool accept) const
828 {
829 LOG_DEBUG("[BleAdapter] %{public}s:%{public}d %{public}d", __func__, passkey, accept);
830
831 std::lock_guard<std::recursive_mutex> lk(pimpl->syncMutex_);
832 std::unique_lock<std::recursive_mutex> peerlk(pimpl->peerDevlistMutex_);
833 if (pimpl->bleSecurity_ == nullptr) {
834 LOG_ERROR("[BleAdapter] %{public}s:SetDevicePasskey failed!", __func__);
835 return false;
836 }
837
838 if (!BLE_INVALID_MAC_ADDRESS.compare(device.GetAddress())) {
839 LOG_ERROR("[BleAdapter] %{public}s:SetDevicePasskey failed, because of invalid bt address!", __func__);
840 return false;
841 }
842
843 auto it = pimpl->peerConnDeviceList_.find(device.GetAddress());
844 if (it == pimpl->peerConnDeviceList_.end()) {
845 LOG_ERROR("[BleAdapter] %{public}s:SetDevicePasskey failed, because of address not exist!", __func__);
846 return false;
847 }
848 int pairStatus = it->second.GetPairedStatus();
849 peerlk.unlock();
850
851 int ret;
852 if ((BLE_PAIR_CANCELING == pairStatus) || (!accept)) {
853 ret = pimpl->bleSecurity_->SetDevicePasskey(device, passkey, GAP_NOT_ACCEPT);
854 } else {
855 ret = pimpl->bleSecurity_->SetDevicePasskey(device, passkey, GAP_ACCEPT);
856 }
857 if (BT_SUCCESS != ret) {
858 LOG_ERROR("[BleAdapter] %{public}s:SetDevicePasskey failed!", __func__);
859 return false;
860 }
861 return true;
862 }
863
PairRequestReply(const RawAddress & device,bool accept) const864 bool BleAdapter::PairRequestReply(const RawAddress &device, bool accept) const
865 {
866 LOG_DEBUG("[BleAdapter] %{public}s:%{public}d", __func__, accept);
867
868 if (pimpl->bleSecurity_ != nullptr) {
869 int addrType = GetPeerDeviceAddrType(device);
870 return pimpl->bleSecurity_->PairRequestReply(device, addrType, accept);
871 }
872 return false;
873 }
874
IsAclConnected(const RawAddress & device) const875 bool BleAdapter::IsAclConnected(const RawAddress &device) const
876 {
877 LOG_DEBUG("[BleAdapter] %{public}s", __func__);
878
879 std::lock_guard<std::recursive_mutex> lk(pimpl->peerDevlistMutex_);
880 bool isAclConnected = false;
881 auto it = pimpl->peerConnDeviceList_.find(device.GetAddress());
882 if (it != pimpl->peerConnDeviceList_.end()) {
883 isAclConnected = it->second.IsAclConnected();
884 }
885 return isAclConnected;
886 }
887
IsAclEncrypted(const RawAddress & device) const888 bool BleAdapter::IsAclEncrypted(const RawAddress &device) const
889 {
890 LOG_DEBUG("[BleAdapter] %{public}s", __func__);
891
892 std::lock_guard<std::recursive_mutex> lk(pimpl->peerDevlistMutex_);
893 bool isAclEncrypted = false;
894 auto it = pimpl->peerConnDeviceList_.find(device.GetAddress());
895 if (it != pimpl->peerConnDeviceList_.end()) {
896 isAclEncrypted = it->second.IsAclEncrypted();
897 }
898 return isAclEncrypted;
899 }
900
GetContext()901 utility::Context *BleAdapter::GetContext()
902 {
903 return this;
904 }
905
GetPairState(const RawAddress & device) const906 int BleAdapter::GetPairState(const RawAddress &device) const
907 {
908 HILOGI("addr: %{public}s", GetEncryptAddr(device.GetAddress()).c_str());
909
910 std::lock_guard<std::recursive_mutex> lk(pimpl->peerDevlistMutex_);
911 int pairState = BLE_PAIR_NONE;
912 auto it = pimpl->peerConnDeviceList_.find(device.GetAddress());
913 if (it == pimpl->peerConnDeviceList_.end()) {
914 return pairState;
915 } else {
916 pairState = it->second.GetPairedStatus();
917 }
918 return pairState;
919 }
920
GetBondableMode() const921 int BleAdapter::GetBondableMode() const
922 {
923 LOG_DEBUG("[BleAdapter] %{public}s", __func__);
924
925 std::lock_guard<std::recursive_mutex> lk(pimpl->syncMutex_);
926 return BleProperties::GetInstance().GetBondableMode();
927 }
928
SetBondableMode(int mode) const929 bool BleAdapter::SetBondableMode(int mode) const
930 {
931 LOG_DEBUG("[BleAdapter] %{public}s:%{public}d", __func__, mode);
932
933 std::lock_guard<std::recursive_mutex> lk(pimpl->syncMutex_);
934 return (BleProperties::GetInstance().SetBondableMode(mode) == BT_SUCCESS);
935 }
936
SetDevicePairingConfirmation(const RawAddress & device,bool accept) const937 bool BleAdapter::SetDevicePairingConfirmation(const RawAddress &device, bool accept) const
938 {
939 HILOGI("addr: %{public}s, accept: %{public}d", GetEncryptAddr(device.GetAddress()).c_str(), accept);
940
941 std::lock_guard<std::recursive_mutex> lk(pimpl->syncMutex_);
942 if (pimpl->bleSecurity_ == nullptr) {
943 LOG_ERROR("[BleAdapter] %{public}s:failed", __func__);
944 return false;
945 }
946
947 if (BLE_INVALID_MAC_ADDRESS == device.GetAddress()) {
948 LOG_ERROR("[BleAdapter] %{public}s:failed, because of invalid bt address!", __func__);
949 return false;
950 }
951
952 std::unique_lock<std::recursive_mutex> peerlk(pimpl->peerDevlistMutex_);
953 auto it = pimpl->peerConnDeviceList_.find(device.GetAddress());
954 if (it == pimpl->peerConnDeviceList_.end()) {
955 LOG_ERROR("[BleAdapter] %{public}s:failed, because of address not exist!", __func__);
956 return false;
957 }
958 int pairStatus = it->second.GetPairedStatus();
959 peerlk.unlock();
960
961 int ret;
962 if ((BLE_PAIR_CANCELING == pairStatus) || (!accept)) {
963 ret = pimpl->bleSecurity_->SetUserConfirm(device, GAP_NOT_ACCEPT);
964 } else {
965 ret = pimpl->bleSecurity_->SetUserConfirm(device, GAP_ACCEPT);
966 }
967 if (BT_SUCCESS != ret) {
968 LOG_ERROR("[BleAdapter] %{public}s:failed!", __func__);
969 return false;
970 }
971 return true;
972 }
973
GetBleMaxAdvertisingDataLength() const974 int BleAdapter::GetBleMaxAdvertisingDataLength() const
975 {
976 LOG_DEBUG("[BleAdapter] %{public}s", __func__);
977
978 std::lock_guard<std::recursive_mutex> lk(pimpl->syncMutex_);
979 return BleFeature::GetInstance().GetBleMaximumAdvertisingDataLength();
980 }
981
GetIoCapability() const982 int BleAdapter::GetIoCapability() const
983 {
984 LOG_DEBUG("[BleAdapter] %{public}s", __func__);
985
986 std::lock_guard<std::recursive_mutex> lk(pimpl->syncMutex_);
987 return BleProperties::GetInstance().GetIoCapability();
988 }
989
SetIoCapability(int ioCapability) const990 bool BleAdapter::SetIoCapability(int ioCapability) const
991 {
992 LOG_DEBUG("[BleAdapter] %{public}s", __func__);
993
994 std::lock_guard<std::recursive_mutex> lk(pimpl->syncMutex_);
995 return BleProperties::GetInstance().SetIoCapability(ioCapability);
996 }
997
IsBleEnabled() const998 bool BleAdapter::IsBleEnabled() const
999 {
1000 LOG_DEBUG("[BleAdapter] %{public}s", __func__);
1001
1002 std::lock_guard<std::recursive_mutex> lk(pimpl->syncMutex_);
1003 int status = AdapterManager::GetInstance()->GetState(BTTransport::ADAPTER_BLE);
1004 return (status == BTStateID::STATE_TURN_ON);
1005 }
1006
IsBtDiscovering() const1007 bool BleAdapter::IsBtDiscovering() const
1008 {
1009 LOG_DEBUG("[BleAdapter] %{public}s", __func__);
1010
1011 std::lock_guard<std::recursive_mutex> lk(pimpl->bleCenMutex_);
1012 if (pimpl->bleCentralManager_ != nullptr) {
1013 return (SCAN_FAILED_ALREADY_STARTED == pimpl->bleCentralManager_->GetScanStatus());
1014 }
1015 return false;
1016 }
1017
RegisterBleAdvertiserCallback(IBleAdvertiserCallback & callback)1018 void BleAdapter::RegisterBleAdvertiserCallback(IBleAdvertiserCallback &callback)
1019 {
1020 LOG_DEBUG("[BleAdapter] %{public}s", __func__);
1021
1022 std::lock_guard<std::recursive_mutex> lk(pimpl->syncMutex_);
1023 if (pimpl->bleAdvertiser_ == nullptr) {
1024 pimpl->bleAdvertiser_ = std::make_unique<BleAdvertiserImpl>(callback, *this, *GetDispatcher());
1025 }
1026 }
1027
DeregisterBleAdvertiserCallback() const1028 void BleAdapter::DeregisterBleAdvertiserCallback() const
1029 {
1030 LOG_DEBUG("[BleAdapter] %{public}s", __func__);
1031
1032 if (pimpl->bleAdvertiser_ != nullptr) {
1033 pimpl->bleAdvertiser_->DeregisterCallbackToGap();
1034 }
1035 }
1036
RegisterBleCentralManagerCallback(IBleCentralManagerCallback & callback)1037 void BleAdapter::RegisterBleCentralManagerCallback(IBleCentralManagerCallback &callback)
1038 {
1039 LOG_DEBUG("[BleAdapter] %{public}s", __func__);
1040
1041 std::lock_guard<std::recursive_mutex> lk(pimpl->bleCenMutex_);
1042 if (pimpl->bleCentralManager_ == nullptr) {
1043 pimpl->bleCentralManager_ = std::make_unique<BleCentralManagerImpl>(callback, *this, *GetDispatcher());
1044 }
1045 }
1046
DeregisterBleCentralManagerCallback() const1047 void BleAdapter::DeregisterBleCentralManagerCallback() const
1048 {
1049 LOG_DEBUG("[BleAdapter] %{public}s", __func__);
1050
1051 if (pimpl->bleCentralManager_ != nullptr) {
1052 pimpl->bleCentralManager_->DeregisterCallbackToGap();
1053 }
1054 }
1055
RegisterBlePeripheralCallback(IBlePeripheralCallback & callback) const1056 void BleAdapter::RegisterBlePeripheralCallback(IBlePeripheralCallback &callback) const
1057 {
1058 LOG_DEBUG("[BleAdapter] %{public}s", __func__);
1059
1060 if (pimpl->blePeripheralCallback_ != nullptr) {
1061 pimpl->blePeripheralCallback_->Register(callback);
1062 }
1063 }
1064
DeregisterBlePeripheralCallback(IBlePeripheralCallback & callback) const1065 void BleAdapter::DeregisterBlePeripheralCallback(IBlePeripheralCallback &callback) const
1066 {
1067 LOG_DEBUG("[BleAdapter] %{public}s", __func__);
1068
1069 if (pimpl->blePeripheralCallback_ != nullptr) {
1070 pimpl->blePeripheralCallback_->Deregister(callback);
1071 }
1072 }
1073
RegisterBleSecurityCallback(BaseObserverList<IAdapterBleObserver> & callback)1074 void BleAdapter::RegisterBleSecurityCallback(BaseObserverList<IAdapterBleObserver> &callback)
1075 {
1076 LOG_DEBUG("[BleAdapter] %{public}s", __func__);
1077
1078 if (pimpl->bleSecurity_ == nullptr) {
1079 pimpl->bleSecurity_ = std::make_unique<BleSecurity>(*this, *GetDispatcher(), callback);
1080 } else {
1081 pimpl->bleSecurity_->RegisterCallbackToGap();
1082 }
1083 }
1084
DeregisterBleSecurityCallback() const1085 void BleAdapter::DeregisterBleSecurityCallback() const
1086 {
1087 LOG_DEBUG("[BleAdapter] %{public}s", __func__);
1088
1089 if (pimpl->bleSecurity_ != nullptr) {
1090 pimpl->bleSecurity_->DeregisterCallbackToGap();
1091 }
1092 }
1093
RegisterBleAdapterObserver(IAdapterBleObserver & observer) const1094 bool BleAdapter::RegisterBleAdapterObserver(IAdapterBleObserver &observer) const
1095 {
1096 LOG_DEBUG("[BleAdapter] %{public}s", __func__);
1097
1098 std::lock_guard<std::recursive_mutex> lk(pimpl->syncMutex_);
1099 if (pimpl->observer_ != nullptr) {
1100 pimpl->observer_->Register(observer);
1101 }
1102 BleProperties::GetInstance().RegisterBleAdapterObserver(*pimpl->observer_.get());
1103 return true;
1104 }
1105
DeregisterBleAdapterObserver(IAdapterBleObserver & observer) const1106 bool BleAdapter::DeregisterBleAdapterObserver(IAdapterBleObserver &observer) const
1107 {
1108 LOG_DEBUG("[BleAdapter] %{public}s", __func__);
1109
1110 std::lock_guard<std::recursive_mutex> lk(pimpl->syncMutex_);
1111 BleProperties::GetInstance().DeregisterBleAdapterObserver(observer);
1112 return true;
1113 }
1114
GetPeerDeviceAddrType(const RawAddress & device) const1115 int BleAdapter::GetPeerDeviceAddrType(const RawAddress &device) const
1116 {
1117 LOG_DEBUG("[BleAdapter] %{public}s", __func__);
1118
1119 int type = BLE_ADDR_TYPE_UNKNOWN;
1120 if (pimpl->bleCentralManager_ != nullptr) {
1121 type = pimpl->bleCentralManager_->GetDeviceAddrType(device.GetAddress());
1122 }
1123 if (type == BLE_ADDR_TYPE_UNKNOWN) {
1124 std::lock_guard<std::recursive_mutex> lk(pimpl->peerDevlistMutex_);
1125 type = BLE_ADDR_TYPE_RANDOM;
1126 auto it = pimpl->peerConnDeviceList_.find(device.GetAddress());
1127 if (it != pimpl->peerConnDeviceList_.end()) {
1128 type = it->second.GetAddressType();
1129 }
1130 }
1131 return type;
1132 }
1133
ReadPeerDeviceInfoFromConf(const std::vector<std::string> & pairedAddrList) const1134 void BleAdapter::ReadPeerDeviceInfoFromConf(const std::vector<std::string> &pairedAddrList) const
1135 {
1136 LOG_DEBUG("[BleAdapter] %{public}s", __func__);
1137
1138 for (auto addr : pairedAddrList) {
1139 RawAddress rawAddr(addr);
1140 std::string invalidMacAddress(INVALID_MAC_ADDRESS);
1141 if ((!invalidMacAddress.compare(rawAddr.GetAddress())) || (rawAddr.GetAddress().empty())) {
1142 continue;
1143 }
1144 BlePeripheralDevice remote;
1145 remote.SetAddress(rawAddr);
1146 remote.SetAddressType(BleConfig::GetInstance().GetPeerAddressType(addr));
1147
1148 std::string name = BleConfig::GetInstance().GetPeerName(addr);
1149 remote.SetName(name);
1150
1151 int io = BleConfig::GetInstance().GetPeerDeviceIoCapability(addr);
1152 remote.SetIoCapability(io);
1153
1154 remote.SetPairedStatus(BLE_PAIR_PAIRED);
1155
1156 std::lock_guard<std::recursive_mutex> lk(pimpl->peerDevlistMutex_);
1157 pimpl->peerConnDeviceList_.insert(std::make_pair(addr, remote));
1158 }
1159 }
1160
SavePeerDeviceInfoToConf(const std::map<std::string,BlePeripheralDevice> & peerConnDeviceList) const1161 bool BleAdapter::SavePeerDeviceInfoToConf(const std::map<std::string, BlePeripheralDevice> &peerConnDeviceList) const
1162 {
1163 LOG_DEBUG("[BleAdapter] %{public}s", __func__);
1164
1165 std::lock_guard<std::recursive_mutex> lk(pimpl->syncMutex_);
1166 bool ret = false;
1167 for (auto it = peerConnDeviceList.begin(); it != peerConnDeviceList.end(); it++) {
1168 if (it->second.GetPairedStatus() != BLE_PAIR_PAIRED) {
1169 continue;
1170 }
1171 RawAddress rawAddr(it->second.GetRawAddress());
1172
1173 int addrType = it->second.GetAddressType();
1174 ret = BleConfig::GetInstance().SetPeerAddressType(rawAddr.GetAddress(), addrType);
1175
1176 ret &= BleConfig::GetInstance().SetPeerName(rawAddr.GetAddress(), it->second.GetName());
1177
1178 int deviceType = it->second.GetDeviceType();
1179 ret &= BleConfig::GetInstance().SetPeerDeviceType(rawAddr.GetAddress(), deviceType);
1180 }
1181
1182 BleConfig::GetInstance().Save();
1183 return ret;
1184 }
1185
ClearPeerDeviceInfo() const1186 void BleAdapter::ClearPeerDeviceInfo() const
1187 {
1188 LOG_DEBUG("[BleAdapter] %{public}s", __func__);
1189
1190 std::lock_guard<std::recursive_mutex> lk(pimpl->peerDevlistMutex_);
1191 pimpl->peerConnDeviceList_.clear();
1192 }
1193
ClearScanResultInfo() const1194 void BleAdapter::ClearScanResultInfo() const
1195 {
1196 LOG_DEBUG("[BleAdapter] %{public}s", __func__);
1197
1198 std::lock_guard<std::recursive_mutex> lk(pimpl->bleCenMutex_);
1199 if (pimpl->bleCentralManager_ != nullptr) {
1200 pimpl->bleCentralManager_->ClearResults();
1201 }
1202 }
1203
ClearScannerIdInfo() const1204 void BleAdapter::ClearScannerIdInfo() const
1205 {
1206 LOG_DEBUG("[BleAdapter] %{public}s", __func__);
1207
1208 std::lock_guard<std::recursive_mutex> lk(pimpl->bleCenMutex_);
1209 if (pimpl->bleCentralManager_ != nullptr) {
1210 pimpl->bleCentralManager_->ClearScannerIds();
1211 }
1212 }
1213
SavePeerDevices2BTM(const std::map<std::string,BlePeripheralDevice> & peerConnDeviceList) const1214 void BleAdapter::SavePeerDevices2BTM(const std::map<std::string, BlePeripheralDevice> &peerConnDeviceList) const
1215 {
1216 LOG_DEBUG("[BleAdapter] %{public}s", __func__);
1217
1218 std::lock_guard<std::recursive_mutex> lk(pimpl->syncMutex_);
1219 // Add pair device to BTM
1220 std::vector<BtmLePairedDevice> devices;
1221 for (auto it = peerConnDeviceList.begin(); it != peerConnDeviceList.end(); it++) {
1222 BtAddr btAddr;
1223 (void)memset_s(&btAddr, sizeof(btAddr), 0x00, sizeof(btAddr));
1224 RawAddress device(it->second.GetRawAddress());
1225 device.ConvertToUint8(btAddr.addr);
1226
1227 std::string invalidMacAddress(INVALID_MAC_ADDRESS);
1228 if ((invalidMacAddress.compare(device.GetAddress()) == 0) || (device.GetAddress().empty()) ||
1229 (BleConfig::GetInstance().GetPeerIrk(device.GetAddress()).empty()) ||
1230 (BleConfig::GetInstance().GetPeerIdentityAddr(device.GetAddress()).empty())) {
1231 continue;
1232 }
1233
1234 BtmLePairedDevice pairedDevice;
1235 (void)memset_s(&pairedDevice, sizeof(pairedDevice), 0x00, sizeof(pairedDevice));
1236 btAddr.type = it->second.GetAddressType();
1237 pairedDevice.addr = btAddr;
1238
1239 // Peer Identity Addr
1240 BtAddr peerAddr;
1241 (void)memset_s(&btAddr, sizeof(btAddr), 0x00, sizeof(btAddr));
1242 std::string addr = BleConfig::GetInstance().GetPeerIdentityAddr(device.GetAddress());
1243 RawAddress peerDevice(addr);
1244 peerAddr.type = BleConfig::GetInstance().GetPeerAddressType(device.GetAddress());
1245 peerDevice.ConvertToUint8(peerAddr.addr);
1246 pairedDevice.remoteIdentityAddress = peerAddr;
1247
1248 // IRK
1249 std::string irk = BleConfig::GetInstance().GetPeerIrk(device.GetAddress());
1250 if (!irk.empty()) {
1251 std::vector<uint8_t> vec;
1252 BleUtils::ConvertHexStringToInt(irk, vec);
1253 if (memcpy_s(pairedDevice.remoteIdentityResolvingKey.key, KEY_SIZE, &vec[0], vec.size()) != EOK) {
1254 LOG_ERROR("[BleAdapter] %{public}s:SavePeerDevices2BTM memcpy_s failed!", __func__);
1255 return;
1256 }
1257 }
1258 devices.push_back(pairedDevice);
1259 }
1260 if (!devices.empty()) {
1261 BTM_SetLePairedDevices(&devices[0], devices.size());
1262 devices.clear();
1263 }
1264 }
1265
RegisterCallbackToBtm()1266 int BleAdapter::RegisterCallbackToBtm()
1267 {
1268 LOG_DEBUG("[BleAdapter] %{public}s", __func__);
1269
1270 pimpl->btmAclCb_.leConnectionComplete = &BleAdapter::LeConnectionComplete;
1271 pimpl->btmAclCb_.leDisconnectionComplete = &BleAdapter::LeDisconnectionComplete;
1272 pimpl->btmAclCb_.readRssiComplete = &BleAdapter::OnReadRemoteRssiEvent;
1273
1274 int ret = BTM_RegisterAclCallbacks(&pimpl->btmAclCb_, this);
1275 if (ret != BT_SUCCESS) {
1276 LOG_ERROR("[BleAdapter] %{public}s:BTM_RegisterAclCallbacks failed!", __func__);
1277 }
1278 return ret;
1279 }
1280
DeregisterCallbackToBtm() const1281 int BleAdapter::DeregisterCallbackToBtm() const
1282 {
1283 LOG_DEBUG("[BleAdapter] %{public}s", __func__);
1284
1285 if (!pimpl->btmEnableFlag_) {
1286 return BT_OPERATION_FAILED;
1287 }
1288
1289 int ret = BTM_DeregisterAclCallbacks(&pimpl->btmAclCb_);
1290 if (ret != BT_SUCCESS) {
1291 LOG_ERROR("[BleAdapter] %{public}s:DeregisterCallbackToBtm failed!", __func__);
1292 }
1293 return ret;
1294 }
1295
LeConnectionComplete(uint8_t status,uint16_t connectionHandle,const BtAddr * addr,uint8_t role,void * context)1296 void BleAdapter::LeConnectionComplete(
1297 uint8_t status, uint16_t connectionHandle, const BtAddr *addr, uint8_t role, void *context)
1298 {
1299 HILOGI("status: %{public}u", status);
1300
1301 if (status != BT_SUCCESS) {
1302 HILOGI("status: %{public}u", status);
1303 return;
1304 }
1305
1306 auto *adapter = static_cast<BleAdapter *>(context);
1307 BtAddr address;
1308 (void)memcpy_s(&address, sizeof(BtAddr), addr, sizeof(BtAddr));
1309 adapter->GetDispatcher()->PostTask(
1310 std::bind(&BleAdapter::LeConnectionCompleteTask, adapter, status, connectionHandle, address, role));
1311 }
1312
LeConnectionCompleteTask(uint8_t status,uint16_t connectionHandle,const BtAddr & addr,uint8_t role) const1313 void BleAdapter::LeConnectionCompleteTask(
1314 uint8_t status, uint16_t connectionHandle, const BtAddr &addr, uint8_t role) const
1315 {
1316 LOG_DEBUG("[BleAdapter] %{public}s, handle is %{public}d", __func__, connectionHandle);
1317
1318 std::lock_guard<std::recursive_mutex> lk(pimpl->syncMutex_);
1319 std::unique_lock<std::recursive_mutex> bleAdvlk(pimpl->bleAdvMutex_);
1320 if ((pimpl->bleAdvertiser_ != nullptr) && (!BleFeature::GetInstance().IsLeExtendedAdvertisingSupported()) &&
1321 (role == LE_CONNECTION_ROLE_SLAVE)) {
1322 pimpl->bleAdvertiser_->ReStartLegacyAdvertising();
1323 }
1324 bleAdvlk.unlock();
1325
1326 RawAddress peerAddr = RawAddress::ConvertToString(addr.addr);
1327
1328 std::unique_lock<std::recursive_mutex> peerlk(pimpl->peerDevlistMutex_);
1329 auto it = pimpl->peerConnDeviceList_.find(peerAddr.GetAddress());
1330 if (it != pimpl->peerConnDeviceList_.end()) {
1331 it->second.SetConnectionHandle(connectionHandle);
1332 it->second.SetRoles(role);
1333 it->second.SetAddressType(addr.type);
1334 if (pimpl->bleCentralManager_ != nullptr) {
1335 it->second.SetName(pimpl->bleCentralManager_->GetDeviceName(peerAddr.GetAddress()));
1336 }
1337 it->second.SetAclConnectState(BLE_CONNECTION_STATE_CONNECTED);
1338
1339 if ((it->second.GetPairedStatus() == BLE_PAIR_PAIRED) && (pimpl->bleSecurity_ != nullptr)) {
1340 pimpl->bleSecurity_->GapLeRequestSecurity(connectionHandle, addr, role);
1341 }
1342 } else {
1343 BlePeripheralDevice peerDevice;
1344 peerDevice.SetAddress(peerAddr);
1345 peerDevice.SetAddressType(addr.type);
1346 if (pimpl->bleCentralManager_ != nullptr) {
1347 peerDevice.SetName(pimpl->bleCentralManager_->GetDeviceName(peerAddr.GetAddress()));
1348 }
1349 peerDevice.SetRoles(role);
1350 peerDevice.SetConnectionHandle(connectionHandle);
1351 peerDevice.SetAclConnectState(BLE_CONNECTION_STATE_CONNECTED);
1352 pimpl->peerConnDeviceList_.insert(std::make_pair(peerAddr.GetAddress(), peerDevice));
1353 }
1354 }
1355
LeDisconnectionComplete(uint8_t status,uint16_t connectionHandle,uint8_t reason,void * context)1356 void BleAdapter::LeDisconnectionComplete(uint8_t status, uint16_t connectionHandle, uint8_t reason, void *context)
1357 {
1358 LOG_DEBUG("[BleAdapter] %{public}s", __func__);
1359
1360 if (status != BT_SUCCESS) {
1361 LOG_DEBUG("[BleAdapter] %{public}s:%u", __func__, status);
1362 return;
1363 }
1364
1365 auto *adapter = static_cast<BleAdapter *>(context);
1366 adapter->GetDispatcher()->PostTask(
1367 std::bind(&BleAdapter::LeDisconnectionCompleteTask, adapter, status, connectionHandle, reason));
1368 }
1369
LeDisconnectionCompleteTask(uint8_t status,uint16_t connectionHandle,uint8_t reason) const1370 void BleAdapter::LeDisconnectionCompleteTask(uint8_t status, uint16_t connectionHandle, uint8_t reason) const
1371 {
1372 LOG_DEBUG("[BleAdapter] %{public}s, handle is %{public}d", __func__, connectionHandle);
1373
1374 std::lock_guard<std::recursive_mutex> lk(pimpl->peerDevlistMutex_);
1375 for (auto it = pimpl->peerConnDeviceList_.begin(); it != pimpl->peerConnDeviceList_.end(); it++) {
1376 if (connectionHandle == it->second.GetConnectionHandle()) {
1377 LOG_DEBUG("[BleAdapter] handle is %{public}d disconnect ", connectionHandle);
1378 it->second.SetAclConnectState(BLE_CONNECTION_STATE_DISCONNECTED);
1379 break;
1380 }
1381 }
1382 }
1383
LePairComplete(const RawAddress & device,const int status) const1384 void BleAdapter::LePairComplete(const RawAddress &device, const int status) const
1385 {
1386 LOG_DEBUG("[BleAdapter] %{public}s:result %{public}d.", __func__, status);
1387 std::lock_guard<std::recursive_mutex> lk(pimpl->syncMutex_);
1388 std::unique_lock<std::recursive_mutex> peerlk(pimpl->peerDevlistMutex_);
1389 auto it = pimpl->peerConnDeviceList_.find(device.GetAddress());
1390 if (it == pimpl->peerConnDeviceList_.end()) {
1391 HILOGI("addr %{public}s.", GetEncryptAddr(device.GetAddress()).c_str());
1392 return;
1393 }
1394 int pairState = BLE_PAIR_NONE;
1395 if (status == BT_SUCCESS) {
1396 it->second.SetPairedStatus(BLE_PAIR_PAIRED);
1397 /// Peer Identity Addr
1398 BtAddr btAddr;
1399 (void)memset_s(&btAddr, sizeof(btAddr), 0x00, sizeof(btAddr));
1400 device.ConvertToUint8(btAddr.addr);
1401 btAddr.type = it->second.GetAddressType();
1402 peerlk.unlock();
1403 RawAddress peerDevice(BleConfig::GetInstance().GetPeerIdentityAddr(device.GetAddress()));
1404 BtAddr peerAddr;
1405 (void)memset_s(&peerAddr, sizeof(peerAddr), 0x00, sizeof(peerAddr));
1406 peerAddr.type = BleConfig::GetInstance().GetPeerDeviceType(device.GetAddress());
1407 peerDevice.ConvertToUint8(peerAddr.addr);
1408 BtmLePairedDevice pairedDevice;
1409 (void)memset_s(&pairedDevice, sizeof(pairedDevice), 0x00, sizeof(pairedDevice));
1410 (void)memcpy_s(&pairedDevice.addr, sizeof(BtAddr), &btAddr, sizeof(BtAddr));
1411 (void)memcpy_s(&pairedDevice.remoteIdentityAddress, sizeof(BtAddr), &peerAddr, sizeof(BtAddr));
1412 /// IRK
1413 std::string irk = BleConfig::GetInstance().GetPeerIrk(device.GetAddress());
1414 if (!irk.empty()) {
1415 std::vector<uint8_t> vec;
1416 BleUtils::ConvertHexStringToInt(irk, vec);
1417 /// Add paired device to btm
1418 (void)memcpy_s(pairedDevice.remoteIdentityResolvingKey.key, KEY_SIZE, &vec[0], vec.size());
1419 }
1420 StartOrStopAdvAndScan(STOP_ADV_TYPE_RESOLVING_LIST, STOP_SCAN_TYPE_RESOLVING_LIST);
1421 BTM_AddLePairedDevice(&pairedDevice);
1422 StartOrStopAdvAndScan(STOP_ADV_TYPE_RESOLVING_LIST, STOP_SCAN_TYPE_RESOLVING_LIST, true);
1423 pairState = BLE_PAIR_PAIRED;
1424 } else {
1425 it->second.SetPairedStatus(BLE_PAIR_NONE);
1426 peerlk.unlock();
1427 }
1428 if (pimpl->blePeripheralCallback_ != nullptr) {
1429 pimpl->blePeripheralCallback_->ForEach([device, pairState](IBlePeripheralCallback &observer) {
1430 observer.OnPairStatusChanged(ADAPTER_BLE, device, pairState);
1431 });
1432 }
1433 }
1434
LePairingStatus(const RawAddress & device) const1435 void BleAdapter::LePairingStatus(const RawAddress &device) const
1436 {
1437 LOG_DEBUG("[BleAdapter] %{public}s", __func__);
1438
1439 std::lock_guard<std::recursive_mutex> lk(pimpl->syncMutex_);
1440 std::unique_lock<std::recursive_mutex> peerlk(pimpl->peerDevlistMutex_);
1441 auto it = pimpl->peerConnDeviceList_.find(device.GetAddress());
1442 if (it != pimpl->peerConnDeviceList_.end()) {
1443 it->second.SetPairedStatus(BLE_PAIR_PAIRING);
1444 } else {
1445 LOG_DEBUG("[BleAdapter] %{public}s", __func__);
1446 BlePeripheralDevice peerDevice;
1447 peerDevice.SetAddress(device);
1448 peerDevice.SetPairedStatus(BLE_PAIR_PAIRING);
1449 pimpl->peerConnDeviceList_.insert(std::make_pair(device.GetAddress(), peerDevice));
1450 }
1451 peerlk.unlock();
1452
1453 if (pimpl->blePeripheralCallback_ != nullptr) {
1454 pimpl->blePeripheralCallback_->ForEach([device](IBlePeripheralCallback &observer) {
1455 observer.OnPairStatusChanged(ADAPTER_BLE, device, BLE_PAIR_PAIRING);
1456 });
1457 }
1458 }
1459
EncryptionComplete(const RawAddress & device) const1460 void BleAdapter::EncryptionComplete(const RawAddress &device) const
1461 {
1462 LOG_DEBUG("[BleAdapter] %{public}s", __func__);
1463
1464 std::lock_guard<std::recursive_mutex> lk(pimpl->peerDevlistMutex_);
1465 auto it = pimpl->peerConnDeviceList_.find(device.GetAddress());
1466 if (it != pimpl->peerConnDeviceList_.end()) {
1467 it->second.SetAclConnectState(BLE_CONNECTION_STATE_ENCRYPTED_LE);
1468 }
1469 }
1470
OnReadRemoteRssiEvent(uint8_t status,const BtAddr * addr,int8_t rssi,void * context)1471 void BleAdapter::OnReadRemoteRssiEvent(uint8_t status, const BtAddr *addr, int8_t rssi, void *context)
1472 {
1473 LOG_DEBUG("[BleAdapter] %{public}s", __func__);
1474
1475 auto *adapter = static_cast<BleAdapter *>(context);
1476 BtAddr address;
1477 (void)memcpy_s(&address, sizeof(BtAddr), addr, sizeof(BtAddr));
1478 adapter->GetDispatcher()->PostTask(
1479 std::bind(&BleAdapter::OnReadRemoteRssiEventTask, adapter, status, address, rssi));
1480 }
1481
OnReadRemoteRssiEventTask(uint8_t status,const BtAddr & addr,int8_t rssi) const1482 void BleAdapter::OnReadRemoteRssiEventTask(uint8_t status, const BtAddr &addr, int8_t rssi) const
1483 {
1484 LOG_DEBUG("[BleAdapter] %{public}s", __func__);
1485
1486 RawAddress device = RawAddress::ConvertToString(addr.addr);
1487 if (pimpl->blePeripheralCallback_ != nullptr) {
1488 pimpl->blePeripheralCallback_->ForEach([device, rssi, status](IBlePeripheralCallback &observer) {
1489 observer.OnReadRemoteRssiEvent(device, rssi, status);
1490 });
1491 }
1492 }
1493
ReadRemoteRssiValue(const RawAddress & device) const1494 bool BleAdapter::ReadRemoteRssiValue(const RawAddress &device) const
1495 {
1496 LOG_DEBUG("[BleAdapter] %{public}s", __func__);
1497
1498 std::lock_guard<std::recursive_mutex> lk(pimpl->syncMutex_);
1499 BtAddr addr;
1500 (void)memset_s(&addr, sizeof(addr), 0x00, sizeof(addr));
1501 addr.type = GetPeerDeviceAddrType(device);
1502 device.ConvertToUint8(addr.addr);
1503 return (BTM_ReadRssi(&addr) == BT_SUCCESS);
1504 }
1505
GetDeviceType(const RawAddress & device) const1506 int BleAdapter::GetDeviceType(const RawAddress &device) const
1507 {
1508 LOG_DEBUG("[BleAdapter] %{public}s", __func__);
1509
1510 std::lock_guard<std::recursive_mutex> lk(pimpl->bleCenMutex_);
1511 if (pimpl->bleCentralManager_ != nullptr) {
1512 return pimpl->bleCentralManager_->GetDeviceType(device.GetAddress());
1513 }
1514 return BLE_BT_DEVICE_TYPE_UNKNOWN;
1515 }
1516
GetAdvertiserHandle() const1517 uint8_t BleAdapter::GetAdvertiserHandle() const
1518 {
1519 LOG_DEBUG("[BleAdapter] %{public}s", __func__);
1520
1521 std::lock_guard<std::recursive_mutex> lk(pimpl->bleAdvMutex_);
1522 if (pimpl->bleAdvertiser_ != nullptr) {
1523 return pimpl->bleAdvertiser_->CreateAdvertiserSetHandle();
1524 }
1525 return BLE_INVALID_ADVERTISING_HANDLE;
1526 }
1527
StartAdvertising(const BleAdvertiserSettingsImpl & settings,const BleAdvertiserDataImpl & advData,const BleAdvertiserDataImpl & scanResponse,uint8_t advHandle) const1528 void BleAdapter::StartAdvertising(const BleAdvertiserSettingsImpl &settings, const BleAdvertiserDataImpl &advData,
1529 const BleAdvertiserDataImpl &scanResponse, uint8_t advHandle) const
1530 {
1531 LOG_DEBUG("[BleAdapter] %{public}s", __func__);
1532
1533 std::lock_guard<std::recursive_mutex> lk(pimpl->bleAdvMutex_);
1534 if (pimpl->bleAdvertiser_ != nullptr) {
1535 pimpl->bleAdvertiser_->StartAdvertising(settings, advData, scanResponse, advHandle);
1536 }
1537 }
1538
StopAdvertising(uint8_t advHandle) const1539 void BleAdapter::StopAdvertising(uint8_t advHandle) const
1540 {
1541 LOG_DEBUG("[BleAdapter] %{public}s", __func__);
1542
1543 std::lock_guard<std::recursive_mutex> lk(pimpl->bleAdvMutex_);
1544 if (pimpl->bleAdvertiser_ != nullptr) {
1545 pimpl->bleAdvertiser_->StopAdvertising(advHandle);
1546 }
1547 }
1548
Close(uint8_t advHandle) const1549 void BleAdapter::Close(uint8_t advHandle) const
1550 {
1551 LOG_DEBUG("[BleAdapter] %{public}s", __func__);
1552
1553 std::lock_guard<std::recursive_mutex> lk(pimpl->bleAdvMutex_);
1554 if (pimpl->bleAdvertiser_ != nullptr) {
1555 pimpl->bleAdvertiser_->Close(advHandle);
1556 }
1557 }
1558
StartScan(const BleScanSettingsImpl & setting) const1559 void BleAdapter::StartScan(const BleScanSettingsImpl &setting) const
1560 {
1561 LOG_DEBUG("[BleAdapter] %{public}s", __func__);
1562
1563 std::lock_guard<std::recursive_mutex> lk(pimpl->bleCenMutex_);
1564 if (pimpl->bleCentralManager_ != nullptr) {
1565 pimpl->bleCentralManager_->StartScan(setting);
1566 }
1567 }
1568
StopScan() const1569 void BleAdapter::StopScan() const
1570 {
1571 LOG_DEBUG("[BleAdapter] %{public}s", __func__);
1572
1573 std::lock_guard<std::recursive_mutex> lk(pimpl->bleCenMutex_);
1574 if (pimpl->bleCentralManager_ != nullptr) {
1575 pimpl->bleCentralManager_->StopScan();
1576 }
1577 }
1578
ConfigScanFilter(int32_t scannerId,const std::vector<BleScanFilterImpl> & filters)1579 int BleAdapter::ConfigScanFilter(int32_t scannerId, const std::vector<BleScanFilterImpl> &filters)
1580 {
1581 LOG_DEBUG("[BleAdapter] %{public}s", __func__);
1582
1583 std::lock_guard<std::recursive_mutex> lk(pimpl->bleCenMutex_);
1584 if (pimpl->bleCentralManager_ != nullptr) {
1585 return pimpl->bleCentralManager_->ConfigScanFilter(scannerId, filters);
1586 }
1587 return 0;
1588 }
1589
RemoveScanFilter(int32_t scannerId)1590 void BleAdapter::RemoveScanFilter(int32_t scannerId)
1591 {
1592 LOG_DEBUG("[BleAdapter] %{public}s", __func__);
1593
1594 std::lock_guard<std::recursive_mutex> lk(pimpl->bleCenMutex_);
1595 if (pimpl->bleCentralManager_ != nullptr) {
1596 pimpl->bleCentralManager_->RemoveScanFilter(scannerId);
1597 }
1598 }
1599
AllocScannerId()1600 int32_t BleAdapter::AllocScannerId()
1601 {
1602 std::lock_guard<std::recursive_mutex> lk(pimpl->bleCenMutex_);
1603 if (pimpl->bleCentralManager_ == nullptr) {
1604 LOG_DEBUG("[BleAdapter] bleCentralManager is null.");
1605 return 0;
1606 }
1607 return pimpl->bleCentralManager_->AllocScannerId();
1608 }
1609
RemoveScannerId(int32_t scannerId)1610 void BleAdapter::RemoveScannerId(int32_t scannerId)
1611 {
1612 std::lock_guard<std::recursive_mutex> lk(pimpl->bleCenMutex_);
1613 if (pimpl->bleCentralManager_ == nullptr) {
1614 LOG_DEBUG("[BleAdapter] bleCentralManager is null.");
1615 return;
1616 }
1617 return pimpl->bleCentralManager_->RemoveScannerId(scannerId);
1618 }
1619
OnStartAdvertisingEvt() const1620 void BleAdapter::OnStartAdvertisingEvt() const
1621 {
1622 LOG_DEBUG("[BleAdapter] %{public}s", __func__);
1623
1624 if (pimpl->observer_ != nullptr) {
1625 int status = BLE_ADV_STATE_ADVERTISING;
1626 pimpl->observer_->ForEach(
1627 [status](IAdapterBleObserver &observer) { observer.OnAdvertisingStateChanged(status); });
1628 }
1629 }
1630
OnStopAdvertisingEvt() const1631 void BleAdapter::OnStopAdvertisingEvt() const
1632 {
1633 LOG_DEBUG("[BleAdapter] %{public}s", __func__);
1634
1635 if (pimpl->observer_ != nullptr) {
1636 int status = BLE_ADV_STATE_IDLE;
1637 pimpl->observer_->ForEach(
1638 [status](IAdapterBleObserver &observer) { observer.OnAdvertisingStateChanged(status); });
1639 }
1640 }
1641
GetAdvertisingStatus() const1642 int BleAdapter::GetAdvertisingStatus() const
1643 {
1644 LOG_DEBUG("[BleAdapter] %{public}s", __func__);
1645
1646 std::lock_guard<std::recursive_mutex> lk(pimpl->bleAdvMutex_);
1647 if (pimpl->bleAdvertiser_ != nullptr) {
1648 if (pimpl->bleAdvertiser_->GetAdvertisingStatus() == ADVERTISE_FAILED_ALREADY_STARTED) {
1649 return BLE_ADV_STATE_ADVERTISING;
1650 } else {
1651 return BLE_ADV_STATE_IDLE;
1652 }
1653 }
1654 return BLE_ADV_STATE_IDLE;
1655 }
1656
IsLlPrivacySupported() const1657 bool BleAdapter::IsLlPrivacySupported() const
1658 {
1659 LOG_DEBUG("[BleAdapter] %{public}s", __func__);
1660
1661 return BleFeature::GetInstance().IsPrivacySupported();
1662 }
1663
AddCharacteristicValue(uint8_t adtype,const std::string & data) const1664 void BleAdapter::AddCharacteristicValue(uint8_t adtype, const std::string &data) const
1665 {
1666 LOG_DEBUG("[BleAdapter] %{public}s", __func__);
1667
1668 std::lock_guard<std::recursive_mutex> lk(pimpl->bleAdvMutex_);
1669 if (pimpl->bleAdvertiser_ != nullptr) {
1670 pimpl->bleAdvertiser_->AddCharacteristicValue(adtype, data);
1671 }
1672 }
1673
SetBleRoles() const1674 int BleAdapter::SetBleRoles() const
1675 {
1676 int roles = BleProperties::GetInstance().GetBleRoles();
1677
1678 LOG_DEBUG("[BleAdapter] %{public}s:%{public}d", __func__, roles);
1679
1680 if (roles > (GAP_LE_ROLE_BROADCASTER | GAP_LE_ROLE_OBSERVER | GAP_LE_ROLE_PREIPHERAL | GAP_LE_ROLE_CENTRAL) ||
1681 roles < GAP_LE_ROLE_BROADCASTER) {
1682 LOG_ERROR("[BleAdapter] %{public}s:Roles is invalid.", __func__);
1683 roles = (GAP_LE_ROLE_BROADCASTER | GAP_LE_ROLE_OBSERVER | GAP_LE_ROLE_PREIPHERAL | GAP_LE_ROLE_CENTRAL);
1684 }
1685 return GAPIF_LeSetRole(roles);
1686 }
1687
1688 REGISTER_CLASS_CREATOR(BleAdapter);
1689 } // namespace bluetooth
1690 } // namespace OHOS
1691