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