From 8928cd1ccdfe795e426c1fa2015ad88302c79416 Mon Sep 17 00:00:00 2001
From: Peter Rosenberg
Date: Tue, 29 Dec 2020 16:05:33 +0100
Subject: [PATCH 1/2] Add broadcast support for longer UUIDs
---
src/nRF51822.cpp | 24 +++++++++++++++++-------
1 file changed, 17 insertions(+), 7 deletions(-)
diff --git a/src/nRF51822.cpp b/src/nRF51822.cpp
index 21adf73..23313c2 100644
--- a/src/nRF51822.cpp
+++ b/src/nRF51822.cpp
@@ -1112,16 +1112,26 @@ bool nRF51822::broadcastCharacteristic(BLECharacteristic& characteristic) {
// copy the existing advertisement data
memcpy(advData, this->_advData, advDataLen);
- advDataLen += (4 + characteristic.valueLength());
+ BLEUuid serviceUuid = BLEUuid(localCharacteristicInfo->service->uuid());
+ unsigned char serviceUuidLength = serviceUuid.length();
- if (advDataLen <= 31) {
- BLEUuid uuid = BLEUuid(localCharacteristicInfo->service->uuid());
+ // length + type + uuidLength + value-length
+ advDataLen += 1 + 1 + serviceUuidLength + characteristic.valueLength();
- advData[this->_advDataLen + 0] = 3 + characteristic.valueLength();
- advData[this->_advDataLen + 1] = 0x16;
+ if (advDataLen <= 31) { // adjust check
- memcpy(&advData[this->_advDataLen + 2], uuid.data(), 2);
- memcpy(&advData[this->_advDataLen + 4], characteristic.value(), characteristic.valueLength());
+ advData[this->_advDataLen + 0] = 1 + serviceUuidLength + characteristic.valueLength();
+ // https://www.bluetooth.com/specifications/assigned-numbers/generic-access-profile/
+ if (serviceUuidLength == 2) {
+ advData[this->_advDataLen + 1] = 0x16; // Service Data - 16-bit UUID
+ } else if (serviceUuidLength == 4) {
+ advData[this->_advDataLen + 1] = 0x20; // Service Data - 32-bit UUID
+ } else {
+ advData[this->_advDataLen + 1] = 0x21; // Service Data - 128-bit UUID
+ }
+
+ memcpy(&advData[this->_advDataLen + 2], serviceUuid.data(), serviceUuidLength);
+ memcpy(&advData[this->_advDataLen + 2 + serviceUuidLength], characteristic.value(), characteristic.valueLength());
sd_ble_gap_adv_data_set(advData, advDataLen, NULL, 0); // update advertisement data
success = true;
From 83466d0aead1a543c1e8d8fa123c5e96144ef8d9 Mon Sep 17 00:00:00 2001
From: Peter Rosenberg
Date: Tue, 29 Dec 2020 17:47:04 +0100
Subject: [PATCH 2/2] document characteristics to service assignment
---
src/BLEPeripheral.h | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/src/BLEPeripheral.h b/src/BLEPeripheral.h
index e9e8705..62fbedb 100644
--- a/src/BLEPeripheral.h
+++ b/src/BLEPeripheral.h
@@ -84,7 +84,13 @@ class BLEPeripheral : public BLEDeviceEventListener,
void setDeviceName(const char* deviceName);
void setAppearance(unsigned short appearance);
+ /**
+ * @brief Add local services, characteristics and descriptors. Characteristics are assigned to the last added service.
+ */
void addAttribute(BLELocalAttribute& attribute);
+ /**
+ * @brief Add local services, characteristics and descriptors. Characteristics are assigned to the last added service.
+ */
void addLocalAttribute(BLELocalAttribute& localAttribute);
void addRemoteAttribute(BLERemoteAttribute& remoteAttribute);