• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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