18#ifndef NIMBLE_CPP_DEVICE_H_
19#define NIMBLE_CPP_DEVICE_H_
21#include "NimBLECppVersion.h"
22#include "syscfg/syscfg.h"
23#if CONFIG_BT_NIMBLE_ENABLED
25# ifndef CONFIG_IDF_TARGET_ESP32P4
28# define NIMBLE_CPP_SCAN_DUPL_ENABLED \
29 (CONFIG_BTDM_BLE_SCAN_DUPL || CONFIG_BT_LE_SCAN_DUPL || CONFIG_BT_CTRL_BLE_SCAN_DUPL)
32# if defined(CONFIG_NIMBLE_CPP_IDF)
33# include <host/ble_gap.h>
35# include <nimble/nimble/host/include/host/ble_gap.h>
46# if MYNEWT_VAL(BLE_ROLE_CENTRAL)
51# if MYNEWT_VAL(BLE_ROLE_OBSERVER)
55# if MYNEWT_VAL(BLE_ROLE_BROADCASTER)
56# if MYNEWT_VAL(BLE_EXT_ADV)
57class NimBLEExtAdvertising;
63# if MYNEWT_VAL(BLE_ROLE_PERIPHERAL)
65# if MYNEWT_VAL(BLE_L2CAP_COC_MAX_NUM)
66class NimBLEL2CAPServer;
70# if MYNEWT_VAL(BLE_ROLE_PERIPHERAL) || MYNEWT_VAL(BLE_ROLE_CENTRAL)
77# define BLEDevice NimBLEDevice
78# define BLEClient NimBLEClient
79# define BLERemoteService NimBLERemoteService
80# define BLERemoteCharacteristic NimBLERemoteCharacteristic
81# define BLERemoteDescriptor NimBLERemoteDescriptor
82# define BLEAdvertisedDevice NimBLEAdvertisedDevice
83# define BLEScan NimBLEScan
84# define BLEUUID NimBLEUUID
85# define BLEAddress NimBLEAddress
86# define BLEUtils NimBLEUtils
87# define BLEClientCallbacks NimBLEClientCallbacks
88# define BLEAdvertisedDeviceCallbacks NimBLEScanCallbacks
89# define BLEScanResults NimBLEScanResults
90# define BLEServer NimBLEServer
91# define BLEService NimBLEService
92# define BLECharacteristic NimBLECharacteristic
93# define BLEAdvertising NimBLEAdvertising
94# define BLEServerCallbacks NimBLEServerCallbacks
95# define BLECharacteristicCallbacks NimBLECharacteristicCallbacks
96# define BLEAdvertisementData NimBLEAdvertisementData
97# define BLEDescriptor NimBLEDescriptor
98# define BLE2904 NimBLE2904
99# define BLEDescriptorCallbacks NimBLEDescriptorCallbacks
100# define BLEBeacon NimBLEBeacon
101# define BLEEddystoneTLM NimBLEEddystoneTLM
102# define BLEEddystoneURL NimBLEEddystoneURL
103# define BLEConnInfo NimBLEConnInfo
104# define BLEL2CAPServer NimBLEL2CAPServer
105# define BLEL2CAPService NimBLEL2CAPService
106# define BLEL2CAPServiceCallbacks NimBLEL2CAPServiceCallbacks
107# define BLEL2CAPClient NimBLEL2CAPClient
108# define BLEL2CAPClientCallbacks NimBLEL2CAPClientCallbacks
109# define BLEL2CAPChannel NimBLEL2CAPChannel
110# define BLEL2CAPChannelCallbacks NimBLEL2CAPChannelCallbacks
112enum class NimBLETxPowerType { All = 0, Advertise = 1, Scan = 2, Connection = 3 };
114typedef int (*gap_event_handler)(ble_gap_event* event,
void* arg);
121 static bool init(
const std::string& deviceName);
122 static bool deinit(
bool clearAll =
false);
137 static void setScanDuplicateCacheSize(uint16_t cacheSize);
138 static void setScanFilterMode(uint8_t type);
139 static void setScanDuplicateCacheResetTime(uint16_t time);
148 static bool startSecurity(uint16_t connHandle,
int* rcPtr =
nullptr);
149 static bool setMTU(uint16_t mtu);
151 static void onReset(
int reason);
154 static int getPower(NimBLETxPowerType type = NimBLETxPowerType::All);
155 static bool setPower(int8_t dbm, NimBLETxPowerType type = NimBLETxPowerType::All);
156 static bool setDefaultPhy(uint8_t txPhyMask, uint8_t rxPhyMask);
159# ifndef CONFIG_IDF_TARGET_ESP32P4
160 static esp_power_level_t getPowerLevel(esp_ble_power_type_t powerType = ESP_BLE_PWR_TYPE_DEFAULT);
161 static bool setPowerLevel(esp_power_level_t powerLevel, esp_ble_power_type_t powerType = ESP_BLE_PWR_TYPE_DEFAULT);
165# if MYNEWT_VAL(BLE_ROLE_OBSERVER)
166 static NimBLEScan* getScan();
169# if MYNEWT_VAL(BLE_ROLE_PERIPHERAL)
170 static NimBLEServer* createServer();
171 static NimBLEServer* getServer();
172# if MYNEWT_VAL(BLE_L2CAP_COC_MAX_NUM)
173 static NimBLEL2CAPServer* createL2CAPServer();
174 static NimBLEL2CAPServer* getL2CAPServer();
178# if MYNEWT_VAL(BLE_ROLE_PERIPHERAL) || MYNEWT_VAL(BLE_ROLE_CENTRAL)
179 static bool injectConfirmPasskey(
const NimBLEConnInfo& peerInfo,
bool accept);
180 static bool injectPassKey(
const NimBLEConnInfo& peerInfo, uint32_t pin);
183# if MYNEWT_VAL(BLE_ROLE_BROADCASTER)
184# if MYNEWT_VAL(BLE_EXT_ADV)
185 static NimBLEExtAdvertising* getAdvertising();
186 static bool startAdvertising(uint8_t instId,
int duration = 0,
int maxEvents = 0);
187 static bool stopAdvertising(uint8_t instId);
188 static bool stopAdvertising();
190# if !MYNEWT_VAL(BLE_EXT_ADV) || defined(_DOXYGEN_)
192 static bool startAdvertising(uint32_t duration = 0);
193 static bool stopAdvertising();
197# if MYNEWT_VAL(BLE_ROLE_CENTRAL)
198 static NimBLEClient* createClient();
199 static NimBLEClient* createClient(
const NimBLEAddress& peerAddress);
200 static bool deleteClient(NimBLEClient* pClient);
201 static NimBLEClient* getClientByHandle(uint16_t connHandle);
202 static NimBLEClient* getClientByPeerAddress(
const NimBLEAddress& peerAddress);
203 static NimBLEClient* getDisconnectedClient();
204 static size_t getCreatedClientCount();
205 static std::vector<NimBLEClient*> getConnectedClients();
208# if MYNEWT_VAL(BLE_ROLE_CENTRAL) || MYNEWT_VAL(BLE_ROLE_PERIPHERAL)
210 static int getNumBonds();
212 static bool deleteAllBonds();
217 static bool m_synced;
218 static bool m_initialized;
219 static uint32_t m_passkey;
220 static ble_gap_event_listener m_listener;
221 static uint8_t m_ownAddrType;
222 static std::vector<NimBLEAddress> m_whiteList;
226# if MYNEWT_VAL(BLE_ROLE_OBSERVER)
227 static NimBLEScan* m_pScan;
230# if MYNEWT_VAL(BLE_ROLE_PERIPHERAL)
231 static NimBLEServer* m_pServer;
232# if MYNEWT_VAL(BLE_L2CAP_COC_MAX_NUM)
233 static NimBLEL2CAPServer* m_pL2CAPServer;
237# if MYNEWT_VAL(BLE_ROLE_BROADCASTER)
238# if MYNEWT_VAL(BLE_EXT_ADV)
239 static NimBLEExtAdvertising* m_bleAdvertising;
245# if MYNEWT_VAL(BLE_ROLE_CENTRAL)
246 static std::array<NimBLEClient*, MYNEWT_VAL(BLE_MAX_CONNECTIONS)> m_pClients;
250# if NIMBLE_CPP_SCAN_DUPL_ENABLED
251 static uint16_t m_scanDuplicateSize;
252 static uint8_t m_scanFilterMode;
253 static uint16_t m_scanDuplicateResetTime;
257# if MYNEWT_VAL(BLE_ROLE_CENTRAL)
258 friend class NimBLEClient;
261# if MYNEWT_VAL(BLE_ROLE_OBSERVER)
262 friend class NimBLEScan;
265# if MYNEWT_VAL(BLE_ROLE_PERIPHERAL)
266 friend class NimBLEServer;
267 friend class NimBLECharacteristic;
270# if MYNEWT_VAL(BLE_ROLE_BROADCASTER)
272# if MYNEWT_VAL(BLE_EXT_ADV)
273 friend class NimBLEExtAdvertising;
274 friend class NimBLEExtAdvertisement;
279# if MYNEWT_VAL(BLE_ROLE_CENTRAL)
280# include "NimBLEClient.h"
281# include "NimBLERemoteService.h"
282# include "NimBLERemoteCharacteristic.h"
283# include "NimBLERemoteDescriptor.h"
286# if MYNEWT_VAL(BLE_ROLE_OBSERVER)
287# include "NimBLEScan.h"
290# if MYNEWT_VAL(BLE_ROLE_PERIPHERAL)
291# include "NimBLEServer.h"
292# include "NimBLEService.h"
293# include "NimBLECharacteristic.h"
294# include "NimBLEDescriptor.h"
295# if MYNEWT_VAL(BLE_L2CAP_COC_MAX_NUM)
296# include "NimBLEL2CAPServer.h"
297# include "NimBLEL2CAPChannel.h"
301# if MYNEWT_VAL(BLE_ROLE_BROADCASTER)
302# if MYNEWT_VAL(BLE_EXT_ADV)
303# include "NimBLEExtAdvertising.h"
305# include "NimBLEAdvertising.h"
309# if MYNEWT_VAL(BLE_ROLE_CENTRAL) || MYNEWT_VAL(BLE_ROLE_PERIPHERAL)
310# include "NimBLEConnInfo.h"
311# include "NimBLEStream.h"
314# include "NimBLEAddress.h"
315# include "NimBLEUtils.h"
336 virtual int onStoreStatus(
struct ble_store_status_event* event,
void* arg);
A BLE device address.
Definition NimBLEAddress.h:42
Perform and manage BLE advertising.
Definition NimBLEAdvertising.h:51
Connection information.
Definition NimBLEConnInfo.h:33
Callbacks associated with a BLE device.
Definition NimBLEDevice.h:320
virtual int onStoreStatus(struct ble_store_status_event *event, void *arg)
Indicates an inability to perform a store operation. This callback should do one of two things: -Addr...
Definition NimBLEDevice.cpp:1381
A model of a BLE Device from which all the BLE roles are created.
Definition NimBLEDevice.h:119
static void onSync(void)
Host synced with controller, all clear to make calls to the stack.
Definition NimBLEDevice.cpp:828
static bool setDefaultPhy(uint8_t txPhyMask, uint8_t rxPhyMask)
Set the preferred default phy to use for connections.
Definition NimBLEDevice.cpp:802
static bool setOwnAddr(const NimBLEAddress &addr)
Set the device address to use.
Definition NimBLEDevice.cpp:1146
static void onReset(int reason)
Host reset, we pass the message so we don't make calls until re-synced.
Definition NimBLEDevice.cpp:815
static bool init(const std::string &deviceName)
Initialize the BLE environment.
Definition NimBLEDevice.cpp:887
static bool setOwnAddrType(uint8_t type)
Sets the address type to use.
Definition NimBLEDevice.cpp:1117
static bool isInitialized()
Check if the initialization is complete.
Definition NimBLEDevice.cpp:1083
static bool setMTU(uint16_t mtu)
Setup local mtu that will be used to negotiate mtu during request from client peer.
Definition NimBLEDevice.cpp:588
static NimBLEAddress getWhiteListAddress(size_t index)
Gets the address at the vector index.
Definition NimBLEDevice.cpp:775
static uint16_t getMTU()
Get local MTU value set.
Definition NimBLEDevice.cpp:601
static int getPower(NimBLETxPowerType type=NimBLETxPowerType::All)
Get the transmission power.
Definition NimBLEDevice.cpp:547
static bool deinit(bool clearAll=false)
Shutdown the NimBLE stack/controller.
Definition NimBLEDevice.cpp:1022
static NimBLEAddress getAddress()
Get our device address.
Definition NimBLEDevice.cpp:1095
static bool whiteListRemove(const NimBLEAddress &address)
Remove a peer address from the whitelist.
Definition NimBLEDevice.cpp:744
static bool startSecurity(uint16_t connHandle, int *rcPtr=nullptr)
Start the connection securing and authorization for this connection.
Definition NimBLEDevice.cpp:1259
static uint32_t getSecurityPasskey()
Get the current passkey used for pairing.
Definition NimBLEDevice.cpp:1249
static void setSecurityAuth(bool bonding, bool mitm, bool sc)
Set the authorization mode for this device.
Definition NimBLEDevice.cpp:1176
static bool setDeviceName(const std::string &deviceName)
Set the BLEDevice name.
Definition NimBLEDevice.cpp:1319
static bool whiteListAdd(const NimBLEAddress &address)
Add a peer address to the whitelist.
Definition NimBLEDevice.cpp:725
static bool setCustomGapHandler(gap_event_handler handler, void *arg=nullptr)
Set a custom callback for gap events.
Definition NimBLEDevice.cpp:1336
static void setSecurityInitKey(uint8_t initKey)
If we are the initiator of the security procedure this sets the keys we will distribute.
Definition NimBLEDevice.cpp:1220
static size_t getWhiteListCount()
Gets the count of addresses in the whitelist.
Definition NimBLEDevice.cpp:766
static void host_task(void *param)
The main host task.
Definition NimBLEDevice.cpp:877
static void setSecurityPasskey(uint32_t passKey)
Set the passkey the server will ask for when pairing.
Definition NimBLEDevice.cpp:1241
static void setSecurityRespKey(uint8_t respKey)
Set the keys we are willing to accept during pairing.
Definition NimBLEDevice.cpp:1233
static void setSecurityIOCap(uint8_t iocap)
Set the Input/Output capabilities of this device.
Definition NimBLEDevice.cpp:1207
static std::string toString()
Return a string representation of the address of this device.
Definition NimBLEDevice.cpp:1352
static bool setPower(int8_t dbm, NimBLETxPowerType type=NimBLETxPowerType::All)
Retrieve the Scan object that we use for scanning.
Definition NimBLEDevice.cpp:504
static bool onWhiteList(const NimBLEAddress &address)
Checks if a peer device is whitelisted.
Definition NimBLEDevice.cpp:710
static const char * getVersion()
Return the library version as a string.
Definition NimBLEDevice.cpp:1360