esp-nimble-cpp 2.3.2
Loading...
Searching...
No Matches
NimBLEClient.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_CLIENT_H_
19#define NIMBLE_CPP_CLIENT_H_
20
21#include "syscfg/syscfg.h"
22#if CONFIG_BT_NIMBLE_ENABLED && MYNEWT_VAL(BLE_ROLE_CENTRAL)
23
24# if defined(CONFIG_NIMBLE_CPP_IDF)
25# include "host/ble_gap.h"
26# else
27# include "nimble/nimble/host/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;
38class NimBLERemoteService;
39class NimBLERemoteCharacteristic;
40class NimBLEAdvertisedDevice;
41class NimBLEAttValue;
42class NimBLEClientCallbacks;
43class NimBLEConnInfo;
44struct NimBLETaskData;
45
49class NimBLEClient {
50 public:
51# if MYNEWT_VAL(BLE_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 setSelfDelete(bool deleteOnDisconnect, bool deleteOnConnectFail);
62 NimBLEAddress getPeerAddress() const;
63 bool setPeerAddress(const NimBLEAddress& address);
64 int getRssi() const;
65 bool isConnected() const;
66 void setClientCallbacks(NimBLEClientCallbacks* pClientCallbacks, bool deleteCallbacks = true);
67 std::string toString() const;
68 uint16_t getConnHandle() const;
69 uint16_t getMTU() const;
70 bool exchangeMTU();
71 bool secureConnection(bool async = false) const;
72 void setConnectTimeout(uint32_t timeout);
73 bool setDataLen(uint16_t txOctets);
74 bool discoverAttributes();
75 NimBLEConnInfo getConnInfo() const;
76 int getLastError() const;
77 bool updateConnParams(uint16_t minInterval, uint16_t maxInterval, uint16_t latency, uint16_t timeout);
78 void setConnectionParams(uint16_t minInterval,
79 uint16_t maxInterval,
80 uint16_t latency,
81 uint16_t timeout,
82 uint16_t scanInterval = 16,
83 uint16_t scanWindow = 16);
84 const std::vector<NimBLERemoteService*>& getServices(bool refresh = false);
85 std::vector<NimBLERemoteService*>::iterator begin();
86 std::vector<NimBLERemoteService*>::iterator end();
87 NimBLERemoteCharacteristic* getCharacteristic(uint16_t handle);
88 NimBLERemoteService* getService(const char* uuid);
89 NimBLERemoteService* getService(const NimBLEUUID& uuid);
90 void deleteServices();
91 size_t deleteService(const NimBLEUUID& uuid);
92 NimBLEAttValue getValue(const NimBLEUUID& serviceUUID, const NimBLEUUID& characteristicUUID);
93 bool setValue(const NimBLEUUID& serviceUUID,
94 const NimBLEUUID& characteristicUUID,
95 const NimBLEAttValue& value,
96 bool response = false);
97
98# if MYNEWT_VAL(BLE_EXT_ADV)
99 void setConnectPhy(uint8_t phyMask);
100# endif
101 bool updatePhy(uint8_t txPhysMask, uint8_t rxPhysMask, uint16_t phyOptions = 0);
102 bool getPhy(uint8_t* txPhy, uint8_t* rxPhy);
103
104 struct Config {
105 uint8_t deleteCallbacks : 1; // Delete the callback object when the client is deleted.
106 uint8_t deleteOnDisconnect : 1; // Delete the client when disconnected.
107 uint8_t deleteOnConnectFail : 1; // Delete the client when a connection attempt fails.
108 uint8_t asyncConnect : 1; // Connect asynchronously.
109 uint8_t exchangeMTU : 1; // Exchange MTU after connection.
110 };
111
112 Config getConfig() const;
113 void setConfig(Config config);
114
115 private:
116 NimBLEClient(const NimBLEAddress& peerAddress);
117 ~NimBLEClient();
118 NimBLEClient(const NimBLEClient&) = delete;
119 NimBLEClient& operator=(const NimBLEClient&) = delete;
120
121 bool retrieveServices(const NimBLEUUID* uuidFilter = nullptr);
122 static int handleGapEvent(struct ble_gap_event* event, void* arg);
123 static int exchangeMTUCb(uint16_t conn_handle, const ble_gatt_error* error, uint16_t mtu, void* arg);
124 static int serviceDiscoveredCB(uint16_t connHandle,
125 const struct ble_gatt_error* error,
126 const struct ble_gatt_svc* service,
127 void* arg);
128
129 NimBLEAddress m_peerAddress;
130 mutable int m_lastErr;
131 int32_t m_connectTimeout;
132 mutable NimBLETaskData* m_pTaskData;
133 std::vector<NimBLERemoteService*> m_svcVec;
134 NimBLEClientCallbacks* m_pClientCallbacks;
135 uint16_t m_connHandle;
136 uint8_t m_terminateFailCount;
137 mutable uint8_t m_asyncSecureAttempt;
138 Config m_config;
139
140# if MYNEWT_VAL(BLE_EXT_ADV)
141 uint8_t m_phyMask;
142# endif
143 ble_gap_conn_params m_connParams;
144
145 friend class NimBLEDevice;
146 friend class NimBLEServer;
147}; // class NimBLEClient
148
152class NimBLEClientCallbacks {
153 public:
154 virtual ~NimBLEClientCallbacks() {};
155
160 virtual void onConnect(NimBLEClient* pClient);
161
167 virtual void onConnectFail(NimBLEClient* pClient, int reason);
168
174 virtual void onDisconnect(NimBLEClient* pClient, int reason);
175
182 virtual bool onConnParamsUpdateRequest(NimBLEClient* pClient, const ble_gap_upd_params* params);
183
188 virtual void onPassKeyEntry(NimBLEConnInfo& connInfo);
189
195 virtual void onAuthenticationComplete(NimBLEConnInfo& connInfo);
196
202 virtual void onConfirmPasskey(NimBLEConnInfo& connInfo, uint32_t pin);
203
208 virtual void onIdentity(NimBLEConnInfo& connInfo);
209
216 virtual void onMTUChange(NimBLEClient* pClient, uint16_t MTU);
217
229 virtual void onPhyUpdate(NimBLEClient* pClient, uint8_t txPhy, uint8_t rxPhy);
230};
231
232#endif // CONFIG_BT_NIMBLE_ENABLED && MYNEWT_VAL(BLE_ROLE_CENTRAL)
233#endif // NIMBLE_CPP_CLIENT_H_
A BLE device address.
Definition NimBLEAddress.h:42
A specialized container class to hold BLE attribute values.
Definition NimBLEAttValue.h:72
Connection information.
Definition NimBLEConnInfo.h:32
A model of a BLE Device from which all the BLE roles are created.
Definition NimBLEDevice.h:116
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:45