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

Arduino Port: Subscribe to Notifications not Working. Function missing. #615

Open
ullibak opened this issue Jun 21, 2024 · 1 comment
Open

Comments

@ullibak
Copy link

ullibak commented Jun 21, 2024

My setup: Raspberry Pi Pico on Arduino IDE, Board definition github.com/earlephilhower/arduino-pico

This board definition relies on the Arduino port of BTstack. The wrapper and the examples are derived from the files published in port/arduino.

The example port/arduino/examples/LECentral/LECentral.ino uses the function
device->subscribeForNotifications() in line 252 to subscribe to notifications. This calls the lower level function BTstackManager::subscribeForNotifications() in line 665 of port/arduino/BTstack.cpp

The subscription is acknowledged, but the callback routine for notifications is not called when the server sends a notification.

Comparing to the example pico_w/bt/standalone/client.c, I find that when subscribing to notifications, an additional function of the BTstack library has to be called: gatt_client_listen_for_characteristic_value_updates() (line 119 of this example). This function, however, is not implemented in port/arduino/BTstack.cpp.

If I add the function gatt_client_listen_for_characteristic_value_updates() to BTstacklib.cpp in a quick and dirty way, the notifications work as expected.

static gatt_client_notification_t notification_listener;

int BTstackManager::subscribeForNotifications(BLEDevice * device, BLECharacteristic * characteristic) {
    gattAction = gattActionSubscribe;
    // ADDED
    gatt_client_listen_for_characteristic_value_updates(&notification_listener, gatt_client_callback,  device->getHandle(), (gatt_client_characteristic_t*) characteristic->getCharacteristic());
    // END ADDED
    return gatt_client_write_client_characteristic_configuration(gatt_client_callback, device->getHandle(), (gatt_client_characteristic_t*) characteristic->getCharacteristic(),
            GATT_CLIENT_CHARACTERISTICS_CONFIGURATION_NOTIFICATION);
}

But this is probably not the correct way since there ist some bookkeeping around notification_listener involved in the example client.c mentioned above.

I guess that the solution might be to add the function gatt_client_listen_for_characteristic_value_updates() to BTstacklib.cpp either by adding it to BTstackManager::subscribeForNotifications() or by giving it a separate function definition. I tried both methods and they work. But there ist still the issue of keeping track of notification_listener and call

gatt_client_stop_listening_for_characteristic_value_updates(&notification_listener);

when disconnecting from the device.

I posted this issue in earlephilhower/arduino-pico#2231 but later found that the function wrapper is based on the Arduino port of the BTstack library. Therefore, I am posting this issue here, hoping that the experts here can find a proper and reliable solution to this issue.

Thanks!

@mringwal
Copy link
Member

Hi there.

I don't have a working setup to test this Arduino wrapper on my desktop (without using hardware) and never tried/played with Arduino on ESP32 or Pico W.

On both platforms, BTstack can be used directly.

Anywya, the missing call to gatt_client_listen_for_characteristic_value_updates has been reported before, but others haven't been able to test changes.

As your quick fix works, please try to add this call to BTstackManager::setup(void) after the call to gatt_client_init():

gatt_client_listen_for_characteristic_value_updates(&notification_listener, gatt_client_callback, GATT_CLIENT_ANY_CONNECTION, NULL);

This uses some kind of 'catch all' notification listener, which doesn't need to be removed.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants