esp-nimble-cpp 2.6.0
Loading...
Searching...
No Matches
NimBLEServer.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_SERVER_H_
19#define NIMBLE_CPP_SERVER_H_
20
21#include "syscfg/syscfg.h"
22#if CONFIG_BT_NIMBLE_ENABLED && MYNEWT_VAL(BLE_ROLE_PERIPHERAL)
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/**** FIX COMPILATION ****/
31# undef min
32# undef max
33/**************************/
34
35# include <vector>
36# include <array>
37
38# define NIMBLE_ATT_REMOVE_HIDE 1
39# define NIMBLE_ATT_REMOVE_DELETE 2
40
41class NimBLEService;
42class NimBLEServerCallbacks;
43class NimBLEUUID;
44class NimBLEConnInfo;
45class NimBLEAddress;
46class NimBLEService;
47class NimBLECharacteristic;
48# if MYNEWT_VAL(BLE_ROLE_BROADCASTER)
49# if MYNEWT_VAL(BLE_EXT_ADV)
50class NimBLEExtAdvertising;
51# else
53# endif
54# endif
55# if MYNEWT_VAL(BLE_ROLE_CENTRAL)
56class NimBLEClient;
57# endif
58
62class NimBLEServer {
63 public:
64 bool start();
65 uint8_t getConnectedCount() const;
66 bool disconnect(uint16_t connHandle, uint8_t reason = BLE_ERR_REM_USER_CONN_TERM) const;
67 bool disconnect(const NimBLEConnInfo& connInfo, uint8_t reason = BLE_ERR_REM_USER_CONN_TERM) const;
68 void setCallbacks(NimBLEServerCallbacks* pCallbacks, bool deleteCallbacks = true);
69 void updateConnParams(uint16_t connHandle, uint16_t minInterval, uint16_t maxInterval, uint16_t latency, uint16_t timeout) const;
70 NimBLEService* createService(const char* uuid);
71 NimBLEService* createService(const NimBLEUUID& uuid);
72 NimBLEService* getServiceByUUID(const char* uuid, uint16_t instanceId = 0) const;
73 NimBLEService* getServiceByUUID(const NimBLEUUID& uuid, uint16_t instanceId = 0) const;
74 NimBLEService* getServiceByHandle(uint16_t handle) const;
75 NimBLECharacteristic* getCharacteristicByHandle(uint16_t handle) const;
76 void removeService(NimBLEService* service, bool deleteSvc = false);
77 void addService(NimBLEService* service);
78 uint16_t getPeerMTU(uint16_t connHandle) const;
79 std::vector<uint16_t> getPeerDevices() const;
80 NimBLEConnInfo getPeerInfo(uint8_t index) const;
81 NimBLEConnInfo getPeerInfo(const NimBLEAddress& address) const;
82 NimBLEConnInfo getPeerInfoByHandle(uint16_t connHandle) const;
83 void advertiseOnDisconnect(bool enable);
84 void registerAppServicesFirst(bool enable);
85 void setDataLen(uint16_t connHandle, uint16_t tx_octets) const;
86 bool updatePhy(uint16_t connHandle, uint8_t txPhysMask, uint8_t rxPhysMask, uint16_t phyOptions);
87 bool getPhy(uint16_t connHandle, uint8_t* txPhy, uint8_t* rxPhy);
88 void sendServiceChangedIndication() const;
89
90# if MYNEWT_VAL(BLE_ROLE_CENTRAL)
91 NimBLEClient* getClient(uint16_t connHandle);
92 NimBLEClient* getClient(const NimBLEConnInfo& connInfo);
93 void deleteClient();
94# endif
95
96# if MYNEWT_VAL(BLE_ROLE_BROADCASTER)
97# if MYNEWT_VAL(BLE_EXT_ADV)
98 NimBLEExtAdvertising* getAdvertising() const;
99 bool startAdvertising(uint8_t instanceId, int duration = 0, int maxEvents = 0) const;
100 bool stopAdvertising(uint8_t instanceId) const;
101# endif
102
103# if !MYNEWT_VAL(BLE_EXT_ADV) || defined(_DOXYGEN_)
104 NimBLEAdvertising* getAdvertising() const;
105 bool startAdvertising(uint32_t duration = 0) const;
106 bool stopAdvertising() const;
107# endif
108# endif
109
110 private:
111 friend class NimBLEDevice;
112 friend class NimBLEService;
113 friend class NimBLECharacteristic;
114# if MYNEWT_VAL(BLE_ROLE_BROADCASTER)
115# if MYNEWT_VAL(BLE_EXT_ADV)
116 friend class NimBLEExtAdvertising;
117# else
118 friend class NimBLEAdvertising;
119# endif
120# endif
121
122 NimBLEServer();
123 ~NimBLEServer();
124 static int handleGapEvent(struct ble_gap_event* event, void* arg);
125 static int handleGattEvent(uint16_t connHandle, uint16_t attrHandle, ble_gatt_access_ctxt* ctxt, void* arg);
126 static void gattRegisterCallback(struct ble_gatt_register_ctxt* ctxt, void* arg);
127 void setServiceChanged();
128 bool resetGATT();
129
130 bool m_gattsStarted : 1;
131 bool m_svcChanged : 1;
132 bool m_deleteCallbacks : 1;
133 bool m_registerAppServicesFirst : 1;
134# if !MYNEWT_VAL(BLE_EXT_ADV) && MYNEWT_VAL(BLE_ROLE_BROADCASTER)
135 bool m_advertiseOnDisconnect : 1;
136# endif
137 NimBLEServerCallbacks* m_pServerCallbacks;
138 std::vector<NimBLEService*> m_svcVec;
139 std::array<uint16_t, MYNEWT_VAL(BLE_MAX_CONNECTIONS)> m_connectedPeers;
140
141# if MYNEWT_VAL(BLE_ROLE_CENTRAL)
142 NimBLEClient* m_pClient{nullptr};
143# endif
144}; // NimBLEServer
145
149class NimBLEServerCallbacks {
150 public:
151 virtual ~NimBLEServerCallbacks() {};
152
160 virtual void onConnect(NimBLEServer* pServer, NimBLEConnInfo& connInfo);
161
170 virtual void onDisconnect(NimBLEServer* pServer, NimBLEConnInfo& connInfo, int reason);
171
178 virtual void onMTUChange(uint16_t MTU, NimBLEConnInfo& connInfo);
179
184 virtual uint32_t onPassKeyDisplay();
185
193 virtual void onPassKeyEntry(NimBLEConnInfo& connInfo);
194
201 virtual void onConfirmPassKey(NimBLEConnInfo& connInfo, uint32_t pin);
202
208 virtual void onAuthenticationComplete(NimBLEConnInfo& connInfo);
209
214 virtual void onIdentity(NimBLEConnInfo& connInfo);
215
222 virtual void onConnParamsUpdate(NimBLEConnInfo& connInfo);
223
235 virtual void onPhyUpdate(NimBLEConnInfo& connInfo, uint8_t txPhy, uint8_t rxPhy);
236}; // NimBLEServerCallbacks
237
238#endif // CONFIG_BT_NIMBLE_ENABLED && MYNEWT_VAL(BLE_ROLE_PERIPHERAL)
239#endif // NIMBLE_CPP_SERVER_H_
A BLE device address.
Definition NimBLEAddress.h:42
Perform and manage BLE advertising.
Definition NimBLEAdvertising.h:51
Connection information.
Definition NimBLEConnInfo.h:33
A model of a BLE Device from which all the BLE roles are created.
Definition NimBLEDevice.h:120
A model of a BLE UUID.
Definition NimBLEUUID.h:41