• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2021-2022 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "ble_service_data.h"
17 
18 #include <algorithm>
19 
20 #include "array"
21 #include "map"
22 #include "vector"
23 #include "securec.h"
24 #include "bluetooth_log.h"
25 
26 namespace OHOS {
27 namespace bluetooth {
28 /**
29  * @brief Represents scan settings.
30  *
31  * @since 6
32  */
33 
SetReportDelay(long reportDelayMillis)34 void BleScanSettingsImpl::SetReportDelay(long reportDelayMillis)
35 {
36     reportDelayMillis_ = reportDelayMillis;
37 }
38 
39 /**
40  * @brief Get the report delay time.
41  *
42  * @return Returns Report delay time.
43  * @since 6
44  */
GetReportDelayMillisValue() const45 long BleScanSettingsImpl::GetReportDelayMillisValue() const
46 {
47     return reportDelayMillis_;
48 }
49 
SetScanMode(int scanMode)50 void BleScanSettingsImpl::SetScanMode(int scanMode)
51 {
52     scanMode_ = scanMode;
53 }
54 
GetScanMode() const55 int BleScanSettingsImpl::GetScanMode() const
56 {
57     return scanMode_;
58 }
59 
SetReportMode(int reportMode)60 void BleScanSettingsImpl::SetReportMode(int reportMode)
61 {
62     reportMode_ = reportMode;
63 }
64 
GetReportMode() const65 int BleScanSettingsImpl::GetReportMode() const
66 {
67     return reportMode_;
68 }
69 
SetLegacy(bool legacy)70 void BleScanSettingsImpl::SetLegacy(bool legacy)
71 {
72     legacy_ = legacy;
73 }
74 
GetLegacy() const75 bool BleScanSettingsImpl::GetLegacy() const
76 {
77     return legacy_;
78 }
79 
SetPhy(int phy)80 void BleScanSettingsImpl::SetPhy(int phy)
81 {
82     phy_ = phy;
83 }
84 
GetPhy() const85 int BleScanSettingsImpl::GetPhy() const
86 {
87     return phy_;
88 }
89 
SetCallbackType(uint8_t callbackType)90 void BleScanSettingsImpl::SetCallbackType(uint8_t callbackType)
91 {
92     callbackType_ = callbackType;
93 }
94 
GetCallbackType() const95 uint8_t BleScanSettingsImpl::GetCallbackType() const
96 {
97     return callbackType_;
98 }
99 
SetMatchTrackAdvType(uint8_t matchTrackAdvType)100 void BleScanSettingsImpl::SetMatchTrackAdvType(uint8_t matchTrackAdvType)
101 {
102     matchTrackAdvType_ = matchTrackAdvType;
103 }
104 
GetMatchTrackAdvType() const105 uint8_t BleScanSettingsImpl::GetMatchTrackAdvType() const
106 {
107     return matchTrackAdvType_;
108 }
109 
SetSensitivityMode(uint8_t sensitivityMode)110 void BleScanSettingsImpl::SetSensitivityMode(uint8_t sensitivityMode)
111 {
112     sensitivityMode_ = sensitivityMode;
113 }
114 
GetSensitivityMode() const115 uint8_t BleScanSettingsImpl::GetSensitivityMode() const
116 {
117     return sensitivityMode_;
118 }
119 
SetMatchMode(uint8_t matchMode)120 void BleScanSettingsImpl::SetMatchMode(uint8_t matchMode)
121 {
122     matchMode_ = matchMode;
123 }
124 
GetMatchMode() const125 uint8_t BleScanSettingsImpl::GetMatchMode() const
126 {
127     return matchMode_;
128 }
129 
GetScanInterval() const130 uint16_t BleScanSettingsImpl::GetScanInterval() const
131 {
132     return scanInterval_;
133 }
134 
GetScanWindow() const135 uint16_t BleScanSettingsImpl::GetScanWindow() const
136 {
137     return scanWindow_;
138 }
139 
SetScanInterval(uint16_t scanInterval)140 void BleScanSettingsImpl::SetScanInterval(uint16_t scanInterval)
141 {
142     scanInterval_ = scanInterval;
143 }
144 
SetScanWindow(uint16_t scanWindow)145 void BleScanSettingsImpl::SetScanWindow(uint16_t scanWindow)
146 {
147     scanWindow_ = scanWindow;
148 }
149 
SetDeviceId(const std::string & deviceId)150 void BleScanFilterImpl::SetDeviceId(const std::string &deviceId)
151 {
152     deviceId_ = deviceId;
153 }
154 
GetDeviceId() const155 std::string BleScanFilterImpl::GetDeviceId() const
156 {
157     return deviceId_;
158 }
159 
SetName(const std::string & name)160 void BleScanFilterImpl::SetName(const std::string &name)
161 {
162     name_ = name;
163 }
164 
GetName() const165 std::string BleScanFilterImpl::GetName() const
166 {
167     return name_;
168 }
169 
SetServiceUuid(const Uuid & serviceUuid)170 void BleScanFilterImpl::SetServiceUuid(const Uuid &serviceUuid)
171 {
172     serviceUuid_ = serviceUuid;
173     hasServiceUuid_ = true;
174 }
175 
HasServiceUuid() const176 bool BleScanFilterImpl::HasServiceUuid() const
177 {
178     return hasServiceUuid_;
179 }
180 
GetServiceUuid() const181 Uuid BleScanFilterImpl::GetServiceUuid() const
182 {
183     return serviceUuid_;
184 }
185 
SetServiceUuidMask(const Uuid & serviceUuidMask)186 void BleScanFilterImpl::SetServiceUuidMask(const Uuid &serviceUuidMask)
187 {
188     serviceUuidMask_ = serviceUuidMask;
189     hasServiceUuidMask_ = true;
190 }
191 
HasServiceUuidMask() const192 bool BleScanFilterImpl::HasServiceUuidMask() const
193 {
194     return hasServiceUuidMask_;
195 }
196 
GetServiceUuidMask() const197 Uuid BleScanFilterImpl::GetServiceUuidMask() const
198 {
199     return serviceUuidMask_;
200 }
201 
SetServiceSolicitationUuid(const Uuid & serviceSolicitationUuid)202 void BleScanFilterImpl::SetServiceSolicitationUuid(const Uuid &serviceSolicitationUuid)
203 {
204     serviceSolicitationUuid_ = serviceSolicitationUuid;
205     hasSolicitationUuid_ = true;
206 }
207 
HasSolicitationUuid() const208 bool BleScanFilterImpl::HasSolicitationUuid() const
209 {
210     return hasSolicitationUuid_;
211 }
212 
GetServiceSolicitationUuid() const213 Uuid BleScanFilterImpl::GetServiceSolicitationUuid() const
214 {
215     return serviceSolicitationUuid_;
216 }
217 
SetServiceSolicitationUuidMask(const Uuid & serviceSolicitationUuidMask)218 void BleScanFilterImpl::SetServiceSolicitationUuidMask(const Uuid &serviceSolicitationUuidMask)
219 {
220     serviceSolicitationUuidMask_ = serviceSolicitationUuidMask;
221     hasSolicitationUuidMask_ = true;
222 }
223 
HasSolicitationUuidMask() const224 bool BleScanFilterImpl::HasSolicitationUuidMask() const
225 {
226     return hasSolicitationUuidMask_;
227 }
228 
GetServiceSolicitationUuidMask() const229 Uuid BleScanFilterImpl::GetServiceSolicitationUuidMask() const
230 {
231     return serviceSolicitationUuidMask_;
232 }
233 
SetServiceData(const std::vector<uint8_t> & serviceData)234 void BleScanFilterImpl::SetServiceData(const std::vector<uint8_t> &serviceData)
235 {
236     serviceData_ = serviceData;
237 }
238 
GetServiceData() const239 std::vector<uint8_t> BleScanFilterImpl::GetServiceData() const
240 {
241     return serviceData_;
242 }
243 
SetServiceDataMask(const std::vector<uint8_t> & serviceDataMask)244 void BleScanFilterImpl::SetServiceDataMask(const std::vector<uint8_t> &serviceDataMask)
245 {
246     serviceDataMask_ = serviceDataMask;
247 }
248 
GetServiceDataMask() const249 std::vector<uint8_t> BleScanFilterImpl::GetServiceDataMask() const
250 {
251     return serviceDataMask_;
252 }
253 
SetManufacturerId(uint16_t manufacturerId)254 void BleScanFilterImpl::SetManufacturerId(uint16_t manufacturerId)
255 {
256     manufacturerId_ = manufacturerId;
257 }
258 
GetManufacturerId() const259 uint16_t BleScanFilterImpl::GetManufacturerId() const
260 {
261     return manufacturerId_;
262 }
263 
SetManufactureData(const std::vector<uint8_t> & manufactureData)264 void BleScanFilterImpl::SetManufactureData(const std::vector<uint8_t> &manufactureData)
265 {
266     manufactureData_ = manufactureData;
267 }
268 
GetManufactureData() const269 std::vector<uint8_t> BleScanFilterImpl::GetManufactureData() const
270 {
271     return manufactureData_;
272 }
273 
SetManufactureDataMask(const std::vector<uint8_t> & manufactureDataMask)274 void BleScanFilterImpl::SetManufactureDataMask(const std::vector<uint8_t> &manufactureDataMask)
275 {
276     manufactureDataMask_ = manufactureDataMask;
277 }
278 
GetManufactureDataMask() const279 std::vector<uint8_t> BleScanFilterImpl::GetManufactureDataMask() const
280 {
281     return manufactureDataMask_;
282 }
283 
SetAdvIndReportFlag(bool advIndReport)284 void BleScanFilterImpl::SetAdvIndReportFlag(bool advIndReport)
285 {
286     advIndReport_ = advIndReport;
287 }
288 
GetAdvIndReportFlag() const289 bool BleScanFilterImpl::GetAdvIndReportFlag() const
290 {
291     return advIndReport_;
292 }
293 
SetClientId(int clientId)294 void BleScanFilterImpl::SetClientId(int clientId)
295 {
296     clientId_ = clientId;
297 }
298 
GetClientId() const299 int BleScanFilterImpl::GetClientId() const
300 {
301     return clientId_;
302 }
303 
SetFiltIndex(uint8_t filtIndex)304 void BleScanFilterImpl::SetFiltIndex(uint8_t filtIndex)
305 {
306     filtIndex_ = filtIndex;
307 }
308 
GetFiltIndex() const309 uint8_t BleScanFilterImpl::GetFiltIndex() const
310 {
311     return filtIndex_;
312 }
313 
SetFilterAction(uint8_t action)314 void BleScanFilterImpl::SetFilterAction(uint8_t action)
315 {
316     action_ = action;
317 }
318 
GetFilterAction() const319 uint8_t BleScanFilterImpl::GetFilterAction() const
320 {
321     return action_;
322 }
323 
324 /**
325  * @brief Check if the device service is connectable.
326  *
327  * @return Returns <b>true</b> if device service is connectable;
328  *         Returns <b>false</b> otherwise.
329  * @since 6
330  */
IsConnectable() const331 bool BleAdvertiserSettingsImpl::IsConnectable() const
332 {
333     return connectable_;
334 }
335 
336 /**
337  * @brief Set whether the device service is connectable.
338  *
339  * @param connectable Whether the device service is connectable.
340  * @since 6
341  */
SetConnectable(bool connectable)342 void BleAdvertiserSettingsImpl::SetConnectable(bool connectable)
343 {
344     connectable_ = connectable;
345 }
346 
347 /**
348  * @brief Check if the advertiser is in legacy mode.
349  *
350  * @return Returns <b>true</b> if the advertiser is in legacy mode;
351  *         Returns <b>false</b> otherwisee.
352  * @since 6
353  */
IsLegacyMode() const354 bool BleAdvertiserSettingsImpl::IsLegacyMode() const
355 {
356     return legacyMode_;
357 }
358 
359 /**
360  * @brief Set whether to enable the legacy mode.
361  *
362  * @param connectable Whether to enable the legacy mode
363  * @since 6
364  */
SetLegacyMode(bool legacyMode)365 void BleAdvertiserSettingsImpl::SetLegacyMode(bool legacyMode)
366 {
367     legacyMode_ = legacyMode;
368 }
369 
370 /**
371  * @brief Get advertise interval.
372  *
373  * @return Returns the advertising interval.
374  * @since 6
375  */
GetInterval() const376 int BleAdvertiserSettingsImpl::GetInterval() const
377 {
378     return interval_;
379 }
380 
381 /**
382  * @brief Set advertise interval.
383  *
384  * @param interval Advertise interval.
385  * @since 6
386  */
SetInterval(int interval)387 void BleAdvertiserSettingsImpl::SetInterval(int interval)
388 {
389     interval_ = interval;
390 }
391 
392 /**
393  * @brief Get the advertiser Tx power.
394  *
395  * @return Returns advertiser Tx power.
396  * @since 6
397  */
GetTxPower() const398 int8_t BleAdvertiserSettingsImpl::GetTxPower() const
399 {
400     return txPower_;
401 }
402 
403 /**
404  * @brief Set the advertiser Tx power.
405  *
406  * @param txPower the advertiser Tx power.
407  * @since 6
408  */
SetTxPower(int8_t txPower)409 void BleAdvertiserSettingsImpl::SetTxPower(int8_t txPower)
410 {
411     txPower_ = txPower;
412 }
413 
414 /**
415  * @brief Get the primary phy.
416  *
417  * @return Returns the primary phy.
418  * @since 6
419  */
GetPrimaryPhy() const420 int BleAdvertiserSettingsImpl::GetPrimaryPhy() const
421 {
422     return primaryPhy_;
423 }
424 
425 /**
426  * @brief Set the primary phy.
427  *
428  * @param primaryPhy Primary phy.
429  * @since 6
430  */
SetPrimaryPhy(int primaryPhy)431 void BleAdvertiserSettingsImpl::SetPrimaryPhy(int primaryPhy)
432 {
433     primaryPhy_ = primaryPhy;
434 }
435 
436 /**
437  * @brief Get the secondary Phy.
438  *
439  * @return Returns primary phy.
440  * @since 6
441  */
GetSecondaryPhy() const442 int BleAdvertiserSettingsImpl::GetSecondaryPhy() const
443 {
444     return secondaryPhy_;
445 }
446 
447 /**
448  * @brief Set the secondary phy.
449  *
450  * @param secondaryPhy Secondary Phy.
451  * @since 6
452  */
SetSecondaryPhy(int secondaryPhy)453 void BleAdvertiserSettingsImpl::SetSecondaryPhy(int secondaryPhy)
454 {
455     secondaryPhy_ = secondaryPhy;
456 }
457 
458 /**
459  * @brief Get own address.
460  *
461  * @param addr Own address.
462  * @since 6
463  */
GetOwnAddr() const464 std::array<uint8_t, RawAddress::BT_ADDRESS_BYTE_LEN> BleAdvertiserSettingsImpl::GetOwnAddr() const
465 {
466     return ownAddr_;
467 }
468 
469 /**
470  * @brief Set own address.
471  *
472  * @param addr Own address.
473  * @since 6
474  */
SetOwnAddr(const std::array<uint8_t,RawAddress::BT_ADDRESS_BYTE_LEN> & addr)475 void BleAdvertiserSettingsImpl::SetOwnAddr(const std::array<uint8_t, RawAddress::BT_ADDRESS_BYTE_LEN>& addr)
476 {
477     ownAddr_ = addr;
478 }
479 
480 /**
481  * @brief Get own address type.
482  *
483  * @return Returns own address type.
484  * @since 6
485  */
GetOwnAddrType() const486 int8_t BleAdvertiserSettingsImpl::GetOwnAddrType() const
487 {
488     return ownAddrType_;
489 }
490 
491 /**
492  * @brief Set own address type.
493  *
494  * @param addrType Own address type.
495  * @since 6
496  */
SetOwnAddrType(int8_t addrType)497 void BleAdvertiserSettingsImpl::SetOwnAddrType(int8_t addrType)
498 {
499     ownAddrType_ = addrType;
500 }
501 
502 /**
503  * @brief A constructor used to create a <b>BleAdvertiseDataInternal</b> instance.
504  *
505  * @since 6
506  */
BleAdvertiserDataImpl()507 BleAdvertiserDataImpl::BleAdvertiserDataImpl() : payload_()
508 {}
509 
510 /**
511  * @brief Add manufacturer data.
512  *
513  * @param manufacturerId manufacturer Id which addad data.
514  * @param data manufacturer data
515  * @since 6
516  */
AddManufacturerData(uint16_t manufacturerId,const std::string & data)517 int BleAdvertiserDataImpl::AddManufacturerData(uint16_t manufacturerId, const std::string &data)
518 {
519     char cdata[BLE_ADV_DATA_FIELD_TYPE_AND_LEN];
520     cdata[0] = static_cast<char>(manufacturerId & 0xFF);
521     cdata[1] = static_cast<char>((manufacturerId >> BLE_ONE_BYTE_LEN) & 0xFF);
522     SetManufacturerData(std::string(cdata, BLE_ADV_DATA_FIELD_TYPE_AND_LEN) + data);
523 
524     return RET_NO_ERROR;
525 }
526 
527 /**
528  * @brief Add service data.
529  *
530  * @param uuid Uuid of service data.
531  * @param data Service data.
532  * @since 6
533  */
AddServiceData(const Uuid & uuid,const std::string & data)534 void BleAdvertiserDataImpl::AddServiceData(const Uuid &uuid, const std::string &data)
535 {
536     char cdata[BLE_ADV_DATA_FIELD_TYPE_AND_LEN];
537     switch (uuid.GetUuidType()) {
538         case Uuid::UUID16_BYTES_TYPE: {
539             /// [Len] [0x16] [UUID16] data
540             cdata[0] = data.length() + BLE_UUID_LEN_16 + 1;
541             cdata[1] = BLE_AD_TYPE_SERVICE_DATA;  /// 0x16
542             uint16_t uuid16 = uuid.ConvertTo16Bits();
543             AddData(std::string(cdata, BLE_ADV_DATA_FIELD_TYPE_AND_LEN) +
544                     std::string(reinterpret_cast<char *>(&uuid16), BLE_UUID_LEN_16) + data);
545             break;
546         }
547 
548         case Uuid::UUID32_BYTES_TYPE: {
549             /// [Len] [0x20] [UUID32] data
550             cdata[0] = data.length() + BLE_UUID_LEN_32 + 1;
551             cdata[1] = BLE_AD_TYPE_32SERVICE_DATA;  /// 0x20
552             uint32_t uuid32 = uuid.ConvertTo32Bits();
553             AddData(std::string(cdata, BLE_ADV_DATA_FIELD_TYPE_AND_LEN) +
554                     std::string(reinterpret_cast<char *>(&uuid32), BLE_UUID_LEN_32) + data);
555             break;
556         }
557 
558         case Uuid::UUID128_BYTES_TYPE: {
559             /// [Len] [0x21] [UUID128] data
560             cdata[0] = data.length() + BLE_UUID_LEN_128 + 1;
561             cdata[1] = BLE_AD_TYPE_128SERVICE_DATA;  /// 0x21
562             uint8_t uuidData[BLE_UUID_LEN_128];
563             uuid.ConvertToBytesLE(uuidData, BLE_UUID_LEN_128);
564             AddData(std::string(cdata, BLE_ADV_DATA_FIELD_TYPE_AND_LEN) +
565                     std::string(reinterpret_cast<char *>(uuidData), BLE_UUID_LEN_128) + data);
566             break;
567         }
568 
569         default:
570             return;
571     }
572 }
573 
574 /**
575  * @brief Add characteristic value.
576  *
577  * @param advertiser type of the field.
578  * @param advertiser data.
579  * @since 6
580  */
AddCharacteristicValue(uint8_t adtype,const std::string & data)581 void BleAdvertiserDataImpl::AddCharacteristicValue(uint8_t adtype, const std::string &data)
582 {
583     char cdata[BLE_ADV_DATA_FIELD_TYPE_AND_LEN];
584     cdata[0] = data.length() + 1;
585     cdata[1] = adtype;
586     AddData(std::string(cdata, BLE_ADV_DATA_FIELD_TYPE_AND_LEN) + data);
587 }
588 
589 /**
590  * @brief Add service uuid.
591  *
592  * @param uuid Service uuid.
593  * @since 6
594  */
AddServiceUuid(const Uuid & uuid)595 void BleAdvertiserDataImpl::AddServiceUuid(const Uuid &uuid)
596 {
597     SetCompleteServices(uuid);
598 }
599 
600 /**
601  * @brief Add service uuids.
602  *
603  * @param uuid Service uuids.
604  * @since 12
605  */
AddServiceUuids(const std::vector<Uuid> & uuidVec)606 void BleAdvertiserDataImpl::AddServiceUuids(const std::vector<Uuid> &uuidVec)
607 {
608     if (uuidVec.empty()) {
609         return;
610     }
611     std::string serviceUuid16 = "";
612     std::string serviceUuid32 = "";
613     std::string serviceUuid128 = "";
614 
615     char cdata[BLE_ADV_DATA_FIELD_TYPE_AND_LEN];
616     for (auto &uuid : uuidVec) {
617         if (uuid.GetUuidType() == Uuid::UUID16_BYTES_TYPE) {
618             uint16_t uuid16 = uuid.ConvertTo16Bits();
619             serviceUuid16.append(std::string(reinterpret_cast<char *>(&uuid16), BLE_UUID_LEN_16));
620         } else if (uuid.GetUuidType() == Uuid::UUID32_BYTES_TYPE) {
621             uint32_t uuid32 = uuid.ConvertTo32Bits();
622             serviceUuid32.append(std::string(reinterpret_cast<char *>(&uuid32), BLE_UUID_LEN_32));
623         } else {
624             uint8_t uuidData[BLE_UUID_LEN_128];
625             uuid.ConvertToBytesLE(uuidData, BLE_UUID_LEN_128);
626             serviceUuid128.append(std::string(reinterpret_cast<char *>(uuidData), BLE_UUID_LEN_128));
627         }
628     }
629 
630     if (!serviceUuid16.empty()) {
631         cdata[0] = serviceUuid16.size() + 1; // 1指BLE_AD_TYPE_16SRV_CMPL标识
632         cdata[1] = BLE_AD_TYPE_16SRV_CMPL; // 0x03
633         AddData(std::string(cdata, BLE_ADV_DATA_FIELD_TYPE_AND_LEN) + serviceUuid16);
634     }
635     if (!serviceUuid32.empty()) {
636         cdata[0] = serviceUuid32.size() + 1; // 1 指 BLE_AD_TYPE_32SRV_CMPL 标识
637         cdata[1] = BLE_AD_TYPE_32SRV_CMPL; // 0x05
638         AddData(std::string(cdata, BLE_ADV_DATA_FIELD_TYPE_AND_LEN) + serviceUuid32);
639     }
640     if (!serviceUuid128.empty()) {
641         cdata[0] = serviceUuid128.size() + 1; // 1 指 BLE_AD_TYPE_128SRV_CMPL 标识
642         cdata[1] = BLE_AD_TYPE_128SRV_CMPL; // 0x07
643         AddData(std::string(cdata, BLE_ADV_DATA_FIELD_TYPE_AND_LEN) + serviceUuid128);
644     }
645 }
646 
647 /**
648  * @brief Set device appearance.
649  *
650  * @param appearance Device appearance.
651  * @since 6
652  */
SetAppearance(uint16_t appearance)653 void BleAdvertiserDataImpl::SetAppearance(uint16_t appearance)
654 {
655     char cdata[BLE_ADV_DATA_FIELD_TYPE_AND_LEN];
656     cdata[0] = BLE_ADV_DATA_BYTE_FIELD_LEN;
657     cdata[1] = BLE_AD_TYPE_APPEARANCE;  /// 0x19
658     AddData(std::string(cdata, BLE_ADV_DATA_FIELD_TYPE_AND_LEN) +
659             std::string(reinterpret_cast<char *>(&appearance), BLE_ADV_DATA_FIELD_TYPE_AND_LEN));
660 }
661 
662 /**
663  * @brief Set complete services.
664  *
665  * @param uuid Service uuid.
666  * @since 6
667  */
SetCompleteServices(const Uuid & uuid)668 void BleAdvertiserDataImpl::SetCompleteServices(const Uuid &uuid)
669 {
670     char cdata[BLE_ADV_DATA_FIELD_TYPE_AND_LEN];
671     switch (uuid.GetUuidType()) {
672         case Uuid::UUID16_BYTES_TYPE: {
673             /// [Len] [0x02] [LL] [HH]
674             cdata[0] = BLE_UUID_LEN_16 + 1;
675             cdata[1] = BLE_AD_TYPE_16SRV_CMPL;  /// 0x03
676             uint16_t uuid16 = uuid.ConvertTo16Bits();
677             AddData(std::string(cdata, BLE_ADV_DATA_FIELD_TYPE_AND_LEN) +
678                     std::string(reinterpret_cast<char *>(&uuid16), BLE_UUID_LEN_16));
679             break;
680         }
681 
682         case Uuid::UUID32_BYTES_TYPE: {
683             /// [Len] [0x04] [LL] [LL] [HH] [HH]
684             cdata[0] = BLE_UUID_LEN_32 + 1;
685             cdata[1] = BLE_AD_TYPE_32SRV_CMPL;  /// 0x05
686             uint32_t uuid32 = uuid.ConvertTo32Bits();
687             AddData(std::string(cdata, BLE_ADV_DATA_FIELD_TYPE_AND_LEN) +
688                     std::string(reinterpret_cast<char *>(&uuid32), BLE_UUID_LEN_32));
689             break;
690         }
691 
692         case Uuid::UUID128_BYTES_TYPE: {
693             /// [Len] [0x04] [0] [1] ... [15]
694             cdata[0] = BLE_UUID_LEN_128 + 1;
695             cdata[1] = BLE_AD_TYPE_128SRV_CMPL;  /// 0x07
696             uint8_t uuidData[BLE_UUID_LEN_128];
697             uuid.ConvertToBytesLE(uuidData, BLE_UUID_LEN_128);
698             AddData(std::string(cdata, BLE_ADV_DATA_FIELD_TYPE_AND_LEN) +
699                     std::string(reinterpret_cast<char *>(uuidData), BLE_UUID_LEN_128));
700             break;
701         }
702 
703         default:
704             return;
705     }
706 }
707 
708 /**
709  * @brief Set advertiser flag.
710  *
711  * @param flag Advertiser flag.
712  * @since 6
713  */
SetFlags(uint8_t flag)714 void BleAdvertiserDataImpl::SetFlags(uint8_t flag)
715 {
716     char cdata[BLE_ADV_DATA_BYTE_FIELD_LEN];
717     cdata[0] = BLE_ADV_DATA_FIELD_TYPE_AND_LEN;
718     cdata[1] = BLE_AD_TYPE_FLAG;  /// 0x01
719     cdata[BLE_ADV_DATA_FIELD_TYPE_AND_LEN] = flag;
720     advFlag_ = flag;
721     AddData(std::string(cdata, BLE_ADV_DATA_BYTE_FIELD_LEN));
722 }
723 
GetFlags() const724 uint8_t BleAdvertiserDataImpl::GetFlags() const
725 {
726     return advFlag_;
727 }
728 
729 /**
730  * @brief Set manufacturer data.
731  *
732  * @param data manufacturer data.
733  * @since 6
734  */
SetManufacturerData(const std::string & data)735 void BleAdvertiserDataImpl::SetManufacturerData(const std::string &data)
736 {
737     char cdata[BLE_ADV_DATA_FIELD_TYPE_AND_LEN];
738     cdata[0] = data.length() + 1;
739     cdata[1] = BLE_AD_MANUFACTURER_SPECIFIC_TYPE;  /// 0xff
740     AddData(std::string(cdata, BLE_ADV_DATA_FIELD_TYPE_AND_LEN) + data);
741 }
742 
743 /**
744  * @brief Set device name.
745  *
746  * @param name Device name.
747  * @since 6
748  */
SetDeviceName(const std::string & name)749 void BleAdvertiserDataImpl::SetDeviceName(const std::string &name)
750 {
751     if (name.length() > DEVICE_NAME_MAX_LEN) {
752         SetLongName(name);
753     } else {
754         SetShortName(name);
755     }
756 }
757 
758 /**
759  * @brief Set Tx power level.
760  *
761  * @param txPowerLevel Tx power level.
762  * @since 6
763  */
SetTxPowerLevel(uint8_t txPowerLevel)764 void BleAdvertiserDataImpl::SetTxPowerLevel(uint8_t txPowerLevel)
765 {
766     char cdata[BLE_ADV_DATA_BYTE_FIELD_LEN];
767     cdata[0] = BLE_ADV_DATA_FIELD_TYPE_AND_LEN;
768     cdata[1] = BLE_AD_TYPE_TX_PWR;  /// 0x09
769     cdata[BLE_ADV_DATA_FIELD_TYPE_AND_LEN] = txPowerLevel;
770     AddData(std::string(cdata, BLE_ADV_DATA_BYTE_FIELD_LEN));
771 }
772 
773 /**
774  * @brief Add service data.
775  *
776  * @param data Service data.
777  * @since 6
778  */
AddData(std::string data)779 void BleAdvertiserDataImpl::AddData(std::string data)
780 {
781     payload_.append(data);
782 }
783 
784 /**
785  * @brief Get advertiser data packet.
786  *
787  * @return Returns advertiser data packet.
788  * @since 6
789  */
SetPayload(const std::string & payload)790 void BleAdvertiserDataImpl::SetPayload(const std::string &payload)
791 {
792     payload_ = payload;
793 }
794 
795 /**
796  * @brief Get advertiser data packet.
797  *
798  * @return Returns advertiser data packet.
799  * @since 6
800  */
GetPayload() const801 std::string BleAdvertiserDataImpl::GetPayload() const
802 {
803     return payload_;
804 }
805 
806 /**
807  * @brief Set advertiser data long name.
808  *
809  * @param name Bluetooth device name.
810  * @since 6
811  */
SetLongName(const std::string & name)812 void BleAdvertiserDataImpl::SetLongName(const std::string &name)
813 {
814     char cdata[BLE_ADV_DATA_FIELD_TYPE_AND_LEN];
815     // A shortened name only contain 26 contiguous characters from the beginning of the full name.
816     cdata[0] = DEVICE_NAME_MAX_LEN + 1;
817     cdata[1] = BLE_AD_TYPE_NAME_SHORT;  /// 0x08
818     AddData(std::string(cdata, BLE_ADV_DATA_FIELD_TYPE_AND_LEN) + name.substr(0, DEVICE_NAME_MAX_LEN));
819 }
820 
821 /**
822  * @brief Set advertiser data short name.
823  *
824  * @param name Bluetooth device name.
825  * @since 6
826  */
SetShortName(const std::string & name)827 void BleAdvertiserDataImpl::SetShortName(const std::string &name)
828 {
829     char cdata[BLE_ADV_DATA_FIELD_TYPE_AND_LEN];
830     cdata[0] = name.length() + 1;
831     cdata[1] = BLE_AD_TYPE_NAME_CMPL;  /// 0x09
832     AddData(std::string(cdata, BLE_ADV_DATA_FIELD_TYPE_AND_LEN) + name);
833 }
834 
BlePeripheralDevice()835 BlePeripheralDevice::BlePeripheralDevice()
836     : manufacturerData_(),
837       name_(),
838       serviceUUIDs_(),
839       txPower_(BLE_ADDR_TYPE_RANDOM),
840       serviceData_(),
841       serviceDataUUIDs_(),
842       pairState_(BLE_PAIR_NONE),
843       ioCapability_(BLE_IO_CAP_NONE),
844       aliasName_()
845 {
846     manufacturerData_.clear();
847     serviceDataUUIDs_.clear();
848     serviceData_.clear();
849     serviceUUIDs_.clear();
850 }
851 
~BlePeripheralDevice()852 BlePeripheralDevice::~BlePeripheralDevice()
853 {
854     manufacturerData_.clear();
855     serviceUUIDs_.clear();
856     serviceData_.clear();
857     serviceDataUUIDs_.clear();
858 }
859 
860 /**
861  * @brief Get device address.
862  *
863  * @return Returns device address.
864  * @since 6
865  */
GetRawAddress() const866 RawAddress BlePeripheralDevice::GetRawAddress() const
867 {
868     return address_;
869 }
870 
871 /**
872  * @brief Get device appearance.
873  *
874  * @return Returns the device appearance.
875  * @since 6
876  */
GetAppearance() const877 uint16_t BlePeripheralDevice::GetAppearance() const
878 {
879     return appearance_;
880 }
881 
882 /**
883  * @brief Get the manufacturer data.
884  *
885  * @return Returns the manufacturer data.
886  * @since 6
887  */
GetManufacturerData() const888 std::map<uint16_t, std::string> BlePeripheralDevice::GetManufacturerData() const
889 {
890     return manufacturerData_;
891 }
892 
893 /**
894  * @brief the device name.
895  *
896  * @return Returns device Name.
897  * @since 6
898  */
GetName() const899 std::string BlePeripheralDevice::GetName() const
900 {
901     return name_;
902 }
903 
904 /**
905  * @brief Get device RSSI.
906  *
907  * @return Returns device RSSI.
908  * @since 6
909  */
GetRSSI() const910 int8_t BlePeripheralDevice::GetRSSI() const
911 {
912     return rssi_;
913 }
914 
915 /**
916  * @brief Get service data.
917  *
918  * @return Returns service data.
919  * @since 6
920  */
GetServiceData() const921 std::vector<std::string> BlePeripheralDevice::GetServiceData() const
922 {
923     return serviceData_;
924 }
925 
926 /**
927  * @brief Get Service Data.
928  *
929  * @param index Service data index.
930  * @return Returns service data.
931  * @since 6
932  */
GetServiceData(int index) const933 std::string BlePeripheralDevice::GetServiceData(int index) const
934 {
935     return serviceData_.empty() ? "" :
936         (static_cast<size_t>(index) < serviceData_.size() ? serviceData_[index] : "");
937 }
938 
939 /**
940  * @brief Get service data UUID.
941  *
942  * @return Returns service data UUID.
943  * @since 6
944  */
GetServiceDataUUID() const945 std::vector<Uuid> BlePeripheralDevice::GetServiceDataUUID() const
946 {
947     return serviceDataUUIDs_;
948 }
949 
950 /**
951  * @brief Get service data UUID.
952  *
953  * @param index Service data index.
954  * @return Returns service data UUID.
955  * @since 6
956  */
GetServiceDataUUID(int index) const957 Uuid BlePeripheralDevice::GetServiceDataUUID(int index) const
958 {
959     Uuid uuid {};
960     return serviceDataUUIDs_.empty() ? uuid : serviceDataUUIDs_[index];
961 }
962 
963 /**
964  * @brief Get the service UUID.
965  *
966  * @return Returns service UUID.
967  * @since 6
968  */
GetServiceUUID() const969 std::vector<Uuid> BlePeripheralDevice::GetServiceUUID() const
970 {
971     return serviceUUIDs_;
972 }
973 
974 /**
975  * @brief Get service UUID.
976  *
977  * @param index Service UUID index.
978  * @return Return service UUID.
979  * @since 6
980  */
GetServiceUUID(int index) const981 Uuid BlePeripheralDevice::GetServiceUUID(int index) const
982 {
983     Uuid uuid {};
984     return serviceUUIDs_.empty() ? uuid : serviceUUIDs_[index];
985 }
986 
987 /**
988  * @brief Get address type.
989  *
990  * @return Returns address type.
991  * @since 6
992  */
GetAddressType() const993 int BlePeripheralDevice::GetAddressType() const
994 {
995     return addressType_;
996 }
997 
998 /**
999  * @brief Set address type.
1000  *
1001  * @param type Address type.
1002  * @since 6
1003  */
SetAddressType(int type)1004 void BlePeripheralDevice::SetAddressType(int type)
1005 {
1006     addressType_ = type;
1007 }
1008 
1009 /**
1010  * @brief Check if manufacturer data is included.
1011  *
1012  * @return Returns <b>true</b> if manufacturer data is included;
1013  *         Returns <b>false</b> otherwise.
1014  * @since 6
1015  */
IsManufacturerData() const1016 bool BlePeripheralDevice::IsManufacturerData() const
1017 {
1018     return isManufacturerData_;
1019 }
1020 
1021 /**
1022  * @brief Check if the device RSSI is included.
1023  *
1024  * @return Returns <b>true</b> if include device rssi;
1025  *         Returns <b>false</b> otherwise.
1026  * @since 6
1027  */
IsRSSI() const1028 bool BlePeripheralDevice::IsRSSI() const
1029 {
1030     return isRSSI_;
1031 }
1032 
1033 /**
1034  * @brief Check if service data is included.
1035  *
1036  * @return Returns <b>true</b> if include service data;
1037  *         Returns <b>false</b> otherwise.
1038  * @since 6
1039  */
IsServiceData() const1040 bool BlePeripheralDevice::IsServiceData() const
1041 {
1042     return isServiceData_;
1043 }
1044 
1045 /**
1046  * @brief Check if the service UUID is included.
1047  *
1048  * @return Returns <b>true</b> if the service UUID is included;
1049  *         Returns <b>false</b> otherwise.
1050  * @since 6
1051  */
IsServiceUUID() const1052 bool BlePeripheralDevice::IsServiceUUID() const
1053 {
1054     return isServiceUUID_;
1055 }
1056 
IsName(void) const1057 bool BlePeripheralDevice::IsName(void) const
1058 {
1059     return isName_;
1060 }
1061 
1062 /**
1063  * @brief Set device address.
1064  *
1065  * @param address device address.
1066  * @since 6
1067  */
SetAddress(const RawAddress & address)1068 void BlePeripheralDevice::SetAddress(const RawAddress &address)
1069 {
1070     address_ = address;
1071 }
1072 
1073 /**
1074  * @brief Set RSSI value.
1075  *
1076  * @param RSSI value.
1077  * @since 6
1078  */
SetRSSI(int8_t rssi)1079 void BlePeripheralDevice::SetRSSI(int8_t rssi)
1080 {
1081     rssi_ = rssi;
1082     isRSSI_ = true;
1083 }
1084 /**
1085  * @brief Check whether device is connectable.
1086  *
1087  * @param [in] rssi value.
1088  * return Returns <b>true</b> if device is connectable.
1089  *        Returns <b>false</b> otherwisee.
1090  */
IsConnectable() const1091 bool BlePeripheralDevice::IsConnectable() const
1092 {
1093     return connectable_;
1094 }
1095 
1096 /**
1097  * @brief Sets whether the peer device is connectable.
1098  *
1099  * @param peer device's connectable.
1100  */
SetConnectable(bool connectable)1101 void BlePeripheralDevice::SetConnectable(bool connectable)
1102 {
1103     connectable_ = connectable;
1104 }
1105 
1106 /**
1107  * @brief Sets adv event type.
1108  *
1109  * @param peer adv event type.
1110  */
SetEventType(uint16_t eventType)1111 void BlePeripheralDevice::SetEventType(uint16_t eventType)
1112 {
1113     eventType_ = eventType;
1114     isEventType_ = true;
1115 }
1116 
1117 /**
1118  * @brief Check whether adv event type is included.
1119  *
1120  * return Returns <b>true</b> if event type is included.
1121  *        Returns <b>false</b> otherwisee.
1122  */
IsEventType() const1123 bool BlePeripheralDevice::IsEventType() const
1124 {
1125     return isEventType_;
1126 }
1127 
1128 /**
1129  * @brief Get adv event type.
1130  *
1131  * @return adv event type
1132  */
GetEventType() const1133 uint16_t BlePeripheralDevice::GetEventType() const
1134 {
1135     return eventType_;
1136 }
1137 
1138 /**
1139  * @brief Parse advertisement packets.
1140  *
1141  * @param payload Advertisement packet.
1142  * @param total_len Advertisement packet length.
1143  * @since 6
1144  */
ParseAdvertiserment(BlePeripheralDeviceParseAdvData & parseAdvData)1145 void BlePeripheralDevice::ParseAdvertiserment(BlePeripheralDeviceParseAdvData &parseAdvData)
1146 {
1147     size_t sizeConsumed = 0;
1148     bool finished = false;
1149     size_t totalLength = parseAdvData.length;
1150     payload_ = parseAdvData.payload;
1151     payloadLen_ = parseAdvData.length;
1152 
1153     while (!finished) {
1154         size_t length = *parseAdvData.payload;
1155         sizeConsumed += 1 + length;
1156         if (sizeConsumed > totalLength) {
1157             break;
1158         }
1159         parseAdvData.payload++;
1160 
1161         if (length != 0) {
1162             uint8_t advType = *parseAdvData.payload;
1163             parseAdvData.payload++;
1164             length--;
1165             parseAdvData.length = length;
1166             BuildAdvertiserData(advType, parseAdvData);
1167             parseAdvData.payload += length;
1168         }
1169         if (sizeConsumed >= totalLength) {
1170             finished = true;
1171         }
1172     }
1173 }
1174 
BuildAdvertiserData(uint8_t advType,BlePeripheralDeviceParseAdvData & parseAdvData)1175 void BlePeripheralDevice::BuildAdvertiserData(uint8_t advType, BlePeripheralDeviceParseAdvData &parseAdvData)
1176 {
1177     switch (advType) {
1178         case BLE_AD_TYPE_NAME_CMPL:   /// Data Type: 0x09
1179         case BLE_AD_TYPE_NAME_SHORT:  /// Data Type: 0x08
1180             SetName(std::string(reinterpret_cast<char *>(parseAdvData.payload), parseAdvData.length));
1181             break;
1182         case BLE_AD_TYPE_TX_PWR:  /// Data Type: 0x0A
1183             SetTXPower(*parseAdvData.payload);
1184             break;
1185         case BLE_AD_TYPE_APPEARANCE:  /// Data Type: 0x19
1186             SetAppearance(*reinterpret_cast<uint16_t *>(parseAdvData.payload));
1187             break;
1188         case BLE_AD_TYPE_FLAG:  /// Data Type: 0x01
1189             SetAdFlag(*parseAdvData.payload);
1190             break;
1191         case BLE_AD_TYPE_16SRV_CMPL:
1192         case BLE_AD_TYPE_16SRV_PART:  /// Data Type: 0x02
1193             SetServiceUUID16Bits(parseAdvData);
1194             break;
1195         case BLE_AD_TYPE_32SRV_CMPL:
1196         case BLE_AD_TYPE_32SRV_PART:  /// Data Type: 0x04
1197             SetServiceUUID32Bits(parseAdvData);
1198             break;
1199         case BLE_AD_TYPE_128SRV_CMPL:  /// Data Type: 0x07
1200         case BLE_AD_TYPE_128SRV_PART:  /// Data Type: 0x06
1201             SetServiceUUID128Bits(parseAdvData);
1202             break;
1203         case BLE_AD_MANUFACTURER_SPECIFIC_TYPE:
1204             SetManufacturerData(std::string(reinterpret_cast<char *>(parseAdvData.payload), parseAdvData.length));
1205             break;
1206         case BLE_AD_TYPE_SERVICE_DATA:  /// Data Type: 0x16
1207             SetServiceDataUUID16Bits(parseAdvData);
1208             break;
1209         case BLE_AD_TYPE_32SERVICE_DATA:  /// Data Type: 0x20
1210             SetServiceDataUUID32Bits(parseAdvData);
1211             break;
1212         case BLE_AD_TYPE_128SERVICE_DATA:  /// Data Type: 0x21
1213             SetServiceDataUUID128Bits(parseAdvData);
1214             break;
1215         default:
1216             break;
1217     }
1218 }
1219 
SetServiceUUID16Bits(BlePeripheralDeviceParseAdvData & parseAdvData)1220 void BlePeripheralDevice::SetServiceUUID16Bits(BlePeripheralDeviceParseAdvData &parseAdvData)
1221 {
1222     for (size_t var = 0; var < parseAdvData.length / BLE_UUID_LEN_16; ++var) {
1223         SetServiceUUID(
1224             Uuid::ConvertFrom16Bits(*reinterpret_cast<uint16_t *>(parseAdvData.payload + var * BLE_UUID_LEN_16)));
1225     }
1226 }
1227 
SetServiceUUID32Bits(BlePeripheralDeviceParseAdvData & parseAdvData)1228 void BlePeripheralDevice::SetServiceUUID32Bits(BlePeripheralDeviceParseAdvData &parseAdvData)
1229 {
1230     for (size_t var = 0; var < parseAdvData.length / BLE_UUID_LEN_32; ++var) {
1231         SetServiceUUID(
1232             Uuid::ConvertFrom32Bits(*reinterpret_cast<uint32_t *>(parseAdvData.payload + var * BLE_UUID_LEN_32)));
1233     }
1234 }
1235 
SetServiceUUID128Bits(const BlePeripheralDeviceParseAdvData & parseAdvData)1236 void BlePeripheralDevice::SetServiceUUID128Bits(const BlePeripheralDeviceParseAdvData &parseAdvData)
1237 {
1238     for (size_t var = 0; var < parseAdvData.length / BLE_UUID_LEN_128; ++var) {
1239         std::array<uint8_t, BLE_UUID_LEN_128> data = {};
1240         for (int i = 0; i < BLE_UUID_LEN_128; i++) {
1241             data[i] = *(parseAdvData.payload + var * BLE_UUID_LEN_128 + i);
1242         }
1243         SetServiceUUID(Uuid::ConvertFromBytesLE(data.data()));
1244     }
1245 }
1246 
SetServiceDataUUID16Bits(BlePeripheralDeviceParseAdvData & parseAdvData)1247 void BlePeripheralDevice::SetServiceDataUUID16Bits(BlePeripheralDeviceParseAdvData &parseAdvData)
1248 {
1249     if (parseAdvData.length < BLE_UUID_LEN_16) {
1250         return;
1251     }
1252     uint16_t uuid = *(reinterpret_cast<uint16_t *>(parseAdvData.payload));
1253     std::string data = "";
1254     if (parseAdvData.length > BLE_UUID_LEN_16) {
1255         data = std::string(
1256             reinterpret_cast<char *>(parseAdvData.payload + BLE_UUID_LEN_16), parseAdvData.length - BLE_UUID_LEN_16);
1257     }
1258     SetServiceDataUUID(Uuid::ConvertFrom16Bits(uuid), data);
1259 }
1260 
SetServiceDataUUID32Bits(BlePeripheralDeviceParseAdvData & parseAdvData)1261 void BlePeripheralDevice::SetServiceDataUUID32Bits(BlePeripheralDeviceParseAdvData &parseAdvData)
1262 {
1263     if (parseAdvData.length < BLE_UUID_LEN_32) {
1264         return;
1265     }
1266     uint32_t uuid = *(reinterpret_cast<uint32_t *>(parseAdvData.payload));
1267     std::string data = "";
1268     if (parseAdvData.length > BLE_UUID_LEN_32) {
1269         data = std::string(
1270             reinterpret_cast<char *>(parseAdvData.payload + BLE_UUID_LEN_32), parseAdvData.length - BLE_UUID_LEN_32);
1271     }
1272     SetServiceDataUUID(Uuid::ConvertFrom32Bits(uuid), data);
1273 }
1274 
SetServiceDataUUID128Bits(BlePeripheralDeviceParseAdvData & parseAdvData)1275 void BlePeripheralDevice::SetServiceDataUUID128Bits(BlePeripheralDeviceParseAdvData &parseAdvData)
1276 {
1277     if (parseAdvData.length < BLE_UUID_LEN_128) {
1278         return;
1279     }
1280     std::string data = "";
1281     if (parseAdvData.length > BLE_UUID_LEN_128) {
1282         data = std::string(
1283             reinterpret_cast<char *>(parseAdvData.payload + BLE_UUID_LEN_128), parseAdvData.length - BLE_UUID_LEN_128);
1284     }
1285     SetServiceDataUUID(Uuid::ConvertFromBytesLE(parseAdvData.payload), data);
1286 }
1287 
1288 /**
1289  * @brief Set device name.
1290  *
1291  * @param name Device name.
1292  * @since 6
1293  */
SetName(const std::string & name)1294 void BlePeripheralDevice::SetName(const std::string &name)
1295 {
1296     name_ = name;
1297     isName_ = true;
1298 }
1299 
1300 /**
1301  * @brief Set device roles.
1302  *
1303  * @param roles Device roles.
1304  * @since 6
1305  */
SetRoles(uint8_t roles)1306 void BlePeripheralDevice::SetRoles(uint8_t roles)
1307 {
1308     roles_ = roles;
1309 }
1310 
1311 /**
1312  * @brief Set bonded from local.
1313  *
1314  * @param flag Advertiser flag.
1315  * @since 6
1316  */
SetBondedFromLocal(bool flag)1317 void BlePeripheralDevice::SetBondedFromLocal(bool flag)
1318 {
1319     bondFlag_ = flag;
1320 }
1321 
1322 /**
1323  * @brief Set acl connection state.
1324  *
1325  * @param connectState Acl connection state.
1326  * @since 6
1327  */
SetAclConnectState(int connectState)1328 void BlePeripheralDevice::SetAclConnectState(int connectState)
1329 {
1330     aclConnected_ = connectState;
1331 }
1332 
1333 /**
1334  * @brief Set acl connection handle.
1335  *
1336  * @param handle Acl connection handle.
1337  * @since 6
1338  */
SetConnectionHandle(int handle)1339 void BlePeripheralDevice::SetConnectionHandle(int handle)
1340 {
1341     connectionHandle_ = handle;
1342 }
1343 
1344 /**
1345  * @brief Check if device acl is connected.
1346  *
1347  * @return Returns <b>true</b> if device acl is connected;
1348  *         Returns <b>false</b> otherwise.
1349  * @since 6
1350  */
IsAclConnected() const1351 bool BlePeripheralDevice::IsAclConnected() const
1352 {
1353     if (aclConnected_ != BLE_CONNECTION_STATE_DISCONNECTED) {
1354         return true;
1355     } else {
1356         return false;
1357     }
1358 }
1359 
1360 /**
1361  * @brief Check if device acl Encrypted.
1362  *
1363  * @return Returns <b>true</b> if device acl is Encrypted;
1364  *         Returns <b>false</b> otherwise.
1365  * @since 6
1366  */
IsAclEncrypted() const1367 bool BlePeripheralDevice::IsAclEncrypted() const
1368 {
1369     if (aclConnected_ > BLE_CONNECTION_STATE_CONNECTED) {
1370         return true;
1371     } else {
1372         return false;
1373     }
1374 }
1375 
1376 /**
1377  * @brief Check if device was bonded from local.
1378  *
1379  * @return Returns <b>true</b> if device was bonded from local;
1380  *         Returns <b>false</b> otherwise.
1381  * @since 6
1382  */
IsBondedFromLocal() const1383 bool BlePeripheralDevice::IsBondedFromLocal() const
1384 {
1385     return bondFlag_;
1386 }
1387 
1388 /**
1389  * @brief Get acl connection handle.
1390  *
1391  * @return Returns acl connection handle;
1392  * @since 6
1393  */
GetConnectionHandle() const1394 int BlePeripheralDevice::GetConnectionHandle() const
1395 {
1396     return connectionHandle_;
1397 }
1398 
1399 /**
1400  * @brief Get device type.
1401  *
1402  * @return Returns device type.
1403  * @since 6
1404  */
GetDeviceType() const1405 uint8_t BlePeripheralDevice::GetDeviceType() const
1406 {
1407     if ((adFlag_ & BLE_ADV_FLAG_BREDR_NOT_SPT) > 0) {
1408         return BLE_BT_DEVICE_TYPE_DUMO;
1409     }
1410     return BLE_BT_DEVICE_TYPE_BLE;
1411 }
1412 
1413 /**
1414  * @brief Get advertising flag.
1415  *
1416  * @return Returns advertising flag.
1417  * @since 6
1418  */
GetAdFlag() const1419 uint8_t BlePeripheralDevice::GetAdFlag() const
1420 {
1421     return adFlag_;
1422 }
1423 
1424 /**
1425  * @brief Get paired status.
1426  *
1427  * @return Returns paired status.
1428  * @since 6
1429  */
GetPairedStatus() const1430 uint8_t BlePeripheralDevice::GetPairedStatus() const
1431 {
1432     return pairState_;
1433 }
1434 
1435 /**
1436  * @brief Set paired status.
1437  *
1438  * @param status Paired status.
1439  * @return Returns <b>true</b> if the operation is successful;
1440  *         Returns <b>false</b> otherwise.
1441  * @since 6
1442  */
SetPairedStatus(uint8_t status)1443 bool BlePeripheralDevice::SetPairedStatus(uint8_t status)
1444 {
1445     if (status < BLE_PAIR_NONE || status > BLE_PAIR_CANCELING) {
1446         return false;
1447     }
1448     if (pairState_ == status) {
1449         return true;
1450     }
1451     pairState_ = status;
1452     return true;
1453 }
1454 
1455 /**
1456  * @brief Set alias name.
1457  *
1458  * @param name Device alias name.
1459  * @since 6
1460  */
SetAliasName(const std::string & name)1461 void BlePeripheralDevice::SetAliasName(const std::string &name)
1462 {
1463     aliasName_ = name;
1464 }
1465 
1466 /**
1467  * @brief Get alias name.
1468  *
1469  * @return Returns alias name.
1470  * @since 6
1471  */
GetAliasName() const1472 std::string BlePeripheralDevice::GetAliasName() const
1473 {
1474     return aliasName_;
1475 }
1476 
1477 /**
1478  * @brief Set IO capability.
1479  *
1480  * @param io IO capability
1481  * @since 6
1482  */
SetIoCapability(uint8_t io)1483 void BlePeripheralDevice::SetIoCapability(uint8_t io)
1484 {
1485     ioCapability_ = io;
1486 }
1487 
1488 /**
1489  * @brief Get IO capability.
1490  *
1491  * @return Returns IO capability.
1492  * @since 6
1493  */
GetIoCapability() const1494 uint8_t BlePeripheralDevice::GetIoCapability() const
1495 {
1496     return ioCapability_;
1497 }
1498 
1499 /**
1500  * @brief Set advertising flag.
1501  *
1502  * @param adFlag Advertising flag.
1503  * @since 6
1504  */
SetAdFlag(uint8_t adFlag)1505 void BlePeripheralDevice::SetAdFlag(uint8_t adFlag)
1506 {
1507     adFlag_ = adFlag;
1508 }
1509 
1510 /**
1511  * @brief Set device appearance.
1512  *
1513  * @param device Appearance.
1514  * @since 6
1515  */
SetAppearance(uint16_t appearance)1516 void BlePeripheralDevice::SetAppearance(uint16_t appearance)
1517 {
1518     appearance_ = appearance;
1519     isAppearance_ = true;
1520 }
1521 
1522 /**
1523  * @brief Set manufacturer data.
1524  *
1525  * @param manufacturerData Manufacturer data.
1526  * @since 6
1527  */
SetManufacturerData(std::string manufacturerData)1528 void BlePeripheralDevice::SetManufacturerData(std::string manufacturerData)
1529 {
1530     if (manufacturerData.size() > BLE_UUID_LEN_16) {
1531         uint16_t manufacturerId = uint8_t(manufacturerData[0]) | (uint16_t(manufacturerData[1]) << BLE_ONE_BYTE_LEN);
1532         std::map<uint16_t, std::string>::const_iterator iter = manufacturerData_.find(manufacturerId);
1533         if (iter == manufacturerData_.cend()) {
1534             manufacturerData_.insert(std::make_pair(manufacturerId, manufacturerData.substr(BLE_UUID_LEN_16)));
1535         }
1536         isManufacturerData_ = true;
1537     } else {
1538         manufacturerData_.clear();
1539         isManufacturerData_ = false;
1540     }
1541 }
1542 
1543 /**
1544  * @brief Set service data UUID.
1545  *
1546  * @param uuid Service data UUID.
1547  * @since 6
1548  */
SetServiceDataUUID(Uuid uuid,std::string data)1549 void BlePeripheralDevice::SetServiceDataUUID(Uuid uuid, std::string data)
1550 {
1551     isServiceData_ = true;
1552     auto iter = std::find(serviceDataUUIDs_.begin(), serviceDataUUIDs_.end(), uuid);
1553     if (iter == serviceDataUUIDs_.end()) {
1554         serviceDataUUIDs_.push_back(uuid);
1555         serviceData_.push_back(data);
1556     }
1557 }
1558 
1559 /**
1560  * @brief Set service UUID.
1561  *
1562  * @param serviceUUID Service UUID.
1563  * @since 6
1564  */
SetServiceUUID(Uuid serviceUUID)1565 void BlePeripheralDevice::SetServiceUUID(Uuid serviceUUID)
1566 {
1567     isServiceUUID_ = true;
1568     auto iter = std::find(serviceUUIDs_.begin(), serviceUUIDs_.end(), serviceUUID);
1569     if (iter == serviceUUIDs_.end()) {
1570         serviceUUIDs_.push_back(serviceUUID);
1571     }
1572 }
1573 /**
1574  * @brief Set TX power.
1575  *
1576  * @param txPower TX power.
1577  * @since 6
1578  */
SetTXPower(int8_t txPower)1579 void BlePeripheralDevice::SetTXPower(int8_t txPower)
1580 {
1581     isTXPower_ = true;
1582     txPower_ = txPower;
1583 }
1584 /**
1585  * @brief Get peripheral device.
1586  *
1587  * @return Returns peripheral device pointer.
1588  * @since 6
1589  */
GetPeripheralDevice() const1590 BlePeripheralDevice BleScanResultImpl::GetPeripheralDevice() const
1591 {
1592     return peripheralDevice_;
1593 }
1594 
1595 /**
1596  * @brief Set peripheral device.
1597  *
1598  * @param dev Peripheral device.
1599  * @since 6
1600  */
SetPeripheralDevice(const BlePeripheralDevice & dev)1601 void BleScanResultImpl::SetPeripheralDevice(const BlePeripheralDevice &dev)
1602 {
1603     peripheralDevice_ = dev;
1604 }
1605 
1606 /**
1607  * @brief Get advertiser data packet.
1608  *
1609  * @return Returns advertiser data packet.
1610  * @since 6
1611  */
GetPayload() const1612 uint8_t *BlePeripheralDevice::GetPayload() const
1613 {
1614     return payload_;
1615 }
1616 
1617 /**
1618  * @brief Get advertising packet length.
1619  *
1620  * @return Returns advertising packet length.
1621  * @since 6
1622  */
GetPayloadLen() const1623 size_t BlePeripheralDevice::GetPayloadLen() const
1624 {
1625     return payloadLen_;
1626 }
1627 }  // namespace bluetooth
1628 }  // namespace OHOS
1629