arduino-audio-tools
Loading...
Searching...
No Matches
BLESerialServerArduinoBLE.h
Go to the documentation of this file.
1#pragma once
2
3#include <ArduinoBLE.h>
4#include "BLESerialStream.h"
5
6namespace audio_tools {
7
21 public:
25
27
29 bool begin(const char *name) override {
30 TRACEI();
31 if (!BLE.begin()) {
32 LOGE("BLESerial: starting BLE failed");
33 return false;
34 }
36
37 // set the local name peripheral advertises
38 BLE.setLocalName(name);
39 BLE.setDeviceName(name);
40
41 // assign event handlers for connected, disconnected to peripheral
42 BLE.setEventHandler(BLEConnected, onConnectCB);
43 BLE.setEventHandler(BLEDisconnected, onDisconnectCB);
44
46
47 // start advertising
48 BLE.advertise();
49 return true;
50 }
51
52 void end() override {
53 TRACEI();
54 BLE.end();
55 release();
56 }
57
58 bool connected() override {
59 // BLE.connected() also processes the BLE events
60 return p_service != nullptr && BLE.connected();
61 }
62
63 protected:
64 BLEService *p_service = nullptr;
65 BLECharacteristic *p_ch01_char = nullptr;
66 BLECharacteristic *p_ch02_char = nullptr;
67 BLECharacteristic *p_info_char = nullptr;
69
71 static BLESerialServerArduinoBLE *self = nullptr;
72 return self;
73 }
74
75 void poll() override { BLE.poll(); }
76
77 void release() {
78 delete p_info_char;
79 delete p_ch02_char;
80 delete p_ch01_char;
81 delete p_service;
82 p_info_char = nullptr;
83 p_ch02_char = nullptr;
84 p_ch01_char = nullptr;
85 p_service = nullptr;
86 }
87
89 TRACEI();
90 release();
91 // the value read by the client has a fixed length: ArduinoBLE determines
92 // the length of the read response before calling the read event handler
93 int read_size = packetSize() + BLE_SERIAL_HEADER_SIZE;
94 packet.resize(read_size);
95 p_service = new BLEService(BLE_SERIAL_SERVICE_UUID);
97 new BLECharacteristic(BLE_CH1_UUID, BLERead, read_size, true);
98 p_ch02_char = new BLECharacteristic(
99 BLE_CH2_UUID, BLEWrite | BLEWriteWithoutResponse, getMTU());
100
101 // assign event handlers for characteristic
102 p_ch01_char->setEventHandler(BLERead, onReadCB);
103 p_ch02_char->setEventHandler(BLEWritten, onWriteCB);
104 p_service->addCharacteristic(*p_ch01_char);
105 p_service->addCharacteristic(*p_ch02_char);
106
108 p_info_char = new BLECharacteristic(
109 BLE_INFO_UUID, BLERead | BLEWrite | BLENotify, 40);
110 p_info_char->setEventHandler(BLEWritten, onInfoWriteCB);
111 p_service->addCharacteristic(*p_info_char);
113 }
114
115 // set the UUID for the service this peripheral advertises
116 BLE.setAdvertisedService(*p_service);
117 BLE.addService(*p_service);
118 }
119
120 void writeAudioInfo(StrView str) override {
121 TRACEI();
122 if (p_info_char == nullptr) return;
123 LOGI("AudioInfo: %s", str.c_str());
124 // notifies a subscribed client
125 p_info_char->writeValue((const uint8_t *)str.c_str(), str.length() + 1);
126 }
127
128 static void onConnectCB(BLEDevice device) { TRACEI(); }
129
130 static void onDisconnectCB(BLEDevice device) {
131 TRACEI();
133 if (self == nullptr) return;
134 self->onDisconnected();
135 BLE.advertise();
136 }
137
139 static void onWriteCB(BLEDevice device, BLECharacteristic characteristic) {
140 TRACED();
142 if (self == nullptr) return;
143 self->receiveData(characteristic.value(), characteristic.valueLength());
144 }
145
146 static void onInfoWriteCB(BLEDevice device,
147 BLECharacteristic characteristic) {
148 TRACEI();
150 if (self == nullptr) return;
151 self->receiveAudioInfo(characteristic.value(),
152 characteristic.valueLength());
153 }
154
156 static void onReadCB(BLEDevice device, BLECharacteristic characteristic) {
157 TRACED();
159 if (self == nullptr) return;
160 self->provideData(self->packet.data(), self->packet.size());
161 self->p_ch01_char->writeValue(self->packet.data(), self->packet.size());
162 }
163};
164
165} // 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_SERIAL_HEADER_SIZE
Size of the length header in the packets which are read by the client.
Definition BLESerialStream.h:16
virtual AudioInfo audioInfo() override
provides the actual input AudioInfo
Definition BaseStream.h:151
A BLE server that implements a serial protocol, so that it can be used to send and receive audio....
Definition BLESerialServerArduinoBLE.h:20
void writeAudioInfo(StrView str) override
Provides the audio info to the other side.
Definition BLESerialServerArduinoBLE.h:120
void release()
Definition BLESerialServerArduinoBLE.h:77
void setupBLEService()
Definition BLESerialServerArduinoBLE.h:88
BLECharacteristic * p_ch02_char
Definition BLESerialServerArduinoBLE.h:66
static BLESerialServerArduinoBLE *& selfBLESerialServerArduinoBLE()
Definition BLESerialServerArduinoBLE.h:70
BLECharacteristic * p_ch01_char
Definition BLESerialServerArduinoBLE.h:65
static void onInfoWriteCB(BLEDevice device, BLECharacteristic characteristic)
Definition BLESerialServerArduinoBLE.h:146
void poll() override
Process the BLE events (if necessary)
Definition BLESerialServerArduinoBLE.h:75
void end() override
Definition BLESerialServerArduinoBLE.h:52
static void onConnectCB(BLEDevice device)
Definition BLESerialServerArduinoBLE.h:128
static void onDisconnectCB(BLEDevice device)
Definition BLESerialServerArduinoBLE.h:130
BLEService * p_service
Definition BLESerialServerArduinoBLE.h:64
static void onReadCB(BLEDevice device, BLECharacteristic characteristic)
provide the next batch of data
Definition BLESerialServerArduinoBLE.h:156
~BLESerialServerArduinoBLE()
Definition BLESerialServerArduinoBLE.h:26
bool connected() override
Returns true if we are connected with the other side.
Definition BLESerialServerArduinoBLE.h:58
BLESerialServerArduinoBLE(int mtu=242)
Definition BLESerialServerArduinoBLE.h:22
BLECharacteristic * p_info_char
Definition BLESerialServerArduinoBLE.h:67
Vector< uint8_t > packet
Definition BLESerialServerArduinoBLE.h:68
bool begin(const char *name) override
starts a BLE server with the indicated name
Definition BLESerialServerArduinoBLE.h:29
static void onWriteCB(BLEDevice device, BLECharacteristic characteristic)
store the received data
Definition BLESerialServerArduinoBLE.h:139
Generic BLE serial server logic which is independent of the BLE API. In BLE terminology the server is...
Definition BLESerialStream.h:284
void onDisconnected()
Called by the implementation when the client has disconnected.
Definition BLESerialStream.h:369
void setupBuffers()
Definition BLESerialStream.h:330
void receiveData(const uint8_t *data, size_t len)
Called by the implementation when the client has written data.
Definition BLESerialStream.h:339
int provideData(uint8_t *packet, int maxLen)
Definition BLESerialStream.h:356
const char * BLE_SERIAL_SERVICE_UUID
Definition BLESerialStream.h:229
const char * BLE_INFO_UUID
Definition BLESerialStream.h:234
const char * BLE_CH2_UUID
Definition BLESerialStream.h:233
void receiveAudioInfo(const uint8_t *data, size_t size)
Process the audio info which was received from the other side.
Definition BLESerialStream.h:243
virtual int getMTU()
Effective MTU.
Definition BLESerialStream.h:237
int packetSize()
Definition BLESerialStream.h:184
bool is_audio_info_active
Definition BLESerialStream.h:223
const char * BLE_CH1_UUID
Definition BLESerialStream.h:231
StrView toStr(AudioInfo info)
Definition BLESerialStream.h:192
A simple wrapper to provide string functions on existing allocated char*. If the underlying char* is ...
Definition StrView.h:29
virtual int length()
Definition StrView.h:460
virtual const char * c_str()
provides the string value as const char*
Definition StrView.h:456
Vector implementation which provides the most important methods as defined by std::vector....
Definition Vector.h:21
bool resize(size_t newSize, T value)
Definition Vector.h:266
T * data()
Definition Vector.h:321
int size()
Definition Vector.h:178
Generic Implementation of sound input and output for desktop environments using portaudio.
Definition LMSEchoCancellationStream.h:6