18#ifndef NIMBLE_CPP_CLIENT_H_
19#define NIMBLE_CPP_CLIENT_H_
21#include "syscfg/syscfg.h"
22#if CONFIG_BT_NIMBLE_ENABLED && MYNEWT_VAL(BLE_ROLE_CENTRAL)
24# ifdef USING_NIMBLE_ARDUINO_HEADERS
25# include "nimble/nimble/host/include/host/ble_gap.h"
27# include "host/ble_gap.h"
30# include "NimBLEAddress.h"
38class NimBLERemoteService;
39class NimBLERemoteCharacteristic;
40class NimBLEAdvertisedDevice;
42class NimBLEClientCallbacks;
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);
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);
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;
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,
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();
88 NimBLERemoteCharacteristic* getCharacteristic(uint16_t handle);
89 NimBLERemoteService* getService(
const char* uuid);
90 NimBLERemoteService* getService(
const NimBLEUUID& uuid);
91 void deleteServices();
97 bool response =
false);
99# if MYNEWT_VAL(BLE_EXT_ADV)
100 void setConnectPhy(uint8_t phyMask);
102 bool updatePhy(uint8_t txPhysMask, uint8_t rxPhysMask, uint16_t phyOptions = 0);
103 bool getPhy(uint8_t* txPhy, uint8_t* rxPhy);
106 uint8_t deleteCallbacks : 1;
107 uint8_t deleteOnDisconnect : 1;
108 uint8_t deleteOnConnectFail : 1;
109 uint8_t asyncConnect : 1;
110 uint8_t exchangeMTU : 1;
111 uint8_t connectFailRetries : 3;
124 : deleteCallbacks(0),
125 deleteOnDisconnect(0),
126 deleteOnConnectFail(0),
129 connectFailRetries(2) {}
132 Config getConfig()
const;
133 void setConfig(Config config);
136 enum ConnStatus : uint8_t { CONNECTED, DISCONNECTED, CONNECTING, DISCONNECTING };
140 NimBLEClient(
const NimBLEClient&) =
delete;
141 NimBLEClient& operator=(
const NimBLEClient&) =
delete;
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,
156 mutable int m_lastErr;
157 int32_t m_connectTimeout;
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;
165 ConnStatus m_connStatus;
166 ble_npl_callout m_connectEstablishedTimer{};
167 bool m_connectCallbackPending;
168 uint8_t m_connectFailRetryCount;
170# if MYNEWT_VAL(BLE_EXT_ADV)
173 ble_gap_conn_params m_connParams;
176 friend class NimBLEServer;
182class NimBLEClientCallbacks {
184 virtual ~NimBLEClientCallbacks() {};
190 virtual void onConnect(NimBLEClient* pClient);
197 virtual void onConnectFail(NimBLEClient* pClient,
int reason);
204 virtual void onDisconnect(NimBLEClient* pClient,
int reason);
212 virtual bool onConnParamsUpdateRequest(NimBLEClient* pClient,
const ble_gap_upd_params* params);
239 virtual void onConfirmPasskey(
NimBLEConnInfo& connInfo, uint32_t pin);
253 virtual void onMTUChange(NimBLEClient* pClient, uint16_t MTU);
266 virtual void onPhyUpdate(NimBLEClient* pClient, uint8_t txPhy, uint8_t rxPhy);
A BLE device address.
Definition NimBLEAddress.h:42
A specialized container class to hold BLE attribute values.
Definition NimBLEAttValue.h:95
Connection information.
Definition NimBLEConnInfo.h:33
A model of a BLE Device from which all the BLE roles are created.
Definition NimBLEDevice.h:119
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:53