1 /*
2 * Copyright (C) 2021 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 #include "bluetooth_ble_advertiser.h"
16
17 #include "bluetooth_ble_advertise_callback_stub.h"
18 #include "bluetooth_def.h"
19 #include "bluetooth_errorcode.h"
20 #include "bluetooth_host.h"
21 #include "bluetooth_log.h"
22 #include "bluetooth_observer_map.h"
23 #include "bluetooth_utils.h"
24 #include "i_bluetooth_ble_advertiser.h"
25 #include "iservice_registry.h"
26 #include "system_ability_definition.h"
27
28 #include <memory>
29
30 namespace OHOS {
31 namespace Bluetooth {
32 using namespace OHOS::bluetooth;
33 std::mutex g_bleProxyMutex;
34 struct BleAdvertiser::impl {
35 impl();
36 ~impl();
37 void ConvertBleAdvertiserData(const BleAdvertiserData &data, BluetoothBleAdvertiserData &outData);
38 uint32_t GetAdvertiserTotalBytes(const BluetoothBleAdvertiserData &data, bool isFlagsIncluded);
39 int32_t CheckAdvertiserData(const BluetoothBleAdvertiserSettings &setting,
40 const BluetoothBleAdvertiserData &advData, const BluetoothBleAdvertiserData &scanResponse);
41 bool InitBleAdvertiserProxy(void);
42
43 class BluetoothBleAdvertiserCallbackImp : public BluetoothBleAdvertiseCallbackStub {
44 public:
BluetoothBleAdvertiserCallbackImp(BleAdvertiser::impl & bleAdvertiser)45 explicit BluetoothBleAdvertiserCallbackImp(BleAdvertiser::impl &bleAdvertiser)
46 : bleAdvertiser_(bleAdvertiser){};
~BluetoothBleAdvertiserCallbackImp()47 ~BluetoothBleAdvertiserCallbackImp()
48 {}
49
OnStartResultEvent(int32_t result,int32_t advHandle,int32_t opcode)50 void OnStartResultEvent(int32_t result, int32_t advHandle, int32_t opcode) override
51 {
52 HILOGD("result: %{public}d, advHandle: %{public}d, opcode: %{public}d", result, advHandle, opcode);
53 BleAdvertiseCallback *observer = nullptr;
54 if (opcode == bluetooth::BLE_ADV_START_FAILED_OP_CODE) {
55 observer = bleAdvertiser_.callbacks_.PopAdvertiserObserver(advHandle);
56 } else {
57 observer = bleAdvertiser_.callbacks_.GetAdvertiserObserver(advHandle);
58 }
59
60 if (observer != nullptr) {
61 observer->OnStartResultEvent(result);
62 }
63 }
64
OnAutoStopAdvEvent(int32_t advHandle)65 void OnAutoStopAdvEvent(int32_t advHandle) override
66 {
67 HILOGI("advHandle: %{public}d", advHandle);
68 BleAdvertiseCallback *observer = bleAdvertiser_.callbacks_.GetAdvertiserObserver(advHandle);
69 if (observer != nullptr) {
70 bleAdvertiser_.callbacks_.Deregister(observer);
71 }
72 }
73
OnSetAdvDataEvent(int32_t result,int32_t advHandle)74 void OnSetAdvDataEvent(int32_t result, int32_t advHandle) override
75 {
76 HILOGI("result: %{public}d, advHandle: %{public}d", result, advHandle);
77 BleAdvertiseCallback *observer = bleAdvertiser_.callbacks_.GetAdvertiserObserver(advHandle);
78 if (observer) {
79 observer->OnSetAdvDataEvent(result);
80 }
81 }
82
83 private:
84 BleAdvertiser::impl &bleAdvertiser_;
85 BLUETOOTH_DISALLOW_COPY_AND_ASSIGN(BluetoothBleAdvertiserCallbackImp);
86 };
87 sptr<BluetoothBleAdvertiserCallbackImp> callbackImp_ = nullptr;
88
89 BluetoothObserverMap<BleAdvertiseCallback> callbacks_;
90 sptr<IBluetoothBleAdvertiser> proxy_ = nullptr;
91
92 class BleAdvertiserDeathRecipient;
93 sptr<BleAdvertiserDeathRecipient> deathRecipient_ = nullptr;
94 };
95
96 class BleAdvertiser::impl::BleAdvertiserDeathRecipient final : public IRemoteObject::DeathRecipient {
97 public:
BleAdvertiserDeathRecipient(BleAdvertiser::impl & impl)98 explicit BleAdvertiserDeathRecipient(BleAdvertiser::impl &impl) : owner_(impl) {};
99 ~BleAdvertiserDeathRecipient() final = default;
100 BLUETOOTH_DISALLOW_COPY_AND_ASSIGN(BleAdvertiserDeathRecipient);
101
OnRemoteDied(const wptr<IRemoteObject> & remote)102 void OnRemoteDied(const wptr<IRemoteObject> &remote) final
103 {
104 HILOGI("enter");
105 std::lock_guard<std::mutex> lock(g_bleProxyMutex);
106 if (!owner_.proxy_) {
107 return;
108 }
109 owner_.proxy_ = nullptr;
110 owner_.callbacks_.Clear();
111 }
112
113 private:
114 BleAdvertiser::impl &owner_;
115 };
116
InitBleAdvertiserProxy(void)117 bool BleAdvertiser::impl::InitBleAdvertiserProxy(void)
118 {
119 std::lock_guard<std::mutex> lock(g_bleProxyMutex);
120 if (proxy_) {
121 return true;
122 }
123 HILOGI("enter");
124 proxy_ = GetRemoteProxy<IBluetoothBleAdvertiser>(BLE_ADVERTISER_SERVER);
125 if (!proxy_) {
126 HILOGE("get bleAdvertiser proxy_ failed");
127 return false;
128 }
129 callbackImp_ = new BluetoothBleAdvertiserCallbackImp(*this);
130 if (callbackImp_ != nullptr) {
131 proxy_->RegisterBleAdvertiserCallback(callbackImp_);
132 }
133
134 deathRecipient_ = new BleAdvertiserDeathRecipient(*this);
135 if (deathRecipient_ != nullptr) {
136 proxy_->AsObject()->AddDeathRecipient(deathRecipient_);
137 }
138 return true;
139 }
140
impl()141 BleAdvertiser::impl::impl()
142 {}
143
~impl()144 BleAdvertiser::impl::~impl()
145 {
146 if (proxy_ != nullptr) {
147 proxy_->DeregisterBleAdvertiserCallback(callbackImp_);
148 proxy_->AsObject()->RemoveDeathRecipient(deathRecipient_);
149 }
150 }
151
BleAdvertiser()152 BleAdvertiser::BleAdvertiser() : pimpl(nullptr)
153 {
154 if (pimpl == nullptr) {
155 pimpl = std::make_unique<impl>();
156 if (!pimpl) {
157 HILOGE("failed, no pimpl");
158 }
159 }
160
161 HILOGI("successful");
162 }
163
~BleAdvertiser()164 BleAdvertiser::~BleAdvertiser()
165 {}
166
ConvertBleAdvertiserData(const BleAdvertiserData & data,BluetoothBleAdvertiserData & outData)167 void BleAdvertiser::impl::ConvertBleAdvertiserData(const BleAdvertiserData &data, BluetoothBleAdvertiserData &outData)
168 {
169 std::map<uint16_t, std::string> manufacturerData = data.GetManufacturerData();
170 for (auto iter = manufacturerData.begin(); iter != manufacturerData.end(); iter++) {
171 outData.AddManufacturerData(iter->first, iter->second);
172 }
173 std::map<ParcelUuid, std::string> serviceData = data.GetServiceData();
174 for (auto it = serviceData.begin(); it != serviceData.end(); it++) {
175 outData.AddServiceData(Uuid::ConvertFromString(it->first.ToString()), it->second);
176 }
177 std::vector<ParcelUuid> serviceUuids = data.GetServiceUuids();
178 for (auto it = serviceUuids.begin(); it != serviceUuids.end(); it++) {
179 outData.AddServiceUuid(Uuid::ConvertFromString(it->ToString()));
180 }
181 outData.SetIncludeDeviceName(data.GetIncludeDeviceName());
182 }
183
GetAdvertiserTotalBytes(const BluetoothBleAdvertiserData & data,bool isFlagsIncluded)184 uint32_t BleAdvertiser::impl::GetAdvertiserTotalBytes(const BluetoothBleAdvertiserData &data, bool isFlagsIncluded)
185 {
186 // If the flag field is contained, the protocol stack adds the flag field, which consists of three bytes.
187 uint32_t size = (isFlagsIncluded) ? BLE_ADV_FLAGS_FIELD_LENGTH : 0;
188 std::map<uint16_t, std::string> manufacturerData = data.GetManufacturerData();
189 for (auto iter = manufacturerData.begin(); iter != manufacturerData.end(); ++iter) {
190 size += BLE_ADV_PER_FIELD_OVERHEAD_LENGTH + BLE_ADV_MANUFACTURER_ID_LENGTH + iter->second.length();
191 }
192
193 std::map<Uuid, std::string> serviceData = data.GetServiceData();
194 for (auto iter = serviceData.begin(); iter != serviceData.end(); ++iter) {
195 size += BLE_ADV_PER_FIELD_OVERHEAD_LENGTH + static_cast<uint32_t>(iter->first.GetUuidType())
196 + iter->second.length();
197 }
198
199 std::vector<Uuid> serviceUuids = data.GetServiceUuids();
200 for (auto iter = serviceUuids.begin(); iter != serviceUuids.end(); ++iter) {
201 size += BLE_ADV_PER_FIELD_OVERHEAD_LENGTH + static_cast<uint32_t>(iter->GetUuidType());
202 }
203
204 if (data.GetIncludeDeviceName()) {
205 uint32_t deviceNameLen = BluetoothHost::GetDefaultHost().GetLocalName().length();
206 deviceNameLen = (deviceNameLen > DEVICE_NAME_MAX_LEN) ? DEVICE_NAME_MAX_LEN : deviceNameLen;
207 size += BLE_ADV_PER_FIELD_OVERHEAD_LENGTH + deviceNameLen;
208 }
209 return size;
210 }
211
CheckAdvertiserData(const BluetoothBleAdvertiserSettings & setting,const BluetoothBleAdvertiserData & advData,const BluetoothBleAdvertiserData & scanResponse)212 int32_t BleAdvertiser::impl::CheckAdvertiserData(const BluetoothBleAdvertiserSettings &setting,
213 const BluetoothBleAdvertiserData &advData, const BluetoothBleAdvertiserData &scanResponse)
214 {
215 uint32_t maxSize = BLE_ADV_MAX_LEGACY_ADVERTISING_DATA_BYTES;
216 if (!setting.IsLegacyMode()) {
217 maxSize = static_cast<uint32_t>(BluetoothHost::GetDefaultHost().GetBleMaxAdvertisingDataLength());
218 }
219 // If is Connect, flag field is contained in AdvertiserData.
220 uint32_t size = GetAdvertiserTotalBytes(advData, setting.IsConnectable());
221 if (size > maxSize) {
222 HILOGE("bleAdvertiserData size = %{public}d, maxSize = %{public}d", size, maxSize);
223 return BT_ERR_INTERNAL_ERROR;
224 }
225 size = GetAdvertiserTotalBytes(scanResponse, false);
226 if (size > maxSize) {
227 HILOGE("bleScanResponse size = %{public}d, maxSize = %{public}d,", size, maxSize);
228 return BT_ERR_INTERNAL_ERROR;
229 }
230 return BT_NO_ERROR;
231 }
232
StartAdvertising(const BleAdvertiserSettings & settings,const BleAdvertiserData & advData,const BleAdvertiserData & scanResponse,BleAdvertiseCallback & callback)233 int BleAdvertiser::StartAdvertising(const BleAdvertiserSettings &settings, const BleAdvertiserData &advData,
234 const BleAdvertiserData &scanResponse, BleAdvertiseCallback &callback)
235 {
236 if (!IS_BLE_ENABLED()) {
237 HILOGE("bluetooth is off.");
238 return BT_ERR_INVALID_STATE;
239 }
240
241 if (pimpl == nullptr || !pimpl->InitBleAdvertiserProxy()) {
242 HILOGE("pimpl or bleAdvertiser proxy is nullptr");
243 return BT_ERR_INTERNAL_ERROR;
244 }
245
246 BluetoothBleAdvertiserSettings setting;
247 setting.SetConnectable(settings.IsConnectable());
248 setting.SetInterval(settings.GetInterval());
249 setting.SetLegacyMode(settings.IsLegacyMode());
250 setting.SetTxPower(settings.GetTxPower());
251
252 BluetoothBleAdvertiserData bleAdvertiserData;
253 BluetoothBleAdvertiserData bleScanResponse;
254 bleAdvertiserData.SetAdvFlag(advData.GetAdvFlag());
255 pimpl->ConvertBleAdvertiserData(advData, bleAdvertiserData);
256 pimpl->ConvertBleAdvertiserData(scanResponse, bleScanResponse);
257
258 int ret = pimpl->CheckAdvertiserData(setting, bleAdvertiserData, bleScanResponse);
259 if (ret != BT_NO_ERROR) {
260 return ret;
261 }
262
263 int32_t advHandle = BLE_INVALID_ADVERTISING_HANDLE;
264 if (pimpl->callbacks_.IsExistAdvertiserCallback(&callback, advHandle)) {
265 ret = pimpl->proxy_->StartAdvertising(setting, bleAdvertiserData, bleScanResponse, advHandle, false);
266 } else {
267 ret = pimpl->proxy_->GetAdvertiserHandle(advHandle);
268 if (ret != BT_NO_ERROR || advHandle == BLE_INVALID_ADVERTISING_HANDLE) {
269 HILOGE("Invalid advertising handle");
270 callback.OnStartResultEvent(BLE_INVALID_ADVERTISING_HANDLE);
271 return ret;
272 }
273 pimpl->callbacks_.Register(advHandle, &callback);
274 ret = pimpl->proxy_->StartAdvertising(setting, bleAdvertiserData, bleScanResponse, advHandle, false);
275 }
276 return ret;
277 }
278
StartAdvertising(const BleAdvertiserSettings & settings,const std::vector<uint8_t> & advData,const std::vector<uint8_t> & scanResponse,BleAdvertiseCallback & callback)279 int BleAdvertiser::StartAdvertising(const BleAdvertiserSettings &settings, const std::vector<uint8_t> &advData,
280 const std::vector<uint8_t> &scanResponse, BleAdvertiseCallback &callback)
281 {
282 if (!IS_BLE_ENABLED()) {
283 HILOGE("bluetooth is off.");
284 return BT_ERR_INVALID_STATE;
285 }
286
287 if (pimpl == nullptr || !pimpl->InitBleAdvertiserProxy()) {
288 HILOGE("pimpl or bleAdvertiser proxy is nullptr");
289 return BT_ERR_INTERNAL_ERROR;
290 }
291
292 BluetoothBleAdvertiserSettings setting;
293 setting.SetConnectable(settings.IsConnectable());
294 setting.SetInterval(settings.GetInterval());
295 setting.SetLegacyMode(settings.IsLegacyMode());
296 setting.SetTxPower(settings.GetTxPower());
297
298 BluetoothBleAdvertiserData bleAdvertiserData;
299 bleAdvertiserData.SetPayload(std::string(advData.begin(), advData.end()));
300 bleAdvertiserData.SetAdvFlag(0);
301 BluetoothBleAdvertiserData bleScanResponse;
302 bleScanResponse.SetPayload(std::string(scanResponse.begin(), scanResponse.end()));
303
304 int32_t advHandle = BLE_INVALID_ADVERTISING_HANDLE;
305 int ret = BT_ERR_INTERNAL_ERROR;
306 if (pimpl->callbacks_.IsExistAdvertiserCallback(&callback, advHandle)) {
307 ret = pimpl->proxy_->StartAdvertising(setting, bleAdvertiserData, bleScanResponse, advHandle, true);
308 } else {
309 ret = pimpl->proxy_->GetAdvertiserHandle(advHandle);
310 if (ret != BT_NO_ERROR || advHandle == BLE_INVALID_ADVERTISING_HANDLE) {
311 HILOGE("Invalid advertising handle");
312 callback.OnStartResultEvent(BLE_INVALID_ADVERTISING_HANDLE);
313 return ret;
314 }
315 pimpl->callbacks_.Register(advHandle, &callback);
316 ret = pimpl->proxy_->StartAdvertising(setting, bleAdvertiserData, bleScanResponse, advHandle, true);
317 }
318 return ret;
319 }
320
SetAdvertisingData(const std::vector<uint8_t> & advData,const std::vector<uint8_t> & scanResponse,BleAdvertiseCallback & callback)321 void BleAdvertiser::SetAdvertisingData(const std::vector<uint8_t> &advData, const std::vector<uint8_t> &scanResponse,
322 BleAdvertiseCallback &callback)
323 {
324 if (!IS_BLE_ENABLED()) {
325 HILOGE("bluetooth is off.");
326 return;
327 }
328
329 if (pimpl == nullptr || !pimpl->InitBleAdvertiserProxy()) {
330 HILOGE("pimpl or bleAdvertiser proxy is nullptr");
331 return;
332 }
333
334 int advHandle = BLE_INVALID_ADVERTISING_HANDLE;
335 if (!pimpl->callbacks_.IsExistAdvertiserCallback(&callback, advHandle)) {
336 HILOGE("Advertising is not started");
337 return;
338 }
339
340 BluetoothBleAdvertiserData bleAdvertiserData;
341 bleAdvertiserData.SetPayload(std::string(advData.begin(), advData.end()));
342 BluetoothBleAdvertiserData bleScanResponse;
343 bleScanResponse.SetPayload(std::string(scanResponse.begin(), scanResponse.end()));
344 pimpl->proxy_->SetAdvertisingData(bleAdvertiserData, bleScanResponse, advHandle);
345 }
346
StopAdvertising(BleAdvertiseCallback & callback)347 int BleAdvertiser::StopAdvertising(BleAdvertiseCallback &callback)
348 {
349 if (!IS_BLE_ENABLED()) {
350 HILOGE("bluetooth is off.");
351 return BT_ERR_INVALID_STATE;
352 }
353
354 if (pimpl == nullptr || !pimpl->InitBleAdvertiserProxy()) {
355 HILOGE("pimpl or bleAdvertiser proxy is nullptr");
356 return BT_ERR_INTERNAL_ERROR;
357 }
358
359 HILOGI("enter");
360 uint8_t advHandle = pimpl->callbacks_.GetAdvertiserHandle(&callback);
361 if (advHandle == BLE_INVALID_ADVERTISING_HANDLE) {
362 HILOGE("Invalid advertising handle");
363 return BT_ERR_INTERNAL_ERROR;
364 }
365
366 BleAdvertiseCallback *observer = pimpl->callbacks_.GetAdvertiserObserver(advHandle);
367 if (observer != nullptr) {
368 pimpl->callbacks_.Deregister(observer);
369 }
370
371 int ret = pimpl->proxy_->StopAdvertising(advHandle);
372 return ret;
373 }
374
Close(BleAdvertiseCallback & callback)375 void BleAdvertiser::Close(BleAdvertiseCallback &callback)
376 {
377 if (!IS_BLE_ENABLED()) {
378 HILOGE("BLE is not enabled");
379 return;
380 }
381
382 if (pimpl == nullptr || !pimpl->InitBleAdvertiserProxy()) {
383 HILOGE("pimpl or bleAdvertiser proxy is nullptr");
384 return;
385 }
386
387 HILOGI("enter");
388 if (pimpl->proxy_ != nullptr) {
389 uint8_t advHandle = pimpl->callbacks_.GetAdvertiserHandle(&callback);
390 if (advHandle != BLE_INVALID_ADVERTISING_HANDLE) {
391 pimpl->proxy_->Close(advHandle);
392 }
393
394 BleAdvertiseCallback *observer = pimpl->callbacks_.GetAdvertiserObserver(advHandle);
395 if (observer != nullptr) {
396 pimpl->callbacks_.Deregister(observer);
397 }
398 }
399 }
400
GetAdvHandle(BleAdvertiseCallback & callback)401 uint8_t BleAdvertiser::GetAdvHandle(BleAdvertiseCallback &callback)
402 {
403 if (!BluetoothHost::GetDefaultHost().IsBleEnabled()) {
404 HILOGE("BLE is not enabled");
405 return BLE_INVALID_ADVERTISING_HANDLE;
406 }
407 return pimpl->callbacks_.GetAdvertiserHandle(&callback);
408 }
409
BleAdvertiserData()410 BleAdvertiserData::BleAdvertiserData()
411 {}
412
~BleAdvertiserData()413 BleAdvertiserData::~BleAdvertiserData()
414 {}
415
AddServiceData(const ParcelUuid & uuid,const std::string & serviceData)416 void BleAdvertiserData::AddServiceData(const ParcelUuid &uuid, const std::string &serviceData)
417 {
418 if (serviceData.empty()) {
419 HILOGE("serviceData is empty");
420 return;
421 }
422
423 serviceData_.insert(std::make_pair(uuid, serviceData));
424 }
425
AddManufacturerData(uint16_t manufacturerId,const std::string & data)426 void BleAdvertiserData::AddManufacturerData(uint16_t manufacturerId, const std::string &data)
427 {
428 if (data.empty()) {
429 HILOGE("serviceData is empty");
430 return;
431 }
432
433 manufacturerSpecificData_.insert(std::make_pair(manufacturerId, data));
434 }
435
GetManufacturerData() const436 std::map<uint16_t, std::string> BleAdvertiserData::GetManufacturerData() const
437 {
438 return manufacturerSpecificData_;
439 }
440
AddServiceUuid(const ParcelUuid & serviceUuid)441 void BleAdvertiserData::AddServiceUuid(const ParcelUuid &serviceUuid)
442 {
443 serviceUuids_.push_back(serviceUuid);
444 }
445
GetServiceUuids() const446 std::vector<ParcelUuid> BleAdvertiserData::GetServiceUuids() const
447 {
448 return serviceUuids_;
449 }
450
SetAdvFlag(uint8_t flag)451 void BleAdvertiserData::SetAdvFlag(uint8_t flag)
452 {
453 advFlag_ = flag;
454 }
455
GetAdvFlag() const456 uint8_t BleAdvertiserData::GetAdvFlag() const
457 {
458 return advFlag_;
459 }
460
GetServiceData() const461 std::map<ParcelUuid, std::string> BleAdvertiserData::GetServiceData() const
462 {
463 return serviceData_;
464 }
465
GetIncludeDeviceName() const466 bool BleAdvertiserData::GetIncludeDeviceName() const
467 {
468 return includeDeviceName_;
469 }
470
SetIncludeDeviceName(bool flag)471 void BleAdvertiserData::SetIncludeDeviceName(bool flag)
472 {
473 includeDeviceName_ = flag;
474 }
475
BleAdvertiserSettings()476 BleAdvertiserSettings::BleAdvertiserSettings()
477 {}
478
~BleAdvertiserSettings()479 BleAdvertiserSettings::~BleAdvertiserSettings()
480 {}
481
SetConnectable(bool connectable)482 void BleAdvertiserSettings::SetConnectable(bool connectable)
483 {
484 connectable_ = connectable;
485 }
486
IsConnectable() const487 bool BleAdvertiserSettings::IsConnectable() const
488 {
489 return connectable_;
490 }
491
SetLegacyMode(bool legacyMode)492 void BleAdvertiserSettings::SetLegacyMode(bool legacyMode)
493 {
494 legacyMode_ = legacyMode;
495 }
496
IsLegacyMode() const497 bool BleAdvertiserSettings::IsLegacyMode() const
498 {
499 return legacyMode_;
500 }
501
SetInterval(uint16_t interval)502 void BleAdvertiserSettings::SetInterval(uint16_t interval)
503 {
504 interval_ = interval;
505 }
506
GetInterval() const507 uint16_t BleAdvertiserSettings::GetInterval() const
508 {
509 return interval_;
510 }
511
SetTxPower(uint8_t txPower)512 void BleAdvertiserSettings::SetTxPower(uint8_t txPower)
513 {
514 txPower_ = txPower;
515 }
516
GetTxPower() const517 uint8_t BleAdvertiserSettings::GetTxPower() const
518 {
519 return txPower_;
520 }
521
GetPrimaryPhy() const522 int BleAdvertiserSettings::GetPrimaryPhy() const
523 {
524 return primaryPhy_;
525 }
526
SetPrimaryPhy(int primaryPhy)527 void BleAdvertiserSettings::SetPrimaryPhy(int primaryPhy)
528 {
529 primaryPhy_ = primaryPhy;
530 }
531
GetSecondaryPhy() const532 int BleAdvertiserSettings::GetSecondaryPhy() const
533 {
534 return secondaryPhy_;
535 }
536
SetSecondaryPhy(int secondaryPhy)537 void BleAdvertiserSettings::SetSecondaryPhy(int secondaryPhy)
538 {
539 secondaryPhy_ = secondaryPhy;
540 }
541 } // namespace Bluetooth
542 } // namespace OHOS
543