arduino-audio-tools
Loading...
Searching...
No Matches
AudioBLEClientESP32.h
Go to the documentation of this file.
1#pragma once
2
3#include "AudioBLEStream.h"
4#include "ConstantsESP32.h"
5//#include <BLE2902.h>
6#include <BLEDevice.h>
7#include <BLEServer.h>
8#include <BLEUtils.h>
9
10namespace audio_tools {
11
12class AudioBLEClient;
14
23class AudioBLEClient : public AudioBLEStream,
24 public BLEClientCallbacks,
25 public BLEAdvertisedDeviceCallbacks {
26public:
31
33 bool begin(const char *localName, int seconds) {
34 TRACEI();
35 // Init BLE device
36 BLEDevice::init(localName);
37
38 // Retrieve a Scanner and set the callback we want to use to be informed
39 // when we have detected a new device.
40 BLEScan *pBLEScan = BLEDevice::getScan();
41 pBLEScan->setAdvertisedDeviceCallbacks(this);
42 pBLEScan->setActiveScan(true);
43 pBLEScan->start(seconds);
44 return true;
45 }
46
47 void end() override {
48 TRACEI();
49 flush();
50 BLEDevice::deinit();
51 }
52
53 size_t readBytes(uint8_t *data, size_t len) override {
54 TRACED();
57 return 0;
58 if (!ch01_char->canRead())
59 return 0;
60 // changed to auto to be version independent (it changed from std::string to
61 // String)
62 auto str = ch01_char->readValue();
63 if (str.length() > 0) {
64 memcpy(data, str.c_str(), str.length());
65 }
66 return str.length();
67 }
68
69 int available() override { return BLE_MTU - BLE_MTU_OVERHEAD; }
70
71 size_t write(const uint8_t *data, size_t len) override {
72 TRACED();
75 return 0;
76 if (!ch02_char->canWrite()){
77 return 0;
78 }
79
80 if (is_framed){
82 delay(1);
83 } else {
84 // send only data with max mtu
85 for (int j=0; j<len; j++){
86 write_buffer.write(data[j]);
87 if (write_buffer.isFull()){
90 }
91 }
92 }
93 return len;
94 }
95
99
100 bool connected() override {
101 if (!setupBLEClient()) {
102 LOGE("setupBLEClient failed");
103 }
104 return is_client_connected;
105 }
106
107 void setWriteThrottle(int ms){
108 write_throttle = ms;
109 }
110
114
115protected:
116 // client
117 BLEClient *p_client = nullptr;
130 int write_throttle = 0;
131 bool write_confirmation_flag = false;
132
133 volatile bool is_client_connected = false;
134 bool is_client_set_up = false;
135
136 void onConnect(BLEClient *pClient) override {
137 TRACEI();
138 is_client_connected = true;
139 }
140
142 TRACEI();
143 is_client_connected = false;
144 };
145
147 TRACEI();
148 // send update via BLE
149 info_char->writeValue((uint8_t *)&info, sizeof(AudioInfo));
150 }
151
152 void writeChannel2Characteristic(const uint8_t*data, size_t len){
153 if (ch02_char->canWrite()) {
154 ch02_char->writeValue((uint8_t *)data, len, write_confirmation_flag);
156 }
157 }
158
160 if (!info_char->canRead())
161 return false;
162 auto str = info_char->readValue();
163 if (str.length() > 0) {
164 setAudioInfo((const uint8_t*)str.c_str(), str.length());
165 return true;
166 }
167 return false;
168 }
169
170 // Scanning Results
172 TRACEI();
173 // Check if the name of the advertiser matches
174 if (advertisedDevice.haveServiceUUID() &&
175 advertisedDevice.isAdvertisingService(BLUEID_AUDIO_SERVICE_UUID)) {
176 LOGI("Service '%s' found!", BLE_AUDIO_SERVICE_UUID);
177 // save advertised_device in class variable
179 // Scan can be stopped, we found what we are looking for
180 advertised_device.getScan()->stop();
181 }
182 delay(10);
183 }
184
186 uint8_t *pData, size_t length, bool isNotify) {
187 TRACEI();
188 if (pBLERemoteCharacteristic->getUUID().toString() ==
191 }
192 }
193
196 return true;
197
198 TRACEI();
199
200 // setup buffer
201 if (write_buffer.size()==0){
203 }
204
205 if (p_client == nullptr)
206 p_client = BLEDevice::createClient();
207
208 // onConnect and on onDisconnect support
209 p_client->setClientCallbacks(this);
210
211 // Connect to the remove BLE Server.
212 LOGI("Connecting to %s ...",
213 advertised_device.getAddress().toString().c_str());
214 // p_client->connect(advertised_device.getAddress(),BLE_ADDR_TYPE_RANDOM);
215 p_client->connect(&advertised_device);
216 if (!p_client->isConnected()) {
217 LOGE("Connect failed");
218 return false;
219 }
220 LOGI("Connected to %s ...",
221 advertised_device.getAddress().toString().c_str());
222
223 LOGI("Setting mtu to %d", max_transfer_size);
226
227 // Obtain a reference to the service we are after in the remote BLE
228 // server.
229 if (p_remote_service == nullptr) {
231 if (p_remote_service == nullptr) {
232 LOGE("Failed to find our service UUID: %s", BLE_AUDIO_SERVICE_UUID);
233 return (false);
234 }
235 }
236
237 if (ch01_char == nullptr) {
238 ch01_char = p_remote_service->getCharacteristic(BLUEID_CH1_UUID);
239 if (ch01_char == nullptr) {
240 LOGE("Failed to find char. UUID: %s", BLE_CH1_UUID);
241 return false;
242 }
243 }
244
245 if (ch02_char == nullptr) {
246 ch02_char = p_remote_service->getCharacteristic(BLUEID_CH2_UUID);
247 if (ch02_char == nullptr) {
248 LOGE("Failed to find char. UUID: %s", BLE_CH2_UUID);
249 return false;
250 }
251 }
252
253 if (is_audio_info_active && info_char == nullptr) {
254 info_char = p_remote_service->getCharacteristic(BLUEID_INFO_UUID);
255 if (info_char == nullptr) {
256 LOGE("Failed to find char. UUID: %s", BLE_INFO_UUID);
257 return false;
258 }
259 info_char->registerForNotify(notifyCallback);
261
262 }
263 LOGI("Connected to server: %s", is_client_connected ? "true" : "false");
264 is_client_set_up = true;
265 is_client_connected = true;
266 return is_client_connected;
267 }
268
269 int getMTU() override { return BLE_MTU; }
270
271
272};
273
274} // namespace audio_tools
#define TRACEI()
Definition AudioLoggerIDF.h:32
#define TRACED()
Definition AudioLoggerIDF.h:31
#define LOGI(...)
Definition AudioLoggerIDF.h:28
#define LOGE(...)
Definition AudioLoggerIDF.h:30
#define BLE_MTU
Definition ConstantsArduino.h:4
#define BLE_MTU_OVERHEAD
Definition ConstantsArduino.h:5
#define DEFAULT_BUFFER_SIZE
Definition avr.h:20
#define assert(T)
Definition avr.h:10
A simple BLE client that implements the serial protocol, so that it can be used to send and recevie a...
Definition AudioBLEClient.h:20
BLECharacteristic ch01_char
Definition AudioBLEClient.h:96
void writeChannel2Characteristic(const uint8_t *data, size_t len)
Definition AudioBLEClient.h:109
volatile bool is_client_connected
Definition AudioBLEClientESP32.h:133
BLECharacteristic ch02_char
Definition AudioBLEClient.h:97
BLEClient * p_client
Definition AudioBLEClientESP32.h:117
void setConfirmWrite(bool flag)
Definition AudioBLEClientESP32.h:111
size_t readBytes(uint8_t *data, size_t len) override
Definition AudioBLEClientESP32.h:53
BLERemoteService * p_remote_service
Definition AudioBLEClientESP32.h:119
bool readAudioInfoCharacteristic()
Definition AudioBLEClientESP32.h:159
void writeAudioInfoCharacteristic(AudioInfo info) override
Definition AudioBLEClientESP32.h:146
void onResult(BLEAdvertisedDevice advertisedDevice) override
Definition AudioBLEClientESP32.h:171
bool is_client_set_up
Definition AudioBLEClientESP32.h:134
void end() override
Definition AudioBLEClientESP32.h:47
int available() override
Definition AudioBLEClientESP32.h:69
BLEUUID BLUEID_AUDIO_SERVICE_UUID
Definition AudioBLEClientESP32.h:125
bool begin(const char *localName, int seconds)
starts a BLE client
Definition AudioBLEClientESP32.h:33
int write_throttle
Definition AudioBLEClient.h:100
size_t write(const uint8_t *data, size_t len) override
Definition AudioBLEClientESP32.h:71
BLEUUID BLUEID_CH1_UUID
Definition AudioBLEClientESP32.h:126
static void notifyCallback(BLERemoteCharacteristic *pBLERemoteCharacteristic, uint8_t *pData, size_t length, bool isNotify)
Definition AudioBLEClientESP32.h:185
int availableForWrite() override
Definition AudioBLEClientESP32.h:96
BLEAddress * p_server_address
Definition AudioBLEClientESP32.h:120
BLEUUID BLUEID_INFO_UUID
Definition AudioBLEClientESP32.h:128
BLEUUID BLUEID_CH2_UUID
Definition AudioBLEClientESP32.h:127
bool connected() override
Definition AudioBLEClientESP32.h:100
AudioBLEClient(int mtu=517)
Definition AudioBLEClientESP32.h:27
void onDisconnect(BLEClient *pClient) override
Definition AudioBLEClientESP32.h:141
void onConnect(BLEClient *pClient) override
Definition AudioBLEClientESP32.h:136
BLECharacteristic info_char
Definition AudioBLEClient.h:98
BLEAdvertisedDevice advertised_device
Definition AudioBLEClientESP32.h:124
SingleBuffer< uint8_t > write_buffer
Definition AudioBLEClient.h:99
bool setupBLEClient()
Definition AudioBLEClient.h:134
bool write_confirmation_flag
Definition AudioBLEClient.h:101
BLEAdvertising * p_advertising
Definition AudioBLEClientESP32.h:118
int getMTU() override
Definition AudioBLEClientESP32.h:269
void setWriteThrottle(int ms)
Definition AudioBLEClientESP32.h:107
Transmit and receive data via BLE using a Serial API. The following additional experimental features ...
Definition AudioBLEStream.h:20
const char * BLE_INFO_UUID
Definition AudioBLEStream.h:79
void setAudioInfo(AudioInfo info)
Defines the input AudioInfo.
Definition AudioBLEStream.h:28
const char * BLE_CH2_UUID
Definition AudioBLEStream.h:78
uint16_t max_transfer_size
Definition AudioBLEStream.h:68
const char * BLE_AUDIO_SERVICE_UUID
Definition AudioBLEStream.h:76
bool is_audio_info_active
Definition AudioBLEStream.h:70
const char * BLE_CH1_UUID
Definition AudioBLEStream.h:77
bool is_framed
Definition AudioBLEStream.h:71
AudioInfo info
Definition BaseStream.h:174
virtual void flush() override
Definition BaseStream.h:62
A simple Buffer implementation which just uses a (dynamically sized) array.
Definition Buffers.h:172
size_t size() override
Definition Buffers.h:303
bool write(T sample) override
write add an entry to the buffer
Definition Buffers.h:206
int available() override
provides the number of entries that are available to read
Definition Buffers.h:233
bool isFull() override
checks if the buffer is full
Definition Buffers.h:240
bool resize(int size)
Resizes the buffer if supported: returns false if not supported.
Definition Buffers.h:305
T * data()
Provides address of actual data.
Definition Buffers.h:284
void reset() override
clears the buffer
Definition Buffers.h:286
Generic Implementation of sound input and output for desktop environments using portaudio.
Definition AudioCodecsBase.h:10
static AudioBLEClient * selfAudioBLEClient
Definition AudioBLEClient.h:10
void delay(unsigned long ms)
Definition Time.h:23
size_t writeData(Print *p_out, T *data, int samples, int maxSamples=512)
Definition AudioTypes.h:512
Basic Audio information which drives e.g. I2S.
Definition AudioTypes.h:55