Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Clear characteristic cccd value when disconnect #376

Open
wants to merge 1 commit into
base: master
Choose a base branch
from

Conversation

fabik111
Copy link
Contributor

@fabik111 fabik111 commented Dec 6, 2024

Problem

If the peripheral sketch with a subscribeable characteristic closes the connection with the central calling the BLE.disconnect() all subsequent subscriptions, after the first connection, are not notified and the characteristic stays always as "subscribed".

Solution

In this PR the characteristic CCCD value is cleared when the BLE.disconnect() is called for resetting the characteristic subscription status and allowing new subscriptions.

Sketches for reproducing the problem

Central

#include <ArduinoBLE.h>
void setup() {
  Serial.begin(9600);
  while (!Serial);

  // initialize the Bluetooth® Low Energy hardware
  BLE.begin();
 BLE.scanForUuid("19B10000-E8F2-537E-4F6C-D104768A1214");
}

void loop() {
  // put your main code here, to run repeatedly:
BLEDevice peripheral = BLE.available();

  if (peripheral) {
    // discovered a peripheral, print out address, local name, and advertised service
    Serial.print("Found ");
    Serial.print(peripheral.address());
    Serial.print(" '");
    Serial.print(peripheral.localName());
    Serial.print("' ");
    Serial.print(peripheral.advertisedServiceUuid());
    Serial.println();


    // stop scanning
    BLE.stopScan();

    controlLed(peripheral);
    delay(10000);
    // peripheral disconnected, start scanning again
    BLE.scanForUuid("19b10000-e8f2-537e-4f6c-d104768a1214");
  }
}

void controlLed(BLEDevice peripheral) {
  // connect to the peripheral
  Serial.println("Connecting ...");

  if (peripheral.connect()) {
    Serial.println("Connected");
  } else {
    Serial.println("Failed to connect!");
    return;
  }

  // discover peripheral attributes
  Serial.println("Discovering attributes ...");
  if (peripheral.discoverAttributes()) {
    Serial.println("Attributes discovered");
  } else {
    Serial.println("Attribute discovery failed!");
    peripheral.disconnect();
    return;
  }

  BLECharacteristic byteCharacteristic = peripheral.characteristic("19B10001-E8F2-537E-4F6C-D104768A1214");
  if (!byteCharacteristic) {
    Serial.println("Peripheral does not have LED characteristic!");
    peripheral.disconnect();
    return;
  } else if (!byteCharacteristic.canSubscribe()) {
    Serial.println("Peripheral does not have a writable LED characteristic!");
    peripheral.disconnect();
    return;
  } else if (!byteCharacteristic.subscribe()) {
    Serial.println("subscription failed!");
    peripheral.disconnect();
    return;
  } else {
    Serial.println("Subscribed");
  }
  while (peripheral.connected()) {
    // while the peripheral is connected

    // check if the value of the simple key characteristic has been updated
    if (byteCharacteristic.valueUpdated()) {
      // yes, get the value, characteristic is 1 byte so use byte value
      byte value = 0;
      
      byteCharacteristic.readValue(value);

      Serial.print("received: ");
      Serial.println(value, HEX);
 
    }
  }
  Serial.println("Disconnected");
  
}

Peripheral

#include <ArduinoBLE.h>
BLEService testService("19B10000-E8F2-537E-4F6C-D104768A1214");
BLEByteCharacteristic byteCharacteristic("19B10001-E8F2-537E-4F6C-D104768A1214", BLERead | BLEIndicate | BLEWrite);
volatile bool disconnect = false;
void byteRead(BLEDevice central, BLECharacteristic characteristic){
  Serial.println("Characteristic subscribed, sending data");
  byte c = 0x01; 
  int written = byteCharacteristic.writeValue(c);
  disconnect=true;
}
void setup() {
    Serial.begin(9600);
  while (!Serial);
  // put your setup code here, to run once:
  if (!BLE.begin()) {
    Serial.println("starting Bluetooth® Low Energy module failed!");

    while (1);
  }

  // set advertised local name and service UUID:
  if(!BLE.setLocalName("TEST-LOCAL-NAME")){
    Serial.println("error setting the local name");
  }

  byteCharacteristic.setEventHandler(BLESubscribed, byteRead);
  BLE.setAdvertisedService(testService);

   // add the characteristic to the service
  testService.addCharacteristic(byteCharacteristic);

   // add service
  BLE.addService(testService);

  // start advertising
  BLE.advertise();

  Serial.println("BLE Peripheral");

}

