• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2021-2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 #ifndef LOG_TAG
16 #define LOG_TAG "bt_c_adapter_gatt"
17 #endif
18 
19 #include "ohos_bt_gatt.h"
20 
21 #include <unistd.h>
22 #include <cstdint>
23 #include <sstream>
24 #include <vector>
25 #include "__config"
26 #include "bluetooth_ble_advertiser.h"
27 #include "bluetooth_ble_central_manager.h"
28 #include "bluetooth_log.h"
29 #include "bluetooth_remote_device.h"
30 #include "bluetooth_utils.h"
31 #include "cstdint"
32 #include "iosfwd"
33 #include "istream"
34 #include "new"
35 #include "ohos_bt_adapter_utils.h"
36 #include "ohos_bt_def.h"
37 #include "ostream"
38 #include "securec.h"
39 #include "streambuf"
40 #include "string"
41 #include "uuid.h"
42 #include "bluetooth_object_map.h"
43 #include "ohos_bt_gatt_utils.h"
44 #include "bluetooth_timer.h"
45 #include "ffrt.h"
46 #include <functional>
47 #include "ohos_bt_gap.h"
48 
49 
50 #ifdef __cplusplus
51 extern "C" {
52 #endif
53 
54 using namespace std;
55 
56 namespace OHOS {
57 namespace Bluetooth {
58 #define MAX_BLE_ADV_NUM 7
59 #define MAX_LEN 1000
60 
61 class BleCentralManagerCallbackWapper;
62 class BleAdvCallback;
63 
64 static BtGattCallbacks *g_AppCallback;
65 
66 static std::shared_ptr<BleAdvCallback> g_bleAdvCallbacks[MAX_BLE_ADV_NUM];
67 static std::shared_ptr<BleAdvertiser> g_BleAdvertiser = nullptr;
68 static mutex g_advMutex;
69 
70 constexpr int32_t MAX_BLE_SCAN_NUM = 5;
71 static BluetoothObjectMap<std::shared_ptr<BleCentralManager>, (MAX_BLE_SCAN_NUM + 1)> g_bleCentralManagerMap;
72 
73 static uint32_t g_advAddrTimerIds[MAX_BLE_ADV_NUM];
74 static mutex g_advTimerMutex;
75 // ffrt queue
76 static ffrt::queue startAdvQueue("startAdv_Queue");
77 
78 class BleCentralManagerCallbackWapper : public BleCentralManagerCallback {
79 public:
80     /**
81      * @brief Scan result callback.
82      *
83      * @param result Scan result.
84      * @since 6
85      */
OnScanCallback(const BleScanResult & result)86     void OnScanCallback(const BleScanResult &result) override
87     {
88         BtScanResultData scanResult;
89         if (result.IsConnectable()) {
90             scanResult.eventType = OHOS_BLE_EVT_LEGACY_CONNECTABLE;
91         } else {
92             scanResult.eventType = OHOS_BLE_EVT_LEGACY_NON_CONNECTABLE;
93         }
94         scanResult.dataStatus = OHOS_BLE_DATA_COMPLETE;
95         scanResult.addrType = OHOS_BLE_RANDOM_DEVICE_ADDRESS;
96         scanResult.primaryPhy = OHOS_BLE_SCAN_PHY_1M;
97         scanResult.secondaryPhy = OHOS_BLE_SCAN_PHY_1M;
98         scanResult.advSid = 1;
99         scanResult.txPower = 1;
100         scanResult.rssi = result.GetRssi();
101         scanResult.directAddrType = OHOS_BLE_RANDOM_DEVICE_ADDRESS;
102         GetAddrFromString(result.GetPeripheralDevice().GetDeviceAddr(), scanResult.addr.addr);
103         vector<uint8_t> vec = result.GetPayload();
104         scanResult.advData = vec.data();
105         scanResult.advLen = vec.size();
106 
107         std::string strs;
108         std::stringstream strStream;
109         for (int i = 0; i < scanResult.advLen; i++) {
110             char token[3] = {0}; // The length of token is 3.
111             (void)sprintf_s(token, sizeof(token), "%02X", scanResult.advData[i]);
112             strStream << token;
113         }
114         strStream >> strs;
115         string address = result.GetPeripheralDevice().GetDeviceAddr();
116         HILOGD("device: %{public}s, len: %{public}d, scan data: %{public}s",
117             GetEncryptAddr(address).c_str(), scanResult.advLen, strs.c_str());
118         if (appCallback != nullptr && appCallback->scanResultCb != nullptr) {
119             appCallback->scanResultCb(&scanResult);
120         } else {
121             HILOGW("call back is null.");
122         }
123     }
124 
125     /**
126      * @brief Scan result for found or lost callback type.
127      *
128      * @param result Scan result.
129      * @param callbackType callback Type.
130      * @since 12
131      */
OnFoundOrLostCallback(const BleScanResult & result,uint8_t callbackType)132     void OnFoundOrLostCallback(const BleScanResult &result, uint8_t callbackType) override {};
133 
134     /**
135      * @brief Batch scan results event callback.
136      *
137      * @param results Scan results.
138      * @since 6
139      */
OnBleBatchScanResultsEvent(const std::vector<BleScanResult> & results)140     void OnBleBatchScanResultsEvent(const std::vector<BleScanResult> &results) override {}
141 
142     /**
143      * @brief Start or Stop scan event callback.
144      *
145      * @param resultCode Scan result code.
146      * @param isStartScan true->start scan, false->stop scan.
147      * @since 6
148      */
OnStartOrStopScanEvent(int32_t resultCode,bool isStartScan)149     void OnStartOrStopScanEvent(int32_t resultCode, bool isStartScan) override
150     {
151         HILOGD("resultCode: %{public}d, isStartScan: %{public}d", resultCode, isStartScan);
152         if (appCallback != nullptr && appCallback->scanStateChangeCb != nullptr) {
153             appCallback->scanStateChangeCb(resultCode, isStartScan);
154         } else {
155             HILOGE("call back is null.");
156         }
157     }
158 
159     /**
160      * @brief Notify low power device msg callback.
161      *
162      * @param btUuid uuid.
163      * @param msgType notify msgType.
164      * @param value notify msg value.
165      * @since 6
166      */
OnNotifyMsgReportFromLpDevice(const UUID & btUuid,int msgType,const std::vector<uint8_t> & value)167     void OnNotifyMsgReportFromLpDevice(const UUID &btUuid, int msgType, const std::vector<uint8_t> &value) override
168     {
169         if (appCallback != nullptr && appCallback->lpDeviceInfoCb != nullptr) {
170             BtUuid retUuid;
171             string strUuid = btUuid.ToString();
172             retUuid.uuid = (char *)strUuid.c_str();
173             retUuid.uuidLen = strUuid.size();
174             appCallback->lpDeviceInfoCb(&retUuid, msgType, const_cast<uint8_t*>(value.data()), value.size());
175         }
176     }
177 
178 public:
179     BleScanCallbacks *appCallback = nullptr;
180 };
181 
182 class BleAdvCallback : public BleAdvertiseCallback {
183 public:
BleAdvCallback(int advId)184     explicit BleAdvCallback(int advId)
185     {
186         advId_ = advId;
187     }
188 
OnStartResultEvent(int32_t result,int32_t advHandle)189     void OnStartResultEvent(int32_t result, int32_t advHandle) override
190     {
191         HILOGD("advId: %{public}d, advHandle: %{public}d, ret: %{public}d", advId_, advHandle, result);
192         int ret = (result == 0) ? OHOS_BT_STATUS_SUCCESS : OHOS_BT_STATUS_FAIL;
193         advHandle_ = advHandle;
194         if (g_AppCallback != nullptr && g_AppCallback->advEnableCb != nullptr) {
195             g_AppCallback->advEnableCb(advId_, ret);
196         } else {
197             HILOGW("call back is null.");
198         }
199     }
200 
OnEnableResultEvent(int result,int advHandle)201     void OnEnableResultEvent(int result, int advHandle) override
202     {
203         HILOGI("advId:%{public}d, advHandle:%{public}d, ret:%{public}d", advId_, advHandle, result);
204         int ret = (result == 0) ? OHOS_BT_STATUS_SUCCESS : OHOS_BT_STATUS_FAIL;
205         if (g_AppCallback != nullptr && g_AppCallback->onEnableExCb != nullptr) {
206             g_AppCallback->onEnableExCb(advId_, ret);
207         }
208     }
209 
OnDisableResultEvent(int result,int advHandle)210     void OnDisableResultEvent(int result, int advHandle) override
211     {
212         HILOGI("advId:%{public}d, advHandle:%{public}d, ret:%{public}d", advId_, advHandle, result);
213         int ret = (result == 0) ? OHOS_BT_STATUS_SUCCESS : OHOS_BT_STATUS_FAIL;
214         if (g_AppCallback != nullptr && g_AppCallback->onDisableExCb != nullptr) {
215             g_AppCallback->onDisableExCb(advId_, ret);
216         }
217     }
218 
OnStopResultEvent(int result,int advHandle)219     void OnStopResultEvent(int result, int advHandle) override
220     {
221         HILOGD("advId: %{public}d, advHandle: %{public}d, ret: %{public}d", advId_, advHandle, result);
222         int ret = (result == 0) ? OHOS_BT_STATUS_SUCCESS : OHOS_BT_STATUS_FAIL;
223         advHandle_ = 0xFF; // restore invalid advHandle
224         if (g_AppCallback != nullptr && g_AppCallback->advDisableCb != nullptr) {
225             g_AppCallback->advDisableCb(advId_, ret);
226         } else {
227             HILOGW("call back is null.");
228         }
229         {
230             lock_guard<mutex> lock(g_advTimerMutex);
231             if (g_advAddrTimerIds[advId_] != 0) {
232                 BluetoothTimer::GetInstance()->UnRegister(g_advAddrTimerIds[advId_]);
233                 g_advAddrTimerIds[advId_] = 0;
234             } else {
235                 HILOGD("TimerId no registered, is 0.");
236             }
237         }
238         lock_guard<mutex> lock(g_advMutex);
239         g_bleAdvCallbacks[advId_] = nullptr;
240         int i = 0;
241         for (; i < MAX_BLE_ADV_NUM; i++) {
242             if (g_bleAdvCallbacks[i] != nullptr) {
243                 break;
244             }
245         }
246         if (i == MAX_BLE_ADV_NUM) {
247             g_BleAdvertiser = nullptr;
248         }
249     }
250 
OnSetAdvDataEvent(int result)251     void OnSetAdvDataEvent(int result) override
252     {
253         HILOGD("advId: %{public}d, ret: %{public}d", advId_, result);
254         int ret = (result == 0) ? OHOS_BT_STATUS_SUCCESS : OHOS_BT_STATUS_FAIL;
255         if (g_AppCallback != nullptr && g_AppCallback->advDataCb  != nullptr) {
256             g_AppCallback->advDataCb(advId_, ret);
257         }
258     }
259 
OnGetAdvHandleEvent(int result,int advHandle)260     void OnGetAdvHandleEvent(int result, int advHandle) override
261     {}
262 
OnChangeAdvResultEvent(int result,int advHandle)263     void OnChangeAdvResultEvent(int result, int advHandle) override
264     {
265         HILOGI("advId:%{public}d, advHandle:%{public}d, ret:%{public}d", advId_, advHandle, result);
266         int ret = (result == 0) ? OHOS_BT_STATUS_SUCCESS : OHOS_BT_STATUS_FAIL;
267         if (g_AppCallback != nullptr && g_AppCallback->advChangeCb != nullptr) {
268             g_AppCallback->advChangeCb(advId_, ret);
269         }
270     }
271 
GetAdvHandle()272     int GetAdvHandle()
273     {
274         return advHandle_;
275     }
276 
277 protected:
278     BleAdvertiserData *advData = nullptr;
279     BleAdvertiserData *advResponseData = nullptr;
280     BleAdvertiserSettings *advSetting = nullptr;
281 
282 private:
283     int advId_;
284     int32_t advHandle_ = 0xFF;
285 };
286 
287 /**
288  * @brief Initializes the Bluetooth protocol stack.
289  *
290  * @return Returns {@link OHOS_BT_STATUS_SUCCESS} if the Bluetooth protocol stack is initialized;
291  * returns an error code defined in {@link BtStatus} otherwise.
292  * @since 6
293  */
InitBtStack(void)294 int InitBtStack(void)
295 {
296     return OHOS_BT_STATUS_SUCCESS;
297 }
298 
299 /**
300  * @brief Enables the Bluetooth protocol stack.
301  *
302  * @return Returns {@link OHOS_BT_STATUS_SUCCESS} if the Bluetooth protocol stack is enabled;
303  * returns an error code defined in {@link BtStatus} otherwise.
304  * @since 6
305  */
EnableBtStack(void)306 int EnableBtStack(void)
307 {
308     return OHOS_BT_STATUS_SUCCESS;
309 }
310 
311 /**
312  * @brief Disables the Bluetooth protocol stack.
313  *
314  * @return Returns {@link OHOS_BT_STATUS_SUCCESS} if the Bluetooth protocol stack is disabled;
315  * returns an error code defined in {@link BtStatus} otherwise.
316  * @since 6
317  */
DisableBtStack(void)318 int DisableBtStack(void)
319 {
320     return OHOS_BT_STATUS_SUCCESS;
321 }
322 
323 /**
324  * @brief Sets the Bluetooth device name.
325  *
326  * @param name Indicates the pointer to the name to set.
327  * @param len Indicates the length of the name to set.
328  * @return Returns {@link OHOS_BT_STATUS_SUCCESS} if the Bluetooth device name is set;
329  * returns an error code defined in {@link BtStatus} otherwise.
330  * @since 6
331  */
SetDeviceName(const char * name,unsigned int len)332 int SetDeviceName(const char *name, unsigned int len)
333 {
334     return OHOS_BT_STATUS_UNSUPPORTED;
335 }
336 
ConvertDataToVec(uint8_t * data,unsigned int len)337 static vector<uint8_t> ConvertDataToVec(uint8_t *data, unsigned int len)
338 {
339     if (data == nullptr || len == 0 || len > MAX_LEN) {
340         return {};
341     }
342 
343     return vector<uint8_t>(data, data + len);
344 }
345 
346 /**
347  * @brief Sets advertising data.
348  *
349  * @param advId Indicates the advertisement ID, which is allocated by the upper layer of the advertiser.
350  * @param data Indicates the pointer to the advertising data. For details, see {@link StartAdvRawData}.
351  * @return Returns {@link OHOS_BT_STATUS_SUCCESS} if advertising data is set;
352  * returns an error code defined in {@link BtStatus} otherwise.
353  * @since 6
354  */
BleSetAdvData(int advId,const StartAdvRawData data)355 int BleSetAdvData(int advId, const StartAdvRawData data)
356 {
357     if (advId < 0 || advId >= MAX_BLE_ADV_NUM) {
358         HILOGE("Invalid advId (%{public}d)", advId);
359         return OHOS_BT_STATUS_PARM_INVALID;
360     }
361     lock_guard<mutex> lock(g_advMutex);
362     if (g_BleAdvertiser == nullptr || g_bleAdvCallbacks[advId] == nullptr) {
363         HILOGE("Adv is not started, need call 'BleStartAdvEx' first.");
364         return OHOS_BT_STATUS_FAIL;
365     }
366     HILOGD("advId: %{public}d, advLen: %{public}u, scanRspLen: %{public}u", advId, data.advDataLen, data.rspDataLen);
367 
368     auto advData = ConvertDataToVec(data.advData, data.advDataLen);
369     auto rspData = ConvertDataToVec(data.rspData, data.rspDataLen);
370     g_BleAdvertiser->SetAdvertisingData(advData, rspData, g_bleAdvCallbacks[advId]);
371     return OHOS_BT_STATUS_SUCCESS;
372 }
373 
374 /**
375  * @brief Starts advertising.
376  *
377  * @param advId Indicates the advertisement ID, which is allocated by the upper layer of the advertiser.
378  * @param param Indicates the pointer to the advertising parameters. For details, see {@link BleAdvParams}.
379  * @return Returns {@link OHOS_BT_STATUS_SUCCESS} if advertising is started;
380  * returns an error code defined in {@link BtStatus} otherwise.
381  * @since 6
382  */
BleStartAdv(int advId,const BleAdvParams * param)383 int BleStartAdv(int advId, const BleAdvParams *param)
384 {
385     return OHOS_BT_STATUS_UNSUPPORTED;
386 }
387 
388 /**
389  * @brief Stops advertising.
390  *
391  * @param advId Indicates the advertisement ID, which is allocated by the upper layer of the advertiser.
392  * @return Returns {@link OHOS_BT_STATUS_SUCCESS} if advertising is stopped;
393  * returns an error code defined in {@link BtStatus} otherwise.
394  * @since 6
395  */
BleStopAdv(int advId)396 int BleStopAdv(int advId)
397 {
398     HILOGD("BleStopAdv, advId: %{public}d.", advId);
399     if (advId < 0 || advId >= MAX_BLE_ADV_NUM) {
400         HILOGE("BleStopAdv fail, advId is invalid.");
401         return OHOS_BT_STATUS_FAIL;
402     }
403     lock_guard<mutex> lock(g_advMutex);
404     if (g_BleAdvertiser == nullptr || g_bleAdvCallbacks[advId] == nullptr) {
405         HILOGE("BleStopAdv fail, the current adv is not started.");
406         return OHOS_BT_STATUS_FAIL;
407     }
408     {
409         lock_guard<mutex> lock(g_advTimerMutex);
410         BluetoothTimer::GetInstance()->UnRegister(g_advAddrTimerIds[advId]);
411         g_advAddrTimerIds[advId] = 0;
412     }
413 
414     std::function stopAdvFunc = [advId]() {
415         HILOGD("stop adv in adv_Queue thread, advId = %{public}d", advId);
416         lock_guard<mutex> lock(g_advMutex);
417         int ret = g_BleAdvertiser->StopAdvertising(g_bleAdvCallbacks[advId]);
418         if (ret != BT_NO_ERROR) {
419             HILOGE("fail, advId: %{public}d, ret: %{public}d", advId, ret);
420         }
421     };
422     startAdvQueue.submit(stopAdvFunc);
423 
424     return OHOS_BT_STATUS_SUCCESS;
425 }
426 
427 /**
428  * @brief Updates advertising parameters.
429  *
430  * @param advId Indicates the advertisement ID, which is allocated by the upper layer of the advertiser.
431  * @param param Indicates the pointer to the advertising parameters. For details, see {@link BleAdvParams}.
432  * @return Returns {@link OHOS_BT_STATUS_SUCCESS} if advertising parameters are updated;
433  * returns an error code defined in {@link BtStatus} otherwise.
434  * @since 6
435  */
BleUpdateAdv(int advId,const BleAdvParams * param)436 int BleUpdateAdv(int advId, const BleAdvParams *param)
437 {
438     return OHOS_BT_STATUS_UNSUPPORTED;
439 }
440 
441 /**
442  * @brief Sets the secure I/O capability mode.
443  *
444  * @param mode Indicates the capability mode to set. For details, see {@link BleIoCapMode}.
445  * @return Returns {@link OHOS_BT_STATUS_SUCCESS} if the capability mode is set;
446  * returns an error code defined in {@link BtStatus} otherwise.
447  * @since 6
448  */
BleSetSecurityIoCap(BleIoCapMode mode)449 int BleSetSecurityIoCap(BleIoCapMode mode)
450 {
451     return OHOS_BT_STATUS_UNSUPPORTED;
452 }
453 
454 /**
455  * @brief Sets the authentication mode for secure connection requests.
456  *
457  * @param mode Indicates the authentication mode to set. For details, see {@link BleAuthReqMode}.
458  * @return Returns {@link OHOS_BT_STATUS_SUCCESS} if the authentication mode is set;
459  * returns an error code defined in {@link BtStatus} otherwise.
460  * @since 6
461  */
BleSetSecurityAuthReq(BleAuthReqMode mode)462 int BleSetSecurityAuthReq(BleAuthReqMode mode)
463 {
464     return OHOS_BT_STATUS_UNSUPPORTED;
465 }
466 
467 /**
468  * @brief Responds to a secure connection request.
469  *
470  * @param bdAddr Indicates the address of the device that sends the request.
471  * @param accept Specifies whether to accept the request. The value <b>true</b> means to accept the request,
472  * and <b>false</b> means to reject the request.
473  * @return Returns {@link OHOS_BT_STATUS_SUCCESS} if the request is responded to;
474  * returns an error code defined in {@link BtStatus} otherwise.
475  * @since 6
476  */
BleGattSecurityRsp(BdAddr bdAddr,bool accept)477 int BleGattSecurityRsp(BdAddr bdAddr, bool accept)
478 {
479     return OHOS_BT_STATUS_UNSUPPORTED;
480 }
481 
482 /**
483  * @brief Obtains the device MAC address.
484  *
485  * @param mac Indicates the pointer to the device MAC address.
486  * @param len Indicates the length of the device MAC address.
487  * @return Returns {@link OHOS_BT_STATUS_SUCCESS} if the device MAC address is obtained;
488  * returns an error code defined in {@link BtStatus} otherwise.
489  * @since 6
490  */
ReadBtMacAddr(unsigned char * mac,unsigned int len)491 int ReadBtMacAddr(unsigned char *mac, unsigned int len)
492 {
493     return OHOS_BT_STATUS_UNSUPPORTED;
494 }
495 
496 /**
497  * @brief Sets scan parameters.
498  *
499  * @param clientId Indicates the client ID, which is obtained during client registration.
500  * @param param Indicates the pointer to the scan parameters. For details, see {@link BleScanParams}.
501  * @return Returns {@link OHOS_BT_STATUS_SUCCESS} if the scan parameters are set;
502  * returns an error code defined in {@link BtStatus} otherwise.
503  * @since 6
504  */
BleSetScanParameters(int clientId,BleScanParams * param)505 int BleSetScanParameters(int clientId, BleScanParams *param)
506 {
507     return OHOS_BT_STATUS_SUCCESS;
508 }
509 
510 /**
511  * @brief Starts a scan.
512  *
513  * @return Returns {@link OHOS_BT_STATUS_SUCCESS} if the scan is started;
514  * returns an error code defined in {@link BtStatus} otherwise.
515  * @since 6
516  */
BleStartScan(void)517 int BleStartScan(void)
518 {
519     HILOGE("This interface is deprecated. BleStartScanEx is recommended.");
520     return OHOS_BT_STATUS_UNSUPPORTED;
521 }
522 
523 /**
524  * @brief Stops a scan.
525  *
526  * @param scannerId Indicates the scanner id.
527  * @return Returns {@link OHOS_BT_STATUS_SUCCESS} if the scan is stopped;
528  * returns an error code defined in {@link BtStatus} otherwise.
529  * @since 6
530  */
BleStopScan(int32_t scannerId)531 int BleStopScan(int32_t scannerId)
532 {
533     HILOGD("BleStopScan enter scannerId: %{public}d", scannerId);
534     std::shared_ptr<BleCentralManager> bleCentralManager = g_bleCentralManagerMap.GetObject(scannerId);
535     if (bleCentralManager == nullptr) {
536         HILOGE("BleStopScan fail, scannerId is invalid.");
537         return OHOS_BT_STATUS_FAIL;
538     }
539 
540     bleCentralManager->StopScan();
541     return OHOS_BT_STATUS_SUCCESS;
542 }
543 
544 /**
545  * @brief Registers GATT callbacks.
546  * explain: This function does not support dynamic registration;
547  * @param func Indicates the pointer to the callbacks to register. For details, see {@link BtGattCallbacks}.
548  * @return Returns {@link OHOS_BT_STATUS_SUCCESS} if the GATT callbacks are registered;
549  * returns an error code defined in {@link BtStatus} otherwise.
550  * @since 6
551  */
BleGattRegisterCallbacks(BtGattCallbacks * func)552 int BleGattRegisterCallbacks(BtGattCallbacks *func)
553 {
554     HILOGI("BleGattRegisterCallbacks enter");
555     if (func == nullptr) {
556         HILOGE("func is null.");
557         return OHOS_BT_STATUS_PARM_INVALID;
558     }
559     g_AppCallback = func;
560     return OHOS_BT_STATUS_SUCCESS;
561 }
562 
563 /**
564  * @brief Register ble scan callbacks.
565  *
566  * @param func Indicates the pointer to the callbacks to register. For details, see {@link BleScanCallbacks}.
567  * @param scannerId Indicates the pointer to the scannerId, identify one scan.
568  * @return Returns {@link OHOS_BT_STATUS_SUCCESS} if the BLE callbacks are registered;
569  * returns an error code defined in {@link BtStatus} otherwise.
570  * @since 6
571  */
BleRegisterScanCallbacks(BleScanCallbacks * func,int32_t * scannerId)572 int BleRegisterScanCallbacks(BleScanCallbacks *func, int32_t *scannerId)
573 {
574     HILOGI("BleRegisterScanCallbacks enter");
575     if (scannerId == nullptr || func == nullptr) {
576         HILOGE("BleRegisterScanCallbacks scannerId or func is null");
577         return OHOS_BT_STATUS_PARM_INVALID;
578     }
579 
580     std::shared_ptr<BleCentralManagerCallbackWapper> callback = std::make_shared<BleCentralManagerCallbackWapper>();
581     callback->appCallback = func;
582     std::shared_ptr<BleCentralManager> bleCentralManager = std::make_shared<BleCentralManager>(callback);
583     int id = g_bleCentralManagerMap.AddLimitedObject(bleCentralManager);
584     if (id == -1) {
585         HILOGE("BleRegisterScanCallbacks fail.");
586         return OHOS_BT_STATUS_FAIL;
587     }
588     *scannerId = id;
589     HILOGI("BleRegisterScanCallbacks success scannerId: %{public}d", *scannerId);
590     return OHOS_BT_STATUS_SUCCESS;
591 }
592 
593 /**
594  * @brief Deregister ble scan callbacks.
595  *
596  * @param scannerId Indicates the scanner id.
597  * @return Returns {@link OHOS_BT_STATUS_SUCCESS} if the BLE callbacks are deregistered;
598  * returns an error code defined in {@link BtStatus} otherwise.
599  * @since 6
600  */
BleDeregisterScanCallbacks(int32_t scannerId)601 int BleDeregisterScanCallbacks(int32_t scannerId)
602 {
603     HILOGI("BleDeregisterScanCallbacks enter. scannerId: %{public}d", scannerId);
604     if (g_bleCentralManagerMap.GetObject(scannerId) == nullptr) {
605         HILOGE("BleDeregisterScanCallbacks fail, scannerId is invalid.");
606         return OHOS_BT_STATUS_FAIL;
607     }
608     g_bleCentralManagerMap.RemoveObject(scannerId);
609     return OHOS_BT_STATUS_SUCCESS;
610 }
611 
612 /*
613  * RPA: The two highest bits of the broadcast address are 01, and address type is random.
614  */
IsRpa(const AdvOwnAddrParams * ownAddrParams)615 static bool IsRpa(const AdvOwnAddrParams *ownAddrParams)
616 {
617     if (ownAddrParams != nullptr && ((ownAddrParams->addr[0] & 0xC0) ^ 0x40) == 0 &&
618         ownAddrParams->addrType == BLE_ADDR_RANDOM) {
619             return true;
620         }
621     return false;
622 }
623 
624 /**
625  * @brief Sets own address, own address type, advertising data and parameters, and then starts advertising.
626  *
627  * This function is available for softbus only.
628  *
629  * @param advId Indicates the pointer to the advertisement ID.
630  * @param rawData Indicates the advertising data. For details, see {@link StartAdvRawData}.
631  * @param advParam Indicates the advertising parameters. For details, see {@link BleAdvParams}.
632  * @param ownAddrParams Indicates the own address(little endian) and own address type.
633  * For details, see {@link AdvOwnAddrParams}.
634  * @return Returns {@link OHOS_BT_STATUS_SUCCESS} if the operation is successful;
635  * returns an error code defined in {@link BtStatus} otherwise.
636  * @since 6
637  */
BleStartAdvWithAddr(int * advId,const StartAdvRawData * rawData,const BleAdvParams * advParam,const AdvOwnAddrParams * ownAddrParams)638 int BleStartAdvWithAddr(int *advId, const StartAdvRawData *rawData, const BleAdvParams *advParam,
639     const AdvOwnAddrParams *ownAddrParams)
640 {
641     HILOGD("BleStartAdvWithAddr enter");
642     CHECK_AND_RETURN_LOG_RET((advId != nullptr && rawData != nullptr && advParam != nullptr && IsRpa(ownAddrParams)),
643         OHOS_BT_STATUS_PARM_INVALID, "params are invalid");
644     if (!IsBleEnabled()) {
645         HILOGE("bluetooth is off.");
646         *advId = -1;
647         return OHOS_BT_STATUS_NOT_READY;
648     }
649     lock_guard<mutex> lock(g_advMutex);
650     int i = CheckAndAllocateAdvHandle();
651     CHECK_AND_RETURN_LOG_RET(i != MAX_BLE_ADV_NUM, OHOS_BT_STATUS_UNHANDLED, "reach the max num of adv");
652     *advId = i;
653 
654     if (!StartAdvAddrTimer(i, ownAddrParams)) {
655         HILOGE("Duplicate addresses after 15 minutes are not allowed to be broadcast");
656         g_bleAdvCallbacks[i] = nullptr;
657         *advId = -1;
658         return OHOS_BT_STATUS_DUPLICATED_ADDR;
659     }
660 
661     BleAdvertiserSettings settings;
662     settings.SetInterval(advParam->minInterval);
663     settings.SetTxPower(advParam->txPower);
664     if (advParam->advType == OHOS_BLE_ADV_SCAN_IND || advParam->advType == OHOS_BLE_ADV_NONCONN_IND) {
665         settings.SetConnectable(false);
666     }
667     std::array<uint8_t, OHOS_BD_ADDR_LEN> addr;
668     std::copy(std::begin(ownAddrParams->addr), std::end(ownAddrParams->addr), std::begin(addr));
669     settings.SetOwnAddr(addr);
670     settings.SetOwnAddrType(ownAddrParams->addrType);
671 
672     auto advData = ConvertDataToVec(rawData->advData, rawData->advDataLen);
673     auto scanResponse = ConvertDataToVec(rawData->rspData, rawData->rspDataLen);
674     if (g_BleAdvertiser == nullptr) {
675         g_BleAdvertiser = BleAdvertiser::CreateInstance();
676     }
677 
678     std::function startAdvFunc = [i, advData, scanResponse, settings]() {
679         HILOGI("start adv in startAdv_Queue thread, handle = %{public}d", i);
680         lock_guard<mutex> lock(g_advMutex);
681         int ret = g_BleAdvertiser->StartAdvertising(settings, advData, scanResponse, 0, g_bleAdvCallbacks[i]);
682         if (ret != BT_NO_ERROR) {
683             HILOGE("fail, ret: %{public}d", ret);
684             //StartAdvertise fail, return default handle -1 to softbus
685             g_bleAdvCallbacks[i] = nullptr;
686             {
687                 lock_guard<mutex> lock(g_advTimerMutex);
688                 BluetoothTimer::GetInstance()->UnRegister(g_advAddrTimerIds[i]);
689                 g_advAddrTimerIds[i] = 0;
690             }
691         }
692     };
693     startAdvQueue.submit(startAdvFunc);
694     HILOGI("ret advId: %{public}d.", *advId);
695     return OHOS_BT_STATUS_SUCCESS;
696 }
697 
698 /**
699  * @brief Sets advertising data and parameters and starts advertising.
700  *
701  * This function is available for system applications only. \n
702  *
703  * @param advId Indicates the pointer to the advertisement ID.
704  * @param rawData Indicates the advertising data. For details, see {@link StartAdvRawData}.
705  * @param advParam Indicates the advertising parameters. For details, see {@link BleAdvParams}.
706  * @return Returns {@link OHOS_BT_STATUS_SUCCESS} if the operation is successful;
707  * returns an error code defined in {@link BtStatus} otherwise.
708  * @since 6
709  */
BleStartAdvEx(int * advId,const StartAdvRawData rawData,BleAdvParams advParam)710 int BleStartAdvEx(int *advId, const StartAdvRawData rawData, BleAdvParams advParam)
711 {
712     HILOGD("BleStartAdvEx enter");
713     if (!IsBleEnabled()) {
714         HILOGE("bluetooth is off.");
715         *advId = -1;
716         return OHOS_BT_STATUS_NOT_READY;
717     }
718 
719     lock_guard<mutex> lock(g_advMutex);
720     if (g_BleAdvertiser == nullptr) {
721         g_BleAdvertiser = BleAdvertiser::CreateInstance();
722     }
723     int i = CheckAndAllocateAdvHandle();
724     CHECK_AND_RETURN_LOG_RET(i != MAX_BLE_ADV_NUM, OHOS_BT_STATUS_UNHANDLED, "reach the max num of adv");
725     *advId = i;
726     BleAdvertiserSettings settings;
727     settings.SetInterval(advParam.minInterval);
728     if (advParam.advType == OHOS_BLE_ADV_SCAN_IND || advParam.advType == OHOS_BLE_ADV_NONCONN_IND) {
729         settings.SetConnectable(false);
730     }
731     auto advData = ConvertDataToVec(rawData.advData, rawData.advDataLen);
732     auto scanResponse = ConvertDataToVec(rawData.rspData, rawData.rspDataLen);
733 
734     std::function startAdvFunc = [i, advData, scanResponse, settings]() {
735         HILOGI("start adv in startAdv_Queue thread, handle = %{public}d", i);
736         lock_guard<mutex> lock(g_advMutex);
737         int ret = g_BleAdvertiser->StartAdvertising(settings, advData, scanResponse, 0, g_bleAdvCallbacks[i]);
738         if (ret != BT_NO_ERROR) {
739             HILOGE("fail, ret: %{public}d", ret);
740             //StartAdvertise fail, return default handle -1 to softbus
741             g_bleAdvCallbacks[i] = nullptr;
742         }
743     };
744     startAdvQueue.submit(startAdvFunc);
745     HILOGI("ret advId: %{public}d.", *advId);
746     return OHOS_BT_STATUS_SUCCESS;
747 }
748 
749 /**
750  * @brief Enable advertising.
751  *
752  * This function is available for system applications only. \n
753  *
754  * @param advId Indicates the pointer to the advertisement ID.
755  * @return Returns {@link OHOS_BT_STATUS_SUCCESS} if the operation is successful;
756  * returns an error code defined in {@link BtStatus} otherwise.
757  * @since 11
758  */
BleEnableAdvEx(int advId)759 int BleEnableAdvEx(int advId)
760 {
761     HILOGI("BleEnableAdv, advId: %{public}d.", advId);
762     if (advId < 0 || advId >= MAX_BLE_ADV_NUM) {
763         HILOGE("BleEnableAdv fail, advId is invalid.");
764         return OHOS_BT_STATUS_FAIL;
765     }
766     lock_guard<mutex> lock(g_advMutex);
767     if (g_BleAdvertiser == nullptr || g_bleAdvCallbacks[advId] == nullptr) {
768         HILOGE("BleEnableAdv fail, the current adv is not started.");
769         return OHOS_BT_STATUS_FAIL;
770     }
771 
772     int ret = g_BleAdvertiser->EnableAdvertising(g_bleAdvCallbacks[advId]->GetAdvHandle(), 0,
773         g_bleAdvCallbacks[advId]);
774     if (ret != BT_NO_ERROR) {
775         HILOGE("fail, advId: %{public}d, ret: %{public}d", advId, ret);
776         return OHOS_BT_STATUS_FAIL;
777     }
778     return OHOS_BT_STATUS_SUCCESS;
779 }
780 
781 /**
782  * @brief Disable advertising.
783  *
784  * This function is available for system applications only. \n
785  *
786  * @param advId Indicates the pointer to the advertisement ID.
787  * @return Returns {@link OHOS_BT_STATUS_SUCCESS} if the operation is successful;
788  * returns an error code defined in {@link BtStatus} otherwise.
789  * @since 11
790  */
BleDisableAdvEx(int advId)791 int BleDisableAdvEx(int advId)
792 {
793     HILOGI("BleDisableAdv, advId: %{public}d.", advId);
794     if (advId < 0 || advId >= MAX_BLE_ADV_NUM) {
795         HILOGE("BleDisableAdv fail, advId is invalid.");
796         return OHOS_BT_STATUS_FAIL;
797     }
798     lock_guard<mutex> lock(g_advMutex);
799     if (g_BleAdvertiser == nullptr || g_bleAdvCallbacks[advId] == nullptr) {
800         HILOGE("BleDisableAdv fail, the current adv is not started.");
801         return OHOS_BT_STATUS_FAIL;
802     }
803 
804     int ret = g_BleAdvertiser->DisableAdvertising(g_bleAdvCallbacks[advId]->GetAdvHandle(), g_bleAdvCallbacks[advId]);
805     if (ret != BT_NO_ERROR) {
806         HILOGE("fail, advId: %{public}d, ret: %{public}d", advId, ret);
807         return OHOS_BT_STATUS_FAIL;
808     }
809     return OHOS_BT_STATUS_SUCCESS;
810 }
811 
SetServiceUuidParameter(BleScanFilter & scanFilter,BleScanNativeFilter * nativeScanFilter)812 static bool SetServiceUuidParameter(BleScanFilter &scanFilter, BleScanNativeFilter *nativeScanFilter)
813 {
814     HILOGD("SetServiceUuidParameter enter");
815     if (nativeScanFilter->serviceUuidLength != 0 && nativeScanFilter->serviceUuid != nullptr) {
816         if (!IsValidUuid(std::string(reinterpret_cast<char *>(nativeScanFilter->serviceUuid)))) {
817             HILOGE("match the UUID faild.");
818             return false;
819         }
820         UUID serviceUuid = UUID::FromString((char *)nativeScanFilter->serviceUuid);
821         scanFilter.SetServiceUuid(serviceUuid);
822         if (nativeScanFilter->serviceUuidMask != nullptr) {
823             if (!IsValidUuid(std::string(reinterpret_cast<char *>(nativeScanFilter->serviceUuidMask)))) {
824                 HILOGE("match the UUID faild.");
825                 return false;
826             }
827             UUID serviceUuidMask = UUID::FromString((char *)nativeScanFilter->serviceUuidMask);
828             scanFilter.SetServiceUuidMask(serviceUuidMask);
829         }
830     }
831     return true;
832 }
833 
834 /**
835  * @brief Sets one scan filter config.
836  *
837  * @param scanFilter Indicates the framework object of scan filter, see {@link BleScanFilter}.
838  * @param nativeScanFilter Indicates the pointer to the scan filter. For details, see {@link BleScanNativeFilter}.
839  * @return Returns {@link OHOS_BT_STATUS_SUCCESS} if set onr scan filter config success;
840  * returns an error code defined in {@link BtStatus} otherwise.
841  * @since 6
842  */
SetOneScanFilter(BleScanFilter & scanFilter,BleScanNativeFilter * nativeScanFilter)843 static int SetOneScanFilter(BleScanFilter &scanFilter, BleScanNativeFilter *nativeScanFilter)
844 {
845     HILOGD("SetOneScanFilter enter");
846     if (nativeScanFilter->address != nullptr) {
847         scanFilter.SetDeviceId(nativeScanFilter->address);
848     }
849     if (nativeScanFilter->deviceName != nullptr) {
850         scanFilter.SetName(nativeScanFilter->deviceName);
851     }
852     bool isSuccess = SetServiceUuidParameter(scanFilter, nativeScanFilter);
853     if (!isSuccess) {
854         HILOGE("SetServiceUuidParameter faild.");
855         return OHOS_BT_STATUS_PARM_INVALID;
856     }
857 
858     if (nativeScanFilter->serviceData != nullptr) {
859         std::vector<uint8_t> serviceData;
860         for (unsigned int i = 0; i < nativeScanFilter->serviceDataLength; i++) {
861             serviceData.push_back(nativeScanFilter->serviceData[i]);
862         }
863         scanFilter.SetServiceData(serviceData);
864 
865         if (nativeScanFilter->serviceDataMask != nullptr) {
866             std::vector<uint8_t> serviceDataMask;
867             for (unsigned int i = 0; i < nativeScanFilter->serviceDataLength; i++) {
868                 serviceDataMask.push_back(nativeScanFilter->serviceDataMask[i]);
869             }
870             scanFilter.SetServiceDataMask(serviceDataMask);
871         }
872     }
873 
874     if (nativeScanFilter->manufactureData != nullptr) {
875         std::vector<uint8_t> manufactureData;
876         for (unsigned int i = 0; i < nativeScanFilter->manufactureDataLength; i++) {
877             manufactureData.push_back(nativeScanFilter->manufactureData[i]);
878         }
879         scanFilter.SetManufactureData(manufactureData);
880 
881         if (nativeScanFilter->manufactureDataMask != nullptr) {
882             std::vector<uint8_t> manufactureDataMask;
883             for (unsigned int i = 0; i < nativeScanFilter->manufactureDataLength; i++) {
884                 manufactureDataMask.push_back(nativeScanFilter->manufactureDataMask[i]);
885             }
886             scanFilter.SetManufactureDataMask(manufactureDataMask);
887         }
888 
889         if (nativeScanFilter->manufactureId != 0) {
890             scanFilter.SetManufacturerId(nativeScanFilter->manufactureId);
891         }
892     }
893     scanFilter.SetAdvIndReportFlag(nativeScanFilter->advIndReport);
894     scanFilter.SetFilterIndex(nativeScanFilter->filterIndex);
895     return OHOS_BT_STATUS_SUCCESS;
896 }
897 
898 /**
899  * @brief Sets scan filter configs.
900  *
901  * @param scannerId Indicates the scanner id.
902  * @param filter Indicates the pointer to the scan filter. For details, see {@link BleScanNativeFilter}.
903  * @param filterSize Indicates the number of the scan filter.
904  * @param outScanFilters expected scan filters.
905  * @return Returns {@link OHOS_BT_STATUS_SUCCESS} if set scan filter configs success;
906  * returns an error code defined in {@link BtStatus} otherwise.
907  * @since 6
908  */
SetConfigScanFilter(int32_t scannerId,const BleScanNativeFilter * filter,uint32_t filterSize,vector<BleScanFilter> & outScanFilters)909 static int SetConfigScanFilter(int32_t scannerId, const BleScanNativeFilter *filter, uint32_t filterSize,
910     vector<BleScanFilter> &outScanFilters)
911 {
912     HILOGD("SetConfigScanFilter enter");
913     for (uint32_t i = 0; i < filterSize; i++) {
914         BleScanNativeFilter nativeScanFilter = filter[i];
915         BleScanFilter scanFilter;
916         int result = SetOneScanFilter(scanFilter, &nativeScanFilter);
917         if (result != OHOS_BT_STATUS_SUCCESS) {
918             HILOGE("SetOneScanFilter faild, result: %{public}d", result);
919             return OHOS_BT_STATUS_PARM_INVALID;
920         }
921         outScanFilters.push_back(scanFilter);
922     }
923     return OHOS_BT_STATUS_SUCCESS;
924 }
925 
926 /**
927  * @brief Starts a scan with BleScanConfigs.
928  * If don't need ble scan filter, set BleScanNativeFilter to NULL or filterSize to zero.
929  * If one of the ble scan filtering rules is not required, set it to NULL.
930  * For example, set the address to NULL when you don't need it.
931  * Don't support only using manufactureId as filter conditions, need to use it with manufactureData.
932  * The manufactureId need to be set a related number when you need a filtering condition of manufactureData.
933  *
934  * @param scannerId Indicates the scanner id.
935  * @param configs Indicates the pointer to the scan filter. For details, see {@link BleScanConfigs}.
936  * @param filter Indicates the pointer to the scan filter. For details, see {@link BleScanNativeFilter}.
937  * @param filterSize Indicates the number of the scan filter.
938  * @return Returns {@link OHOS_BT_STATUS_SUCCESS} if the scan is started;
939  * returns an error code defined in {@link BtStatus} otherwise.
940  * @since 6
941  */
BleStartScanEx(int32_t scannerId,const BleScanConfigs * configs,const BleScanNativeFilter * filter,uint32_t filterSize)942 int BleStartScanEx(int32_t scannerId, const BleScanConfigs *configs, const BleScanNativeFilter *filter,
943     uint32_t filterSize)
944 {
945     if (configs == nullptr) {
946         HILOGE("BleStartScanEx fail, configs is null.");
947         return OHOS_BT_STATUS_FAIL;
948     }
949     HILOGD("BleStartScanEx enter, scannerId: %{public}d, filterSize %{public}u, scanMode: %{public}d",
950         scannerId, filterSize, configs->scanMode);
951     std::shared_ptr<BleCentralManager> bleCentralManager = g_bleCentralManagerMap.GetObject(scannerId);
952     if (bleCentralManager == nullptr) {
953         HILOGE("BleStartScanEx fail, scannerId is invalid.");
954         return OHOS_BT_STATUS_FAIL;
955     }
956 
957     vector<BleScanFilter> scanFilters;
958     if (filter != nullptr && filterSize != 0) {
959         int result = SetConfigScanFilter(scannerId, filter, filterSize, scanFilters);
960         if (result != OHOS_BT_STATUS_SUCCESS) {
961             HILOGE("SetConfigScanFilter faild, result: %{public}d", result);
962             return OHOS_BT_STATUS_PARM_INVALID;
963         }
964     }
965 
966     BleScanSettings settings;
967     settings.SetScanMode(configs->scanMode);
968     return bleCentralManager->StartScan(settings, scanFilters);
969 }
970 
971 /**
972  * @brief Get BleCentralManager object.
973  * get one from existing objects, if not exist, create one.
974  * used to operate by BleCentralManager object, but not related to one scan.
975  *
976  * @param bleCentralManager the pointer of BleCentralManager.
977  * @since 6
978 */
GetBleCentralManagerObject(std::shared_ptr<BleCentralManager> & bleCentralManager)979 void GetBleCentralManagerObject(std::shared_ptr<BleCentralManager> &bleCentralManager)
980 {
981     bleCentralManager = g_bleCentralManagerMap.GetObject();
982     if (bleCentralManager == nullptr) {
983         HILOGI("no exist BleCentralManager");
984         std::shared_ptr<BleCentralManagerCallbackWapper> callback = std::make_shared<BleCentralManagerCallbackWapper>();
985         bleCentralManager = std::make_shared<BleCentralManager>(callback);
986     }
987 }
988 
989 /**
990  * @brief set low power device adv param.
991  *
992  * @param duration advertise duration.
993  * @param maxExtAdvEvents maximum number of extended advertising events.
994  * @param window work window.
995  * @param interval work interval.
996  * @param advHandle Indicates the advertise handle.
997  * @return Returns {@link OHOS_BT_STATUS_SUCCESS} if set success;
998  * returns an error code defined in {@link BtStatus} otherwise.
999  * @since 6
1000 */
SetLpDeviceAdvParam(int duration,int maxExtAdvEvents,int window,int interval,int advHandle)1001 int SetLpDeviceAdvParam(int duration, int maxExtAdvEvents, int window, int interval, int advHandle)
1002 {
1003     HILOGI("SetLpDeviceAdvParam enter. duration: %{public}d, maxExtAdvEvents: %{public}d, window: %{public}d \
1004         interval: %{public}d, advHandle: %{public}d", duration, maxExtAdvEvents, window, interval, advHandle);
1005     if (duration < LPDEVICE_ADVERTISING_DURATION_MIN || duration > LPDEVICE_ADVERTISING_DURATION_MAX) {
1006         HILOGE("duration out of range:, duration: %{public}d", duration);
1007         return OHOS_BT_STATUS_PARM_INVALID;
1008     }
1009 
1010     if (maxExtAdvEvents < LPDEVICE_ADVERTISING_EXTADVEVENT_MIN
1011         || maxExtAdvEvents > LPDEVICE_ADVERTISING_EXTADVEVENT_MAX) {
1012         HILOGE("maxExtAdvEvents out of range:, maxExtAdvEvents: %{public}d", maxExtAdvEvents);
1013         return OHOS_BT_STATUS_PARM_INVALID;
1014     }
1015 
1016     if (window < LPDEVICE_ADVERTISING_WINDOW_MIN || window > LPDEVICE_ADVERTISING_WINDOW_MAX) {
1017         HILOGE("window out of range:, window: %{public}d", window);
1018         return OHOS_BT_STATUS_PARM_INVALID;
1019     }
1020 
1021     if (interval < LPDEVICE_ADVERTISING_INTERVAL_MIN || interval > LPDEVICE_ADVERTISING_INTERVAL_MAX) {
1022         HILOGE("interval out of range:, interval: %{public}d", interval);
1023         return OHOS_BT_STATUS_PARM_INVALID;
1024     }
1025 
1026     if (interval < window) {
1027         HILOGE("interval must bigger than window, interval: %{public}d, window: %{public}d", interval, window);
1028         return OHOS_BT_STATUS_PARM_INVALID;
1029     }
1030     std::shared_ptr<BleCentralManager> bleCentralManager = nullptr;
1031     GetBleCentralManagerObject(bleCentralManager);
1032     if (bleCentralManager == nullptr) {
1033         HILOGE("get BleCentralManager fail.");
1034         return OHOS_BT_STATUS_FAIL;
1035     }
1036     int ret = bleCentralManager->SetLpDeviceAdvParam(duration, maxExtAdvEvents, window, interval, advHandle);
1037     if (ret != BT_NO_ERROR) {
1038         HILOGE("fail, advHandle: %{public}d,ret: %{public}d", advHandle, ret);
1039         return OHOS_BT_STATUS_FAIL;
1040     }
1041     return OHOS_BT_STATUS_SUCCESS;
1042 }
1043 
1044 /**
1045  * @brief Set scan report channel.
1046  *
1047  * @param scannerId Indicates the scanner id.
1048  * @param enable true:report to low power device; false:not report to low power device.
1049  * @return Returns {@link OHOS_BT_STATUS_SUCCESS} if set report channel success;
1050  * returns an error code defined in {@link BtStatus} otherwise.
1051  * @since 6
1052  */
SetScanReportChannelToLpDevice(int32_t scannerId,bool enable)1053 int SetScanReportChannelToLpDevice(int32_t scannerId, bool enable)
1054 {
1055     HILOGD("SetScanReportChannelToLpDevice enter. scannerId: %{public}d, isToAp: %{public}d", scannerId, enable);
1056     std::shared_ptr<BleCentralManager> bleCentralManager = g_bleCentralManagerMap.GetObject(scannerId);
1057     if (bleCentralManager == nullptr) {
1058         HILOGE("SetScanReportChannelToLpDevice fail, ble centra manager is null.");
1059         return OHOS_BT_STATUS_FAIL;
1060     }
1061     int ret = bleCentralManager->SetScanReportChannelToLpDevice(enable);
1062     if (ret != BT_NO_ERROR) {
1063         HILOGE("fail, scannerId: %{public}d, ret: %{public}d", scannerId, ret);
1064         return OHOS_BT_STATUS_FAIL;
1065     }
1066     return OHOS_BT_STATUS_SUCCESS;
1067 }
1068 
1069 /**
1070  * @brief Enable synchronizing data to low power device.
1071  *
1072  * @return Returns {@link OHOS_BT_STATUS_SUCCESS} if enable sync success;
1073  * returns an error code defined in {@link BtStatus} otherwise.
1074  * @since 6
1075  */
EnableSyncDataToLpDevice(void)1076 int EnableSyncDataToLpDevice(void)
1077 {
1078     HILOGI("EnableSyncDataToLpDevice enter");
1079     std::shared_ptr<BleCentralManager> bleCentralManager = nullptr;
1080     GetBleCentralManagerObject(bleCentralManager);
1081     if (bleCentralManager == nullptr) {
1082         HILOGE("get BleCentralManager fail.");
1083         return OHOS_BT_STATUS_FAIL;
1084     }
1085     int ret = bleCentralManager->EnableSyncDataToLpDevice();
1086     if (ret != BT_NO_ERROR) {
1087         HILOGE("fail, ret: %{public}d", ret);
1088         return OHOS_BT_STATUS_FAIL;
1089     }
1090     return OHOS_BT_STATUS_SUCCESS;
1091 }
1092 
1093 /**
1094  * @brief Disable synchronizing data to the low power device.
1095  *
1096  * @return Returns {@link OHOS_BT_STATUS_SUCCESS} if disable sync success;
1097  * returns an error code defined in {@link BtStatus} otherwise.
1098  * @since 6
1099  */
DisableSyncDataToLpDevice(void)1100 int DisableSyncDataToLpDevice(void)
1101 {
1102     HILOGD("DisableSyncDataToLpDevice enter");
1103     std::shared_ptr<BleCentralManager> bleCentralManager = nullptr;
1104     GetBleCentralManagerObject(bleCentralManager);
1105     if (bleCentralManager == nullptr) {
1106         HILOGE("get BleCentralManager fail.");
1107         return OHOS_BT_STATUS_FAIL;
1108     }
1109     int ret = bleCentralManager->DisableSyncDataToLpDevice();
1110     if (ret != BT_NO_ERROR) {
1111         HILOGE("fail, ret: %{public}d", ret);
1112         return OHOS_BT_STATUS_FAIL;
1113     }
1114     return OHOS_BT_STATUS_SUCCESS;
1115 }
1116 
1117 /**
1118  * @brief Get advertiser handle.
1119  *
1120  * @param advId Indicates the advertisement ID.
1121  * @param advHandle Indicates the pointer to the advertiser handle.
1122  * @return Returns {@link OHOS_BT_STATUS_SUCCESS} if get success;
1123  * returns an error code defined in {@link BtStatus} otherwise.
1124  * @since 6
1125  */
GetAdvHandle(int advId,int * advHandle)1126 int GetAdvHandle(int advId, int *advHandle)
1127 {
1128     HILOGI("GetAdvHandle enter. advId: %{public}d", advId);
1129     if (advHandle == nullptr) {
1130         HILOGE("GetAdvHandle fail, advHandle is nullptr.");
1131         return OHOS_BT_STATUS_PARM_INVALID;
1132     }
1133     if (advId < 0 || advId >= MAX_BLE_ADV_NUM) {
1134         HILOGE("GetAdvHandle fail, advId is invalid.advId: %{public}d.", advId);
1135         return OHOS_BT_STATUS_PARM_INVALID;
1136     }
1137     lock_guard<mutex> lock(g_advMutex);
1138     if (g_BleAdvertiser == nullptr || g_bleAdvCallbacks[advId] == nullptr) {
1139         HILOGE("GetAdvHandle fail, the current adv is not started.");
1140         return OHOS_BT_STATUS_FAIL;
1141     }
1142     *advHandle = g_BleAdvertiser->GetAdvHandle(g_bleAdvCallbacks[advId]);
1143     return OHOS_BT_STATUS_SUCCESS;
1144 }
1145 
1146 /**
1147  * @brief Translate ParamData to low power device.
1148  *
1149  * @param data Indicates the pointer to the data.
1150  * @param dataSize Indicates the data size.
1151  * @param type Indicates the data type.
1152  * @return Returns {@link OHOS_BT_STATUS_SUCCESS} if set param to low power device success;
1153  * returns an error code defined in {@link BtStatus} otherwise.
1154  * @since 6
1155  */
SendParamsToLpDevice(const uint8_t * data,uint32_t dataSize,int32_t type)1156 int SendParamsToLpDevice(const uint8_t *data, uint32_t dataSize, int32_t type)
1157 {
1158     HILOGI("SendParamsToLpDevice enter. type: %{public}d, dataSize: %{public}d", type, dataSize);
1159     if (data == nullptr || dataSize <= 0) {
1160         HILOGE("SendParamsToLpDevice fail, data is nullptr or dataSize is wrong.");
1161         return OHOS_BT_STATUS_PARM_INVALID;
1162     }
1163     std::shared_ptr<BleCentralManager> bleCentralManager = nullptr;
1164     GetBleCentralManagerObject(bleCentralManager);
1165     if (bleCentralManager == nullptr) {
1166         HILOGE("get BleCentralManager fail.");
1167         return OHOS_BT_STATUS_FAIL;
1168     }
1169     std::vector<uint8_t> dataValue(data, data + dataSize);
1170     int ret = bleCentralManager->SendParamsToLpDevice(std::move(dataValue), type);
1171     if (ret != BT_NO_ERROR) {
1172         HILOGE("fail, ret: %{public}d", ret);
1173         return OHOS_BT_STATUS_FAIL;
1174     }
1175     return OHOS_BT_STATUS_SUCCESS;
1176 }
1177 
1178 /**
1179  * @brief Get whether low power device available.
1180  *
1181  * @return true: available; false: not available.
1182  * @since 6
1183  */
IsLpDeviceAvailable(void)1184 bool IsLpDeviceAvailable(void)
1185 {
1186     HILOGI("IsLpDeviceAvailable enter.");
1187     std::shared_ptr<BleCentralManager> bleCentralManager = nullptr;
1188     GetBleCentralManagerObject(bleCentralManager);
1189     if (bleCentralManager == nullptr) {
1190         HILOGE("get BleCentralManager fail.");
1191         return false;
1192     }
1193 
1194     return bleCentralManager->IsLpDeviceAvailable();
1195 }
1196 
BleScanNativeFilterLog(BleScanNativeFilter & filter)1197 void BleScanNativeFilterLog(BleScanNativeFilter &filter)
1198 {
1199     if (filter.address != nullptr) {
1200         std::string address(filter.address);
1201         HILOGI("address: %{public}s", GetEncryptAddr(filter.address).c_str());
1202     }
1203     if (filter.deviceName != nullptr) {
1204         HILOGI("deviceName: %{private}s", filter.deviceName);
1205     }
1206     if (filter.serviceUuidLength != 0) {
1207         if (filter.serviceUuid != nullptr) {
1208             HILOGI("serviceUuid: %{public}s", reinterpret_cast<char *>(filter.serviceUuid));
1209         }
1210         if (filter.serviceUuidMask != nullptr) {
1211             HILOGI("serviceUuidMask: %{public}s", reinterpret_cast<char *>(filter.serviceUuidMask));
1212         }
1213     }
1214     std::string dataStr;
1215     if (filter.serviceDataLength != 0) {
1216         if (filter.serviceData != nullptr) {
1217             dataStr = "";
1218             ConvertDataToHex(filter.serviceData, filter.serviceDataLength, dataStr);
1219             HILOGI("serviceData: %{public}s", dataStr.c_str());
1220         }
1221         if (filter.serviceDataMask != nullptr) {
1222             dataStr = "";
1223             ConvertDataToHex(filter.serviceDataMask, filter.serviceDataLength, dataStr);
1224             HILOGI("serviceDataMask: %{public}s", dataStr.c_str());
1225         }
1226     }
1227     if (filter.manufactureDataLength != 0) {
1228         if (filter.manufactureData != nullptr) {
1229             dataStr = "";
1230             ConvertDataToHex(filter.manufactureData, filter.manufactureDataLength, dataStr);
1231             HILOGI("manufactureData: %{public}s", dataStr.c_str());
1232         }
1233         if (filter.manufactureDataMask != nullptr) {
1234             dataStr = "";
1235             ConvertDataToHex(filter.manufactureDataMask, filter.manufactureDataLength, dataStr);
1236             HILOGI("manufactureDataMask: %{public}s", dataStr.c_str());
1237         }
1238         HILOGI("manufactureId: %{public}d", filter.manufactureId);
1239     }
1240 }
1241 
ConvertScanFilterParam(const BtLpDeviceParam * param,std::vector<BleScanFilter> & filter)1242 bool ConvertScanFilterParam(const BtLpDeviceParam *param, std::vector<BleScanFilter> &filter)
1243 {
1244     unsigned int maxFilterSize = 10;  // max filter size
1245     if (param->filterSize > maxFilterSize) {
1246         HILOGE("filterSize(%{public}u) is larger than %{public}u", param->filterSize, maxFilterSize);
1247         return false;
1248     }
1249     for (unsigned int i = 0; i < param->filterSize; i++) {
1250         BleScanNativeFilter nativeScanFilter = param->filter[i];
1251         BleScanNativeFilterLog(nativeScanFilter);
1252         BleScanFilter scanFilter;
1253         int result = SetOneScanFilter(scanFilter, &nativeScanFilter);
1254         if (result != OHOS_BT_STATUS_SUCCESS) {
1255             HILOGE("SetOneScanFilter faild, result: %{public}d", result);
1256             return false;
1257         }
1258         filter.push_back(scanFilter);
1259     }
1260     return true;
1261 }
1262 
ConvertAdvSettingParam(const BtLpDeviceParam * param,BleAdvertiserSettings & advSettings)1263 void ConvertAdvSettingParam(const BtLpDeviceParam *param, BleAdvertiserSettings &advSettings)
1264 {
1265     HILOGI("BleAdvParams: minInterval: %{public}d, advType: %{public}d",
1266         param->advParam.minInterval, param->advParam.advType);
1267     advSettings.SetInterval(param->advParam.minInterval);
1268     if (param->advParam.advType == OHOS_BLE_ADV_SCAN_IND ||
1269         param->advParam.advType == OHOS_BLE_ADV_NONCONN_IND) {
1270         advSettings.SetConnectable(false);
1271     }
1272 }
1273 
ConvertAdvDeviceInfo(const BtLpDeviceParam * param,std::vector<BleActiveDeviceInfo> & activeDeviceInfos)1274 bool ConvertAdvDeviceInfo(const BtLpDeviceParam *param, std::vector<BleActiveDeviceInfo> &activeDeviceInfos)
1275 {
1276     if (param->activeDeviceInfo == nullptr || param->activeDeviceSize == 0) {
1277         return true;
1278     }
1279     unsigned int maxActiveDevice = 10;  // max active device
1280     if (param->activeDeviceSize > maxActiveDevice) {
1281         HILOGE("activeDeviceSize(%{public}u) is larger than %{public}u", param->activeDeviceSize, maxActiveDevice);
1282         return false;
1283     }
1284     for (unsigned int i = 0; i < param->activeDeviceSize; i++) {
1285         HILOGI("ActiveDeviceInfo: status: %{public}d, timeOut: %{public}d",
1286             param->activeDeviceInfo[i].status, param->activeDeviceInfo[i].timeOut);
1287         BleActiveDeviceInfo deviceInfo;
1288         std::vector<int8_t> value(param->activeDeviceInfo[i].deviceId,
1289             param->activeDeviceInfo[i].deviceId + OHOS_ACTIVE_DEVICE_ID_LEN);
1290         deviceInfo.deviceId = value;
1291         deviceInfo.status = param->activeDeviceInfo[i].status;
1292         deviceInfo.timeOut = param->activeDeviceInfo[i].timeOut;
1293         activeDeviceInfos.push_back(deviceInfo);
1294     }
1295     return true;
1296 }
1297 
ConvertBtUuid(const BtUuid & inUuid,UUID & outUuid)1298 bool ConvertBtUuid(const BtUuid &inUuid, UUID &outUuid)
1299 {
1300     if (inUuid.uuid == nullptr || inUuid.uuidLen == 0) {
1301         HILOGE("uuid is NULL or len is 0.");
1302         return false;
1303     }
1304     string strUuid(inUuid.uuid);
1305     HILOGD("UUID: %{public}s", strUuid.c_str());
1306     if (!IsValidUuid(strUuid)) {
1307         HILOGE("match the UUID faild.");
1308         return false;
1309     }
1310     outUuid = UUID::FromString(strUuid);
1311     return true;
1312 }
1313 
ConvertLpDeviceParamData(const BtLpDeviceParam * inParam,BleLpDeviceParamSet & outParam)1314 int ConvertLpDeviceParamData(const BtLpDeviceParam *inParam, BleLpDeviceParamSet &outParam)
1315 {
1316     outParam.fieldValidFlagBit = 0;
1317     if (!ConvertBtUuid(inParam->uuid, outParam.uuid)) {
1318         return OHOS_BT_STATUS_PARM_INVALID;
1319     }
1320 
1321     if (inParam->scanConfig != nullptr) {
1322         outParam.scanSettings.SetScanMode(inParam->scanConfig->scanMode);
1323         outParam.fieldValidFlagBit |= BLE_LPDEVICE_SCAN_SETTING_VALID_BIT;
1324     }
1325 
1326     if (inParam->filter != nullptr && inParam->filterSize > 0) {
1327         if (!ConvertScanFilterParam(inParam, outParam.scanFilters)) {
1328             return OHOS_BT_STATUS_PARM_INVALID;
1329         }
1330         outParam.fieldValidFlagBit |= BLE_LPDEVICE_SCAN_FILTER_VALID_BIT;
1331     }
1332 
1333     outParam.fieldValidFlagBit |= BLE_LPDEVICE_ADV_SETTING_VALID_BIT;
1334     ConvertAdvSettingParam(inParam, outParam.advSettings);
1335 
1336     if (inParam->rawData.advData != nullptr && inParam->rawData.advDataLen > 0) {
1337         outParam.advData = ConvertDataToVec(inParam->rawData.advData,
1338             inParam->rawData.advDataLen);
1339         outParam.fieldValidFlagBit |= BLE_LPDEVICE_ADVDATA_VALID_BIT;
1340     }
1341 
1342     if (inParam->rawData.rspData != nullptr && inParam->rawData.rspDataLen > 0) {
1343         outParam.respData = ConvertDataToVec(inParam->rawData.rspData,
1344             inParam->rawData.rspDataLen);
1345         outParam.fieldValidFlagBit |= BLE_LPDEVICE_RESPDATA_VALID_BIT;
1346     }
1347 
1348     if (inParam->activeDeviceInfo != nullptr && inParam->activeDeviceSize > 0) {
1349         if (!ConvertAdvDeviceInfo(inParam, outParam.activeDeviceInfos)) {
1350             return OHOS_BT_STATUS_PARM_INVALID;
1351         }
1352         outParam.fieldValidFlagBit |= BLE_LPDEVICE_ADV_DEVICEINFO_VALID_BIT;
1353     }
1354 
1355     outParam.advHandle = inParam->advHandle;
1356     outParam.duration = inParam->duration;
1357     outParam.deliveryMode = inParam->deliveryMode;
1358     return OHOS_BT_STATUS_SUCCESS;
1359 }
1360 
1361 /**
1362  * @brief Set low power device Param.
1363  *
1364  * @param lpDeviceParam the param set to low power device.
1365  * @return Returns {@link OHOS_BT_STATUS_SUCCESS} if set lpDeviceParam success;
1366  * returns an error code defined in {@link BtStatus} otherwise.
1367  * @since 6
1368  */
SetLpDeviceParam(const BtLpDeviceParam * lpDeviceParam)1369 int SetLpDeviceParam(const BtLpDeviceParam *lpDeviceParam)
1370 {
1371     HILOGI("SetLpDeviceParam enter.");
1372     if (lpDeviceParam == nullptr) {
1373         HILOGE("SetLpDeviceParam fail, lpDeviceParam is null.");
1374         return OHOS_BT_STATUS_PARM_INVALID;
1375     }
1376     BleLpDeviceParamSet paramSet;
1377     int ret = ConvertLpDeviceParamData(lpDeviceParam, paramSet);
1378     if (ret != OHOS_BT_STATUS_SUCCESS) {
1379         return ret;
1380     }
1381     std::shared_ptr<BleCentralManager> bleCentralManager = nullptr;
1382     GetBleCentralManagerObject(bleCentralManager);
1383     if (bleCentralManager == nullptr) {
1384         HILOGE("get BleCentralManager fail.");
1385         return OHOS_BT_STATUS_FAIL;
1386     }
1387 
1388     HILOGI("SetLpDeviceParam fieldValidFlagBit: %{public}u", paramSet.fieldValidFlagBit);
1389     ret = bleCentralManager->SetLpDeviceParam(paramSet);
1390     if (ret != BT_NO_ERROR) {
1391         HILOGE("fail, advHandle: %{public}d, ret: %{public}d", paramSet.advHandle, ret);
1392         return OHOS_BT_STATUS_FAIL;
1393     }
1394     return OHOS_BT_STATUS_SUCCESS;
1395 }
1396 
1397 /**
1398  * @brief Remove low power device Param.
1399  *
1400  * @param uuid Uuid.
1401  * @return Returns {@link OHOS_BT_STATUS_SUCCESS} if remove success;
1402  * returns an error code defined in {@link BtStatus} otherwise.
1403  * @since 6
1404  */
RemoveLpDeviceParam(BtUuid uuid)1405 int RemoveLpDeviceParam(BtUuid uuid)
1406 {
1407     HILOGI("RemoveLpDeviceParam enter.");
1408     std::shared_ptr<BleCentralManager> bleCentralManager = nullptr;
1409     GetBleCentralManagerObject(bleCentralManager);
1410     if (bleCentralManager == nullptr) {
1411         HILOGE("get BleCentralManager fail.");
1412         return OHOS_BT_STATUS_FAIL;
1413     }
1414     UUID srvUuid;
1415     if (!ConvertBtUuid(uuid, srvUuid)) {
1416         return OHOS_BT_STATUS_PARM_INVALID;
1417     }
1418     int ret = bleCentralManager->RemoveLpDeviceParam(srvUuid);
1419     if (ret != BT_NO_ERROR) {
1420         HILOGE("fail, ret: %{public}d", ret);
1421         return OHOS_BT_STATUS_FAIL;
1422     }
1423     return OHOS_BT_STATUS_SUCCESS;
1424 }
1425 
ClearGlobalResource(void)1426 void ClearGlobalResource(void)
1427 {
1428     int i = 0;
1429     lock_guard<mutex> lock(g_advMutex);
1430     for (i = 0; i < MAX_BLE_ADV_NUM; i++) {
1431         if (g_bleAdvCallbacks[i] != nullptr) {
1432             g_bleAdvCallbacks[i] = nullptr;
1433         }
1434     }
1435     HILOGI("clear all g_bleAdvCallbacks");
1436 }
1437 
StartAdvAddrTimer(int advHandle,const AdvOwnAddrParams * ownAddrParams)1438 bool StartAdvAddrTimer(int advHandle, const AdvOwnAddrParams *ownAddrParams)
1439 {
1440     RemoveTimeoutAdvAddr();
1441     string addrStr;
1442     ConvertAddr(ownAddrParams->addr, addrStr);
1443     if (!CanStartAdv(addrStr)) {
1444         g_bleAdvCallbacks[advHandle] = nullptr;
1445         return false;
1446     }
1447     // adv must stop after {@link ADV_ADDR_TIME_THRESHOLD}
1448     auto timerCallback = [advHandle]() {
1449         HILOGI("Stop adv : %{public}d.", advHandle);
1450         BleStopAdv(advHandle);
1451     };
1452     uint32_t timerId = 0;
1453     BluetoothTimer::GetInstance()->Register(timerCallback, timerId, ADV_ADDR_TIME_THRESHOLD);
1454     {
1455         lock_guard<mutex> lock(g_advTimerMutex);
1456         g_advAddrTimerIds[advHandle] = timerId;
1457     }
1458     return true;
1459 }
1460 
1461 /**
1462  * @brief Change Advertising parameters when adv is disabled. If advertising started, an error will be returned.
1463  *
1464  * @param advId Indicates the advertisement ID.
1465  * @param advParam Indicates the advertising parameters. For details, see {@link BleAdvParams}. If you don't want
1466  * to cahnge current advertising address, please set ownAddr to 0xFF.
1467  * @return Returns {@link OHOS_BT_STATUS_SUCCESS} if the advertising is started.
1468  * returns an error code defined in {@link BtStatus} otherwise.
1469  * @since 16
1470  */
BleChangeAdvParams(int advId,const BleAdvParams advParam)1471 int BleChangeAdvParams(int advId, const BleAdvParams advParam)
1472 {
1473     HILOGI("advId:%{public}d", advId);
1474     if (advId < 0 || advId >= MAX_BLE_ADV_NUM) {
1475         HILOGW("Invaild advId:%{public}d", advId);
1476         return OHOS_BT_STATUS_PARM_INVALID;
1477     }
1478     lock_guard<mutex> lock(g_advMutex);
1479     if (g_BleAdvertiser == nullptr || g_bleAdvCallbacks[advId] == nullptr) {
1480         HILOGE("Adv is not started, need call BleStartAdvEx first.");
1481         return OHOS_BT_STATUS_FAIL;
1482     }
1483     BleAdvertiserSettings settings;
1484     settings.SetInterval(advParam.minInterval);
1485     if ((advParam.advType == OHOS_BLE_ADV_SCAN_IND) || (advParam.advType == OHOS_BLE_ADV_NONCONN_IND)) {
1486         settings.SetConnectable(false);
1487     }
1488     return g_BleAdvertiser->ChangeAdvertisingParams(g_bleAdvCallbacks[advId]->GetAdvHandle(), settings);
1489 }
1490 
1491 /**
1492  * @brief Change a scan with BleScanConfigs and filter. Please make sure scan is started.
1493  * If don't change ble scan filter, set BleScanNativeFilter to nullptr or filterSzie to zero.
1494  * Don't support only using manufactureId as filter conditions, need to use it with manufactureData.
1495  * The manufactureId need to be set a related number when you need a filtering confition of manufactureData.
1496  *
1497  * @param scannerId Indicates the scanner id.
1498  * @param configs Indicates the pointer to the scan filter. For details, see {@link BleScanConfigs}.
1499  * @param filter Indicates the pointer to the scan filter. For details, see {@link BleScanNativeFilter}.
1500  * @param filterSize Indicates the number of the scan filter.
1501  * @param filterAction Indicates change filter behavior. See {@link BleScanUpdateFilterAction}.
1502  * @return Returns {@link OHOS_BT_STATUS_SUCCESS} if the scan is started;
1503  * returns an error code defined in {@link BtStatus} otherwise.
1504  * @since 16
1505  */
BleChangeScanParams(int32_t scannerId,const BleScanConfigs * config,const BleScanNativeFilter * filter,uint32_t filterSize,uint32_t filterAction)1506 int BleChangeScanParams(int32_t scannerId, const BleScanConfigs *config, const BleScanNativeFilter *filter,
1507     uint32_t filterSize, uint32_t filterAction)
1508 {
1509     if (config == nullptr) {
1510         HILOGE("config invaild action:%{public}d", filterAction);
1511         return OHOS_BT_STATUS_PARM_INVALID;
1512     }
1513     std::shared_ptr<BleCentralManager> bleCentralManager = g_bleCentralManagerMap.GetObject(scannerId);
1514     if (bleCentralManager == nullptr) {
1515         HILOGE("invaild scannerId:%{public}d", scannerId);
1516         return OHOS_BT_STATUS_PARM_INVALID;
1517     }
1518     std::vector<BleScanFilter> scanFilters;
1519     if (filter != nullptr && filterSize != 0) {
1520         int result = SetConfigScanFilter(scannerId, filter, filterSize, scanFilters);
1521         if (result != OHOS_BT_STATUS_SUCCESS) {
1522             HILOGE("SetConfigScanFilter failed result:%{public}d", result);
1523             return OHOS_BT_STATUS_FAIL;
1524         }
1525     }
1526     BleScanSettings settings;
1527     settings.SetScanMode(config->scanMode);
1528     return bleCentralManager->ChangeScanParams(settings, scanFilters, filterAction);
1529 }
1530 
AllocateAdvHandle(void)1531 int AllocateAdvHandle(void)
1532 {
1533     int i = 0;
1534     for (; i < MAX_BLE_ADV_NUM; i++) {
1535         if (g_bleAdvCallbacks[i] == nullptr) {
1536             g_bleAdvCallbacks[i] = make_shared<BleAdvCallback>(i);
1537             break;
1538         }
1539     }
1540     return i;
1541 }
1542 
CheckAdvIdInUse(void)1543 void CheckAdvIdInUse(void)
1544 {
1545     if (g_AppCallback == nullptr || g_AppCallback->advIdReachMaxCb == nullptr) {
1546         HILOGE("call back is null");
1547         return;
1548     }
1549     int advIds[MAX_BLE_ADV_NUM];
1550     std::shared_ptr<int> advNum = std::make_shared<int>(-1);
1551     g_AppCallback->advIdReachMaxCb(advIds, MAX_BLE_ADV_NUM, advNum.get());
1552     if (advNum == nullptr || *advNum < 0 || *advNum > MAX_BLE_ADV_NUM) {
1553         HILOGW("Do not check advertising num, invalid advNum");
1554         return;
1555     }
1556     if (*advNum == MAX_BLE_ADV_NUM) {
1557         HILOGW("Check advertising num reach max");
1558         return;
1559     }
1560     for (int i = 0; i < MAX_BLE_ADV_NUM; i++) {
1561         if (g_bleAdvCallbacks[i] == nullptr) {
1562             HILOGW("Advertising num no reaching max, advId: %{public}d", i);
1563             return;
1564         }
1565         bool advIdInUse = false;
1566         for (int j = 0; j < *advNum; j++) {
1567             if (i == advIds[j]) {
1568                 advIdInUse = true;
1569                 break;
1570             }
1571         }
1572         if (!advIdInUse) {
1573             HILOGW("AdvId: %{public}d not in use", i);
1574             g_bleAdvCallbacks[i] = nullptr;
1575         }
1576     }
1577     return;
1578 }
1579 
CheckAndAllocateAdvHandle(void)1580 int CheckAndAllocateAdvHandle(void)
1581 {
1582     int i = AllocateAdvHandle();
1583     if (i == MAX_BLE_ADV_NUM) {
1584         HILOGW("check and re-allocate advId");
1585         CheckAdvIdInUse();
1586         i = AllocateAdvHandle();
1587     }
1588     return i;
1589 }
1590 
1591 }  // namespace Bluetooth
1592 }  // namespace OHOS
1593 #ifdef __cplusplus
1594 }
1595 #endif
1596 /** @} */
1597