esp-nimble-cpp 2.2.0
Loading...
Searching...
No Matches
NimBLEDevice.h
1/*
2 * Copyright 2020-2025 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 "nimconfig.h"
22#if defined(CONFIG_BT_ENABLED)
23# ifdef ESP_PLATFORM
24# ifndef CONFIG_IDF_TARGET_ESP32P4
25# include <esp_bt.h>
26# endif
27# endif
28
29# if defined(CONFIG_NIMBLE_CPP_IDF)
30# include <host/ble_gap.h>
31# else
32# include <nimble/nimble/host/include/host/ble_gap.h>
33# endif
34
35/**** FIX COMPILATION ****/
36# undef min
37# undef max
38/**************************/
39
40# include <string>
41# include <vector>
42
43# if defined(CONFIG_BT_NIMBLE_ROLE_CENTRAL)
44# include <array>
45class NimBLEClient;
46# endif
47
48# if defined(CONFIG_BT_NIMBLE_ROLE_OBSERVER)
49class NimBLEScan;
50# endif
51
52# if defined(CONFIG_BT_NIMBLE_ROLE_BROADCASTER)
53# if CONFIG_BT_NIMBLE_EXT_ADV
55# else
57# endif
58# endif
59
60# if defined(CONFIG_BT_NIMBLE_ROLE_PERIPHERAL)
61class NimBLEServer;
62# endif
63
64# if defined(CONFIG_BT_NIMBLE_ROLE_PERIPHERAL) || defined(CONFIG_BT_NIMBLE_ROLE_CENTRAL)
65class NimBLEConnInfo;
66# endif
67
68class NimBLEAddress;
70
71# define BLEDevice NimBLEDevice
72# define BLEClient NimBLEClient
73# define BLERemoteService NimBLERemoteService
74# define BLERemoteCharacteristic NimBLERemoteCharacteristic
75# define BLERemoteDescriptor NimBLERemoteDescriptor
76# define BLEAdvertisedDevice NimBLEAdvertisedDevice
77# define BLEScan NimBLEScan
78# define BLEUUID NimBLEUUID
79# define BLEAddress NimBLEAddress
80# define BLEUtils NimBLEUtils
81# define BLEClientCallbacks NimBLEClientCallbacks
82# define BLEAdvertisedDeviceCallbacks NimBLEScanCallbacks
83# define BLEScanResults NimBLEScanResults
84# define BLEServer NimBLEServer
85# define BLEService NimBLEService
86# define BLECharacteristic NimBLECharacteristic
87# define BLEAdvertising NimBLEAdvertising
88# define BLEServerCallbacks NimBLEServerCallbacks
89# define BLECharacteristicCallbacks NimBLECharacteristicCallbacks
90# define BLEAdvertisementData NimBLEAdvertisementData
91# define BLEDescriptor NimBLEDescriptor
92# define BLE2904 NimBLE2904
93# define BLEDescriptorCallbacks NimBLEDescriptorCallbacks
94# define BLEBeacon NimBLEBeacon
95# define BLEEddystoneTLM NimBLEEddystoneTLM
96# define BLEEddystoneURL NimBLEEddystoneURL
97# define BLEConnInfo NimBLEConnInfo
98
99# ifdef CONFIG_BT_NIMBLE_MAX_CONNECTIONS
100# define NIMBLE_MAX_CONNECTIONS CONFIG_BT_NIMBLE_MAX_CONNECTIONS
101# else
102# define NIMBLE_MAX_CONNECTIONS CONFIG_NIMBLE_MAX_CONNECTIONS
103# endif
104
105enum class NimBLETxPowerType {
106 All = 0,
107 Advertise = 1,
108 Scan = 2,
109 Connection = 3
110};
111
112typedef int (*gap_event_handler)(ble_gap_event* event, void* arg);
113
118 public:
119 static bool init(const std::string& deviceName);
120 static bool deinit(bool clearAll = false);
121 static bool setDeviceName(const std::string& deviceName);
122 static bool isInitialized();
123 static NimBLEAddress getAddress();
124 static std::string toString();
125 static bool whiteListAdd(const NimBLEAddress& address);
126 static bool whiteListRemove(const NimBLEAddress& address);
127 static bool onWhiteList(const NimBLEAddress& address);
128 static size_t getWhiteListCount();
129 static NimBLEAddress getWhiteListAddress(size_t index);
130 static bool setOwnAddrType(uint8_t type);
131 static bool setOwnAddr(const NimBLEAddress& addr);
132 static bool setOwnAddr(const uint8_t* addr);
133 static void setDeviceCallbacks(NimBLEDeviceCallbacks* cb);
134 static void setScanDuplicateCacheSize(uint16_t cacheSize);
135 static void setScanFilterMode(uint8_t type);
136 static bool setCustomGapHandler(gap_event_handler handler);
137 static void setSecurityAuth(bool bonding, bool mitm, bool sc);
138 static void setSecurityAuth(uint8_t auth);
139 static void setSecurityIOCap(uint8_t iocap);
140 static void setSecurityInitKey(uint8_t initKey);
141 static void setSecurityRespKey(uint8_t respKey);
142 static void setSecurityPasskey(uint32_t passKey);
143 static uint32_t getSecurityPasskey();
144 static bool startSecurity(uint16_t connHandle, int* rcPtr = nullptr);
145 static bool setMTU(uint16_t mtu);
146 static uint16_t getMTU();
147 static void onReset(int reason);
148 static void onSync(void);
149 static void host_task(void* param);
150 static int getPower(NimBLETxPowerType type = NimBLETxPowerType::All);
151 static bool setPower(int8_t dbm, NimBLETxPowerType type = NimBLETxPowerType::All);
152
153# ifdef ESP_PLATFORM
154# ifndef CONFIG_IDF_TARGET_ESP32P4
155 static esp_power_level_t getPowerLevel(esp_ble_power_type_t powerType = ESP_BLE_PWR_TYPE_DEFAULT);
156 static bool setPowerLevel(esp_power_level_t powerLevel, esp_ble_power_type_t powerType = ESP_BLE_PWR_TYPE_DEFAULT);
157# endif
158# endif
159
160# if CONFIG_BT_NIMBLE_EXT_ADV
161 static bool setDefaultPhy(uint8_t txPhyMask, uint8_t rxPhyMask);
162# endif
163
164# if defined(CONFIG_BT_NIMBLE_ROLE_OBSERVER)
165 static NimBLEScan* getScan();
166# endif
167
168# if defined(CONFIG_BT_NIMBLE_ROLE_PERIPHERAL)
169 static NimBLEServer* createServer();
170 static NimBLEServer* getServer();
171# endif
172
173# if defined(CONFIG_BT_NIMBLE_ROLE_PERIPHERAL) || defined(CONFIG_BT_NIMBLE_ROLE_CENTRAL)
174 static bool injectConfirmPasskey(const NimBLEConnInfo& peerInfo, bool accept);
175 static bool injectPassKey(const NimBLEConnInfo& peerInfo, uint32_t pin);
176# endif
177
178# if defined(CONFIG_BT_NIMBLE_ROLE_BROADCASTER)
179# if CONFIG_BT_NIMBLE_EXT_ADV
181 static bool startAdvertising(uint8_t instId, int duration = 0, int maxEvents = 0);
182 static bool stopAdvertising(uint8_t instId);
183 static bool stopAdvertising();
184# endif
185# if !CONFIG_BT_NIMBLE_EXT_ADV || defined(_DOXYGEN_)
187 static bool startAdvertising(uint32_t duration = 0);
188 static bool stopAdvertising();
189# endif
190# endif
191
192# if defined(CONFIG_BT_NIMBLE_ROLE_CENTRAL)
193 static NimBLEClient* createClient();
194 static NimBLEClient* createClient(const NimBLEAddress& peerAddress);
195 static bool deleteClient(NimBLEClient* pClient);
196 static NimBLEClient* getClientByHandle(uint16_t connHandle);
197 static NimBLEClient* getClientByPeerAddress(const NimBLEAddress& peerAddress);
199 static size_t getCreatedClientCount();
200 static std::vector<NimBLEClient*> getConnectedClients();
201# endif
202
203# if defined(CONFIG_BT_NIMBLE_ROLE_CENTRAL) || defined(CONFIG_BT_NIMBLE_ROLE_PERIPHERAL)
204 static bool deleteBond(const NimBLEAddress& address);
205 static int getNumBonds();
206 static bool isBonded(const NimBLEAddress& address);
207 static bool deleteAllBonds();
208 static NimBLEAddress getBondedAddress(int index);
209# endif
210
211 private:
212 static bool m_synced;
213 static bool m_initialized;
214 static uint32_t m_passkey;
215 static ble_gap_event_listener m_listener;
216 static uint8_t m_ownAddrType;
217 static std::vector<NimBLEAddress> m_whiteList;
218 static NimBLEDeviceCallbacks* m_pDeviceCallbacks;
219 static NimBLEDeviceCallbacks defaultDeviceCallbacks;
220
221# if defined(CONFIG_BT_NIMBLE_ROLE_OBSERVER)
222 static NimBLEScan* m_pScan;
223# endif
224
225# if defined(CONFIG_BT_NIMBLE_ROLE_PERIPHERAL)
226 static NimBLEServer* m_pServer;
227# endif
228
229# if defined(CONFIG_BT_NIMBLE_ROLE_BROADCASTER)
230# if CONFIG_BT_NIMBLE_EXT_ADV
231 static NimBLEExtAdvertising* m_bleAdvertising;
232# else
233 static NimBLEAdvertising* m_bleAdvertising;
234# endif
235# endif
236
237# if defined(CONFIG_BT_NIMBLE_ROLE_CENTRAL)
238 static std::array<NimBLEClient*, NIMBLE_MAX_CONNECTIONS> m_pClients;
239# endif
240
241# ifdef ESP_PLATFORM
242# ifdef CONFIG_BTDM_BLE_SCAN_DUPL
243 static uint16_t m_scanDuplicateSize;
244 static uint8_t m_scanFilterMode;
245# endif
246# endif
247
248# if defined(CONFIG_BT_NIMBLE_ROLE_CENTRAL)
249 friend class NimBLEClient;
250# endif
251
252# if defined(CONFIG_BT_NIMBLE_ROLE_OBSERVER)
253 friend class NimBLEScan;
254# endif
255
256# if defined(CONFIG_BT_NIMBLE_ROLE_PERIPHERAL)
257 friend class NimBLEServer;
258 friend class NimBLECharacteristic;
259# endif
260
261# if defined(CONFIG_BT_NIMBLE_ROLE_BROADCASTER)
262 friend class NimBLEAdvertising;
263# if CONFIG_BT_NIMBLE_EXT_ADV
264 friend class NimBLEExtAdvertising;
265 friend class NimBLEExtAdvertisement;
266# endif
267# endif
268};
269
270# if defined(CONFIG_BT_NIMBLE_ROLE_CENTRAL)
271# include "NimBLEClient.h"
272# include "NimBLERemoteService.h"
273# include "NimBLERemoteCharacteristic.h"
274# include "NimBLERemoteDescriptor.h"
275# endif
276
277# if defined(CONFIG_BT_NIMBLE_ROLE_OBSERVER)
278# include "NimBLEScan.h"
279# endif
280
281# if defined(CONFIG_BT_NIMBLE_ROLE_PERIPHERAL)
282# include "NimBLEServer.h"
283# include "NimBLEService.h"
284# include "NimBLECharacteristic.h"
285# include "NimBLEDescriptor.h"
286# endif
287
288# if defined(CONFIG_BT_NIMBLE_ROLE_BROADCASTER)
289# if CONFIG_BT_NIMBLE_EXT_ADV
290# include "NimBLEExtAdvertising.h"
291# else
292# include "NimBLEAdvertising.h"
293# endif
294# endif
295
296# if defined(CONFIG_BT_NIMBLE_ROLE_CENTRAL) || defined(CONFIG_BT_NIMBLE_ROLE_PERIPHERAL)
297# include "NimBLEConnInfo.h"
298# endif
299
300# include "NimBLEUtils.h"
301
306 public:
307 virtual ~NimBLEDeviceCallbacks() {};
308
321 virtual int onStoreStatus(struct ble_store_status_event* event, void* arg);
322};
323
324#endif // CONFIG_BT_ENABLED
325#endif // NIMBLE_CPP_DEVICE_H_
A BLE device address.
Definition NimBLEAddress.h:41
Perform and manage BLE advertising.
Definition NimBLEAdvertising.h:52
The model of a BLE Characteristic.
Definition NimBLECharacteristic.h:40
A model of a BLE client.
Definition NimBLEClient.h:49
Connection information.
Definition NimBLEConnInfo.h:32
Callbacks associated with a BLE device.
Definition NimBLEDevice.h:305
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:1274
A model of a BLE Device from which all the BLE roles are created.
Definition NimBLEDevice.h:117
static NimBLEClient * createClient()
Creates a new client object, each client can connect to 1 peripheral device.
Definition NimBLEDevice.cpp:294
static void onSync(void)
Host synced with controller, all clear to make calls to the stack.
Definition NimBLEDevice.cpp:784
static size_t getCreatedClientCount()
Get the number of created client objects.
Definition NimBLEDevice.cpp:354
static bool setDefaultPhy(uint8_t txPhyMask, uint8_t rxPhyMask)
Set the preferred default phy to use for connections.
Definition NimBLEDevice.cpp:757
static bool setOwnAddr(const NimBLEAddress &addr)
Set the device address to use.
Definition NimBLEDevice.cpp:1063
static NimBLEClient * getDisconnectedClient()
Finds the first disconnected client available.
Definition NimBLEDevice.cpp:399
static bool isBonded(const NimBLEAddress &address)
Checks if a peer device is bonded.
Definition NimBLEDevice.cpp:619
static bool setCustomGapHandler(gap_event_handler handler)
Set a custom callback for gap events.
Definition NimBLEDevice.cpp:1237
static bool deleteAllBonds()
Deletes all bonding information.
Definition NimBLEDevice.cpp:596
static bool startAdvertising(uint8_t instId, int duration=0, int maxEvents=0)
Convenience function to begin advertising.
Definition NimBLEDevice.cpp:170
static void onReset(int reason)
Host reset, we pass the message so we don't make calls until re-synced.
Definition NimBLEDevice.cpp:771
static bool deleteBond(const NimBLEAddress &address)
Deletes a peer bond.
Definition NimBLEDevice.cpp:610
static bool init(const std::string &deviceName)
Initialize the BLE environment.
Definition NimBLEDevice.cpp:843
static bool setOwnAddrType(uint8_t type)
Sets the address type to use.
Definition NimBLEDevice.cpp:1032
static bool stopAdvertising()
Convenience function to stop all advertising.
Definition NimBLEDevice.cpp:210
static NimBLEServer * getServer()
Get the instance of the server.
Definition NimBLEDevice.cpp:140
static bool isInitialized()
Check if the initialization is complete.
Definition NimBLEDevice.cpp:998
static bool setMTU(uint16_t mtu)
Setup local mtu that will be used to negotiate mtu during request from client peer.
Definition NimBLEDevice.cpp:556
static NimBLEAddress getWhiteListAddress(size_t index)
Gets the address at the vector index.
Definition NimBLEDevice.cpp:729
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:1194
static uint16_t getMTU()
Get local MTU value set.
Definition NimBLEDevice.cpp:569
static int getPower(NimBLETxPowerType type=NimBLETxPowerType::All)
Get the transmission power.
Definition NimBLEDevice.cpp:515
static bool deinit(bool clearAll=false)
Shutdown the NimBLE stack/controller.
Definition NimBLEDevice.cpp:943
static NimBLEAddress getAddress()
Get our device address.
Definition NimBLEDevice.cpp:1010
static int getNumBonds()
Gets the number of bonded peers stored.
Definition NimBLEDevice.cpp:581
static bool whiteListRemove(const NimBLEAddress &address)
Remove a peer address from the whitelist.
Definition NimBLEDevice.cpp:698
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:321
static bool startSecurity(uint16_t connHandle, int *rcPtr=nullptr)
Start the connection securing and authorization for this connection.
Definition NimBLEDevice.cpp:1176
static NimBLEClient * getClientByHandle(uint16_t connHandle)
Get a reference to a client by connection handle.
Definition NimBLEDevice.cpp:370
static uint32_t getSecurityPasskey()
Get the current passkey used for pairing.
Definition NimBLEDevice.cpp:1166
static void setSecurityAuth(bool bonding, bool mitm, bool sc)
Set the authorization mode for this device.
Definition NimBLEDevice.cpp:1093
static NimBLEExtAdvertising * getAdvertising()
Get the instance of the extended advertising object.
Definition NimBLEDevice.cpp:155
static bool setDeviceName(const std::string &deviceName)
Set the BLEDevice name.
Definition NimBLEDevice.cpp:1222
static bool whiteListAdd(const NimBLEAddress &address)
Add a peer address to the whitelist.
Definition NimBLEDevice.cpp:679
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:1137
static size_t getWhiteListCount()
Gets the count of addresses in the whitelist.
Definition NimBLEDevice.cpp:720
static void host_task(void *param)
The main host task.
Definition NimBLEDevice.cpp:833
static void setSecurityPasskey(uint32_t passKey)
Set the passkey the server will ask for when pairing.
Definition NimBLEDevice.cpp:1158
static void setSecurityRespKey(uint8_t respKey)
Set the keys we are willing to accept during pairing.
Definition NimBLEDevice.cpp:1150
static void setSecurityIOCap(uint8_t iocap)
Set the Input/Output capabilities of this device.
Definition NimBLEDevice.cpp:1124
static std::string toString()
Return a string representation of the address of this device.
Definition NimBLEDevice.cpp:1253
static bool setPower(int8_t dbm, NimBLETxPowerType type=NimBLETxPowerType::All)
Set the transmission power.
Definition NimBLEDevice.cpp:470
static NimBLEAddress getBondedAddress(int index)
Get the address of a bonded peer device by index.
Definition NimBLEDevice.cpp:643
static std::vector< NimBLEClient * > getConnectedClients()
Get a list of connected clients.
Definition NimBLEDevice.cpp:413
static bool onWhiteList(const NimBLEAddress &address)
Checks if a peer device is whitelisted.
Definition NimBLEDevice.cpp:664
static NimBLEScan * getScan()
Retrieve the Scan object that we use for scanning.
Definition NimBLEDevice.cpp:225
static NimBLEClient * getClientByPeerAddress(const NimBLEAddress &peerAddress)
Get a reference to a client by peer address.
Definition NimBLEDevice.cpp:385
static bool injectConfirmPasskey(const NimBLEConnInfo &peerInfo, bool accept)
Inject the provided numeric comparison response into the Security Manager.
Definition NimBLEDevice.cpp:1206
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:60