void loop() {
  // put your main code here, to run repeatedly:
  if(disconnect){
    BLE.disconnect();
    disconnect = false;
    Serial.println("disconnected");
  }
 BLE.poll();
 
}

Logs

Here the logs of the current behaviour.
Central

11:18:48.793 -> Found 34:94:54:27:05:66 'TEST-LOCAL-NAME' 19b10000-e8f2-537e-4f6c-d104768a1214
11:18:48.829 -> Connecting ...
11:18:48.897 -> Connected
11:18:48.897 -> Discovering attributes ...
11:18:49.291 -> Attributes discovered
11:18:49.330 -> Subscribed
11:18:49.330 -> received: 1
11:18:49.330 -> Disconnected
//End of the first run
11:18:59.416 -> Found 34:94:54:27:05:66 'TEST-LOCAL-NAME' 19b10000-e8f2-537e-4f6c-d104768a1214
11:18:59.448 -> Connecting ...
11:18:59.527 -> Connected
11:18:59.527 -> Discovering attributes ...
11:18:59.948 -> Attributes discovered
11:18:59.948 -> Subscribed
//Has never received new data since the peripheral never sends it

Peripheral

11:18:27.926 -> BLE Peripheral
11:18:49.291 -> Characteristic subscribed, sending data
11:18:49.330 -> disconnected
// Note that the subscribed event at 11:18:59.948 has never been notified to the sketch

@per1234 per1234 added type: imperfection Perceived defect in any part of project topic: code Related to content of the project itself labels Dec 6, 2024
Copy link

github-actions bot commented Dec 6, 2024

Memory usage change @ d909b6c

