arduino-audio-tools
Loading...
Searching...
No Matches
BLESerialServerESP32.h
Go to the documentation of this file.
1#pragma once
2
3#include <BLEDevice.h>
4#include <BLEServer.h>
5#include <BLEUtils.h>
6#if defined(CONFIG_BLUEDROID_ENABLED)
7#include <BLE2902.h>
8#endif
10#include "BLESerialStream.h"
11
12namespace audio_tools {
13
25 public BLEServerCallbacks {
26 public:
30 // the callbacks are executed in the BLE task: so we can wait
31 receive_timeout_ms = 1000;
32 }
33
35 bool begin(const char *name) override {
36 TRACEI();
37 if (!BLEDevice::init(name)) {
38 LOGE("BLESerial: BLEDevice::init failed");
39 return false;
40 }
41 BLEDevice::setMTU(max_transfer_size);
43
44 p_server = BLEDevice::createServer();
45 p_server->setCallbacks(this);
46
48 BLEAdvertising *p_advertising = BLEDevice::getAdvertising();
49 p_advertising->addServiceUUID(BLE_SERIAL_SERVICE_UUID);
50 BLEDevice::startAdvertising();
51 return true;
52 }
53
54 void end() override {
55 TRACEI();
56 BLEDevice::deinit();
57 p_server = nullptr;
58 p_service = nullptr;
59 ch01_char = nullptr;
60 ch02_char = nullptr;
61 info_char = nullptr;
62 }
63
64 bool connected() override {
65 return p_server != nullptr && p_server->getConnectedCount() > 0;
66 }
67
68 protected:
69 BLEServer *p_server = nullptr;
70 BLEService *p_service = nullptr;
71 BLECharacteristic *ch01_char = nullptr;
72 BLECharacteristic *ch02_char = nullptr;
73 BLECharacteristic *info_char = nullptr;
74 BLEDescriptor ch01_desc{"2901"};
75 BLEDescriptor ch02_desc{"2901"};
76 BLEDescriptor info_desc{"2901"};
80
81 int getMTU() override {
82 int result = max_transfer_size;
83 if (connected()) {
84 int peer_mtu = p_server->getPeerMTU(p_server->getConnId());
85 if (peer_mtu > 0 && peer_mtu < result) result = peer_mtu;
86 }
87 return result;
88 }
89
90 void writeAudioInfo(StrView str) override {
91 TRACEI();
92 if (info_char == nullptr) return;
93 LOGI("AudioInfo: %s", str.c_str());
94 info_char->setValue((uint8_t *)str.c_str(), str.length() + 1);
95 if (connected()) info_char->notify();
96 }
97
99 TRACEI();
100 // the characteristic properties define what the client can do
102
103 ch01_char = p_service->createCharacteristic(
104 BLE_CH1_UUID, BLECharacteristic::PROPERTY_READ);
105 ch01_desc.setValue("Channel 1");
106 ch01_char->addDescriptor(&ch01_desc);
107 ch01_char->setCallbacks(this);
108
109 ch02_char = p_service->createCharacteristic(
110 BLE_CH2_UUID, BLECharacteristic::PROPERTY_WRITE |
111 BLECharacteristic::PROPERTY_WRITE_NR);
112 ch02_desc.setValue("Channel 2");
113 ch02_char->addDescriptor(&ch02_desc);
114 ch02_char->setCallbacks(this);
115
116 // optional setup of audio info notifications
118 info_char = p_service->createCharacteristic(
119 BLE_INFO_UUID, BLECharacteristic::PROPERTY_READ |
120 BLECharacteristic::PROPERTY_WRITE |
121 BLECharacteristic::PROPERTY_NOTIFY);
122 info_desc.setValue("Audio Info");
123 info_char->addDescriptor(&info_desc);
124#if defined(CONFIG_BLUEDROID_ENABLED)
125 // NimBLE adds the CCCD descriptor automatically
126 info_char->addDescriptor(new BLE2902());
127#endif
128 info_char->setCallbacks(this);
130 }
131
132 p_service->start();
133 }
134
135 void onConnect(BLEServer *pServer) override { TRACEI(); }
136
137 void onDisconnect(BLEServer *pServer) override {
138 TRACEI();
140 BLEDevice::startAdvertising();
141 }
142
144 void onWrite(BLECharacteristic *pCharacteristic) override {
145 TRACED();
146 // auto: it changed from std::string to String
147 auto value = pCharacteristic->getValue();
148 if (pCharacteristic == info_char) {
149 receiveAudioInfo((const uint8_t *)value.c_str(), value.length());
150 } else if (pCharacteristic == ch02_char) {
151 receiveData((const uint8_t *)value.c_str(), value.length());
152 }
153 }
154
156 void onRead(BLECharacteristic *pCharacteristic) override {
157 TRACED();
158 if (pCharacteristic != ch01_char) return;
159 // the value is limited by the MTU: the ATT read response needs 1 byte
160 int max = getMTU() - 1;
161 if (packet.size() < (size_t)max) packet.resize(max);
162 int len = provideData(packet.data(), max);
163 pCharacteristic->setValue(packet.data(), len);
164 }
165};
166
167} // 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
virtual AudioInfo audioInfo() override
provides the actual input AudioInfo
Definition BaseStream.h:151
void setMutex(MutexBase *mutex)
Definition BLESerialStream.h:44
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
BLESerialPacketBuffer tx_buffer
Definition BLESerialStream.h:323
void receiveData(const uint8_t *data, size_t len)
Called by the implementation when the client has written data.
Definition BLESerialStream.h:339
int receive_timeout_ms
max time in ms to wait for free space in the receive buffer
Definition BLESerialStream.h:325
int provideData(uint8_t *packet, int maxLen)
Definition BLESerialStream.h:356
BLESerialPacketBuffer rx_buffer
Definition BLESerialStream.h:322
A BLE server that implements a serial protocol, so that it can be used to send and receive audio....
Definition BLESerialServerESP32.h:25
void writeAudioInfo(StrView str) override
Provides the audio info to the other side.
Definition BLESerialServerESP32.h:90
void setupBLEService()
Definition BLESerialServerESP32.h:98
Mutex rx_mutex
Definition BLESerialServerESP32.h:77
BLEDescriptor ch02_desc
Definition BLESerialServerESP32.h:75
void end() override
Definition BLESerialServerESP32.h:54
void onConnect(BLEServer *pServer) override
Definition BLESerialServerESP32.h:135
BLEDescriptor ch01_desc
Definition BLESerialServerESP32.h:74
Mutex tx_mutex
Definition BLESerialServerESP32.h:78
BLECharacteristic * ch02_char
Definition BLESerialServerESP32.h:72
void onRead(BLECharacteristic *pCharacteristic) override
provide the next batch of data
Definition BLESerialServerESP32.h:156
BLEService * p_service
Definition BLESerialServerESP32.h:70
void onWrite(BLECharacteristic *pCharacteristic) override
store the received data
Definition BLESerialServerESP32.h:144
bool connected() override
Returns true if we are connected with the other side.
Definition BLESerialServerESP32.h:64
BLESerialServerESP32(int mtu=517)
Definition BLESerialServerESP32.h:27
Vector< uint8_t > packet
Definition BLESerialServerESP32.h:79
BLECharacteristic * ch01_char
Definition BLESerialServerESP32.h:71
BLEServer * p_server
Definition BLESerialServerESP32.h:69
bool begin(const char *name) override
starts a BLE server with the indicated name
Definition BLESerialServerESP32.h:35
void onDisconnect(BLEServer *pServer) override
Definition BLESerialServerESP32.h:137
BLECharacteristic * info_char
Definition BLESerialServerESP32.h:73
BLEDescriptor info_desc
Definition BLESerialServerESP32.h:76
int getMTU() override
Effective MTU.
Definition BLESerialServerESP32.h:81
int max_transfer_size
Definition BLESerialStream.h:218
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
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
Mutex implemntation based on std::mutex.
Definition Mutex.h:16
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