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