Board flash % RAM for global variables %
arduino:mbed_nano:nano33ble 💚 -64 - 0 -0.01 - 0.0 0 - 0 0.0 - 0.0
arduino:mbed_nano:nanorp2040connect 💚 -8 - -8 -0.0 - -0.0 0 - 0 0.0 - 0.0
arduino:megaavr:uno2018:mode=on 🔺 +256 - +256 +0.53 - +0.53 0 - 0 0.0 - 0.0
arduino:renesas_uno:unor4wifi 💚 -32 - -32 -0.01 - -0.01 0 - 0 0.0 - 0.0
arduino:samd:mkrwifi1010 💚 -8 - -8 -0.0 - -0.0 0 - 0 0.0 - 0.0
arduino:samd:nano_33_iot 💚 -8 - -8 -0.0 - -0.0 0 - 0 0.0 - 0.0
Click for full report table
Board examples/Central/LedControl
flash
% examples/Central/LedControl
RAM for global variables
% examples/Central/PeripheralExplorer
flash
% examples/Central/PeripheralExplorer
RAM for global variables
% examples/Central/Scan
flash
% examples/Central/Scan
RAM for global variables
% examples/Central/ScanCallback
flash
% examples/Central/ScanCallback
RAM for global variables
% examples/Central/SensorTagButton
flash
% examples/Central/SensorTagButton
RAM for global variables
% examples/Peripheral/Advertising/EnhancedAdvertising
flash
% examples/Peripheral/Advertising/EnhancedAdvertising
RAM for global variables
% examples/Peripheral/Advertising/RawDataAdvertising
flash
% examples/Peripheral/Advertising/RawDataAdvertising
RAM for global variables
% examples/Peripheral/BatteryMonitor
flash
% examples/Peripheral/BatteryMonitor
RAM for global variables
% examples/Peripheral/ButtonLED
flash
% examples/Peripheral/ButtonLED
RAM for global variables
% examples/Peripheral/CallbackLED
flash
% examples/Peripheral/CallbackLED
RAM for global variables
% examples/Peripheral/EncryptedBatteryMonitor
flash
% examples/Peripheral/EncryptedBatteryMonitor
RAM for global variables
% examples/Peripheral/LED
flash
% examples/Peripheral/LED
RAM for global variables
%
arduino:mbed_nano:nano33ble -64 -0.01 0 0.0 0 0.0 0 0.0 0 0.0 0 0.0 0 0.0 0 0.0 0 0.0 0 0.0 0 0.0 0 0.0 0 0.0 0 0.0 0 0.0 0 0.0 0 0.0 0 0.0 0 0.0 0 0.0 0 0.0 0 0.0 0 0.0 0 0.0
arduino:mbed_nano:nanorp2040connect -8 -0.0 0 0.0 -8 -0.0 0 0.0 -8 -0.0 0 0.0 -8 -0.0 0 0.0 -8 -0.0 0 0.0 -8 -0.0 0 0.0 -8 -0.0 0 0.0 -8 -0.0 0 0.0 -8 -0.0 0 0.0 -8 -0.0 0 0.0 -8 -0.0 0 0.0 -8 -0.0 0 0.0
arduino:megaavr:uno2018:mode=on 256 0.53 0 0.0 256 0.53 0 0.0 256 0.53 0 0.0 256 0.53 0 0.0 256 0.53 0 0.0 256 0.53 0 0.0 256 0.53 0 0.0 256 0.53 0 0.0 256 0.53 0 0.0 256 0.53 0 0.0 256 0.53 0 0.0 256 0.53 0 0.0
arduino:renesas_uno:unor4wifi -32 -0.01 0 0.0 -32 -0.01 0 0.0 -32 -0.01 0 0.0 -32 -0.01 0 0.0 -32 -0.01 0 0.0 -32 -0.01 0 0.0 -32 -0.01 0 0.0 -32 -0.01 0 0.0 -32 -0.01 0 0.0 -32 -0.01 0 0.0 -32 -0.01 0 0.0 -32 -0.01 0 0.0
arduino:samd:mkrwifi1010 -8 -0.0 0 0.0 -8 -0.0 0 0.0 -8 -0.0 0 0.0 -8 -0.0 0 0.0 -8 -0.0 0 0.0 -8 -0.0 0 0.0 -8 -0.0 0 0.0 -8 -0.0 0 0.0 -8 -0.0 0 0.0 -8 -0.0 0 0.0 -8 -0.0 0 0.0 -8 -0.0 0 0.0
arduino:samd:nano_33_iot -8 -0.0 0 0.0 -8 -0.0 0 0.0 -8 -0.0 0 0.0 -8 -0.0 0 0.0 -8 -0.0 0 0.0 -8 -0.0 0 0.0 -8 -0.0 0 0.0 -8 -0.0 0 0.0 -8 -0.0 0 0.0 -8 -0.0 0 0.0 -8 -0.0 0 0.0 -8 -0.0 0 0.0
Click for full report CSV
Board,examples/Central/LedControl<br>flash,%,examples/Central/LedControl<br>RAM for global variables,%,examples/Central/PeripheralExplorer<br>flash,%,examples/Central/PeripheralExplorer<br>RAM for global variables,%,examples/Central/Scan<br>flash,%,examples/Central/Scan<br>RAM for global variables,%,examples/Central/ScanCallback<br>flash,%,examples/Central/ScanCallback<br>RAM for global variables,%,examples/Central/SensorTagButton<br>flash,%,examples/Central/SensorTagButton<br>RAM for global variables,%,examples/Peripheral/Advertising/EnhancedAdvertising<br>flash,%,examples/Peripheral/Advertising/EnhancedAdvertising<br>RAM for global variables,%,examples/Peripheral/Advertising/RawDataAdvertising<br>flash,%,examples/Peripheral/Advertising/RawDataAdvertising<br>RAM for global variables,%,examples/Peripheral/BatteryMonitor<br>flash,%,examples/Peripheral/BatteryMonitor<br>RAM for global variables,%,examples/Peripheral/ButtonLED<br>flash,%,examples/Peripheral/ButtonLED<br>RAM for global variables,%,examples/Peripheral/CallbackLED<br>flash,%,examples/Peripheral/CallbackLED<br>RAM for global variables,%,examples/Peripheral/EncryptedBatteryMonitor<br>flash,%,examples/Peripheral/EncryptedBatteryMonitor<br>RAM for global variables,%,examples/Peripheral/LED<br>flash,%,examples/Peripheral/LED<br>RAM for global variables,%
arduino:mbed_nano:nano33ble,-64,-0.01,0,0.0,0,0.0,0,0.0,0,0.0,0,0.0,0,0.0,0,0.0,0,0.0,0,0.0,0,0.0,0,0.0,0,0.0,0,0.0,0,0.0,0,0.0,0,0.0,0,0.0,0,0.0,0,0.0,0,0.0,0,0.0,0,0.0,0,0.0
arduino:mbed_nano:nanorp2040connect,-8,-0.0,0,0.0,-8,-0.0,0,0.0,-8,-0.0,0,0.0,-8,-0.0,0,0.0,-8,-0.0,0,0.0,-8,-0.0,0,0.0,-8,-0.0,0,0.0,-8,-0.0,0,0.0,-8,-0.0,0,0.0,-8,-0.0,0,0.0,-8,-0.0,0,0.0,-8,-0.0,0,0.0
arduino:megaavr:uno2018:mode=on,256,0.53,0,0.0,256,0.53,0,0.0,256,0.53,0,0.0,256,0.53,0,0.0,256,0.53,0,0.0,256,0.53,0,0.0,256,0.53,0,0.0,256,0.53,0,0.0,256,0.53,0,0.0,256,0.53,0,0.0,256,0.53,0,0.0,256,0.53,0,0.0
arduino:renesas_uno:unor4wifi,-32,-0.01,0,0.0,-32,-0.01,0,0.0,-32,-0.01,0,0.0,-32,-0.01,0,0.0,-32,-0.01,0,0.0,-32,-0.01,0,0.0,-32,-0.01,0,0.0,-32,-0.01,0,0.0,-32,-0.01,0,0.0,-32,-0.01,0,0.0,-32,-0.01,0,0.0,-32,-0.01,0,0.0
arduino:samd:mkrwifi1010,-8,-0.0,0,0.0,-8,-0.0,0,0.0,-8,-0.0,0,0.0,-8,-0.0,0,0.0,-8,-0.0,0,0.0,-8,-0.0,0,0.0,-8,-0.0,0,0.0,-8,-0.0,0,0.0,-8,-0.0,0,0.0,-8,-0.0,0,0.0,-8,-0.0,0,0.0,-8,-0.0,0,0.0
arduino:samd:nano_33_iot,-8,-0.0,0,0.0,-8,-0.0,0,0.0,-8,-0.0,0,0.0,-8,-0.0,0,0.0,-8,-0.0,0,0.0,-8,-0.0,0,0.0,-8,-0.0,0,0.0,-8,-0.0,0,0.0,-8,-0.0,0,0.0,-8,-0.0,0,0.0,-8,-0.0,0,0.0,-8,-0.0,0,0.0

