From d728f00b2541a1b95d47dba11809d8df444de46a Mon Sep 17 00:00:00 2001 From: RobertoHE Date: Wed, 2 Apr 2025 00:18:05 +0200 Subject: [PATCH 01/12] Adaptation to new NimBLE lib methods. --- src/hardware/BLEMIDI_Client_ESP32.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/hardware/BLEMIDI_Client_ESP32.h b/src/hardware/BLEMIDI_Client_ESP32.h index 92b3318..bdd796e 100644 --- a/src/hardware/BLEMIDI_Client_ESP32.h +++ b/src/hardware/BLEMIDI_Client_ESP32.h @@ -138,7 +138,7 @@ struct DefaultSettingsClient : public BLEMIDI_NAMESPACE::DefaultSettings }; /** Define a class to handle the callbacks when advertisments are received */ -class AdvertisedDeviceCallbacks : public NimBLEAdvertisedDeviceCallbacks +class AdvertisedDeviceCallbacks : public NimBLEScanCallbacks { public: NimBLEAdvertisedDevice advDevice; @@ -165,7 +165,7 @@ class AdvertisedDeviceCallbacks : public NimBLEAdvertisedDeviceCallbacks } DEBUGCLIENT("Found MIDI Service"); - if (!(!specificTarget || (advertisedDevice->getName() == nameTarget.c_str() || advertisedDevice->getAddress() == nameTarget))) + if (!(!specificTarget || (advertisedDevice->getName() == nameTarget.c_str() || advertisedDevice->getAddress().toString() == nameTarget))) { DEBUGCLIENT("Name error"); return; @@ -450,7 +450,7 @@ void BLEMIDI_Client_ESP32<_Settings>::scan() NimBLEScan *pBLEScan = BLEDevice::getScan(); if (!pBLEScan->isScanning()) { - pBLEScan->setAdvertisedDeviceCallbacks(&myAdvCB); + pBLEScan->setScanCallbacks(&myAdvCB); pBLEScan->setInterval(600); pBLEScan->setWindow(500); pBLEScan->setActiveScan(true); @@ -501,7 +501,7 @@ bool BLEMIDI_Client_ESP32<_Settings>::connect() } } - if (NimBLEDevice::getClientListSize() >= NIMBLE_MAX_CONNECTIONS) + if (NimBLEDevice::getCreatedClientCount() >= NIMBLE_MAX_CONNECTIONS) { DEBUGCLIENT("Max clients reached - no more connections available"); return false; From 7d4b342a311e4566885a94cb1f862361077039d9 Mon Sep 17 00:00:00 2001 From: RobertoHE Date: Fri, 16 May 2025 14:16:24 +0200 Subject: [PATCH 02/12] Refactor BLEMIDI settings structure and add custom settings example. Uniffied Settings. --- .../CustomSettings.ino} | 59 +++------------- examples/MidiBle_Client/MidiBle_Client.ino | 70 +++++++++++++++++-- src/BLEMIDI_Settings.h | 4 +- src/hardware/BLEMIDI_ArduinoBLE.h | 8 ++- src/hardware/BLEMIDI_Client_ESP32.h | 28 ++++---- src/hardware/BLEMIDI_ESP32.h | 8 ++- src/hardware/BLEMIDI_ESP32_NimBLE.h | 14 +++- src/hardware/BLEMIDI_nRF52.h | 8 ++- 8 files changed, 119 insertions(+), 80 deletions(-) rename examples/{CustomerBufferSize/CustomerBufferSize.ino => CustomSettings/CustomSettings.ino} (53%) diff --git a/examples/CustomerBufferSize/CustomerBufferSize.ino b/examples/CustomSettings/CustomSettings.ino similarity index 53% rename from examples/CustomerBufferSize/CustomerBufferSize.ino rename to examples/CustomSettings/CustomSettings.ino index 8aa7e94..aef25b3 100644 --- a/examples/CustomerBufferSize/CustomerBufferSize.ino +++ b/examples/CustomSettings/CustomSettings.ino @@ -1,62 +1,19 @@ #include -static uint32_t customPasskeyRequest() -{ - // FILL WITH YOUR CUSTOM AUTH METHOD CODE or PASSKEY - // FOR EXAMPLE: - uint32_t passkey = 123456; - - // Serial.println("Client Passkey Request"); - - /** return the passkey to send to the server */ - return passkey; -}; - - struct CustomBufferSizeSettings : public BLEMIDI_NAMESPACE::DefaultSettings { - //See all options and them explanation in the library. - - /* - ##### BLE DEVICE NAME ##### - */ - //static constexpr char *name = "BleMidiClient"; - /* - ###### TX POWER ##### - */ - //static const esp_power_level_t clientTXPwr = ESP_PWR_LVL_P9; - /* - ###### SECURITY ##### - */ - //static const uint8_t clientSecurityCapabilities = BLE_HS_IO_NO_INPUT_OUTPUT; - //static const bool clientBond = true; - //static const bool clientMITM = false; - //static const bool clientPair = true; - //static constexpr PasskeyRequestCallback userOnPassKeyRequest = customPasskeyRequest; - /* - ###### BLE COMMUNICATION PARAMS ###### - */ - //static const uint16_t commMinInterval = 6; // 7.5ms - //static const uint16_t commMaxInterval = 35; // 40ms - //static const uint16_t commLatency = 0; // - //static const uint16_t commTimeOut = 200; // 2000ms - /* - ###### BLE FORCE NEW CONNECTION ###### - */ - //static const bool forceNewConnection = false; - /* - ###### BLE SUBSCRIPTION: NOTIFICATION & RESPONSE ###### - */ - //static const bool notification = true; - //static const bool response = true; - /* - ###### AND THE OTHER SETTINGS OF MIDI LIBRARY ###### - */ +//User defined settings +struct CustomBufferSizeSettings : public BLEMIDI_NAMESPACE::DefaultSettings { + //BLE-MIDI settings (see BLEMIDI_Settings.h and BLE_class for more details) static const size_t MaxBufferSize = 16; - + + //MIDI settings (see MIDI_Settings.h) + static const int Use1ByteParsing = true; + static const bool HandleNullVelocityNoteOnAsNoteOff = true; }; #include //#include //#include +//#include #ifndef LED_BUILTIN #define LED_BUILTIN 2 diff --git a/examples/MidiBle_Client/MidiBle_Client.ino b/examples/MidiBle_Client/MidiBle_Client.ino index 08efbeb..c7296c1 100644 --- a/examples/MidiBle_Client/MidiBle_Client.ino +++ b/examples/MidiBle_Client/MidiBle_Client.ino @@ -29,21 +29,79 @@ #include #include -//#include -//#include -//#include #ifndef LED_BUILTIN #define LED_BUILTIN 2 #endif +// For customPasskeyRequest callback format type +using PasskeyRequestCallback = uint32_t (*)(void); + +// This function is called when the server request a passkey (if you need it) +// If yo need a passkey, you must set the security capabilities and set PasskeyRequestCallback + +/*static uint32_t customPasskeyRequest() +{ + // FILL WITH YOUR CUSTOM AUTH METHOD CODE or PASSKEY + // FOR EXAMPLE: + uint32_t passkey = 123456; + + // Serial.println("Client Passkey Request"); + + // return the passkey to send to the server + return passkey; +}; +*/ + //See DefaultSettingsClient in hardware/BLEMIDI_Client_ESP32.h for more configurable settings // If you do not redefine a parameter, it will use the default value for these parameter -struct CustomBufferSizeSettings : public BLEMIDI_NAMESPACE::DefaultSettingsClient { - static const size_t MaxBufferSize = 16; +struct CustomSettings : public BLEMIDI_NAMESPACE::DefaultSettings +{ + //See all options and them explanation in the library. + + /* + ##### BLE DEVICE NAME ##### + */ + //static constexpr char *name = (char*)"BleMidiClient"; + /* + ###### TX POWER ##### + */ + //static const int8_t clientTXPwr = 9; // in dBm + /* + ###### SECURITY ##### + */ + //static const uint8_t clientSecurityCapabilities = BLE_HS_IO_NO_INPUT_OUTPUT; + //static const bool clientBond = true; + //static const bool clientMITM = false; + //static const bool clientPair = true; + //static constexpr PasskeyRequestCallback userOnPassKeyRequest = customPasskeyRequest; + /* + ###### BLE COMMUNICATION PARAMS ###### + */ + //static const uint16_t commMinInterval = 6; // 7.5ms + //static const uint16_t commMaxInterval = 35; // 40ms + //static const uint16_t commLatency = 0; // + //static const uint16_t commTimeOut = 200; // 2000ms + /* + ###### BLE FORCE NEW CONNECTION ###### + */ + static const bool forceNewConnection = false; + /* + ###### BLE SUBSCRIPTION: NOTIFICATION & RESPONSE ###### + */ + //static const bool notification = true; + //static const bool response = true; + + + //BLE-MIDI settings (see BLEMIDI_Settings.h and BLE_class for more details) + static const size_t MaxBufferSize = 16; + + // MIDI settings (see MIDI_Settings.h) + static const int Use1ByteParsing = true; + static const bool HandleNullVelocityNoteOnAsNoteOff = true; }; -BLEMIDI_CREATE_CUSTOM_INSTANCE("Esp32-BLE-MIDI", MIDI, CustomBufferSizeSettings); // Connect to a server named "Esp32-BLE-MIDI" and use CustomBufferSizeSettings as settings of client +BLEMIDI_CREATE_CUSTOM_INSTANCE("Esp32-BLE-MIDI", MIDI, CustomSettings); // Connect to a server named "Esp32-BLE-MIDI" and use CustomSettings as settings of client //BLEMIDI_CREATE_INSTANCE("",MIDI) //Connect to the first server found, using default settings //BLEMIDI_CREATE_INSTANCE("f2:c1:d9:36:e7:6b",MIDI) //Connect to a specific BLE address server, using default settings diff --git a/src/BLEMIDI_Settings.h b/src/BLEMIDI_Settings.h index 5463737..6fa7911 100644 --- a/src/BLEMIDI_Settings.h +++ b/src/BLEMIDI_Settings.h @@ -4,7 +4,9 @@ BEGIN_BLEMIDI_NAMESPACE -struct DefaultSettings +//Common settings for all BLEMIDI classes +//This is the default settings for all BLEMIDI classes +struct _DefaultSettings : MIDI_NAMESPACE::DefaultSettings { static const short MaxBufferSize = 64; }; diff --git a/src/hardware/BLEMIDI_ArduinoBLE.h b/src/hardware/BLEMIDI_ArduinoBLE.h index 59397c9..a5c1630 100644 --- a/src/hardware/BLEMIDI_ArduinoBLE.h +++ b/src/hardware/BLEMIDI_ArduinoBLE.h @@ -4,6 +4,12 @@ BEGIN_BLEMIDI_NAMESPACE +// Dependanced class settings +struct DefaultSettings : public _DefaultSettings +{ + //TODO Create parametric configurations +}; + template class Fifo { @@ -202,7 +208,7 @@ bool BLEMIDI_ArduinoBLE<_Settings>::begin(const char *deviceName, BLEMIDI_Transp */ #define BLEMIDI_CREATE_CUSTOM_INSTANCE(DeviceName, Name, _Settings) \ BLEMIDI_NAMESPACE::BLEMIDI_Transport, _Settings> BLE##Name(DeviceName); \ - MIDI_NAMESPACE::MidiInterface, _Settings>, BLEMIDI_NAMESPACE::MySettings> Name((BLEMIDI_NAMESPACE::BLEMIDI_Transport, _Settings> &)BLE##Name); + MIDI_NAMESPACE::MidiInterface, _Settings>, _Settings> Name((BLEMIDI_NAMESPACE::BLEMIDI_Transport, _Settings> &)BLE##Name); /*! \brief Create an instance for ArduinoBLE */ diff --git a/src/hardware/BLEMIDI_Client_ESP32.h b/src/hardware/BLEMIDI_Client_ESP32.h index bdd796e..85726ed 100644 --- a/src/hardware/BLEMIDI_Client_ESP32.h +++ b/src/hardware/BLEMIDI_Client_ESP32.h @@ -10,6 +10,8 @@ // Headers for ESP32 nimBLE #include +#include "BLEMIDI_Namespace.h" +#include "BLEMIDI_Settings.h" BEGIN_BLEMIDI_NAMESPACE @@ -27,7 +29,8 @@ static uint32_t defautlPasskeyRequest() return passkey; }; -struct DefaultSettingsClient : public BLEMIDI_NAMESPACE::DefaultSettings +// Dependanced class settings +struct DefaultSettings : public _DefaultSettings { /* @@ -38,7 +41,7 @@ struct DefaultSettingsClient : public BLEMIDI_NAMESPACE::DefaultSettings * Set name of ble device (not affect to connection with server) * max 16 characters */ - static constexpr char *name = "BleMidiClient"; + static constexpr char *name = (char*)"BleMidiClient"; /* ###### TX POWER ##### @@ -46,26 +49,19 @@ struct DefaultSettingsClient : public BLEMIDI_NAMESPACE::DefaultSettings /** * Set power transmision - * - * ESP_PWR_LVL_N12 // Corresponding to -12dbm Minimum - * ESP_PWR_LVL_N9 // Corresponding to -9dbm - * ESP_PWR_LVL_N6 // Corresponding to -6dbm - * ESP_PWR_LVL_N3 // Corresponding to -3dbm - * ESP_PWR_LVL_N0 // Corresponding to 0dbm - * ESP_PWR_LVL_P3 // Corresponding to +3dbm - * ESP_PWR_LVL_P6 // Corresponding to +6dbm - * ESP_PWR_LVL_P9 // Corresponding to +9dbm Maximum */ - static const esp_power_level_t clientTXPwr = ESP_PWR_LVL_P9; + static const uint8_t clientTXPwr = 9; //in dBm /* ###### SECURITY ##### */ /** Set the IO capabilities of the device, each option will trigger a different pairing method. - * BLE_HS_IO_KEYBOARD_ONLY - Passkey pairing - * BLE_HS_IO_DISPLAY_YESNO - Numeric comparison pairing - * BLE_HS_IO_NO_INPUT_OUTPUT - DEFAULT setting - just works pairing + * * 0x00 BLE_HS_IO_DISPLAY_ONLY DisplayOnly IO capability + * * 0x01 BLE_HS_IO_DISPLAY_YESNO DisplayYesNo IO capability + * * 0x02 BLE_HS_IO_KEYBOARD_ONLY KeyboardOnly IO capability + * * 0x03 BLE_HS_IO_NO_INPUT_OUTPUT NoInputNoOutput IO capability + * * 0x04 BLE_HS_IO_KEYBOARD_DISPLAY KeyboardDisplay Only IO capability */ static const uint8_t clientSecurityCapabilities = BLE_HS_IO_NO_INPUT_OUTPUT; @@ -579,7 +575,7 @@ END_BLEMIDI_NAMESPACE */ #define BLEMIDI_CREATE_CUSTOM_INSTANCE(DeviceName, Name, _Settings) \ BLEMIDI_NAMESPACE::BLEMIDI_Transport, _Settings> BLE##Name(DeviceName); \ - MIDI_NAMESPACE::MidiInterface, _Settings>, BLEMIDI_NAMESPACE::MySettings> Name((BLEMIDI_NAMESPACE::BLEMIDI_Transport, _Settings> &)BLE##Name); + MIDI_NAMESPACE::MidiInterface, _Settings>, _Settings> Name((BLEMIDI_NAMESPACE::BLEMIDI_Transport, _Settings> &)BLE##Name); /*! \brief Create an instance for ESP32 named , and advertise it like "Prefix + + Subfix" It will try to connect to a specific server with equal name or addr than . If is "", it will connect to first midi server diff --git a/src/hardware/BLEMIDI_ESP32.h b/src/hardware/BLEMIDI_ESP32.h index 955f62c..ee8f004 100644 --- a/src/hardware/BLEMIDI_ESP32.h +++ b/src/hardware/BLEMIDI_ESP32.h @@ -8,6 +8,12 @@ BEGIN_BLEMIDI_NAMESPACE +// Dependanced class settings +struct DefaultSettings : public _DefaultSettings +{ + //TODO Create parametric configurations +}; + template class BLEMIDI_ESP32 { @@ -172,7 +178,7 @@ bool BLEMIDI_ESP32<_Settings>::begin(const char *deviceName, BLEMIDI_Transport, _Settings> BLE##Name(DeviceName); \ - MIDI_NAMESPACE::MidiInterface, _Settings>, BLEMIDI_NAMESPACE::MySettings> Name((BLEMIDI_NAMESPACE::BLEMIDI_Transport, _Settings> &)BLE##Name); + MIDI_NAMESPACE::MidiInterface, _Settings>, _Settings> Name((BLEMIDI_NAMESPACE::BLEMIDI_Transport, _Settings> &)BLE##Name); /*! \brief Create an instance for ESP32 named */ diff --git a/src/hardware/BLEMIDI_ESP32_NimBLE.h b/src/hardware/BLEMIDI_ESP32_NimBLE.h index 8f9a237..31cf776 100644 --- a/src/hardware/BLEMIDI_ESP32_NimBLE.h +++ b/src/hardware/BLEMIDI_ESP32_NimBLE.h @@ -2,9 +2,17 @@ // Headers for ESP32 NimBLE #include +#include "BLEMIDI_Namespace.h" +#include BEGIN_BLEMIDI_NAMESPACE +// Dependanced class settings +struct DefaultSettings : public _DefaultSettings +{ + //TODO Create parametric configurations +}; + template class BLEMIDI_ESP32_NimBLE { @@ -145,9 +153,9 @@ bool BLEMIDI_ESP32_NimBLE<_Settings>::begin(const char *deviceName, BLEMIDI_Tran _characteristic->setCallbacks(new MyCharacteristicCallbacks<_Settings>(this)); - auto _security = new NimBLESecurity(); - _security->setAuthenticationMode(ESP_LE_AUTH_BOND); + NimBLEDevice::setSecurityIOCap(BLE_HS_IO_NO_INPUT_OUTPUT); // Attention + // Start the service service->start(); @@ -164,7 +172,7 @@ bool BLEMIDI_ESP32_NimBLE<_Settings>::begin(const char *deviceName, BLEMIDI_Tran */ #define BLEMIDI_CREATE_CUSTOM_INSTANCE(DeviceName, Name, _Settings) \ BLEMIDI_NAMESPACE::BLEMIDI_Transport, _Settings> BLE##Name(DeviceName); \ - MIDI_NAMESPACE::MidiInterface, _Settings>, BLEMIDI_NAMESPACE::MySettings> Name((BLEMIDI_NAMESPACE::BLEMIDI_Transport, _Settings> &)BLE##Name); + MIDI_NAMESPACE::MidiInterface, _Settings>, _Settings> Name((BLEMIDI_NAMESPACE::BLEMIDI_Transport, _Settings> &)BLE##Name); /*! \brief Create an instance for ESP32 named */ diff --git a/src/hardware/BLEMIDI_nRF52.h b/src/hardware/BLEMIDI_nRF52.h index 06544c2..aa474fb 100644 --- a/src/hardware/BLEMIDI_nRF52.h +++ b/src/hardware/BLEMIDI_nRF52.h @@ -6,6 +6,12 @@ BEGIN_BLEMIDI_NAMESPACE +// Dependanced class settings +struct DefaultSettings : public _DefaultSettings +{ + //TODO Create parametric configurations +}; + template class BLEMIDI_nRF52 { @@ -142,7 +148,7 @@ bool BLEMIDI_nRF52<_Settings>::begin(const char* deviceName, BLEMIDI_NAMESPACE:: */ #define BLEMIDI_CREATE_CUSTOM_INSTANCE(DeviceName, Name, _Settings) \ BLEMIDI_NAMESPACE::BLEMIDI_Transport, _Settings> BLE##Name(DeviceName); \ - MIDI_NAMESPACE::MidiInterface, _Settings>, BLEMIDI_NAMESPACE::MySettings> Name((BLEMIDI_NAMESPACE::BLEMIDI_Transport, _Settings> &)BLE##Name); + MIDI_NAMESPACE::MidiInterface, _Settings>, _Settings> Name((BLEMIDI_NAMESPACE::BLEMIDI_Transport, _Settings> &)BLE##Name); /*! \brief Create an instance for nRF52 named */ From 9a7a252ab2464f5e7feeec414fa809f241c30a0e Mon Sep 17 00:00:00 2001 From: RobertoHE Date: Sat, 24 May 2025 10:55:20 +0200 Subject: [PATCH 03/12] Update BLEMIDI_Transport.h Remove redundance declarations --- src/BLEMIDI_Transport.h | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/BLEMIDI_Transport.h b/src/BLEMIDI_Transport.h index a86bfb1..d58afba 100644 --- a/src/BLEMIDI_Transport.h +++ b/src/BLEMIDI_Transport.h @@ -184,8 +184,6 @@ class BLEMIDI_Transport // callbacks void (*_connectedCallback)() = nullptr; void (*_connectedCallbackDeviceName)(char *) = nullptr; - void (*_disconnectedCallback)() = nullptr; - void (*_connectedCallbackDeviceName)(char *) = nullptr; BLEMIDI_Transport &setName(const char *deviceName) { @@ -200,12 +198,6 @@ class BLEMIDI_Transport return *this; } - BLEMIDI_Transport &setHandleConnected(void (*fptr)(char*)) - { - _connectedCallbackDeviceName= fptr; - return *this; - } - BLEMIDI_Transport &setHandleConnected(void (*fptr)(char*)) { _connectedCallbackDeviceName= fptr; From c79a55f31a9ab2f3b407c59a3f5c9c2377dfd4ed Mon Sep 17 00:00:00 2001 From: RobertoHE Date: Sat, 24 May 2025 10:59:36 +0200 Subject: [PATCH 04/12] Update BLEMIDI_Transport.h --- src/BLEMIDI_Transport.h | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/src/BLEMIDI_Transport.h b/src/BLEMIDI_Transport.h index d58afba..e84e7ad 100644 --- a/src/BLEMIDI_Transport.h +++ b/src/BLEMIDI_Transport.h @@ -183,7 +183,7 @@ class BLEMIDI_Transport public: // callbacks void (*_connectedCallback)() = nullptr; - void (*_connectedCallbackDeviceName)(char *) = nullptr; + void (*_disconnectedCallback)() = nullptr; BLEMIDI_Transport &setName(const char *deviceName) { @@ -197,13 +197,7 @@ class BLEMIDI_Transport _connectedCallback = fptr; return *this; } - - BLEMIDI_Transport &setHandleConnected(void (*fptr)(char*)) - { - _connectedCallbackDeviceName= fptr; - return *this; - } - + BLEMIDI_Transport &setHandleDisconnected(void (*fptr)()) { _disconnectedCallback = fptr; From e107c8f3f2d26f5ba9dd24f5b5274bc58bfd6980 Mon Sep 17 00:00:00 2001 From: RobertoHE Date: Sat, 24 May 2025 13:44:17 +0200 Subject: [PATCH 05/12] Refactor BLEMIDI settings to use BLEDefaultSettings across multiple files for consistency and improved configuration options. --- examples/CustomSettings/CustomSettings.ino | 14 ++-- examples/MidiBle/MidiBle.ino | 4 +- examples/MidiBle_Client/MidiBle_Client.ino | 2 +- src/BLEMIDI_Settings.h | 2 +- src/BLEMIDI_Transport.h | 7 +- src/hardware/BLEMIDI_ArduinoBLE.h | 80 +++++++--------------- src/hardware/BLEMIDI_Client_ESP32.h | 23 +++---- src/hardware/BLEMIDI_ESP32.h | 6 +- src/hardware/BLEMIDI_ESP32_NimBLE.h | 4 +- src/hardware/BLEMIDI_nRF52.h | 4 +- 10 files changed, 57 insertions(+), 89 deletions(-) diff --git a/examples/CustomSettings/CustomSettings.ino b/examples/CustomSettings/CustomSettings.ino index aef25b3..40d8299 100644 --- a/examples/CustomSettings/CustomSettings.ino +++ b/examples/CustomSettings/CustomSettings.ino @@ -1,8 +1,13 @@ #include +//#include +#include +//#include +//#include + //User defined settings -struct CustomBufferSizeSettings : public BLEMIDI_NAMESPACE::DefaultSettings { - //BLE-MIDI settings (see BLEMIDI_Settings.h and BLE_class for more details) +struct CustomBufferSizeSettings : public BLEMIDI_NAMESPACE::BLEDefaultSettings { + //BLE-MIDI settings (see BLEMIDI_Settings.h and Hardware/BLE_class for more details) static const size_t MaxBufferSize = 16; //MIDI settings (see MIDI_Settings.h) @@ -10,11 +15,6 @@ struct CustomBufferSizeSettings : public BLEMIDI_NAMESPACE::DefaultSettings { static const bool HandleNullVelocityNoteOnAsNoteOff = true; }; -#include -//#include -//#include -//#include - #ifndef LED_BUILTIN #define LED_BUILTIN 2 #endif diff --git a/examples/MidiBle/MidiBle.ino b/examples/MidiBle/MidiBle.ino index 9022671..a0998a7 100644 --- a/examples/MidiBle/MidiBle.ino +++ b/examples/MidiBle/MidiBle.ino @@ -1,8 +1,8 @@ #include //#include -#include -//#include +//#include +#include #ifndef LED_BUILTIN #define LED_BUILTIN 2 diff --git a/examples/MidiBle_Client/MidiBle_Client.ino b/examples/MidiBle_Client/MidiBle_Client.ino index c7296c1..769c02b 100644 --- a/examples/MidiBle_Client/MidiBle_Client.ino +++ b/examples/MidiBle_Client/MidiBle_Client.ino @@ -55,7 +55,7 @@ using PasskeyRequestCallback = uint32_t (*)(void); //See DefaultSettingsClient in hardware/BLEMIDI_Client_ESP32.h for more configurable settings // If you do not redefine a parameter, it will use the default value for these parameter -struct CustomSettings : public BLEMIDI_NAMESPACE::DefaultSettings +struct CustomSettings : public BLEMIDI_NAMESPACE::BLEDefaultSettings { //See all options and them explanation in the library. diff --git a/src/BLEMIDI_Settings.h b/src/BLEMIDI_Settings.h index 6fa7911..a61291d 100644 --- a/src/BLEMIDI_Settings.h +++ b/src/BLEMIDI_Settings.h @@ -6,7 +6,7 @@ BEGIN_BLEMIDI_NAMESPACE //Common settings for all BLEMIDI classes //This is the default settings for all BLEMIDI classes -struct _DefaultSettings : MIDI_NAMESPACE::DefaultSettings +struct CommonBLEDefaultSettings : MIDI_NAMESPACE::DefaultSettings { static const short MaxBufferSize = 64; }; diff --git a/src/BLEMIDI_Transport.h b/src/BLEMIDI_Transport.h index e84e7ad..27d1b5e 100644 --- a/src/BLEMIDI_Transport.h +++ b/src/BLEMIDI_Transport.h @@ -23,7 +23,7 @@ static const char *const CHARACTERISTIC_UUID = "7772e5db-3868-4112-a1a9-f2669d10 #define MIDI_TYPE 0x80 -template +template class BLEMIDI_Transport { private: @@ -409,9 +409,4 @@ class BLEMIDI_Transport } }; -struct MySettings : public MIDI_NAMESPACE::DefaultSettings -{ - static const bool Use1ByteParsing = false; -}; - END_BLEMIDI_NAMESPACE diff --git a/src/hardware/BLEMIDI_ArduinoBLE.h b/src/hardware/BLEMIDI_ArduinoBLE.h index ba68176..5d8fb9a 100644 --- a/src/hardware/BLEMIDI_ArduinoBLE.h +++ b/src/hardware/BLEMIDI_ArduinoBLE.h @@ -1,13 +1,15 @@ #pragma once #include +#include "BLEMIDI_Namespace.h" +#include "BLEMIDI_Settings.h" #define BLE_POLLING BEGIN_BLEMIDI_NAMESPACE // Dependanced class settings -struct DefaultSettings : public _DefaultSettings +struct BLEDefaultSettings : public CommonBLEDefaultSettings { //TODO Create parametric configurations }; @@ -79,12 +81,13 @@ class BLEMIDI_ArduinoBLE Fifo mRxBuffer; - template friend class MyServerCallbacks; + static BLEMIDI_ArduinoBLE<_Settings>* self; public: BLEMIDI_ArduinoBLE() : _midiService(SERVICE_UUID), _midiChar(CHARACTERISTIC_UUID, BLERead | BLEWrite | BLENotify | BLEWriteWithoutResponse, _Settings::MaxBufferSize) { + self = this; } bool begin(const char *, BLEMIDI_Transport, _Settings> *); @@ -145,59 +148,26 @@ class BLEMIDI_ArduinoBLE end(); } -}; -template -class MyServerCallbacks : public BLEDeviceCallbacks -{ -public: - MyServerCallbacks(BLEMIDI_ArduinoBLE<_Settings> *bluetooth) - : _bluetooth(bluetooth) - { + static void blePeripheralConnectedHandler(BLEDevice central) { + self->connected(); } - -protected: - BLEMIDI_ArduinoBLE<_Settings> *_bluetooth = nullptr; - - void onConnect(BLEDevice device) - { - if (_bluetooth) - _bluetooth->connected(); - }; - - void onDisconnect(BLEDevice device) - { - if (_bluetooth) - _bluetooth->disconnected(); + + static void blePeripheralDisconnectedHandler(BLEDevice central) { + self->disconnected(); } -}; - -template -class MyCharacteristicCallbacks : public BLECharacteristicCallbacks -{ -public: - MyCharacteristicCallbacks(BLEMIDI_ArduinoBLE<_Settings> *bluetooth) - : _bluetooth(bluetooth) - { - } - -protected: - BLEMIDI_ArduinoBLE<_Settings> *_bluetooth = nullptr; - - void onWrite(BLECharacteristic characteristic) - { - // std::string rxValue = characteristic->getValue(); - // if (rxValue.length() > 0) - // { - // _bluetooth->receive((uint8_t *)(rxValue.c_str()), rxValue.length()); - //} - } - - void onRead(BLECharacteristic characteristic) - { + + static void switchCharacteristicWritten(BLEDevice central, BLECharacteristic characteristic) { +// std::string rxValue = characteristic->value(); +// if (rxValue.length() > 0) +// receive((uint8_t *)(rxValue.c_str()), rxValue.length()); } }; +// this pattern of static to instance variable is limited to 1 instance of ArduinoBLE +// for multiple instances, turn this into a vector and lookup +template BLEMIDI_ArduinoBLE<_Settings>* BLEMIDI_ArduinoBLE<_Settings>::self; + template bool BLEMIDI_ArduinoBLE<_Settings>::begin(const char *deviceName, BLEMIDI_Transport, _Settings> *bleMidiTransport) { @@ -213,9 +183,10 @@ bool BLEMIDI_ArduinoBLE<_Settings>::begin(const char *deviceName, BLEMIDI_Transp _midiService.addCharacteristic(_midiChar); BLE.addService(_midiService); - BLE.setCallbacks(new MyServerCallbacks<_Settings>(this)); + BLE.setEventHandler(BLEConnected, blePeripheralConnectedHandler); + BLE.setEventHandler(BLEDisconnected, blePeripheralDisconnectedHandler); - _midiChar.setCallbacks(new MyCharacteristicCallbacks<_Settings>(this)); + _midiChar.setEventHandler(BLEWritten, switchCharacteristicWritten); // set the initial value for the characeristic: // (when not set, the device will disconnect after 0.5 seconds) @@ -229,20 +200,21 @@ bool BLEMIDI_ArduinoBLE<_Settings>::begin(const char *deviceName, BLEMIDI_Transp return true; } + /*! \brief Create an instance for ArduinoBLE */ #define BLEMIDI_CREATE_CUSTOM_INSTANCE(DeviceName, Name, _Settings) \ BLEMIDI_NAMESPACE::BLEMIDI_Transport, _Settings> BLE##Name(DeviceName); \ - MIDI_NAMESPACE::MidiInterface, _Settings>, _Settings> Name((BLEMIDI_NAMESPACE::BLEMIDI_Transport, _Settings> &)BLE##Name); + MIDI_NAMESPACE::MidiInterface, _Settings>, BLEMIDI_NAMESPACE::BLEDefaultSettings> Name((BLEMIDI_NAMESPACE::BLEMIDI_Transport, _Settings> &)BLE##Name); /*! \brief Create an instance for ArduinoBLE */ #define BLEMIDI_CREATE_INSTANCE(DeviceName, Name) \ - BLEMIDI_CREATE_CUSTOM_INSTANCE(DeviceName, Name, BLEMIDI_NAMESPACE::DefaultSettings); + BLEMIDI_CREATE_CUSTOM_INSTANCE(DeviceName, Name, BLEMIDI_NAMESPACE::BLEDefaultSettings); /*! \brief Create a default instance for ArduinoBLE named BLE-MIDI */ #define BLEMIDI_CREATE_DEFAULT_INSTANCE() \ BLEMIDI_CREATE_INSTANCE("BLE-MIDI", MIDI) -END_BLEMIDI_NAMESPACE +END_BLEMIDI_NAMESPACE \ No newline at end of file diff --git a/src/hardware/BLEMIDI_Client_ESP32.h b/src/hardware/BLEMIDI_Client_ESP32.h index cad1f87..77136ab 100644 --- a/src/hardware/BLEMIDI_Client_ESP32.h +++ b/src/hardware/BLEMIDI_Client_ESP32.h @@ -10,6 +10,7 @@ // Headers for ESP32 nimBLE #include +#include "transport.h" #include "BLEMIDI_Namespace.h" #include "BLEMIDI_Settings.h" @@ -30,7 +31,7 @@ static uint32_t defautlPasskeyRequest() }; // Dependanced class settings -struct DefaultSettings : public _DefaultSettings +struct BLEDefaultSettings : public CommonBLEDefaultSettings { /* @@ -41,7 +42,7 @@ struct DefaultSettings : public _DefaultSettings * Set name of ble device (not affect to connection with server) * max 16 characters */ - static constexpr char *name = (char*)"BleMidiClient"; + static constexpr char *clientName = (char*)"BleMidiClient"; /* ###### TX POWER ##### @@ -193,7 +194,7 @@ class BLEMIDI_Client_ESP32 bool firstTimeSend = true; //First writeValue get sends like Write with reponse for clean security flags. After first time, all messages are send like WriteNoResponse for increase transmision speed. char connectedDeviceName[24]; - BLEMIDI_Transport *_bleMidiTransport = nullptr; + BLEMIDI_Transport *_bleMidiTransport = nullptr; bool specificTarget = false; @@ -265,12 +266,6 @@ class BLEMIDI_Client_ESP32 if (_bleMidiTransport->_connectedCallback) _bleMidiTransport->_connectedCallback(); firstTimeSend = true; - - if (_bleMidiTransport->_connectedCallbackDeviceName) - { - sprintf(connectedDeviceName, "%s", myAdvCB.advDevice.getName().c_str()); - _bleMidiTransport->_connectedCallbackDeviceName(connectedDeviceName); - } } void disconnected() @@ -378,11 +373,15 @@ bool BLEMIDI_Client_ESP32<_Settings>::begin(const char *deviceName, BLEMIDI_Tran { myAdvCB.specificTarget = true; myAdvCB.nameTarget = strDeviceName; + } + DEBUGCLIENT("Target Server:"); + DEBUGCLIENT(myAdvCB.nameTarget.c_str()); static char array[16]; - memcpy(array, _Settings::name, 16); + memcpy(array, _Settings::clientName, 16); strDeviceName = array; + DEBUGCLIENT("ClientName (this device):"); DEBUGCLIENT(strDeviceName.c_str()); NimBLEDevice::init(strDeviceName); @@ -575,14 +574,14 @@ void scanEndedCB(NimBLEScanResults results) END_BLEMIDI_NAMESPACE -/*! \brief Create a custom instance for ESP32 named , and advertise it like "Prefix + + Subfix" +/*! \brief Create a custom instance for ESP32 named . It will try to connect to a specific server with equal name or addr than . If is "", it will connect to first midi server */ #define BLEMIDI_CREATE_CUSTOM_INSTANCE(DeviceName, Name, _Settings) \ BLEMIDI_NAMESPACE::BLEMIDI_Transport, _Settings> BLE##Name(DeviceName); \ MIDI_NAMESPACE::MidiInterface, _Settings>, _Settings> Name((BLEMIDI_NAMESPACE::BLEMIDI_Transport, _Settings> &)BLE##Name); -/*! \brief Create an instance for ESP32 named , and advertise it like "Prefix + + Subfix" +/*! \brief Create an instance for ESP32 named . It will try to connect to a specific server with equal name or addr than . If is "", it will connect to first midi server */ #define BLEMIDI_CREATE_INSTANCE(DeviceName, Name) \ diff --git a/src/hardware/BLEMIDI_ESP32.h b/src/hardware/BLEMIDI_ESP32.h index adda57d..0876579 100644 --- a/src/hardware/BLEMIDI_ESP32.h +++ b/src/hardware/BLEMIDI_ESP32.h @@ -5,6 +5,8 @@ #include #include #include +#include "BLEMIDI_Namespace.h" +#include "BLEMIDI_Settings.h" // Note: error: redefinition of 'class BLEDescriptor' is a namespace collision on class BLEDescriptor between our ESp32 BLE and ArduinoBLE // Solution: remove ArduinoBLE @@ -12,7 +14,7 @@ BEGIN_BLEMIDI_NAMESPACE // Dependanced class settings -struct DefaultSettings : public _DefaultSettings +struct BLEDefaultSettings : public CommonBLEDefaultSettings { //TODO Create parametric configurations }; @@ -186,7 +188,7 @@ bool BLEMIDI_ESP32<_Settings>::begin(const char *deviceName, BLEMIDI_Transport */ #define BLEMIDI_CREATE_INSTANCE(DeviceName, Name) \ - BLEMIDI_CREATE_CUSTOM_INSTANCE (DeviceName, Name, BLEMIDI_NAMESPACE::DefaultSettings) + BLEMIDI_CREATE_CUSTOM_INSTANCE (DeviceName, Name, BLEMIDI_NAMESPACE::BLEDefaultSettings) /*! \brief Create a default instance for ESP32 named BLE-MIDI */ diff --git a/src/hardware/BLEMIDI_ESP32_NimBLE.h b/src/hardware/BLEMIDI_ESP32_NimBLE.h index 8ba138a..d7a67ae 100644 --- a/src/hardware/BLEMIDI_ESP32_NimBLE.h +++ b/src/hardware/BLEMIDI_ESP32_NimBLE.h @@ -8,7 +8,7 @@ BEGIN_BLEMIDI_NAMESPACE // Dependanced class settings -struct DefaultSettings : public _DefaultSettings +struct BLEDefaultSettings : public CommonBLEDefaultSettings { //TODO Create parametric configurations }; @@ -199,7 +199,7 @@ bool BLEMIDI_ESP32_NimBLE<_Settings>::begin(const char *deviceName, BLEMIDI_Tran /*! \brief Create an instance for ESP32 named */ #define BLEMIDI_CREATE_INSTANCE(DeviceName, Name) \ - BLEMIDI_CREATE_CUSTOM_INSTANCE (DeviceName, Name, BLEMIDI_NAMESPACE::DefaultSettings) + BLEMIDI_CREATE_CUSTOM_INSTANCE (DeviceName, Name, BLEMIDI_NAMESPACE::BLEDefaultSettings) /*! \brief Create a default instance for ESP32 named BLE-MIDI */ diff --git a/src/hardware/BLEMIDI_nRF52.h b/src/hardware/BLEMIDI_nRF52.h index aa474fb..4e32fca 100644 --- a/src/hardware/BLEMIDI_nRF52.h +++ b/src/hardware/BLEMIDI_nRF52.h @@ -7,7 +7,7 @@ BEGIN_BLEMIDI_NAMESPACE // Dependanced class settings -struct DefaultSettings : public _DefaultSettings +struct BLEDefaultSettings : public CommonBLEDefaultSettings { //TODO Create parametric configurations }; @@ -153,7 +153,7 @@ bool BLEMIDI_nRF52<_Settings>::begin(const char* deviceName, BLEMIDI_NAMESPACE:: /*! \brief Create an instance for nRF52 named */ #define BLEMIDI_CREATE_INSTANCE(DeviceName, Name) \ - BLEMIDI_CREATE_CUSTOM_INSTANCE (DeviceName, Name, BLEMIDI_NAMESPACE::DefaultSettings) + BLEMIDI_CREATE_CUSTOM_INSTANCE (DeviceName, Name, BLEMIDI_NAMESPACE::BLEDefaultSettings) /*! \brief Create a default instance for nRF52 named BLE-MIDI */ From 05daa966d152f3c8ece7ace048e5433610ba9e31 Mon Sep 17 00:00:00 2001 From: RobertoHE Date: Sat, 24 May 2025 13:51:51 +0200 Subject: [PATCH 06/12] Enable installation of ArduinoBLE library in build script --- ci/build-arduino.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/build-arduino.sh b/ci/build-arduino.sh index fd30016..a6cb533 100644 --- a/ci/build-arduino.sh +++ b/ci/build-arduino.sh @@ -31,7 +31,7 @@ arduino-cli board listall ln -s $GITHUB_WORKSPACE $HOME/Arduino/libraries/CI_Test_Library arduino-cli lib install "MIDI library" -#arduino-cli lib install ArduinoBLE +arduino-cli lib install ArduinoBLE arduino-cli lib install NimBLE-Arduino # Compile all *.ino files for the Arduino Uno From 6b7647e2c754ec9479071eac13e59adb874e0129 Mon Sep 17 00:00:00 2001 From: RobertoHE Date: Sat, 24 May 2025 13:56:29 +0200 Subject: [PATCH 07/12] No ArduinoBLE. Problems --- examples/MidiBle/MidiBle.ino | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/MidiBle/MidiBle.ino b/examples/MidiBle/MidiBle.ino index a0998a7..9022671 100644 --- a/examples/MidiBle/MidiBle.ino +++ b/examples/MidiBle/MidiBle.ino @@ -1,8 +1,8 @@ #include //#include -//#include -#include +#include +//#include #ifndef LED_BUILTIN #define LED_BUILTIN 2 From 66a3eda9199860ddc1c20794e06b640eae7520ff Mon Sep 17 00:00:00 2001 From: RobertoHE Date: Sat, 24 May 2025 14:39:57 +0200 Subject: [PATCH 08/12] Actualizar build-arduino.sh --- ci/build-arduino.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/build-arduino.sh b/ci/build-arduino.sh index a6cb533..fd30016 100644 --- a/ci/build-arduino.sh +++ b/ci/build-arduino.sh @@ -31,7 +31,7 @@ arduino-cli board listall ln -s $GITHUB_WORKSPACE $HOME/Arduino/libraries/CI_Test_Library arduino-cli lib install "MIDI library" -arduino-cli lib install ArduinoBLE +#arduino-cli lib install ArduinoBLE arduino-cli lib install NimBLE-Arduino # Compile all *.ino files for the Arduino Uno From cbe1360e3b1b9495c90518efbfd5552f0f1803ba Mon Sep 17 00:00:00 2001 From: RobertoHE Date: Sun, 25 May 2025 14:32:07 +0200 Subject: [PATCH 09/12] Fix compilation command in build script to use the correct file reference --- ci/build-arduino.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/build-arduino.sh b/ci/build-arduino.sh index fd30016..15ae6b6 100644 --- a/ci/build-arduino.sh +++ b/ci/build-arduino.sh @@ -57,6 +57,6 @@ for f in **/*.ino ; do d=$(dirname $(readlink -f $f)) echo $d cd $d - arduino-cli compile -b esp32:esp32:esp32 *.ino --clean + arduino-cli compile -b esp32:esp32:esp32 $f --clean cd $dR done From f577301d6bcc72aa0442e6ce7bb622f0e178fc96 Mon Sep 17 00:00:00 2001 From: RobertoHE Date: Sun, 25 May 2025 14:35:04 +0200 Subject: [PATCH 10/12] undo last commit --- ci/build-arduino.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/build-arduino.sh b/ci/build-arduino.sh index 15ae6b6..fd30016 100644 --- a/ci/build-arduino.sh +++ b/ci/build-arduino.sh @@ -57,6 +57,6 @@ for f in **/*.ino ; do d=$(dirname $(readlink -f $f)) echo $d cd $d - arduino-cli compile -b esp32:esp32:esp32 $f --clean + arduino-cli compile -b esp32:esp32:esp32 *.ino --clean cd $dR done From 58f0ede4f521a60258f7aad100d0b61d9bc52237 Mon Sep 17 00:00:00 2001 From: RobertoHE Date: Sun, 1 Jun 2025 20:51:19 +0200 Subject: [PATCH 11/12] Fixed name server NimBLE --- src/hardware/BLEMIDI_ESP32_NimBLE.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/hardware/BLEMIDI_ESP32_NimBLE.h b/src/hardware/BLEMIDI_ESP32_NimBLE.h index d7a67ae..aaaeb56 100644 --- a/src/hardware/BLEMIDI_ESP32_NimBLE.h +++ b/src/hardware/BLEMIDI_ESP32_NimBLE.h @@ -185,6 +185,7 @@ bool BLEMIDI_ESP32_NimBLE<_Settings>::begin(const char *deviceName, BLEMIDI_Tran _advertising = _server->getAdvertising(); _advertising->addServiceUUID(service->getUUID()); _advertising->setAppearance(0x00); + _advertising->setName(deviceName); _advertising->start(); return true; From 96c79141dfc4597090fc6364942113d1e114beb1 Mon Sep 17 00:00:00 2001 From: RobertoHE Date: Sun, 1 Jun 2025 23:19:59 +0200 Subject: [PATCH 12/12] Add Settings to ESP32_Nimble --- src/hardware/BLEMIDI_Client_ESP32.h | 20 +++--- src/hardware/BLEMIDI_ESP32_NimBLE.h | 99 +++++++++++++++++++++-------- 2 files changed, 81 insertions(+), 38 deletions(-) diff --git a/src/hardware/BLEMIDI_Client_ESP32.h b/src/hardware/BLEMIDI_Client_ESP32.h index 77136ab..3965768 100644 --- a/src/hardware/BLEMIDI_Client_ESP32.h +++ b/src/hardware/BLEMIDI_Client_ESP32.h @@ -51,7 +51,7 @@ struct BLEDefaultSettings : public CommonBLEDefaultSettings /** * Set power transmision */ - static const uint8_t clientTXPwr = 9; //in dBm + static const uint8_t BLETXPwr = 9; //in dBm /* ###### SECURITY ##### @@ -64,7 +64,7 @@ struct BLEDefaultSettings : public CommonBLEDefaultSettings * * 0x03 BLE_HS_IO_NO_INPUT_OUTPUT NoInputNoOutput IO capability * * 0x04 BLE_HS_IO_KEYBOARD_DISPLAY KeyboardDisplay Only IO capability */ - static const uint8_t clientSecurityCapabilities = BLE_HS_IO_NO_INPUT_OUTPUT; + static const uint8_t BLESecurityCapabilities = BLE_HS_IO_NO_INPUT_OUTPUT; /** Set the security method. * bonding @@ -73,9 +73,9 @@ struct BLEDefaultSettings : public CommonBLEDefaultSettings * * More info in nimBLE lib */ - static const bool clientBond = true; - static const bool clientMITM = false; - static const bool clientPair = true; + static const bool BLEBond = true; + static const bool BLEMITM = false; + static const bool BLEPair = true; /** * This callback function defines what will be done when server requieres PassKey. @@ -146,7 +146,7 @@ class AdvertisedDeviceCallbacks : public NimBLEScanCallbacks std::string nameTarget; protected: - void onResult(NimBLEAdvertisedDevice *advertisedDevice) + void onResult(const NimBLEAdvertisedDevice *advertisedDevice) { if (!enableConnection) // not begin() or end() { @@ -299,7 +299,7 @@ class MyClientCallbacks : public BLEClientCallbacks void onConnect(BLEClient *pClient) { DEBUGCLIENT("##Connected##"); - // pClient->updateConnParams(_Settings::commMinInterval, _Settings::commMaxInterval, _Settings::commLatency, _Settings::commTimeOut); + pClient->updateConnParams(_Settings::commMinInterval, _Settings::commMaxInterval, _Settings::commLatency, _Settings::commTimeOut); vTaskDelay(1); if (_bluetoothEsp32) _bluetoothEsp32->connected(); @@ -389,11 +389,11 @@ bool BLEMIDI_Client_ESP32<_Settings>::begin(const char *deviceName, BLEMIDI_Tran // Core_0 runs here, core_1 runs the BLE stack mRxQueue = xQueueCreate(_Settings::MaxBufferSize, sizeof(uint8_t)); - NimBLEDevice::setSecurityIOCap(_Settings::clientSecurityCapabilities); // Attention, it may need a passkey - NimBLEDevice::setSecurityAuth(_Settings::clientBond, _Settings::clientMITM, _Settings::clientPair); + NimBLEDevice::setSecurityIOCap(_Settings::BLESecurityCapabilities); // Attention, it may need a passkey + NimBLEDevice::setSecurityAuth(_Settings::BLEBond, _Settings::BLEMITM, _Settings::BLEPair); /** Optional: set the transmit power, default is 3db */ - NimBLEDevice::setPower(_Settings::clientTXPwr); /** +9db */ + NimBLEDevice::setPower(_Settings::BLETXPwr); /** +9db */ myAdvCB.enableConnection = true; scan(); diff --git a/src/hardware/BLEMIDI_ESP32_NimBLE.h b/src/hardware/BLEMIDI_ESP32_NimBLE.h index aaaeb56..75ddb43 100644 --- a/src/hardware/BLEMIDI_ESP32_NimBLE.h +++ b/src/hardware/BLEMIDI_ESP32_NimBLE.h @@ -10,7 +10,62 @@ BEGIN_BLEMIDI_NAMESPACE // Dependanced class settings struct BLEDefaultSettings : public CommonBLEDefaultSettings { - //TODO Create parametric configurations + + /* + ###### TX POWER ##### + */ + + /** + * Set power transmision + */ + static const uint8_t BLETXPwr = 9; //in dBm + + /* + ###### SECURITY ##### + */ + + /** Set the IO capabilities of the device, each option will trigger a different pairing method. + * * 0x00 BLE_HS_IO_DISPLAY_ONLY DisplayOnly IO capability + * * 0x01 BLE_HS_IO_DISPLAY_YESNO DisplayYesNo IO capability + * * 0x02 BLE_HS_IO_KEYBOARD_ONLY KeyboardOnly IO capability + * * 0x03 BLE_HS_IO_NO_INPUT_OUTPUT NoInputNoOutput IO capability + * * 0x04 BLE_HS_IO_KEYBOARD_DISPLAY KeyboardDisplay Only IO capability + */ + static const uint8_t BLESecurityCapabilities = BLE_HS_IO_NO_INPUT_OUTPUT; + + /** Set the security method. + * bonding + * man in the middle protection + * pair. secure connections + * + * More info in nimBLE lib + */ + static const bool BLEBond = true; + static const bool BLEMITM = false; + static const bool BLEPair = true; + + /* + ###### BLE COMMUNICATION PARAMS ###### + */ + + /** Set connection parameters: + * If you only use one connection, put recomended BLE server param communication + * (you may scan it ussing "nRF Connect" app or other similar apps). + * + * If you use more than one connection adjust, for example, settings like 15ms interval, 0 latency, 120ms timout. + * These settings may be safe for 3 clients to connect reliably, set faster values if you have less + * connections. + * + * Min interval (unit: 1.25ms): 12 * 1.25ms = 15 ms, + * Max interval (unit: 1.25ms): 12 * 1.25ms = 15, + * 0 latency (Number of intervals allowed to skip), + * TimeOut (unit: 10ms) 51 * 10ms = 510ms. Timeout should be minimum 100ms. + */ + static const uint16_t commMinInterval = 6; // 7.5ms + static const uint16_t commMaxInterval = 35; // 40ms + static const uint16_t commLatency = 0; // + static const uint16_t commTimeOut = 200; // 2000ms + }; template @@ -90,13 +145,13 @@ class MyServerCallbacks : public BLEServerCallbacks protected: BLEMIDI_ESP32_NimBLE<_Settings> *_bluetoothEsp32 = nullptr; - void onConnect(BLEServer *) + void onConnect(BLEServer *, NimBLEConnInfo &) { if (_bluetoothEsp32) _bluetoothEsp32->connected(); }; - void onDisconnect(BLEServer *) + void onDisconnect(BLEServer *, NimBLEConnInfo &) { if (_bluetoothEsp32) _bluetoothEsp32->disconnected(); @@ -115,7 +170,7 @@ class MyCharacteristicCallbacks : public BLECharacteristicCallbacks protected: BLEMIDI_ESP32_NimBLE<_Settings> *_bluetoothEsp32 = nullptr; - void onWrite(BLECharacteristic *characteristic) + void onWrite(BLECharacteristic *characteristic, NimBLEConnInfo &) { std::string rxValue = characteristic->getValue(); if (rxValue.length() > 0) @@ -131,27 +186,11 @@ bool BLEMIDI_ESP32_NimBLE<_Settings>::begin(const char *deviceName, BLEMIDI_Tran _bleMidiTransport = bleMidiTransport; BLEDevice::init(deviceName); + + NimBLEDevice::setSecurityIOCap(_Settings::BLESecurityCapabilities); // Attention, it may need a passkey + NimBLEDevice::setSecurityAuth(_Settings::BLEBond, _Settings::BLEMITM, _Settings::BLEPair); - /** - * Set the IO capabilities of the device, each option will trigger a different pairing method. - * BLE_HS_IO_DISPLAY_ONLY - Passkey pairing - * BLE_HS_IO_DISPLAY_YESNO - Numeric comparison pairing - * BLE_HS_IO_NO_INPUT_OUTPUT - DEFAULT setting - just works pairing - */ - // NimBLEDevice::setSecurityIOCap(BLE_HS_IO_DISPLAY_ONLY); // use passkey - // NimBLEDevice::setSecurityIOCap(BLE_HS_IO_DISPLAY_YESNO); //use numeric comparison - - /** - * 2 different ways to set security - both calls achieve the same result. - * no bonding, no man in the middle protection, BLE secure connections. - * - * These are the default values, only shown here for demonstration. - */ - // NimBLEDevice::setSecurityAuth(false, false, true); - -// NimBLEDevice::setSecurityAuth(/*BLE_SM_PAIR_AUTHREQ_BOND | BLE_SM_PAIR_AUTHREQ_MITM |*/ BLE_SM_PAIR_AUTHREQ_SC); - - NimBLEDevice::setSecurityAuth(true, false, false); + /** Optional: set the transmit power, default is 3db */ NimBLEDevice::setPower(_Settings::BLETXPwr); /** +9db */ // To communicate between the 2 cores. // Core_0 runs here, core_1 runs the BLE stack @@ -166,8 +205,8 @@ bool BLEMIDI_ESP32_NimBLE<_Settings>::begin(const char *deviceName, BLEMIDI_Tran // Create a BLE Characteristic _characteristic = service->createCharacteristic( - BLEUUID(CHARACTERISTIC_UUID), - NIMBLE_PROPERTY::READ | + BLEUUID(CHARACTERISTIC_UUID), + NIMBLE_PROPERTY::READ | NIMBLE_PROPERTY::WRITE | NIMBLE_PROPERTY::NOTIFY | NIMBLE_PROPERTY::WRITE_NR); @@ -175,8 +214,12 @@ bool BLEMIDI_ESP32_NimBLE<_Settings>::begin(const char *deviceName, BLEMIDI_Tran _characteristic->setCallbacks(new MyCharacteristicCallbacks<_Settings>(this)); - NimBLEDevice::setSecurityIOCap(BLE_HS_IO_NO_INPUT_OUTPUT); // Attention - + NimBLEDevice::setSecurityIOCap(_Settings::BLESecurityCapabilities); // Attention, it may need a passkey + NimBLEDevice::setSecurityAuth(_Settings::BLEBond, _Settings::BLEMITM, _Settings::BLEPair); + + /** Optional: set the transmit power, default is 3db */ + NimBLEDevice::setPower(_Settings::BLETXPwr); /** +9db */ + // Start the service service->start();