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