NimBLE-Arduino 2.5.0
Loading...
Searching...
No Matches
NimBLEClient.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_CLIENT_H_
19#define NIMBLE_CPP_CLIENT_H_
20
21#include "nimconfig.h"
22#if CONFIG_BT_ENABLED && CONFIG_BT_NIMBLE_ROLE_CENTRAL
23
24# ifdef USING_NIMBLE_ARDUINO_HEADERS
25# include "nimble/nimble/host/include/host/ble_gap.h"
26# else
27# include "host/ble_gap.h"
28# endif
29
30# include "NimBLEAddress.h"
31
32# include <stdint.h>
33# include <vector>
34# include <string>
35
36class NimBLEAddress;
37class NimBLEUUID;
41class NimBLEAttValue;
43class NimBLEConnInfo;
44struct NimBLETaskData;
45
50 public:
51# if CONFIG_BT_NIMBLE_ROLE_OBSERVER
52 bool connect(const NimBLEAdvertisedDevice* device,
53 bool deleteAttributes = true,
54 bool asyncConnect = false,
55 bool exchangeMTU = true);
56# endif
57 bool connect(const NimBLEAddress& address, bool deleteAttributes = true, bool asyncConnect = false, bool exchangeMTU = true);
58 bool connect(bool deleteAttributes = true, bool asyncConnect = false, bool exchangeMTU = true);
59 bool disconnect(uint8_t reason = BLE_ERR_REM_USER_CONN_TERM);
60 bool cancelConnect() const;
61 void setConnectRetries(uint8_t numRetries);
62 void setSelfDelete(bool deleteOnDisconnect, bool deleteOnConnectFail);
64 bool setPeerAddress(const NimBLEAddress& address);
65 int getRssi() const;
66 bool isConnected() const;
67 void setClientCallbacks(NimBLEClientCallbacks* pClientCallbacks, bool deleteCallbacks = true);
68 std::string toString() const;
69 uint16_t getConnHandle() const;
70 uint16_t getMTU() const;
71 bool exchangeMTU();
72 bool secureConnection(bool async = false) const;
73 void setConnectTimeout(uint32_t timeout);
74 bool setDataLen(uint16_t txOctets);
75 bool discoverAttributes();
77 int getLastError() const;
78 bool updateConnParams(uint16_t minInterval, uint16_t maxInterval, uint16_t latency, uint16_t timeout);
79 void setConnectionParams(uint16_t minInterval,
80 uint16_t maxInterval,
81 uint16_t latency,
82 uint16_t timeout,
83 uint16_t scanInterval = 16,
84 uint16_t scanWindow = 16);
85 const std::vector<NimBLERemoteService*>& getServices(bool refresh = false);
86 std::vector<NimBLERemoteService*>::iterator begin();
87 std::vector<NimBLERemoteService*>::iterator end();
89 NimBLERemoteService* getService(const char* uuid);
91 void deleteServices();
92 size_t deleteService(const NimBLEUUID& uuid);
93 NimBLEAttValue getValue(const NimBLEUUID& serviceUUID, const NimBLEUUID& characteristicUUID);
94 bool setValue(const NimBLEUUID& serviceUUID,
95 const NimBLEUUID& characteristicUUID,
96 const NimBLEAttValue& value,
97 bool response = false);
98
99# if CONFIG_BT_NIMBLE_EXT_ADV
100 void setConnectPhy(uint8_t phyMask);
101# endif
102 bool updatePhy(uint8_t txPhysMask, uint8_t rxPhysMask, uint16_t phyOptions = 0);
103 bool getPhy(uint8_t* txPhy, uint8_t* rxPhy);
104
105 struct Config {
106 uint8_t deleteCallbacks : 1; // Delete the callback object when the client is deleted.
107 uint8_t deleteOnDisconnect : 1; // Delete the client when disconnected.
108 uint8_t deleteOnConnectFail : 1; // Delete the client when a connection attempt fails.
109 uint8_t asyncConnect : 1; // Connect asynchronously.
110 uint8_t exchangeMTU : 1; // Exchange MTU after connection.
111 uint8_t connectFailRetries : 3; // Number of retries for 0x3e (connection establishment) failures.
112
123 Config()
124 : deleteCallbacks(0),
125 deleteOnDisconnect(0),
126 deleteOnConnectFail(0),
127 asyncConnect(0),
128 exchangeMTU(1),
129 connectFailRetries(2) {}
130 };
131
132 Config getConfig() const;
133 void setConfig(Config config);
134
135 private:
136 enum ConnStatus : uint8_t { CONNECTED, DISCONNECTED, CONNECTING, DISCONNECTING };
137
138 NimBLEClient(const NimBLEAddress& peerAddress);
140 NimBLEClient(const NimBLEClient&) = delete;
141 NimBLEClient& operator=(const NimBLEClient&) = delete;
142
143 bool retrieveServices(const NimBLEUUID* uuidFilter = nullptr);
144 int startConnectionAttempt(const ble_addr_t* peerAddr);
145 static int handleGapEvent(struct ble_gap_event* event, void* arg);
146 static void connectEstablishedTimerCb(struct ble_npl_event* event);
147 void startConnectEstablishedTimer(uint16_t connInterval);
148 bool completeConnectEstablished();
149 static int exchangeMTUCb(uint16_t conn_handle, const ble_gatt_error* error, uint16_t mtu, void* arg);
150 static int serviceDiscoveredCB(uint16_t connHandle,
151 const struct ble_gatt_error* error,
152 const struct ble_gatt_svc* service,
153 void* arg);
154
155 NimBLEAddress m_peerAddress;
156 mutable int m_lastErr;
157 int32_t m_connectTimeout;
158 mutable NimBLETaskData* m_pTaskData;
159 std::vector<NimBLERemoteService*> m_svcVec;
160 NimBLEClientCallbacks* m_pClientCallbacks;
161 uint16_t m_connHandle;
162 uint8_t m_terminateFailCount;
163 mutable uint8_t m_asyncSecureAttempt;
164 Config m_config;
165 ConnStatus m_connStatus;
166 ble_npl_callout m_connectEstablishedTimer{};
167 bool m_connectCallbackPending;
168 uint8_t m_connectFailRetryCount;
169
170# if CONFIG_BT_NIMBLE_EXT_ADV
171 uint8_t m_phyMask;
172# endif
173 ble_gap_conn_params m_connParams;
174
175 friend class NimBLEDevice;
176 friend class NimBLEServer;
177}; // class NimBLEClient
178
183 public:
184 virtual ~NimBLEClientCallbacks() {};
185
190 virtual void onConnect(NimBLEClient* pClient);
191
197 virtual void onConnectFail(NimBLEClient* pClient, int reason);
198
204 virtual void onDisconnect(NimBLEClient* pClient, int reason);
205
212 virtual bool onConnParamsUpdateRequest(NimBLEClient* pClient, const ble_gap_upd_params* params);
213
218 virtual void onPassKeyEntry(NimBLEConnInfo& connInfo);
219
225 virtual uint32_t onPassKeyDisplay(NimBLEConnInfo& connInfo);
226
232 virtual void onAuthenticationComplete(NimBLEConnInfo& connInfo);
233
239 virtual void onConfirmPasskey(NimBLEConnInfo& connInfo, uint32_t pin);
240
245 virtual void onIdentity(NimBLEConnInfo& connInfo);
246
253 virtual void onMTUChange(NimBLEClient* pClient, uint16_t MTU);
254
266 virtual void onPhyUpdate(NimBLEClient* pClient, uint8_t txPhy, uint8_t rxPhy);
267};
268
269#endif // CONFIG_BT_ENABLED && CONFIG_BT_NIMBLE_ROLE_CENTRAL
270#endif // NIMBLE_CPP_CLIENT_H_
A BLE device address.
Definition NimBLEAddress.h:42
A representation of a BLE advertised device found by a scan.
Definition NimBLEAdvertisedDevice.h:45
A specialized container class to hold BLE attribute values.
Definition NimBLEAttValue.h:85
Callbacks associated with a BLE client.
Definition NimBLEClient.h:182
virtual uint32_t onPassKeyDisplay(NimBLEConnInfo &connInfo)
Called when using passkey entry pairing and the passkey should be displayed.
Definition NimBLEClient.cpp:1482
virtual void onPhyUpdate(NimBLEClient *pClient, uint8_t txPhy, uint8_t rxPhy)
Called when the PHY update procedure is complete.
Definition NimBLEClient.cpp:1504
virtual void onConfirmPasskey(NimBLEConnInfo &connInfo, uint32_t pin)
Called when using numeric comparision for pairing.
Definition NimBLEClient.cpp:1495
virtual bool onConnParamsUpdateRequest(NimBLEClient *pClient, const ble_gap_upd_params *params)
Called when server requests to update the connection parameters.
Definition NimBLEClient.cpp:1472
virtual void onMTUChange(NimBLEClient *pClient, uint16_t MTU)
Called when the connection MTU changes.
Definition NimBLEClient.cpp:1500
virtual void onConnect(NimBLEClient *pClient)
Called after client connects.
Definition NimBLEClient.cpp:1460
virtual void onPassKeyEntry(NimBLEConnInfo &connInfo)
Called when server requests a passkey for pairing.
Definition NimBLEClient.cpp:1477
virtual void onIdentity(NimBLEConnInfo &connInfo)
Called when the peer identity address is resolved.
Definition NimBLEClient.cpp:1491
virtual void onConnectFail(NimBLEClient *pClient, int reason)
Called when a connection attempt fails.
Definition NimBLEClient.cpp:1464
virtual void onDisconnect(NimBLEClient *pClient, int reason)
Called when disconnected from the server.
Definition NimBLEClient.cpp:1468
virtual void onAuthenticationComplete(NimBLEConnInfo &connInfo)
Called when the pairing procedure is complete.
Definition NimBLEClient.cpp:1487
A model of a BLE client.
Definition NimBLEClient.h:49
void setConnectPhy(uint8_t phyMask)
Set the PHY types to use when connecting to a server.
Definition NimBLEClient.cpp:446
std::vector< NimBLERemoteService * >::iterator end()
Get iterator to the end of the vector of remote service pointers.
Definition NimBLEClient.cpp:652
bool isConnected() const
Are we connected to a server?
Definition NimBLEClient.cpp:1416
size_t deleteService(const NimBLEUUID &uuid)
Delete a service by UUID from the local database to free resources.
Definition NimBLEClient.cpp:130
bool discoverAttributes()
Retrieves the full database of attributes that the peripheral has available.
Definition NimBLEClient.cpp:740
bool updatePhy(uint8_t txPhysMask, uint8_t rxPhysMask, uint16_t phyOptions=0)
Request a change to the PHY used for this peer connection.
Definition NimBLEClient.cpp:469
void setConnectionParams(uint16_t minInterval, uint16_t maxInterval, uint16_t latency, uint16_t timeout, uint16_t scanInterval=16, uint16_t scanWindow=16)
Set the connection parameters to use when connecting to a server.
Definition NimBLEClient.cpp:502
bool exchangeMTU()
Begin the MTU exchange process with the server.
Definition NimBLEClient.cpp:943
int getRssi() const
Ask the BLE server for the RSSI value.
Definition NimBLEClient.cpp:623
bool connect(const NimBLEAdvertisedDevice *device, bool deleteAttributes=true, bool asyncConnect=false, bool exchangeMTU=true)
Connect to an advertising device.
Definition NimBLEClient.cpp:155
bool secureConnection(bool async=false) const
Initiate a secure connection (pair/bond) with the server. Called automatically when a characteristic ...
Definition NimBLEClient.cpp:335
bool disconnect(uint8_t reason=BLE_ERR_REM_USER_CONN_TERM)
Disconnect from the peer.
Definition NimBLEClient.cpp:379
NimBLEAttValue getValue(const NimBLEUUID &serviceUUID, const NimBLEUUID &characteristicUUID)
Get the value of a specific characteristic associated with a specific service.
Definition NimBLEClient.cpp:843
NimBLEAddress getPeerAddress() const
Retrieve the address of the peer.
Definition NimBLEClient.cpp:600
bool setDataLen(uint16_t txOctets)
Request an update of the data packet length.
Definition NimBLEClient.cpp:552
NimBLEConnInfo getConnInfo() const
Get detailed information about the current peer connection.
Definition NimBLEClient.cpp:571
void setSelfDelete(bool deleteOnDisconnect, bool deleteOnConnectFail)
Set or unset a flag to delete this client when disconnected or connection failed.
Definition NimBLEClient.cpp:416
void deleteServices()
Delete all service objects created by this client and clear the vector.
Definition NimBLEClient.cpp:116
NimBLERemoteCharacteristic * getCharacteristic(uint16_t handle)
Get the remote characteristic with the specified handle.
Definition NimBLEClient.cpp:897
bool getPhy(uint8_t *txPhy, uint8_t *rxPhy)
Get the PHY used for this peer connection.
Definition NimBLEClient.cpp:484
void setConnectRetries(uint8_t numRetries)
Set the number of times to retry connecting after a connection establishment error (0x3e).
Definition NimBLEClient.cpp:1003
uint16_t getMTU() const
Get the current mtu of this connection.
Definition NimBLEClient.cpp:915
bool setPeerAddress(const NimBLEAddress &address)
Set the peer address.
Definition NimBLEClient.cpp:609
std::string toString() const
Return a string representation of this client.
Definition NimBLEClient.cpp:1439
bool setValue(const NimBLEUUID &serviceUUID, const NimBLEUUID &characteristicUUID, const NimBLEAttValue &value, bool response=false)
Set the value of a specific characteristic associated with a specific service.
Definition NimBLEClient.cpp:870
std::vector< NimBLERemoteService * >::iterator begin()
Get iterator to the beginning of the vector of remote service pointers.
Definition NimBLEClient.cpp:644
Config getConfig() const
Get a copy of the clients configuration.
Definition NimBLEClient.cpp:425
uint16_t getConnHandle() const
Get the connection handle for this client.
Definition NimBLEClient.cpp:592
bool updateConnParams(uint16_t minInterval, uint16_t maxInterval, uint16_t latency, uint16_t timeout)
Update the connection parameters:
Definition NimBLEClient.cpp:526
void setConfig(Config config)
Set the client configuration options.
Definition NimBLEClient.cpp:433
const std::vector< NimBLERemoteService * > & getServices(bool refresh=false)
Get a pointer to the vector of found services.
Definition NimBLEClient.cpp:723
NimBLERemoteService * getService(const char *uuid)
Get the service BLE Remote Service instance corresponding to the uuid.
Definition NimBLEClient.cpp:661
int getLastError() const
Get the last error code reported by the NimBLE host.
Definition NimBLEClient.cpp:1456
void setConnectTimeout(uint32_t timeout)
Set the timeout to wait for connection attempt to complete.
Definition NimBLEClient.cpp:584
void setClientCallbacks(NimBLEClientCallbacks *pClientCallbacks, bool deleteCallbacks=true)
Set the callbacks that will be invoked when events are received.
Definition NimBLEClient.cpp:1425
bool cancelConnect() const
Cancel an ongoing connection attempt.
Definition NimBLEClient.cpp:400
Connection information.
Definition NimBLEConnInfo.h:33
A model of a BLE Device from which all the BLE roles are created.
Definition NimBLEDevice.h:126
A model of a remote BLE characteristic.
Definition NimBLERemoteCharacteristic.h:36
A model of a remote BLE service.
Definition NimBLERemoteService.h:34
The model of a BLE server.
Definition NimBLEServer.h:62
A model of a BLE UUID.
Definition NimBLEUUID.h:41
A structure to hold data for a task that is waiting for a response.
Definition NimBLEUtils.h:33