NimBLE-Arduino 2.4.0
Loading...
Searching...
No Matches
NimBLEDevice.h
1/*
2 * Copyright 2020-2026 Ryan Powell <ryan@nable-embedded.io> and
3 * esp-nimble-cpp, NimBLE-Arduino contributors.
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18#ifndef NIMBLE_CPP_DEVICE_H_
19#define NIMBLE_CPP_DEVICE_H_
20
21#include "NimBLECppVersion.h"
22#include "nimconfig.h"
23#if CONFIG_BT_ENABLED
24
25# ifdef ESP_PLATFORM
26# ifndef CONFIG_IDF_TARGET_ESP32P4
27# include <esp_bt.h>
28# endif
29# define NIMBLE_CPP_SCAN_DUPL_ENABLED \
30 (CONFIG_BTDM_BLE_SCAN_DUPL || CONFIG_BT_LE_SCAN_DUPL || CONFIG_BT_CTRL_BLE_SCAN_DUPL)
31# endif
32
33# if defined(CONFIG_NIMBLE_CPP_IDF)
34# include <host/ble_gap.h>
35# else
36# include <nimble/nimble/host/include/host/ble_gap.h>
37# endif
38
39/**** FIX COMPILATION ****/
40# undef min
41# undef max
42/**************************/
43
44# include <string>
45# include <vector>
46
47# if CONFIG_BT_NIMBLE_ROLE_CENTRAL
48# include <array>
49class NimBLEClient;
50# endif
51
52# if CONFIG_BT_NIMBLE_ROLE_OBSERVER
53class NimBLEScan;
54# endif
55
56# if CONFIG_BT_NIMBLE_ROLE_BROADCASTER
57# if CONFIG_BT_NIMBLE_EXT_ADV
59# else
61# endif
62# endif
63
64# if CONFIG_BT_NIMBLE_ROLE_PERIPHERAL
65class NimBLEServer;
66# if CONFIG_BT_NIMBLE_L2CAP_COC_MAX_NUM > 0
67class NimBLEL2CAPServer;
68# endif
69# endif
70
71# if CONFIG_BT_NIMBLE_ROLE_PERIPHERAL || CONFIG_BT_NIMBLE_ROLE_CENTRAL
72class NimBLEConnInfo;
73# endif
74
75class NimBLEAddress;
77
78# define BLEDevice NimBLEDevice
79# define BLEClient NimBLEClient
80# define BLERemoteService NimBLERemoteService
81# define BLERemoteCharacteristic NimBLERemoteCharacteristic
82# define BLERemoteDescriptor NimBLERemoteDescriptor
83# define BLEAdvertisedDevice NimBLEAdvertisedDevice
84# define BLEScan NimBLEScan
85# define BLEUUID NimBLEUUID
86# define BLEAddress NimBLEAddress
87# define BLEUtils NimBLEUtils
88# define BLEClientCallbacks NimBLEClientCallbacks
89# define BLEAdvertisedDeviceCallbacks NimBLEScanCallbacks
90# define BLEScanResults NimBLEScanResults
91# define BLEServer NimBLEServer
92# define BLEService NimBLEService
93# define BLECharacteristic NimBLECharacteristic
94# define BLEAdvertising NimBLEAdvertising
95# define BLEServerCallbacks NimBLEServerCallbacks
96# define BLECharacteristicCallbacks NimBLECharacteristicCallbacks
97# define BLEAdvertisementData NimBLEAdvertisementData
98# define BLEDescriptor NimBLEDescriptor
99# define BLE2904 NimBLE2904
100# define BLEDescriptorCallbacks NimBLEDescriptorCallbacks
101# define BLEBeacon NimBLEBeacon
102# define BLEEddystoneTLM NimBLEEddystoneTLM
103# define BLEEddystoneURL NimBLEEddystoneURL
104# define BLEConnInfo NimBLEConnInfo
105# define BLEL2CAPServer NimBLEL2CAPServer
106# define BLEL2CAPService NimBLEL2CAPService
107# define BLEL2CAPServiceCallbacks NimBLEL2CAPServiceCallbacks
108# define BLEL2CAPClient NimBLEL2CAPClient
109# define BLEL2CAPClientCallbacks NimBLEL2CAPClientCallbacks
110# define BLEL2CAPChannel NimBLEL2CAPChannel
111# define BLEL2CAPChannelCallbacks NimBLEL2CAPChannelCallbacks
112
113# ifdef CONFIG_BT_NIMBLE_MAX_CONNECTIONS
114# define NIMBLE_MAX_CONNECTIONS CONFIG_BT_NIMBLE_MAX_CONNECTIONS
115# else
116# define NIMBLE_MAX_CONNECTIONS CONFIG_NIMBLE_MAX_CONNECTIONS
117# endif
118
119enum class NimBLETxPowerType { All = 0, Advertise = 1, Scan = 2, Connection = 3 };
120
121typedef int (*gap_event_handler)(ble_gap_event* event, void* arg);
122
127 public:
128 static bool init(const std::string& deviceName);
129 static bool deinit(bool clearAll = false);
130 static bool setDeviceName(const std::string& deviceName);
131 static bool isInitialized();
132 static NimBLEAddress getAddress();
133 static std::string toString();
134 static const char* getVersion();
135 static bool whiteListAdd(const NimBLEAddress& address);
136 static bool whiteListRemove(const NimBLEAddress& address);
137 static bool onWhiteList(const NimBLEAddress& address);
138 static size_t getWhiteListCount();
139 static NimBLEAddress getWhiteListAddress(size_t index);
140 static bool setOwnAddrType(uint8_t type);
141 static bool setOwnAddr(const NimBLEAddress& addr);
142 static bool setOwnAddr(const uint8_t* addr);
143 static void setDeviceCallbacks(NimBLEDeviceCallbacks* cb);
144 static void setScanDuplicateCacheSize(uint16_t cacheSize);
145 static void setScanFilterMode(uint8_t type);
146 static void setScanDuplicateCacheResetTime(uint16_t time);
147 static bool setCustomGapHandler(gap_event_handler handler, void* arg = nullptr);
148 static void setSecurityAuth(bool bonding, bool mitm, bool sc);
149 static void setSecurityAuth(uint8_t auth);
150 static void setSecurityIOCap(uint8_t iocap);
151 static void setSecurityInitKey(uint8_t initKey);
152 static void setSecurityRespKey(uint8_t respKey);
153 static void setSecurityPasskey(uint32_t passKey);
154 static uint32_t getSecurityPasskey();
155 static bool startSecurity(uint16_t connHandle, int* rcPtr = nullptr);
156 static bool setMTU(uint16_t mtu);
157 static uint16_t getMTU();
158 static void onReset(int reason);
159 static void onSync(void);
160 static void host_task(void* param);
161 static int getPower(NimBLETxPowerType type = NimBLETxPowerType::All);
162 static bool setPower(int8_t dbm, NimBLETxPowerType type = NimBLETxPowerType::All);
163 static bool setDefaultPhy(uint8_t txPhyMask, uint8_t rxPhyMask);
164
165# ifdef ESP_PLATFORM
166# ifndef CONFIG_IDF_TARGET_ESP32P4
167 static esp_power_level_t getPowerLevel(esp_ble_power_type_t powerType = ESP_BLE_PWR_TYPE_DEFAULT);
168 static bool setPowerLevel(esp_power_level_t powerLevel, esp_ble_power_type_t powerType = ESP_BLE_PWR_TYPE_DEFAULT);
169# endif
170# endif
171
172# if CONFIG_BT_NIMBLE_ROLE_OBSERVER
173 static NimBLEScan* getScan();
174# endif
175
176# if CONFIG_BT_NIMBLE_ROLE_PERIPHERAL
177 static NimBLEServer* createServer();
178 static NimBLEServer* getServer();
179# if CONFIG_BT_NIMBLE_L2CAP_COC_MAX_NUM > 0
180 static NimBLEL2CAPServer* createL2CAPServer();
181 static NimBLEL2CAPServer* getL2CAPServer();
182# endif
183# endif
184
185# if CONFIG_BT_NIMBLE_ROLE_PERIPHERAL || CONFIG_BT_NIMBLE_ROLE_CENTRAL
186 static bool injectConfirmPasskey(const NimBLEConnInfo& peerInfo, bool accept);
187 static bool injectPassKey(const NimBLEConnInfo& peerInfo, uint32_t pin);
188# endif
189
190# if CONFIG_BT_NIMBLE_ROLE_BROADCASTER
191# if CONFIG_BT_NIMBLE_EXT_ADV
193 static bool startAdvertising(uint8_t instId, int duration = 0, int maxEvents = 0);
194 static bool stopAdvertising(uint8_t instId);
195 static bool stopAdvertising();
196# endif
197# if !CONFIG_BT_NIMBLE_EXT_ADV || defined(_DOXYGEN_)
199 static bool startAdvertising(uint32_t duration = 0);
200 static bool stopAdvertising();
201# endif
202# endif
203
204# if CONFIG_BT_NIMBLE_ROLE_CENTRAL
205 static NimBLEClient* createClient();
206 static NimBLEClient* createClient(const NimBLEAddress& peerAddress);
207 static bool deleteClient(NimBLEClient* pClient);
208 static NimBLEClient* getClientByHandle(uint16_t connHandle);
209 static NimBLEClient* getClientByPeerAddress(const NimBLEAddress& peerAddress);
211 static size_t getCreatedClientCount();
212 static std::vector<NimBLEClient*> getConnectedClients();
213# endif
214
215# if CONFIG_BT_NIMBLE_ROLE_CENTRAL || CONFIG_BT_NIMBLE_ROLE_PERIPHERAL
216 static bool deleteBond(const NimBLEAddress& address);
217 static int getNumBonds();
218 static bool isBonded(const NimBLEAddress& address);
219 static bool deleteAllBonds();
220 static NimBLEAddress getBondedAddress(int index);
221# endif
222
223 private:
224 static bool m_synced;
225 static bool m_initialized;
226 static uint32_t m_passkey;
227 static ble_gap_event_listener m_listener;
228 static uint8_t m_ownAddrType;
229 static std::vector<NimBLEAddress> m_whiteList;
230 static NimBLEDeviceCallbacks* m_pDeviceCallbacks;
231 static NimBLEDeviceCallbacks defaultDeviceCallbacks;
232
233# if CONFIG_BT_NIMBLE_ROLE_OBSERVER
234 static NimBLEScan* m_pScan;
235# endif
236
237# if CONFIG_BT_NIMBLE_ROLE_PERIPHERAL
238 static NimBLEServer* m_pServer;
239# if CONFIG_BT_NIMBLE_L2CAP_COC_MAX_NUM > 0
240 static NimBLEL2CAPServer* m_pL2CAPServer;
241# endif
242# endif
243
244# if CONFIG_BT_NIMBLE_ROLE_BROADCASTER
245# if CONFIG_BT_NIMBLE_EXT_ADV
246 static NimBLEExtAdvertising* m_bleAdvertising;
247# else
248 static NimBLEAdvertising* m_bleAdvertising;
249# endif
250# endif
251
252# if CONFIG_BT_NIMBLE_ROLE_CENTRAL
253 static std::array<NimBLEClient*, NIMBLE_MAX_CONNECTIONS> m_pClients;
254# endif
255
256# ifdef ESP_PLATFORM
257# if NIMBLE_CPP_SCAN_DUPL_ENABLED
258 static uint16_t m_scanDuplicateSize;
259 static uint8_t m_scanFilterMode;
260 static uint16_t m_scanDuplicateResetTime;
261# endif
262# endif
263
264# if CONFIG_BT_NIMBLE_ROLE_CENTRAL
265 friend class NimBLEClient;
266# endif
267
268# if CONFIG_BT_NIMBLE_ROLE_OBSERVER
269 friend class NimBLEScan;
270# endif
271
272# if CONFIG_BT_NIMBLE_ROLE_PERIPHERAL
273 friend class NimBLEServer;
274 friend class NimBLECharacteristic;
275# endif
276
277# if CONFIG_BT_NIMBLE_ROLE_BROADCASTER
278 friend class NimBLEAdvertising;
279# if CONFIG_BT_NIMBLE_EXT_ADV
280 friend class NimBLEExtAdvertising;
281 friend class NimBLEExtAdvertisement;
282# endif
283# endif
284};
285
286# if CONFIG_BT_NIMBLE_ROLE_CENTRAL
287# include "NimBLEClient.h"
288# include "NimBLERemoteService.h"
289# include "NimBLERemoteCharacteristic.h"
290# include "NimBLERemoteDescriptor.h"
291# endif
292
293# if CONFIG_BT_NIMBLE_ROLE_OBSERVER
294# include "NimBLEScan.h"
295# endif
296
297# if CONFIG_BT_NIMBLE_ROLE_PERIPHERAL
298# include "NimBLEServer.h"
299# include "NimBLEService.h"
300# include "NimBLECharacteristic.h"
301# include "NimBLEDescriptor.h"
302# if CONFIG_BT_NIMBLE_L2CAP_COC_MAX_NUM
303# include "NimBLEL2CAPServer.h"
304# include "NimBLEL2CAPChannel.h"
305# endif
306# endif
307
308# if CONFIG_BT_NIMBLE_ROLE_BROADCASTER
309# if CONFIG_BT_NIMBLE_EXT_ADV
310# include "NimBLEExtAdvertising.h"
311# else
312# include "NimBLEAdvertising.h"
313# endif
314# endif
315
316# if CONFIG_BT_NIMBLE_ROLE_CENTRAL || CONFIG_BT_NIMBLE_ROLE_PERIPHERAL
317# include "NimBLEConnInfo.h"
318# include "NimBLEStream.h"
319# endif
320
321# include "NimBLEAddress.h"
322# include "NimBLEUtils.h"
323
328 public:
329 virtual ~NimBLEDeviceCallbacks() {};
330
343 virtual int onStoreStatus(struct ble_store_status_event* event, void* arg);
344};
345
346#endif // CONFIG_BT_ENABLED
347#endif // NIMBLE_CPP_DEVICE_H_
A BLE device address.
Definition NimBLEAddress.h:42
Perform and manage BLE advertising.
Definition NimBLEAdvertising.h:51
The model of a BLE Characteristic.
Definition NimBLECharacteristic.h:41
A model of a BLE client.
Definition NimBLEClient.h:49
Connection information.
Definition NimBLEConnInfo.h:33
Callbacks associated with a BLE device.
Definition NimBLEDevice.h:327
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:1383
A model of a BLE Device from which all the BLE roles are created.
Definition NimBLEDevice.h:126
static NimBLEClient * createClient()
Creates a new client object, each client can connect to 1 peripheral device.
Definition NimBLEDevice.cpp:331
static void onSync(void)
Host synced with controller, all clear to make calls to the stack.
Definition NimBLEDevice.cpp:831
static size_t getCreatedClientCount()
Get the number of created client objects.
Definition NimBLEDevice.cpp:391
static bool setDefaultPhy(uint8_t txPhyMask, uint8_t rxPhyMask)
Set the preferred default phy to use for connections.
Definition NimBLEDevice.cpp:805
static bool setOwnAddr(const NimBLEAddress &addr)
Set the device address to use.
Definition NimBLEDevice.cpp:1149
static NimBLEClient * getDisconnectedClient()
Finds the first disconnected client available.
Definition NimBLEDevice.cpp:436
static bool isBonded(const NimBLEAddress &address)
Checks if a peer device is bonded.
Definition NimBLEDevice.cpp:661
static bool deleteAllBonds()
Deletes all bonding information.
Definition NimBLEDevice.cpp:635
static bool startAdvertising(uint8_t instId, int duration=0, int maxEvents=0)
Convenience function to begin advertising.
Definition NimBLEDevice.cpp:188
static void onReset(int reason)
Host reset, we pass the message so we don't make calls until re-synced.
Definition NimBLEDevice.cpp:818
static bool deleteBond(const NimBLEAddress &address)
Deletes a peer bond.
Definition NimBLEDevice.cpp:652
static bool init(const std::string &deviceName)
Initialize the BLE environment.
Definition NimBLEDevice.cpp:890
static bool setOwnAddrType(uint8_t type)
Sets the address type to use.
Definition NimBLEDevice.cpp:1120
static bool stopAdvertising()
Convenience function to stop all advertising.
Definition NimBLEDevice.cpp:228
static NimBLEServer * getServer()
Get the instance of the server.
Definition NimBLEDevice.cpp:137
static bool isInitialized()
Check if the initialization is complete.
Definition NimBLEDevice.cpp:1086
static bool setMTU(uint16_t mtu)
Setup local mtu that will be used to negotiate mtu during request from client peer.
Definition NimBLEDevice.cpp:591
static NimBLEAddress getWhiteListAddress(size_t index)
Gets the address at the vector index.
Definition NimBLEDevice.cpp:778
static NimBLEServer * createServer()
Create an instance of a server.
Definition NimBLEDevice.cpp:125
static bool injectPassKey(const NimBLEConnInfo &peerInfo, uint32_t pin)
Inject the provided passkey into the Security Manager.
Definition NimBLEDevice.cpp:1280
static uint16_t getMTU()
Get local MTU value set.
Definition NimBLEDevice.cpp:604
static int getPower(NimBLETxPowerType type=NimBLETxPowerType::All)
Get the transmission power.
Definition NimBLEDevice.cpp:550
static bool deinit(bool clearAll=false)
Shutdown the NimBLE stack/controller.
Definition NimBLEDevice.cpp:1025
static NimBLEAddress getAddress()
Get our device address.
Definition NimBLEDevice.cpp:1098
static int getNumBonds()
Gets the number of bonded peers stored.
Definition NimBLEDevice.cpp:616
static bool whiteListRemove(const NimBLEAddress &address)
Remove a peer address from the whitelist.
Definition NimBLEDevice.cpp:747
static bool deleteClient(NimBLEClient *pClient)
Delete the client object and remove it from the list. Checks if it is connected or trying to connect ...
Definition NimBLEDevice.cpp:358
static bool startSecurity(uint16_t connHandle, int *rcPtr=nullptr)
Start the connection securing and authorization for this connection.
Definition NimBLEDevice.cpp:1262
static NimBLEClient * getClientByHandle(uint16_t connHandle)
Get a reference to a client by connection handle.
Definition NimBLEDevice.cpp:407
static uint32_t getSecurityPasskey()
Get the current passkey used for pairing.
Definition NimBLEDevice.cpp:1252
static void setSecurityAuth(bool bonding, bool mitm, bool sc)
Set the authorization mode for this device.
Definition NimBLEDevice.cpp:1179
static NimBLEExtAdvertising * getAdvertising()
Get the instance of the extended advertising object.
Definition NimBLEDevice.cpp:173
static bool setDeviceName(const std::string &deviceName)
Set the BLEDevice name.
Definition NimBLEDevice.cpp:1322
static bool whiteListAdd(const NimBLEAddress &address)
Add a peer address to the whitelist.
Definition NimBLEDevice.cpp:728
static bool setCustomGapHandler(gap_event_handler handler, void *arg=nullptr)
Set a custom callback for gap events.
Definition NimBLEDevice.cpp:1338
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:1223
static size_t getWhiteListCount()
Gets the count of addresses in the whitelist.
Definition NimBLEDevice.cpp:769
static void host_task(void *param)
The main host task.
Definition NimBLEDevice.cpp:880
static void setSecurityPasskey(uint32_t passKey)
Set the passkey the server will ask for when pairing.
Definition NimBLEDevice.cpp:1244
static void setSecurityRespKey(uint8_t respKey)
Set the keys we are willing to accept during pairing.
Definition NimBLEDevice.cpp:1236
static void setSecurityIOCap(uint8_t iocap)
Set the Input/Output capabilities of this device.
Definition NimBLEDevice.cpp:1210
static std::string toString()
Return a string representation of the address of this device.
Definition NimBLEDevice.cpp:1354
static bool setPower(int8_t dbm, NimBLETxPowerType type=NimBLETxPowerType::All)
Set the transmission power.
Definition NimBLEDevice.cpp:507
static NimBLEAddress getBondedAddress(int index)
Get the address of a bonded peer device by index.
Definition NimBLEDevice.cpp:687
static std::vector< NimBLEClient * > getConnectedClients()
Get a list of connected clients.
Definition NimBLEDevice.cpp:450
static bool onWhiteList(const NimBLEAddress &address)
Checks if a peer device is whitelisted.
Definition NimBLEDevice.cpp:713
static const char * getVersion()
Return the library version as a string.
Definition NimBLEDevice.cpp:1362
static NimBLEScan * getScan()
Retrieve the Scan object that we use for scanning.
Definition NimBLEDevice.cpp:243
static NimBLEClient * getClientByPeerAddress(const NimBLEAddress &peerAddress)
Get a reference to a client by peer address.
Definition NimBLEDevice.cpp:422
static bool injectConfirmPasskey(const NimBLEConnInfo &peerInfo, bool accept)
Inject the provided numeric comparison response into the Security Manager.
Definition NimBLEDevice.cpp:1299
Extended advertisement data.
Definition NimBLEExtAdvertising.h:46
Extended advertising class.
Definition NimBLEExtAdvertising.h:110
Perform and manage BLE scans.
Definition NimBLEScan.h:67
The model of a BLE server.
Definition NimBLEServer.h:62