@per1234
Copy link
Contributor

per1234 commented Dec 6, 2024

Hi @fabik111. Thanks for your pull request. Please disregard the failed spell check.

This is a spurious failure caused by bit rot in the antiquated infrastructure used for that check, nothing to do with the changes you propose here. The failed check won't block the reviewers from merging your PR and we'll be sure to fix the broken spell check system separately ASAP.

Copy link

github-actions bot commented Dec 9, 2024

Memory usage change @ 2355c4d

Board flash % RAM for global variables %
arduino:mbed_nano:nano33ble 💚 -64 - 0 -0.01 - 0.0 0 - 0 0.0 - 0.0
arduino:mbed_nano:nanorp2040connect 💚 -8 - -8 -0.0 - -0.0 0 - 0 0.0 - 0.0
arduino:megaavr:uno2018:mode=on 🔺 +256 - +256 +0.53 - +0.53 0 - 0 0.0 - 0.0
arduino:renesas_uno:unor4wifi 💚 -32 - -32 -0.01 - -0.01 0 - 0 0.0 - 0.0
arduino:samd:mkrwifi1010 💚 -8 - -8 -0.0 - -0.0 0 - 0 0.0 - 0.0
arduino:samd:nano_33_iot 💚 -8 - -8 -0.0 - -0.0 0 - 0 0.0 - 0.0
Click for full report table
Board examples/Central/LedControl
flash
% examples/Central/LedControl
RAM for global variables
% examples/Central/PeripheralExplorer
flash
% examples/Central/PeripheralExplorer
RAM for global variables
% examples/Central/Scan
flash
% examples/Central/Scan
RAM for global variables
% examples/Central/ScanCallback
flash
% examples/Central/ScanCallback
RAM for global variables
% examples/Central/SensorTagButton
flash
% examples/Central/SensorTagButton
RAM for global variables
% examples/Peripheral/Advertising/EnhancedAdvertising
flash
% examples/Peripheral/Advertising/EnhancedAdvertising
RAM for global variables
% examples/Peripheral/Advertising/RawDataAdvertising
flash
% examples/Peripheral/Advertising/RawDataAdvertising
RAM for global variables
% examples/Peripheral/BatteryMonitor
flash
% examples/Peripheral/BatteryMonitor
RAM for global variables
% examples/Peripheral/ButtonLED
flash
% examples/Peripheral/ButtonLED
RAM for global variables
% examples/Peripheral/CallbackLED
flash
% examples/Peripheral/CallbackLED
RAM for global variables
% examples/Peripheral/EncryptedBatteryMonitor
flash
% examples/Peripheral/EncryptedBatteryMonitor
RAM for global variables
% examples/Peripheral/LED
flash
% examples/Peripheral/LED
RAM for global variables
%
arduino:mbed_nano:nano33ble -64 -0.01 0 0.0 0 0.0 0 0.0 0 0.0 0 0.0 0 0.0 0 0.0 0 0.0 0 0.0 0 0.0 0 0.0 0 0.0 0 0.0 0 0.0 0 0.0 0 0.0 0 0.0 0 0.0 0 0.0 0 0.0 0 0.0 0 0.0 0 0.0
arduino:mbed_nano:nanorp2040connect -8 -0.0 0 0.0 -8 -0.0 0 0.0 -8 -0.0 0 0.0 -8 -0.0 0 0.0 -8 -0.0 0 0.0 -8 -0.0 0 0.0 -8 -0.0 0 0.0 -8 -0.0 0 0.0 -8 -0.0 0 0.0 -8 -0.0 0 0.0 -8 -0.0 0 0.0 -8 -0.0 0 0.0
arduino:megaavr:uno2018:mode=on 256 0.53 0 0.0 256 0.53 0 0.0 256 0.53 0 0.0 256 0.53 0 0.0 256 0.53 0 0.0 256 0.53 0 0.0 256 0.53 0 0.0 256 0.53 0 0.0 256 0.53 0 0.0 256 0.53 0 0.0 256 0.53 0 0.0 256 0.53 0 0.0
arduino:renesas_uno:unor4wifi -32 -0.01 0 0.0 -32 -0.01 0 0.0 -32 -0.01 0 0.0 -32 -0.01 0 0.0 -32 -0.01 0 0.0 -32 -0.01 0 0.0 -32 -0.01 0 0.0 -32 -0.01 0 0.0 -32 -0.01 0 0.0 -32 -0.01 0 0.0 -32 -0.01 0 0.0 -32 -0.01 0 0.0
arduino:samd:mkrwifi1010 -8 -0.0 0 0.0 -8 -0.0 0 0.0 -8 -0.0 0 0.0 -8 -0.0 0 0.0 -8 -0.0 0 0.0 -8 -0.0 0 0.0 -8 -0.0 0 0.0 -8 -0.0 0 0.0 -8 -0.0 0 0.0 -8 -0.0 0 0.0 -8 -0.0 0 0.0 -8 -0.0 0 0.0
arduino:samd:nano_33_iot -8 -0.0 0 0.0 -8 -0.0 0 0.0 -8 -0.0 0 0.0 -8 -0.0 0 0.0 -8 -0.0 0 0.0 -8 -0.0 0 0.0 -8 -0.0 0 0.0 -8 -0.0 0 0.0 -8 -0.0 0 0.0 -8 -0.0 0 0.0 -8 -0.0 0 0.0 -8 -0.0 0 0.0
Click for full report CSV
Board,examples/Central/LedControl<br>flash,%,examples/Central/LedControl<br>RAM for global variables,%,examples/Central/PeripheralExplorer<br>flash,%,examples/Central/PeripheralExplorer<br>RAM for global variables,%,examples/Central/Scan<br>flash,%,examples/Central/Scan<br>RAM for global variables,%,examples/Central/ScanCallback<br>flash,%,examples/Central/ScanCallback<br>RAM for global variables,%,examples/Central/SensorTagButton<br>flash,%,examples/Central/SensorTagButton<br>RAM for global variables,%,examples/Peripheral/Advertising/EnhancedAdvertising<br>flash,%,examples/Peripheral/Advertising/EnhancedAdvertising<br>RAM for global variables,%,examples/Peripheral/Advertising/RawDataAdvertising<br>flash,%,examples/Peripheral/Advertising/RawDataAdvertising<br>RAM for global variables,%,examples/Peripheral/BatteryMonitor<br>flash,%,examples/Peripheral/BatteryMonitor<br>RAM for global variables,%,examples/Peripheral/ButtonLED<br>flash,%,examples/Peripheral/ButtonLED<br>RAM for global variables,%,examples/Peripheral/CallbackLED<br>flash,%,examples/Peripheral/CallbackLED<br>RAM for global variables,%,examples/Peripheral/EncryptedBatteryMonitor<br>flash,%,examples/Peripheral/EncryptedBatteryMonitor<br>RAM for global variables,%,examples/Peripheral/LED<br>flash,%,examples/Peripheral/LED<br>RAM for global variables,%
arduino:mbed_nano:nano33ble,-64,-0.01,0,0.0,0,0.0,0,0.0,0,0.0,0,0.0,0,0.0,0,0.0,0,0.0,0,0.0,0,0.0,0,0.0,0,0.0,0,0.0,0,0.0,0,0.0,0,0.0,0,0.0,0,0.0,0,0.0,0,0.0,0,0.0,0,0.0,0,0.0
arduino:mbed_nano:nanorp2040connect,-8,-0.0,0,0.0,-8,-0.0,0,0.0,-8,-0.0,0,0.0,-8,-0.0,0,0.0,-8,-0.0,0,0.0,-8,-0.0,0,0.0,-8,-0.0,0,0.0,-8,-0.0,0,0.0,-8,-0.0,0,0.0,-8,-0.0,0,0.0,-8,-0.0,0,0.0,-8,-0.0,0,0.0
arduino:megaavr:uno2018:mode=on,256,0.53,0,0.0,256,0.53,0,0.0,256,0.53,0,0.0,256,0.53,0,0.0,256,0.53,0,0.0,256,0.53,0,0.0,256,0.53,0,0.0,256,0.53,0,0.0,256,0.53,0,0.0,256,0.53,0,0.0,256,0.53,0,0.0,256,0.53,0,0.0
arduino:renesas_uno:unor4wifi,-32,-0.01,0,0.0,-32,-0.01,0,0.0,-32,-0.01,0,0.0,-32,-0.01,0,0.0,-32,-0.01,0,0.0,-32,-0.01,0,0.0,-32,-0.01,0,0.0,-32,-0.01,0,0.0,-32,-0.01,0,0.0,-32,-0.01,0,0.0,-32,-0.01,0,0.0,-32,-0.01,0,0.0
arduino:samd:mkrwifi1010,-8,-0.0,0,0.0,-8,-0.0,0,0.0,-8,-0.0,0,0.0,-8,-0.0,0,0.0,-8,-0.0,0,0.0,-8,-0.0,0,0.0,-8,-0.0,0,0.0,-8,-0.0,0,0.0,-8,-0.0,0,0.0,-8,-0.0,0,0.0,-8,-0.0,0,0.0,-8,-0.0,0,0.0
arduino:samd:nano_33_iot,-8,-0.0,0,0.0,-8,-0.0,0,0.0,-8,-0.0,0,0.0,-8,-0.0,0,0.0,-8,-0.0,0,0.0,-8,-0.0,0,0.0,-8,-0.0,0,0.0,-8,-0.0,0,0.0,-8,-0.0,0,0.0,-8,-0.0,0,0.0,-8,-0.0,0,0.0,-8,-0.0,0,0.0

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
topic: code Related to content of the project itself type: imperfection Perceived defect in any part of project
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants