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 #ifndef BLE_ADVERTISER_IMPL_H 17 #define BLE_ADVERTISER_IMPL_H 18 19 #include <map> 20 #include <mutex> 21 22 #include "adapter_manager.h" 23 #include "ble_defs.h" 24 #include "gap_le_if.h" 25 #include "interface_adapter_ble.h" 26 #include "log.h" 27 #include "log_util.h" 28 #include "timer.h" 29 30 /* 31 * @brief The Bluetooth subsystem. 32 */ 33 namespace OHOS { 34 namespace bluetooth { 35 /** 36 * @brief BLE advertiser wrap data. 37 */ 38 struct BleAdvertiserImplWrapData { BleAdvertiserImplWrapDataOHOS::bluetooth::BleAdvertiserImplWrapData39 BleAdvertiserImplWrapData(const BleAdvertiserSettingsImpl &settings, const BleAdvertiserDataImpl &advData, 40 const BleAdvertiserDataImpl &rspData, int advStatus, 41 const STOP_ALL_ADV_TYPE &isUserStopAdv = STOP_ADV_TYPE_SINGLE) 42 : settings_(settings), advData_(advData), rspData_(rspData), timer_(nullptr) 43 { 44 advStatus_ = advStatus; 45 stopAllAdvType_ = isUserStopAdv; 46 } 47 48 BleAdvertiserSettingsImpl settings_ {}; 49 BleAdvertiserDataImpl advData_ {}; 50 BleAdvertiserDataImpl rspData_ {}; 51 std::unique_ptr<utility::Timer> timer_ {}; 52 int advStatus_ {}; 53 STOP_ALL_ADV_TYPE stopAllAdvType_ {}; 54 }; 55 struct BleAdvertiserImplOp { BleAdvertiserImplOpOHOS::bluetooth::BleAdvertiserImplOp56 BleAdvertiserImplOp(uint8_t advHandleSet, ADV_HANDLE_STATUS advStatus) 57 :advHandle(advHandleSet), advOpStatus(advStatus) 58 {} 59 uint8_t advHandle {}; 60 ADV_HANDLE_STATUS advOpStatus {}; 61 }; 62 /** 63 * @brief BLE advertiser. 64 */ 65 class BleAdvertiserImpl { 66 public: 67 /** 68 * @brief Constructor. 69 */ 70 explicit BleAdvertiserImpl( 71 IBleAdvertiserCallback &callback, IAdapterBle &bleAdapter, utility::Dispatcher &dispatch); 72 73 /** 74 * @brief Destructor. 75 */ 76 ~BleAdvertiserImpl(); 77 78 /** 79 * @brief Get advertising status 80 * 81 * @return @c advertiser status. 82 */ 83 int GetAdvertisingStatus() const; 84 85 /** 86 * @brief Restart Bluetooth LE Advertising. 87 * 88 */ 89 void ReStartLegacyAdvertising() const; 90 91 /** 92 * @brief Start Bluetooth LE Advertising. 93 * 94 * @param [in] Advertising parameters. 95 * @param [in] Advertising data. 96 * @param [in] Scan response data. 97 * @param [in] Advertising handle. 98 */ 99 void StartAdvertising(const BleAdvertiserSettingsImpl &settings, const BleAdvertiserDataImpl &advData, 100 const BleAdvertiserDataImpl &scanResponse, uint8_t advHandle); 101 102 /** 103 * @brief Stop Bluetooth LE advertising. 104 * 105 * @param [in] Advertise handle. 106 * @param [in] True:RPA timer auto stop. 107 */ 108 void StopAdvertising(uint8_t advHandle) const; 109 void StartOrStopAllAdvertising(const STOP_ALL_ADV_TYPE &stopAllAdvType, bool isStartAdv = false) const; 110 /** 111 * @brief deregister scan callback to gap 112 * 113 * @return @c status. 114 */ 115 int DeregisterCallbackToGap(); 116 117 /** 118 * @brief Cleans up advertisers. 119 */ 120 void Close(uint8_t advHandle) const; 121 122 /** 123 * @brief Create advertising set handle. 124 * 125 * @return @c Advertising handle. 126 */ 127 uint8_t CreateAdvertiserSetHandle() const; 128 129 /** 130 * @brief Add characteristic value. 131 * 132 * @param adtype Type of the field. 133 * @param data Field data. 134 */ 135 void AddCharacteristicValue(uint8_t adtype, const std::string &data) const; 136 void GAPExAdvClearHandle(); 137 138 private: 139 void LegacyAdvertising(uint8_t advHandle); 140 void ExtentAdvertising(uint8_t advHandle); 141 /** 142 * @brief Gap set avertising parameter callback 143 * 144 * @param [in] status. 145 * @param [in] context. 146 */ 147 static void AdvSetParamResult(uint8_t status, void *context); 148 149 /** 150 * @brief Gap set avertising read tx power callback 151 * 152 * @param [in] status. 153 * @param [in] tx power level. 154 * @param [in] context. 155 */ 156 static void AdvReadTxPower(uint8_t status, int8_t txPower, void *context); 157 158 /** 159 * @brief Gap set advertising data callback 160 * 161 * @param [in] status. 162 * @param [in] context. 163 */ 164 static void AdvSetDataResult(uint8_t status, void *context); 165 166 /** 167 * @brief Gap set scan rsp data callback 168 * 169 * @param [in] status. 170 * @param [in] context. 171 */ 172 static void AdvSetScanRspDataResult(uint8_t status, void *context); 173 174 /** 175 * @brief Gap set advertising enable callback 176 * 177 * @param [in] status. 178 * @param [in] context. 179 */ 180 static void AdvSetEnableResult(uint8_t status, void *context); 181 182 // Extended Advertising callback 183 static void ExAdvSetRandAddrResult(uint8_t status, void *context); 184 static void ExAdvSetParamResult(uint8_t status, uint8_t selectTxPower, void *context); 185 static void ExAdvSetDataResult(uint8_t status, void *context); 186 static void ExAdvSetScanRspDataResult(uint8_t status, void *context); 187 static void ExAdvSetEnableResult(uint8_t status, void *context); 188 static void ExAdvRemoveHandleResult(uint8_t status, void *context); 189 static void ExAdvClearHandleResult(uint8_t status, void *context); 190 static void ExAdvScanRequestReceived(uint8_t advHandle, const BtAddr *scannerAddr, void *context); 191 static void ExAdvTerminatedAdvSet( 192 uint8_t status, uint8_t advHandle, uint16_t connectionHandle, uint8_t completedNumber, void *context); 193 194 /** 195 * @brief Set avertising parameter to gap 196 * 197 * @param [in] Avertising setting parameter. 198 * @return @c status. 199 */ 200 int SetAdvParamToGap(const BleAdvertiserSettingsImpl &settings) const; 201 202 /** 203 * @brief Set extend avertising parameter to gap 204 * 205 * @return @c status. 206 */ 207 int SetExAdvParamToGap(uint8_t advHandle, const BleAdvertiserSettingsImpl &settings) const; 208 209 /** 210 * @brief Set avertising parameter 211 * 212 * @param [in] Avertising setting parameter. 213 * @return @c status. 214 */ 215 void SetAdvParam(const BleAdvertiserSettingsImpl &settings) const; 216 217 /** 218 * @brief Set avertising data to gap 219 * 220 * @param [in] avertising data. 221 * @param [in] avertising setting data. 222 * @param [in] local txpower. 223 * @return @c status. 224 */ 225 int SetAdvDataToGap( 226 const BleAdvertiserDataImpl &advData, const BleAdvertiserSettingsImpl &settings, int8_t txPowerLevel) const; 227 228 /** 229 * @brief Set extend avertising data to gap 230 * 231 * @param [in] avertising data. 232 * @param [in] avertising setting data. 233 * @param [in] local txpower. 234 * @return @c status. 235 */ 236 int SetExAdvDataToGap( 237 const BleAdvertiserDataImpl &advData, const BleAdvertiserSettingsImpl &settings, int8_t txPowerLevel) const; 238 239 /** 240 * @brief Set avertising response data to gap 241 * 242 * @param [in] avertising response data. 243 * @param [in] local txpower value. 244 * @return @c status. 245 */ 246 int SetAdvScanRspDataToGap(const BleAdvertiserDataImpl &scanResponse, const BleAdvertiserSettingsImpl &settings, 247 int8_t txPowerLevel) const; 248 249 /** 250 * @brief Set extend avertising response data to gap 251 * 252 * @param [in] avertising response data. 253 * @param [in] local txpower value. 254 * @return @c status. 255 */ 256 int SetExAdvScanRspDataToGap(const BleAdvertiserDataImpl &scanResponse, const BleAdvertiserSettingsImpl &settings, 257 int8_t txPowerLevel) const; 258 259 /** 260 * @brief Set avertising enable status 261 * 262 * @param [in] avertising enable. 263 * @return @c status. 264 */ 265 int SetAdvEnableToGap(bool isEnable) const; 266 /** 267 * @brief Set extend avertising enable status 268 * 269 * @param [in] avertising enable. 270 * @return @c status. 271 */ 272 int SetExAdvEnableToGap(uint8_t advHandle, bool isEnable) const; 273 274 /** 275 * @brief Setextend avertising batch enable status 276 * 277 * @param [in] avertising enable. 278 * @return @c status. 279 */ 280 int SetExAdvBatchEnableToGap(bool isEnable) const; 281 282 /** 283 * @brief Register avertising callback to gap 284 * 285 * @return @c status. 286 */ 287 int RegisterCallbackToGap(); 288 289 /** 290 * @brief Register extend avertising callback to gap 291 * 292 * @return @c status. 293 */ 294 int RegisterExAdvCallbackToGap(); 295 296 /** 297 * @brief Check avertising parameter 298 * 299 * @param [in] avertising parameters. 300 * @param [in] avertising data. 301 * @param [in] scan response data. 302 * @return @c status. 303 */ 304 int CheckAdvertiserPara(const BleAdvertiserSettingsImpl &settings, const BleAdvertiserDataImpl &advData, 305 const BleAdvertiserDataImpl &scanResponse) const; 306 int CheckAdvertiserFlag(const std::string &payload) const; 307 static int CheckAdvertiserLen(uint8_t payload, uint8_t advType); 308 309 /** 310 * @brief Set avertising max interval 311 * 312 * @param [in] interval. 313 */ 314 void SetMaxInterval(uint16_t maxinterval) const; 315 316 /** 317 * @brief Set avertising min interval 318 * 319 * @param [in] min interval. 320 */ 321 void SetMinInterval(uint16_t mininterval) const; 322 323 /** 324 * @brief Set scan filter 325 * 326 * @param [in] White list. 327 * @param [in] White list. 328 */ 329 void SetFilter(bool scanReqWhitelistOnly, bool connectWhitelistOnly) const; 330 331 /** 332 * @brief Set channel map 333 * 334 * @param [in] channel map. 335 */ 336 void SetChannelMap(const BLE_ADV_CHANNEL &channelMap) const; 337 338 /** 339 * @brief timer call back 340 * 341 */ 342 static void TimerCallback(void *context, uint8_t advHandle); 343 static void TimerCallbackEx(void *context, uint8_t advHandle); 344 static void GenResPriAddrResult(uint8_t result, const uint8_t addr[BT_ADDRESS_SIZE], void *context); 345 346 void HandleGapEvent(const BLE_GAP_CB_EVENT &event, int status, int8_t txPower = 0); 347 void HandleGapExAdvEvent(const BLE_GAP_CB_EVENT &event, int status, int8_t txPower = 0, uint8_t handle = 0); 348 void RemoveAdvHandle(uint8_t handle) const; 349 void RemoveAllAdvHandle(int status) const; 350 void AdvSetEnableResultTask(uint8_t status); 351 void ExAdvSetEnableResultTask(uint8_t status); 352 void GapAdvParamSetCompleteEvt(int status) const; 353 void GapAdvReadTxPowerEvt(int status, int8_t txPower) const; 354 void GapAdvDataSetCompleteEvt(int status, int8_t txPower) const; 355 void GapAdvScanRspDataSetCompleteEvt(int status) const; 356 void GapAdvStartCompleteEvt(int status); 357 void GapAdvStopCompleteEvt(int status) const; 358 359 void GapExAdvSetRandAddrResultEvt(int status) const; 360 void GapExAdvParamSetCompleteEvt(int status, int8_t txPower) const; 361 void GapExAdvDataSetCompleteEvt(int status, int8_t txPower); 362 void GapExAdvScanRspDataSetCompleteEvt(int status); 363 void GapExAdvStartCompleteEvt(int status); 364 void GapExAdvStopCompleteEvt(int status) const; 365 void GapExAdvResolvingListStartCompleteEvt(int status) const; 366 void GapExAdvResolvingListStopCompleteEvt(int status) const; 367 void GapExAdvStopAllCompleteEvt(int status) const; 368 void GapExAdvRemoveHandleResultEvt(int status) const; 369 void GapExAdvTerminatedAdvSetEvt(int status, uint8_t handle) const; 370 void StartLegacyAdvOrExAdv(uint8_t advHandle); 371 static int GetMaxAdvertisingDataLength(const BleAdvertiserSettingsImpl &settings); 372 int ExAdvDataFragment(const BleAdvertiserDataImpl &data) const; 373 int ExResDataFragment(const BleAdvertiserDataImpl &data) const; 374 void GenResPriAddrResultTask(uint8_t result, BtAddr btAddr) const; 375 376 void StartAllAdvertising(const STOP_ALL_ADV_TYPE &stopAllAdvType, bool isStartAdv) const; 377 void StopAllAdvertising(const STOP_ALL_ADV_TYPE &stopAllAdvType, bool isStartAdv) const; 378 void UpdateAllAdvertisingStatus(const ADVERTISE_STATUS &advStatus) const; 379 380 /// Advertising callback 381 IBleAdvertiserCallback *callback_ = nullptr; 382 /// Gap exadv callback 383 GapExAdvCallback exAdvCallback_ {}; 384 IAdapterBle *bleAdapter_ = nullptr; 385 utility::Dispatcher *dispatcher_ = nullptr; 386 387 BT_DISALLOW_COPY_AND_ASSIGN(BleAdvertiserImpl); 388 DECLARE_IMPL(); 389 }; 390 } // namespace bluetooth 391 } // namespace OHOS 392 393 #endif // BLE_ADVERTISER_IMPL_H 394