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