nRF Connect SDK API 3.3.99
Loading...
Searching...
No Matches
ble_connectivity_manager.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2023 Nordic Semiconductor ASA
3 *
4 * SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
5 */
6
7#pragma once
8
10
11#include <bluetooth/gatt_dm.h>
12#include <bluetooth/scan.h>
13#include <zephyr/bluetooth/addr.h>
14#include <zephyr/bluetooth/conn.h>
15#include <zephyr/bluetooth/gatt.h>
16#include <zephyr/kernel.h>
17#include <zephyr/sys/ring_buffer.h>
18#include <zephyr/sys/slist.h>
19
20namespace Nrf
21{
22
23/* Forward declarations. */
24struct BLEBridgedDevice;
26
28public:
29 static constexpr uint16_t kScanTimeoutMs = CONFIG_BRIDGE_BT_SCAN_TIMEOUT_MS;
30 static constexpr uint16_t kMaxScannedDevices = CONFIG_BRIDGE_BT_MAX_SCANNED_DEVICES;
31 /* One BT connection is reserved for the Matter service purposes. */
32 static constexpr uint16_t kMaxConnectedDevices = CONFIG_BT_MAX_CONN - 1;
33 static constexpr uint8_t kMaxServiceUuids = CONFIG_BT_SCAN_UUID_CNT;
34
47 enum State : uint8_t { Start = 0, Scanning = 0, Pairing, LostDevice, Connected, Idle, Unknown, End };
56 using StateChangedCallback = void (*)(State state);
57
59 bt_addr_le_t mAddr;
60 bt_le_conn_param mConnParam;
61 uint16_t mUuid;
62 };
63
64 struct ScanResult {
66 uint8_t mCount = 0;
67 };
68
69private:
70 class Recovery {
71 friend class BLEConnectivityManager;
72
73 /* Recovery intervals in seconds. */
74 constexpr static auto kRecoveryIntervalSec = 1;
75 constexpr static auto kRecoveryMaxIntervalSec = CONFIG_BRIDGE_BT_RECOVERY_MAX_INTERVAL;
76
77 constexpr static auto kRecoveryScanTimeoutMs = CONFIG_BRIDGE_BT_RECOVERY_SCAN_TIMEOUT_MS;
78
79 struct ListItem : public sys_snode_t {
80 BLEBridgedDeviceProvider *mProvider = nullptr;
81 };
82
83 public:
84 Recovery();
85 ~Recovery() { CancelTimer(); }
86 void NotifyProviderToRecover(BLEBridgedDeviceProvider *provider);
87
88 private:
89 static bool EntryExists(BLEBridgedDeviceProvider *provider, sys_slist_t *list);
90 static BLEBridgedDeviceProvider *GetProvider(sys_slist_t *list);
91 static bool PutProvider(BLEBridgedDeviceProvider *provider, sys_slist_t *list);
92 bool IsNeeded() { return !sys_slist_is_empty(&mListToRecover); }
93 void StartTimer();
94 void CancelTimer() { k_timer_stop(&mRecoveryTimer); }
95 void RemoveRecovered(BLEBridgedDeviceProvider *provider);
96 uint16_t GetFailedRecoveryAttempts();
97
98 static void TimerTimeoutCallback(k_timer *timer);
99
100 sys_slist_t mListToRecover;
101 sys_slist_t mListToReconnect;
102 k_timer mRecoveryTimer;
103 };
104
105 struct DiscoveryHandlerCtx {
106 BLEBridgedDeviceProvider *mProvider;
107 bt_gatt_dm *mDiscoveryData;
108 };
109
110public:
111 using DeviceConnectedCallback = CHIP_ERROR (*)(bool success, void *context);
112 using ScanDoneCallback = void (*)(ScanResult &result, void *context);
113 using ConnectionSecurityRequestCallback = void (*)(void *context);
114
119
128 CHIP_ERROR Init(const bt_uuid **serviceUuids, uint8_t serviceUuidsCount);
129
140 CHIP_ERROR Scan(ScanDoneCallback callback, void *context, uint32_t scanTimeoutMs = kScanTimeoutMs);
141
148 CHIP_ERROR StopScan();
149
160 CHIP_ERROR Connect(BLEBridgedDeviceProvider *provider, ConnectionSecurityRequest *request = nullptr);
161
168 CHIP_ERROR Reconnect(BLEBridgedDeviceProvider *provider);
169
178
187
195 CHIP_ERROR RemoveBLEProvider(bt_addr_le_t address);
196
205 CHIP_ERROR GetScannedDeviceAddress(bt_addr_le_t *address, uint8_t index);
206
215 CHIP_ERROR GetScannedDeviceUuid(uint16_t &uuid, uint8_t index);
216
223 void Recover(BLEBridgedDeviceProvider *provider) { mRecovery.NotifyProviderToRecover(provider); }
224
233 void RegisterStateCallback(StateChangedCallback callback) { mStateChangedCb = callback; }
234
236 CHIP_ERROR PrepareFilterForAddress(bt_addr_le_t *addr);
237
238 /* Public static callbacks for Bluetooth LE connection handling. */
239 static void FilterMatch(bt_scan_device_info *device_info, bt_scan_filter_match *filter_match, bool connectable);
240 static void ScanTimeoutCallback(k_timer *timer);
241 static void ScanTimeoutHandle(intptr_t context);
242 static void ConnectionHandler(bt_conn *conn, uint8_t conn_err);
243 static void DisconnectionHandler(bt_conn *conn, uint8_t reason);
244 static void DiscoveryCompletedHandler(bt_gatt_dm *dm, void *context);
245 static void DiscoveryNotFound(bt_conn *conn, void *context);
246 static void DiscoveryError(bt_conn *conn, int err, void *context);
247 static int StartGattDiscovery(bt_conn *conn, BLEBridgedDeviceProvider *provider);
248#ifdef CONFIG_BRIDGE_FORCE_BT_CONNECTION_PARAMS
249 static bool ParamChangeRequestHandler(struct bt_conn *conn, struct bt_le_conn_param *param);
250#endif
251
252#ifdef CONFIG_BT_SMP
253 static void SecurityChangedHandler(struct bt_conn *conn, bt_security_t level, enum bt_security_err err);
254 static void AuthenticationCancel(struct bt_conn *conn);
255 static void PasskeyEntry(struct bt_conn *conn);
256 static void PairingComplete(struct bt_conn *conn, bool bonded);
257 static void PairingFailed(struct bt_conn *conn, enum bt_security_err reason);
258
265 void SetPincode(bt_addr_le_t addr, unsigned int pincode);
266#endif /* CONFIG_BT_SMP */
267
269 {
270 static BLEConnectivityManager sInstance;
271 return sInstance;
272 }
273 static void ReScanCallback(ScanResult &result, void *context);
274
275private:
276 bt_le_conn_param *GetScannedDeviceConnParams(bt_addr_le_t address);
277 State GetCurrentState();
278 void UpdateStateFlag(State state, bool enabled);
279 void UpdateRecovery();
280
281 StateChangedCallback mStateChangedCb = nullptr;
282 uint8_t mStateBitmask = 0;
283 bool mScanActive;
284 k_timer mScanTimer;
285 uint8_t mScannedDevicesCounter;
286 uint8_t mConnectedProvidersCounter;
287 ScannedDevice mScannedDevices[kMaxScannedDevices];
288 ScanResult mScanResult;
290 bt_uuid *mServicesUuid[kMaxServiceUuids];
291 uint8_t mServicesUuidCount;
292 ScanDoneCallback mScanDoneCallback;
293 void *mScanDoneCallbackContext;
294#ifdef CONFIG_BT_SMP
295 ConnectionSecurityRequest mConnectionSecurityRequest;
296#endif /* CONFIG_BT_SMP */
297 Recovery mRecovery;
298};
299
300} /* namespace Nrf */
Definition ble_bridged_device.h:32
static void PairingComplete(struct bt_conn *conn, bool bonded)
static void PairingFailed(struct bt_conn *conn, enum bt_security_err reason)
static void ScanTimeoutHandle(intptr_t context)
static constexpr uint16_t kMaxScannedDevices
Definition ble_connectivity_manager.h:30
static void DiscoveryError(bt_conn *conn, int err, void *context)
static void ScanTimeoutCallback(k_timer *timer)
CHIP_ERROR PrepareFilterForAddress(bt_addr_le_t *addr)
static constexpr uint16_t kScanTimeoutMs
Definition ble_connectivity_manager.h:29
CHIP_ERROR(*)(bool success, void *context) DeviceConnectedCallback
Definition ble_connectivity_manager.h:111
static void PasskeyEntry(struct bt_conn *conn)
static void DiscoveryCompletedHandler(bt_gatt_dm *dm, void *context)
static void FilterMatch(bt_scan_device_info *device_info, bt_scan_filter_match *filter_match, bool connectable)
static constexpr uint16_t kMaxConnectedDevices
Definition ble_connectivity_manager.h:32
State
Definition ble_connectivity_manager.h:47
@ Idle
Definition ble_connectivity_manager.h:47
@ Scanning
Definition ble_connectivity_manager.h:47
@ Pairing
Definition ble_connectivity_manager.h:47
@ LostDevice
Definition ble_connectivity_manager.h:47
@ Unknown
Definition ble_connectivity_manager.h:47
@ Start
Definition ble_connectivity_manager.h:47
@ Connected
Definition ble_connectivity_manager.h:47
@ End
Definition ble_connectivity_manager.h:47
CHIP_ERROR Init(const bt_uuid **serviceUuids, uint8_t serviceUuidsCount)
Initialize BLEConnectivityManager instance.
void RegisterStateCallback(StateChangedCallback callback)
Register a callback to notify application about current status change.
Definition ble_connectivity_manager.h:233
static BLEConnectivityManager & Instance()
Definition ble_connectivity_manager.h:268
static void ConnectionHandler(bt_conn *conn, uint8_t conn_err)
CHIP_ERROR Scan(ScanDoneCallback callback, void *context, uint32_t scanTimeoutMs=kScanTimeoutMs)
Start scanning for Bluetooth LE peripheral devices advertising service UUIDs passed in Init method.
void(*)(void *context) ConnectionSecurityRequestCallback
Definition ble_connectivity_manager.h:113
static void AuthenticationCancel(struct bt_conn *conn)
void(*)(ScanResult &result, void *context) ScanDoneCallback
Definition ble_connectivity_manager.h:112
static void DiscoveryNotFound(bt_conn *conn, void *context)
BLEBridgedDeviceProvider * FindBLEProvider(bt_addr_le_t address)
Get BLE provider that uses the specified connection object.
static void DisconnectionHandler(bt_conn *conn, uint8_t reason)
CHIP_ERROR Connect(BLEBridgedDeviceProvider *provider, ConnectionSecurityRequest *request=nullptr)
Create connection to the Bluetooth LE device, managed by BLEBridgedDeviceProvider object....
CHIP_ERROR GetScannedDeviceAddress(bt_addr_le_t *address, uint8_t index)
Gets Bluetooth LE address of a device that was scanned before.
static constexpr uint8_t kMaxServiceUuids
Definition ble_connectivity_manager.h:33
void(*)(State state) StateChangedCallback
Callback to indicate the bridge's Bluetooth LE connectivity state of the highest priority.
Definition ble_connectivity_manager.h:56
CHIP_ERROR PrepareFilterForUuid()
void SetPincode(bt_addr_le_t addr, unsigned int pincode)
Set authentication pincode to confirm the specific Bluetooth LE connection.
CHIP_ERROR RemoveBLEProvider(bt_addr_le_t address)
Remove the BLE provider from the manager's list.
CHIP_ERROR Reconnect(BLEBridgedDeviceProvider *provider)
Create connection to the first Bluetooth LE device on the mProvidersToRecover recovery list.
CHIP_ERROR GetScannedDeviceUuid(uint16_t &uuid, uint8_t index)
Gets Bluetooth LE service UUID of a device that was scanned before.
static int StartGattDiscovery(bt_conn *conn, BLEBridgedDeviceProvider *provider)
void Recover(BLEBridgedDeviceProvider *provider)
Recover connection with the specified BLE provider. It is necessary to first add the provider to the ...
Definition ble_connectivity_manager.h:223
CHIP_ERROR StopScan()
Stop scanning operation.
static void SecurityChangedHandler(struct bt_conn *conn, bt_security_t level, enum bt_security_err err)
static void ReScanCallback(ScanResult &result, void *context)
CHIP_ERROR AddBLEProvider(BLEBridgedDeviceProvider *provider)
Add the BLE provider's address to the manager's list.
Definition ble_connectivity_manager.h:27
Definition ble_connectivity_manager.h:21
Definition ble_bridged_device.h:22
void * mContext
Definition ble_connectivity_manager.h:117
ConnectionSecurityRequestCallback mCallback
Definition ble_connectivity_manager.h:116
Definition ble_connectivity_manager.h:115
ScannedDevice * mDevices
Definition ble_connectivity_manager.h:65
uint8_t mCount
Definition ble_connectivity_manager.h:66
Definition ble_connectivity_manager.h:64
bt_addr_le_t mAddr
Definition ble_connectivity_manager.h:59
bt_le_conn_param mConnParam
Definition ble_connectivity_manager.h:60
uint16_t mUuid
Definition ble_connectivity_manager.h:61
Definition ble_connectivity_manager.h:58
Structure containing device data needed to establish connection and advertising information.
Definition scan.h:286
Structure for setting the filter status.
Definition scan.h:263