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

BLERemoteCharacteristic::readValue() does not return the correct value #20

Closed
Jeroen88 opened this issue Apr 28, 2020 · 21 comments
Closed

Comments

@Jeroen88
Copy link

I would love to get this library running, but I think I found another issue...

I already thought it was my problem so I asked question #19 today, but it is an error of the library.

MVCE:

#include <NimBLEDevice.h>

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  Serial.println("/n/nStarted");

  BLEDevice::init("ESP32");

  readBLEClients();
}


void readBLEClients() {
// LYWSD03MMC
  static BLEClient * pClient = BLEDevice::createClient();

  Serial.println("Connecting...");
  bool success = pClient->connect(BLEAddress("a4:c1:38:5d:ef:16"));
  if(!success) {
    BLEDevice::deleteClient(pClient);

    Serial.println("Failed to connect");
    return;
  }
  Serial.println("Connected");

  BLERemoteService * pRemoteService = pClient->getService(BLEUUID("ebe0ccb0-7a0a-4b0c-8a1a-6ff2997da3a6"));
  if(pRemoteService == nullptr) {
    Serial.print("Failed to find our service UUID: ");
  } else {
    Serial.println(" - Found our service");

    // Obtain a reference to the characteristic in the service of the remote BLE server.
    BLERemoteCharacteristic * pRemoteCharacteristic = pRemoteService->getCharacteristic(BLEUUID("ebe0ccc1-7a0a-4b0c-8a1a-6ff2997da3a6"));
    if(pRemoteCharacteristic == nullptr) {
      Serial.print("Failed to find our characteristic UUID: ");
    } else {
      Serial.println(" - Found our characteristic");
      if(pRemoteCharacteristic->canRead()) {
        Serial.println("Can read");
//        Serial.printf("string value is '%s'\n", pRemoteCharacteristic->readValue().c_str());
//        Serial.printf("uint8_t value is %u\n", pRemoteCharacteristic->readUInt8());
//        Serial.printf("uint16_t value is %u\n", pRemoteCharacteristic->readUInt16());
//        const uint8_t * pData = pRemoteCharacteristic->readRawData();
        const uint8_t * pData = reinterpret_cast<const uint8_t*>(pRemoteCharacteristic->readValue().c_str());

        float temperature = (pData[0] | (pData[1] << 8)) * 0.01; //little endian 
        uint8_t humidity = pData[2];
        Serial.printf("LYWSD03MMC temperature = %.2f : humidity = %u\n", temperature, humidity);    
      }
      if(pRemoteCharacteristic->canNotify()) {
        Serial.println("Can notify");
//        pRemoteCharacteristic->registerForNotify(notifyCallback);
      }
    }
  }
  pClient->disconnect();
  BLEDevice::deleteClient(pClient);
}

void loop() {
}

returns 0.00 for temperature and 0 for humidity.

Digging for hours in the library resulted in:

Here the data is still correct. If I add the following line at this exact position:

characteristic->second->m_value = std::string((char*) event->notify_rx.om->om_data, event->notify_rx.om->om_len);

And comment out this line (otherwise the value just sets gets overwritten), the MVCE actually works correctly.

HOWEVER it does not feel good. My gut feeling says that onReadCB should indeed read the value from struct ble_gatt_attr *attr, but that value is not correct. At least the data from event->notify_rx.om in NimBLEClient differs from attr->om in NimbleRemoteCharacteristic.

I am not familiair enough with BLE and the library to solve this, and I am stuck now, any suggestions would be very welcome!.

@h2zero
Copy link
Owner

h2zero commented Apr 28, 2020

Troubling indeed, would it be possible to see a log?

@Jeroen88
Copy link
Author

Jeroen88 commented Apr 28, 2020

This is the log with the changes, but this does not differ as such from the log without the changes, only the resulting value is correct :D

I NimBLEDevice: "BLE Host Task Started"
I NimBLEDevice: "NimBle host synced."
Connecting...
D NimBLEClient: ">> connect(a4:c1:38:5d:ef:16)"
D FreeRTOS: "Semaphore taking: name: OpenEvt (0x3ffc8b0c), owner: <N/A> for connect"
D FreeRTOS: "Semaphore taken:  name: OpenEvt (0x3ffc8b0c), owner: connect"
D FreeRTOS: ">> wait: Semaphore waiting: name: OpenEvt (0x3ffc8b0c), owner: connect for connect"
D NimBLEClient: "Got Client event BLE_GAP_EVENT_CONNECT "
D NimBLEClient: "Connection established"
D FreeRTOS: "Semaphore giving: name: OpenEvt (0x3ffc8b0c), owner: connect"
D FreeRTOS: "<< wait: Semaphore released: name: OpenEvt (0x3ffc8b0c), owner: <N/A>"
D NimBLEClient: "Refreshing Services for: (a4:c1:38:5d:ef:16)"
D NimBLEClient: ">> clearServices"
D NimBLEClient: "<< clearServices"
D NimBLEClient: ">> retrieveServices"
D FreeRTOS: "Semaphore taking: name: SearchCmplEvt (0x3ffc8b6c), owner: <N/A> for retrieveServices"
D FreeRTOS: "Semaphore taken:  name: SearchCmplEvt (0x3ffc8b6c), owner: retrieveServices"
D FreeRTOS: ">> wait: Semaphore waiting: name: SearchCmplEvt (0x3ffc8b6c), owner: retrieveServices for retrieveServices"
D NimBLEClient: "Got Client event BLE_GAP_EVENT_MTU"
I NimBLEClient: "mtu update event; conn_handle=0 mtu=23"
D FreeRTOS: "Semaphore giving: name: OpenEvt (0x3ffc8b0c), owner: <N/A>"
D NimBLEClient: "Service Discovered >> status: 0 handle: 0"
D NimBLERemoteService: ">> BLERemoteService()"
D NimBLERemoteService: "<< BLERemoteService()"
D NimBLEClient: "<< Service Discovered. status: 0"
D NimBLEClient: "Service Discovered >> status: 0 handle: 0"
D NimBLERemoteService: ">> BLERemoteService()"
D NimBLERemoteService: "<< BLERemoteService()"
D NimBLEClient: "<< Service Discovered. status: 0"
D NimBLEClient: "Service Discovered >> status: 0 handle: 0"
D NimBLERemoteService: ">> BLERemoteService()"
D NimBLERemoteService: "<< BLERemoteService()"
D NimBLEClient: "<< Service Discovered. status: 0"
D NimBLEClient: "Service Discovered >> status: 0 handle: 0"
D NimBLERemoteService: ">> BLERemoteService()"
D NimBLERemoteService: "<< BLERemoteService()"
D NimBLEClient: "<< Service Discovered. status: 0"
D NimBLEClient: "Service Discovered >> status: 0 handle: 0"
D NimBLERemoteService: ">> BLERemoteService()"
D NimBLERemoteService: "<< BLERemoteService()"
D NimBLEClient: "<< Service Discovered. status: 0"
D NimBLEClient: "Service Discovered >> status: 0 handle: 0"
D NimBLERemoteService: ">> BLERemoteService()"
D NimBLERemoteService: "<< BLERemoteService()"
D NimBLEClient: "<< Service Discovered. status: 0"
D NimBLEClient: "Service Discovered >> status: 0 handle: 0"
D NimBLERemoteService: ">> BLERemoteService()"
D NimBLERemoteService: "<< BLERemoteService()"
D NimBLEClient: "<< Service Discovered. status: 0"
D NimBLEClient: "Service Discovered >> status: 0 handle: 0"
D NimBLERemoteService: ">> BLERemoteService()"
D NimBLERemoteService: "<< BLERemoteService()"
D NimBLEClient: "<< Service Discovered. status: 0"
D NimBLEClient: "Service Discovered >> status: 14 handle: 0"
D FreeRTOS: "Semaphore giving: name: SearchCmplEvt (0x3ffc8b6c), owner: retrieveServices"
D NimBLEClient: "<< Service Discovered. status: 0"
D FreeRTOS: "<< wait: Semaphore released: name: SearchCmplEvt (0x3ffc8b6c), owner: <N/A>"
D NimBLERemoteService: ">> retrieveCharacteristics() for service: 00000100-0065-6c62-2e74-6f696d2e696d"
D FreeRTOS: "Semaphore taking: name: GetCharEvt (0x3ffc96d4), owner: <N/A> for retrieveCharacteristics"
D FreeRTOS: "Semaphore taken:  name: GetCharEvt (0x3ffc96d4), owner: retrieveCharacteristics"
D FreeRTOS: ">> wait: Semaphore waiting: name: GetCharEvt (0x3ffc96d4), owner: retrieveCharacteristics for retrieveCharacteristics"
D NimBLERemoteService: "Characteristic Discovered >> status: 0 handle: 0"
D NimBLERemoteService: "<< Characteristic Discovered. status: 0"
D NimBLERemoteService: "Characteristic Discovered >> status: 0 handle: 0"
D NimBLERemoteService: "<< Characteristic Discovered. status: 0"
D NimBLERemoteService: "Characteristic Discovered >> status: 14 handle: 0"
D FreeRTOS: "Semaphore giving: name: GetCharEvt (0x3ffc96d4), owner: retrieveCharacteristics"
D NimBLERemoteService: "<< Characteristic Discovered. status: 0"
D FreeRTOS: "<< wait: Semaphore released: name: GetCharEvt (0x3ffc96d4), owner: <N/A>"
D NimBLERemoteService: "Found 2 Characteristics"
D NimBLERemoteService: "Found UUID: 00000101-0065-6c62-2e74-6f696d2e696d Handle: 98 Def Handle: 97"
D NimBLERemoteService: "Next UUID: 00000102-0065-6c62-2e74-6f696d2e696d Handle: 102 Def Handle: 101"
D NimBLERemoteCharacteristic: ">> retrieveDescriptors() for characteristic: 00000101-0065-6c62-2e74-6f696d2e696d"
D FreeRTOS: "Semaphore taking: name: GetDescEvt (0x3ffc9904), owner: <N/A> for retrieveDescriptors"
D FreeRTOS: "Semaphore taken:  name: GetDescEvt (0x3ffc9904), owner: retrieveDescriptors"
D FreeRTOS: ">> wait: Semaphore waiting: name: GetDescEvt (0x3ffc9904), owner: retrieveDescriptors for retrieveCharacteristics"
D NimBLEClient: "Got Client event BLE_GAP_EVENT_L2CAP_UPDATE_REQ"
D NimBLEClient: "Peer requesting to update connection parameters"
D NimBLEClient: "MinInterval: 12, MaxInterval: 24, Latency: 0, Timeout: 90"
D NimBLEClientCallbacks: "onConnParamsUpdateRequest: default"
D NimBLEClient: "Accepted peer params"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 0 handle: 0"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 0 handle: 0"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 14 handle: 0"
D FreeRTOS: "Semaphore giving: name: GetDescEvt (0x3ffc9904), owner: retrieveDescriptors"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D FreeRTOS: "<< wait: Semaphore released: name: GetDescEvt (0x3ffc9904), owner: <N/A>"
D NimBLERemoteService: "Found UUID: 00000102-0065-6c62-2e74-6f696d2e696d Handle: 102 Def Handle: 101"
D NimBLERemoteService: "END CHARS"
D NimBLERemoteCharacteristic: ">> retrieveDescriptors() for characteristic: 00000102-0065-6c62-2e74-6f696d2e696d"
D FreeRTOS: "Semaphore taking: name: GetDescEvt (0x3ffc9bc4), owner: <N/A> for retrieveDescriptors"
D FreeRTOS: "Semaphore taken:  name: GetDescEvt (0x3ffc9bc4), owner: retrieveDescriptors"
D FreeRTOS: ">> wait: Semaphore waiting: name: GetDescEvt (0x3ffc9bc4), owner: retrieveDescriptors for retrieveCharacteristics"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 0 handle: 0"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 0 handle: 0"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 14 handle: 0"
D FreeRTOS: "Semaphore giving: name: GetDescEvt (0x3ffc9bc4), owner: retrieveDescriptors"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D FreeRTOS: "<< wait: Semaphore released: name: GetDescEvt (0x3ffc9bc4), owner: <N/A>"
D NimBLERemoteService: "<< retrieveCharacteristics()"
D NimBLERemoteService: ">> retrieveCharacteristics() for service: 00010203-0405-0607-0809-0a0b0c0d1912"
D FreeRTOS: "Semaphore taking: name: GetCharEvt (0x3ffc9298), owner: <N/A> for retrieveCharacteristics"
D FreeRTOS: "Semaphore taken:  name: GetCharEvt (0x3ffc9298), owner: retrieveCharacteristics"
D FreeRTOS: ">> wait: Semaphore waiting: name: GetCharEvt (0x3ffc9298), owner: retrieveCharacteristics for retrieveCharacteristics"
D NimBLERemoteService: "Characteristic Discovered >> status: 0 handle: 0"
D NimBLERemoteService: "<< Characteristic Discovered. status: 0"
D NimBLEClient: "Got Client event BLE_GAP_EVENT_CONN_UPDATE"
I NimBLEClient: "Connection parameters updated."
D NimBLERemoteService: "Characteristic Discovered >> status: 14 handle: 0"
D FreeRTOS: "Semaphore giving: name: GetCharEvt (0x3ffc9298), owner: retrieveCharacteristics"
D NimBLERemoteService: "<< Characteristic Discovered. status: 0"
D FreeRTOS: "<< wait: Semaphore released: name: GetCharEvt (0x3ffc9298), owner: <N/A>"
D NimBLERemoteService: "Found 1 Characteristics"
D NimBLERemoteService: "Found UUID: 00010203-0405-0607-0809-0a0b0c0d2b12 Handle: 31 Def Handle: 30"
D NimBLERemoteService: "END CHARS"
D NimBLERemoteCharacteristic: ">> retrieveDescriptors() for characteristic: 00010203-0405-0607-0809-0a0b0c0d2b12"
D FreeRTOS: "Semaphore taking: name: GetDescEvt (0x3ffca5bc), owner: <N/A> for retrieveDescriptors"
D FreeRTOS: "Semaphore taken:  name: GetDescEvt (0x3ffca5bc), owner: retrieveDescriptors"
D FreeRTOS: ">> wait: Semaphore waiting: name: GetDescEvt (0x3ffca5bc), owner: retrieveDescriptors for retrieveCharacteristics"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 0 handle: 0"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 14 handle: 0"
D FreeRTOS: "Semaphore giving: name: GetDescEvt (0x3ffca5bc), owner: retrieveDescriptors"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D FreeRTOS: "<< wait: Semaphore released: name: GetDescEvt (0x3ffca5bc), owner: <N/A>"
D NimBLERemoteService: "<< retrieveCharacteristics()"
D NimBLERemoteService: ">> retrieveCharacteristics() for service: 0x1800"
D FreeRTOS: "Semaphore taking: name: GetCharEvt (0x3ffc8d88), owner: <N/A> for retrieveCharacteristics"
D FreeRTOS: "Semaphore taken:  name: GetCharEvt (0x3ffc8d88), owner: retrieveCharacteristics"
D FreeRTOS: ">> wait: Semaphore waiting: name: GetCharEvt (0x3ffc8d88), owner: retrieveCharacteristics for retrieveCharacteristics"
D NimBLERemoteService: "Characteristic Discovered >> status: 0 handle: 0"
D NimBLERemoteService: "<< Characteristic Discovered. status: 0"
D NimBLERemoteService: "Characteristic Discovered >> status: 0 handle: 0"
D NimBLERemoteService: "<< Characteristic Discovered. status: 0"
D NimBLERemoteService: "Characteristic Discovered >> status: 0 handle: 0"
D NimBLERemoteService: "<< Characteristic Discovered. status: 0"
D NimBLERemoteService: "Characteristic Discovered >> status: 14 handle: 0"
D FreeRTOS: "Semaphore giving: name: GetCharEvt (0x3ffc8d88), owner: retrieveCharacteristics"
D NimBLERemoteService: "<< Characteristic Discovered. status: 0"
D FreeRTOS: "<< wait: Semaphore released: name: GetCharEvt (0x3ffc8d88), owner: <N/A>"
D NimBLERemoteService: "Found 3 Characteristics"
D NimBLERemoteService: "Found UUID: 0x2a00 Handle: 3 Def Handle: 2"
D NimBLERemoteService: "Next UUID: 0x2a01 Handle: 5 Def Handle: 4"
D NimBLERemoteService: "Found UUID: 0x2a01 Handle: 5 Def Handle: 4"
D NimBLERemoteService: "Next UUID: 0x2a04 Handle: 7 Def Handle: 6"
D NimBLERemoteService: "Found UUID: 0x2a04 Handle: 7 Def Handle: 6"
D NimBLERemoteService: "END CHARS"
D NimBLERemoteService: "<< retrieveCharacteristics()"
D NimBLERemoteService: ">> retrieveCharacteristics() for service: 0x1801"
D FreeRTOS: "Semaphore taking: name: GetCharEvt (0x3ffc8ecc), owner: <N/A> for retrieveCharacteristics"
D FreeRTOS: "Semaphore taken:  name: GetCharEvt (0x3ffc8ecc), owner: retrieveCharacteristics"
D FreeRTOS: ">> wait: Semaphore waiting: name: GetCharEvt (0x3ffc8ecc), owner: retrieveCharacteristics for retrieveCharacteristics"
D NimBLERemoteService: "Characteristic Discovered >> status: 0 handle: 0"
D NimBLERemoteService: "<< Characteristic Discovered. status: 0"
D NimBLERemoteService: "Characteristic Discovered >> status: 14 handle: 0"
D FreeRTOS: "Semaphore giving: name: GetCharEvt (0x3ffc8ecc), owner: retrieveCharacteristics"
D NimBLERemoteService: "<< Characteristic Discovered. status: 0"
D FreeRTOS: "<< wait: Semaphore released: name: GetCharEvt (0x3ffc8ecc), owner: <N/A>"
D NimBLERemoteService: "Found 1 Characteristics"
D NimBLERemoteService: "Found UUID: 0x2a05 Handle: 10 Def Handle: 9"
D NimBLERemoteService: "END CHARS"
D NimBLERemoteCharacteristic: ">> retrieveDescriptors() for characteristic: 0x2a05"
D FreeRTOS: "Semaphore taking: name: GetDescEvt (0x3ffcb278), owner: <N/A> for retrieveDescriptors"
D FreeRTOS: "Semaphore taken:  name: GetDescEvt (0x3ffcb278), owner: retrieveDescriptors"
D FreeRTOS: ">> wait: Semaphore waiting: name: GetDescEvt (0x3ffcb278), owner: retrieveDescriptors for retrieveCharacteristics"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 0 handle: 0"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 14 handle: 0"
D FreeRTOS: "Semaphore giving: name: GetDescEvt (0x3ffcb278), owner: retrieveDescriptors"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D FreeRTOS: "<< wait: Semaphore released: name: GetDescEvt (0x3ffcb278), owner: <N/A>"
D NimBLERemoteService: "<< retrieveCharacteristics()"
D NimBLERemoteService: ">> retrieveCharacteristics() for service: 0x180a"
D FreeRTOS: "Semaphore taking: name: GetCharEvt (0x3ffc9010), owner: <N/A> for retrieveCharacteristics"
D FreeRTOS: "Semaphore taken:  name: GetCharEvt (0x3ffc9010), owner: retrieveCharacteristics"
D FreeRTOS: ">> wait: Semaphore waiting: name: GetCharEvt (0x3ffc9010), owner: retrieveCharacteristics for retrieveCharacteristics"
D NimBLERemoteService: "Characteristic Discovered >> status: 0 handle: 0"
D NimBLERemoteService: "<< Characteristic Discovered. status: 0"
D NimBLERemoteService: "Characteristic Discovered >> status: 0 handle: 0"
D NimBLERemoteService: "<< Characteristic Discovered. status: 0"
D NimBLERemoteService: "Characteristic Discovered >> status: 0 handle: 0"
D NimBLERemoteService: "<< Characteristic Discovered. status: 0"
D NimBLERemoteService: "Characteristic Discovered >> status: 0 handle: 0"
D NimBLERemoteService: "<< Characteristic Discovered. status: 0"
D NimBLERemoteService: "Characteristic Discovered >> status: 0 handle: 0"
D NimBLERemoteService: "<< Characteristic Discovered. status: 0"
D NimBLERemoteService: "Characteristic Discovered >> status: 0 handle: 0"
D NimBLERemoteService: "<< Characteristic Discovered. status: 0"
D NimBLERemoteService: "Characteristic Discovered >> status: 14 handle: 0"
D FreeRTOS: "Semaphore giving: name: GetCharEvt (0x3ffc9010), owner: retrieveCharacteristics"
D NimBLERemoteService: "<< Characteristic Discovered. status: 0"
D FreeRTOS: "<< wait: Semaphore released: name: GetCharEvt (0x3ffc9010), owner: <N/A>"
D NimBLERemoteService: "Found 6 Characteristics"
D NimBLERemoteService: "Found UUID: 0x2a24 Handle: 14 Def Handle: 13"
D NimBLERemoteService: "Next UUID: 0x2a25 Handle: 16 Def Handle: 15"
D NimBLERemoteService: "Found UUID: 0x2a25 Handle: 16 Def Handle: 15"
D NimBLERemoteService: "Next UUID: 0x2a26 Handle: 18 Def Handle: 17"
D NimBLERemoteService: "Found UUID: 0x2a26 Handle: 18 Def Handle: 17"
D NimBLERemoteService: "Next UUID: 0x2a27 Handle: 20 Def Handle: 19"
D NimBLERemoteService: "Found UUID: 0x2a27 Handle: 20 Def Handle: 19"
D NimBLERemoteService: "Next UUID: 0x2a28 Handle: 22 Def Handle: 21"
D NimBLERemoteService: "Found UUID: 0x2a28 Handle: 22 Def Handle: 21"
D NimBLERemoteService: "Next UUID: 0x2a29 Handle: 24 Def Handle: 23"
D NimBLERemoteService: "Found UUID: 0x2a29 Handle: 24 Def Handle: 23"
D NimBLERemoteService: "END CHARS"
D NimBLERemoteService: "<< retrieveCharacteristics()"
D NimBLERemoteService: ">> retrieveCharacteristics() for service: 0x180f"
D FreeRTOS: "Semaphore taking: name: GetCharEvt (0x3ffc9154), owner: <N/A> for retrieveCharacteristics"
D FreeRTOS: "Semaphore taken:  name: GetCharEvt (0x3ffc9154), owner: retrieveCharacteristics"
D FreeRTOS: ">> wait: Semaphore waiting: name: GetCharEvt (0x3ffc9154), owner: retrieveCharacteristics for retrieveCharacteristics"
D NimBLERemoteService: "Characteristic Discovered >> status: 0 handle: 0"
D NimBLERemoteService: "<< Characteristic Discovered. status: 0"
D NimBLERemoteService: "Characteristic Discovered >> status: 14 handle: 0"
D FreeRTOS: "Semaphore giving: name: GetCharEvt (0x3ffc9154), owner: retrieveCharacteristics"
D NimBLERemoteService: "<< Characteristic Discovered. status: 0"
D FreeRTOS: "<< wait: Semaphore released: name: GetCharEvt (0x3ffc9154), owner: <N/A>"
D NimBLERemoteService: "Found 1 Characteristics"
D NimBLERemoteService: "Found UUID: 0x2a19 Handle: 27 Def Handle: 26"
D NimBLERemoteService: "END CHARS"
D NimBLERemoteCharacteristic: ">> retrieveDescriptors() for characteristic: 0x2a19"
D FreeRTOS: "Semaphore taking: name: GetDescEvt (0x3ffcc70c), owner: <N/A> for retrieveDescriptors"
D FreeRTOS: "Semaphore taken:  name: GetDescEvt (0x3ffcc70c), owner: retrieveDescriptors"
D FreeRTOS: ">> wait: Semaphore waiting: name: GetDescEvt (0x3ffcc70c), owner: retrieveDescriptors for retrieveCharacteristics"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 0 handle: 0"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 14 handle: 0"
D FreeRTOS: "Semaphore giving: name: GetDescEvt (0x3ffcc70c), owner: retrieveDescriptors"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D FreeRTOS: "<< wait: Semaphore released: name: GetDescEvt (0x3ffcc70c), owner: <N/A>"
D NimBLERemoteService: "<< retrieveCharacteristics()"
D NimBLERemoteService: ">> retrieveCharacteristics() for service: 0xfe95"
D FreeRTOS: "Semaphore taking: name: GetCharEvt (0x3ffc9590), owner: <N/A> for retrieveCharacteristics"
D FreeRTOS: "Semaphore taken:  name: GetCharEvt (0x3ffc9590), owner: retrieveCharacteristics"
D FreeRTOS: ">> wait: Semaphore waiting: name: GetCharEvt (0x3ffc9590), owner: retrieveCharacteristics for retrieveCharacteristics"
D NimBLERemoteService: "Characteristic Discovered >> status: 0 handle: 0"
D NimBLERemoteService: "<< Characteristic Discovered. status: 0"
D NimBLERemoteService: "Characteristic Discovered >> status: 0 handle: 0"
D NimBLERemoteService: "<< Characteristic Discovered. status: 0"
D NimBLERemoteService: "Characteristic Discovered >> status: 0 handle: 0"
D NimBLERemoteService: "<< Characteristic Discovered. status: 0"
D NimBLERemoteService: "Characteristic Discovered >> status: 0 handle: 0"
D NimBLERemoteService: "<< Characteristic Discovered. status: 0"
D NimBLERemoteService: "Characteristic Discovered >> status: 0 handle: 0"
D NimBLERemoteService: "<< Characteristic Discovered. status: 0"
D NimBLERemoteService: "Characteristic Discovered >> status: 14 handle: 0"
D FreeRTOS: "Semaphore giving: name: GetCharEvt (0x3ffc9590), owner: retrieveCharacteristics"
D NimBLERemoteService: "<< Characteristic Discovered. status: 0"
D FreeRTOS: "<< wait: Semaphore released: name: GetCharEvt (0x3ffc9590), owner: <N/A>"
D NimBLERemoteService: "Found 5 Characteristics"
D NimBLERemoteService: "Found UUID: 0x0004 Handle: 78 Def Handle: 77"
D NimBLERemoteService: "Next UUID: 0x0010 Handle: 81 Def Handle: 80"
D NimBLERemoteCharacteristic: ">> retrieveDescriptors() for characteristic: 0x0004"
D FreeRTOS: "Semaphore taking: name: GetDescEvt (0x3ffccb80), owner: <N/A> for retrieveDescriptors"
D FreeRTOS: "Semaphore taken:  name: GetDescEvt (0x3ffccb80), owner: retrieveDescriptors"
D FreeRTOS: ">> wait: Semaphore waiting: name: GetDescEvt (0x3ffccb80), owner: retrieveDescriptors for retrieveCharacteristics"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 0 handle: 0"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 14 handle: 0"
D FreeRTOS: "Semaphore giving: name: GetDescEvt (0x3ffccb80), owner: retrieveDescriptors"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D FreeRTOS: "<< wait: Semaphore released: name: GetDescEvt (0x3ffccb80), owner: <N/A>"
D NimBLERemoteService: "Found UUID: 0x0010 Handle: 81 Def Handle: 80"
D NimBLERemoteService: "Next UUID: 0x0017 Handle: 85 Def Handle: 84"
D NimBLERemoteCharacteristic: ">> retrieveDescriptors() for characteristic: 0x0010"
D FreeRTOS: "Semaphore taking: name: GetDescEvt (0x3ffcce30), owner: <N/A> for retrieveDescriptors"
D FreeRTOS: "Semaphore taken:  name: GetDescEvt (0x3ffcce30), owner: retrieveDescriptors"
D NimBLEClient: "Got Client event BLE_GAP_EVENT_NOTIFY_RX"
D FreeRTOS: ">> wait: Semaphore waiting: name: GetDescEvt (0x3ffcce30), owner: retrieveDescriptors for retrieveCharacteristics"
D NimBLEClient: "Notify Recieved for handle: 54"
D NimBLEClient: "checking service 00000100-0065-6c62-2e74-6f696d2e696d for handle: 54"
D NimBLEClient: "checking service 0xfe95 for handle: 54"
D NimBLEClient: "checking service ebe0ccb0-7a0a-4b0c-8a1a-6ff2997da3a6 for handle: 54"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 0 handle: 0"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 0 handle: 0"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 14 handle: 0"
D FreeRTOS: "Semaphore giving: name: GetDescEvt (0x3ffcce30), owner: retrieveDescriptors"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D FreeRTOS: "<< wait: Semaphore released: name: GetDescEvt (0x3ffcce30), owner: <N/A>"
D NimBLERemoteService: "Found UUID: 0x0017 Handle: 85 Def Handle: 84"
D NimBLERemoteService: "Next UUID: 0x0018 Handle: 89 Def Handle: 88"
D NimBLERemoteCharacteristic: ">> retrieveDescriptors() for characteristic: 0x0017"
D FreeRTOS: "Semaphore taking: name: GetDescEvt (0x3ffcd0e0), owner: <N/A> for retrieveDescriptors"
D FreeRTOS: "Semaphore taken:  name: GetDescEvt (0x3ffcd0e0), owner: retrieveDescriptors"
D FreeRTOS: ">> wait: Semaphore waiting: name: GetDescEvt (0x3ffcd0e0), owner: retrieveDescriptors for retrieveCharacteristics"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 0 handle: 0"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 0 handle: 0"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 14 handle: 0"
D FreeRTOS: "Semaphore giving: name: GetDescEvt (0x3ffcd0e0), owner: retrieveDescriptors"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D FreeRTOS: "<< wait: Semaphore released: name: GetDescEvt (0x3ffcd0e0), owner: <N/A>"
D NimBLERemoteService: "Found UUID: 0x0018 Handle: 89 Def Handle: 88"
D NimBLERemoteService: "Next UUID: 0x0019 Handle: 93 Def Handle: 92"
D NimBLERemoteCharacteristic: ">> retrieveDescriptors() for characteristic: 0x0018"
D FreeRTOS: "Semaphore taking: name: GetDescEvt (0x3ffcd390), owner: <N/A> for retrieveDescriptors"
D FreeRTOS: "Semaphore taken:  name: GetDescEvt (0x3ffcd390), owner: retrieveDescriptors"
D FreeRTOS: ">> wait: Semaphore waiting: name: GetDescEvt (0x3ffcd390), owner: retrieveDescriptors for retrieveCharacteristics"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 0 handle: 0"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 0 handle: 0"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 14 handle: 0"
D FreeRTOS: "Semaphore giving: name: GetDescEvt (0x3ffcd390), owner: retrieveDescriptors"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D FreeRTOS: "<< wait: Semaphore released: name: GetDescEvt (0x3ffcd390), owner: <N/A>"
D NimBLERemoteService: "Found UUID: 0x0019 Handle: 93 Def Handle: 92"
D NimBLERemoteService: "END CHARS"
D NimBLERemoteCharacteristic: ">> retrieveDescriptors() for characteristic: 0x0019"
D FreeRTOS: "Semaphore taking: name: GetDescEvt (0x3ffcd640), owner: <N/A> for retrieveDescriptors"
D FreeRTOS: "Semaphore taken:  name: GetDescEvt (0x3ffcd640), owner: retrieveDescriptors"
D FreeRTOS: ">> wait: Semaphore waiting: name: GetDescEvt (0x3ffcd640), owner: retrieveDescriptors for retrieveCharacteristics"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 0 handle: 0"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 0 handle: 0"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 14 handle: 0"
D FreeRTOS: "Semaphore giving: name: GetDescEvt (0x3ffcd640), owner: retrieveDescriptors"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D FreeRTOS: "<< wait: Semaphore released: name: GetDescEvt (0x3ffcd640), owner: <N/A>"
D NimBLERemoteService: "<< retrieveCharacteristics()"
D NimBLERemoteService: ">> retrieveCharacteristics() for service: ebe0ccb0-7a0a-4b0c-8a1a-6ff2997da3a6"
D FreeRTOS: "Semaphore taking: name: GetCharEvt (0x3ffc9414), owner: <N/A> for retrieveCharacteristics"
D FreeRTOS: "Semaphore taken:  name: GetCharEvt (0x3ffc9414), owner: retrieveCharacteristics"
D FreeRTOS: ">> wait: Semaphore waiting: name: GetCharEvt (0x3ffc9414), owner: retrieveCharacteristics for retrieveCharacteristics"
D NimBLERemoteService: "Characteristic Discovered >> status: 0 handle: 0"
D NimBLERemoteService: "<< Characteristic Discovered. status: 0"
D NimBLERemoteService: "Characteristic Discovered >> status: 0 handle: 0"
D NimBLERemoteService: "<< Characteristic Discovered. status: 0"
D NimBLERemoteService: "Characteristic Discovered >> status: 0 handle: 0"
D NimBLERemoteService: "<< Characteristic Discovered. status: 0"
D NimBLERemoteService: "Characteristic Discovered >> status: 0 handle: 0"
D NimBLERemoteService: "<< Characteristic Discovered. status: 0"
D NimBLERemoteService: "Characteristic Discovered >> status: 0 handle: 0"
D NimBLERemoteService: "<< Characteristic Discovered. status: 0"
D NimBLERemoteService: "Characteristic Discovered >> status: 0 handle: 0"
D NimBLERemoteService: "<< Characteristic Discovered. status: 0"
D NimBLERemoteService: "Characteristic Discovered >> status: 0 handle: 0"
D NimBLERemoteService: "<< Characteristic Discovered. status: 0"
D NimBLERemoteService: "Characteristic Discovered >> status: 0 handle: 0"
D NimBLERemoteService: "<< Characteristic Discovered. status: 0"
D NimBLERemoteService: "Characteristic Discovered >> status: 0 handle: 0"
D NimBLERemoteService: "<< Characteristic Discovered. status: 0"
D NimBLERemoteService: "Characteristic Discovered >> status: 0 handle: 0"
D NimBLERemoteService: "<< Characteristic Discovered. status: 0"
D NimBLERemoteService: "Characteristic Discovered >> status: 0 handle: 0"
D NimBLERemoteService: "<< Characteristic Discovered. status: 0"
D NimBLERemoteService: "Characteristic Discovered >> status: 0 handle: 0"
D NimBLERemoteService: "<< Characteristic Discovered. status: 0"
D NimBLERemoteService: "Characteristic Discovered >> status: 0 handle: 0"
D NimBLERemoteService: "<< Characteristic Discovered. status: 0"
D NimBLERemoteService: "Characteristic Discovered >> status: 14 handle: 0"
D FreeRTOS: "Semaphore giving: name: GetCharEvt (0x3ffc9414), owner: retrieveCharacteristics"
D NimBLERemoteService: "<< Characteristic Discovered. status: 0"
D FreeRTOS: "<< wait: Semaphore released: name: GetCharEvt (0x3ffc9414), owner: <N/A>"
D NimBLERemoteService: "Found 13 Characteristics"
D NimBLERemoteService: "Found UUID: ebe0ccb7-7a0a-4b0c-8a1a-6ff2997da3a6 Handle: 35 Def Handle: 34"
D NimBLERemoteService: "Next UUID: ebe0ccb9-7a0a-4b0c-8a1a-6ff2997da3a6 Handle: 38 Def Handle: 37"
D NimBLERemoteCharacteristic: ">> retrieveDescriptors() for characteristic: ebe0ccb7-7a0a-4b0c-8a1a-6ff2997da3a6"
D FreeRTOS: "Semaphore taking: name: GetDescEvt (0x3ffce8d4), owner: <N/A> for retrieveDescriptors"
D FreeRTOS: "Semaphore taken:  name: GetDescEvt (0x3ffce8d4), owner: retrieveDescriptors"
D FreeRTOS: ">> wait: Semaphore waiting: name: GetDescEvt (0x3ffce8d4), owner: retrieveDescriptors for retrieveCharacteristics"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 0 handle: 0"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 14 handle: 0"
D FreeRTOS: "Semaphore giving: name: GetDescEvt (0x3ffce8d4), owner: retrieveDescriptors"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D FreeRTOS: "<< wait: Semaphore released: name: GetDescEvt (0x3ffce8d4), owner: <N/A>"
D NimBLERemoteService: "Found UUID: ebe0ccb9-7a0a-4b0c-8a1a-6ff2997da3a6 Handle: 38 Def Handle: 37"
D NimBLERemoteService: "Next UUID: ebe0ccba-7a0a-4b0c-8a1a-6ff2997da3a6 Handle: 41 Def Handle: 40"
D NimBLERemoteCharacteristic: ">> retrieveDescriptors() for characteristic: ebe0ccb9-7a0a-4b0c-8a1a-6ff2997da3a6"
D FreeRTOS: "Semaphore taking: name: GetDescEvt (0x3ffcebbc), owner: <N/A> for retrieveDescriptors"
D FreeRTOS: "Semaphore taken:  name: GetDescEvt (0x3ffcebbc), owner: retrieveDescriptors"
D FreeRTOS: ">> wait: Semaphore waiting: name: GetDescEvt (0x3ffcebbc), owner: retrieveDescriptors for retrieveCharacteristics"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 0 handle: 0"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 14 handle: 0"
D FreeRTOS: "Semaphore giving: name: GetDescEvt (0x3ffcebbc), owner: retrieveDescriptors"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D FreeRTOS: "<< wait: Semaphore released: name: GetDescEvt (0x3ffcebbc), owner: <N/A>"
D NimBLERemoteService: "Found UUID: ebe0ccba-7a0a-4b0c-8a1a-6ff2997da3a6 Handle: 41 Def Handle: 40"
D NimBLERemoteService: "Next UUID: ebe0ccbb-7a0a-4b0c-8a1a-6ff2997da3a6 Handle: 44 Def Handle: 43"
D NimBLERemoteCharacteristic: ">> retrieveDescriptors() for characteristic: ebe0ccba-7a0a-4b0c-8a1a-6ff2997da3a6"
D FreeRTOS: "Semaphore taking: name: GetDescEvt (0x3ffceea4), owner: <N/A> for retrieveDescriptors"
D FreeRTOS: "Semaphore taken:  name: GetDescEvt (0x3ffceea4), owner: retrieveDescriptors"
D FreeRTOS: ">> wait: Semaphore waiting: name: GetDescEvt (0x3ffceea4), owner: retrieveDescriptors for retrieveCharacteristics"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 0 handle: 0"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 14 handle: 0"
D FreeRTOS: "Semaphore giving: name: GetDescEvt (0x3ffceea4), owner: retrieveDescriptors"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D FreeRTOS: "<< wait: Semaphore released: name: GetDescEvt (0x3ffceea4), owner: <N/A>"
D NimBLERemoteService: "Found UUID: ebe0ccbb-7a0a-4b0c-8a1a-6ff2997da3a6 Handle: 44 Def Handle: 43"
D NimBLERemoteService: "Next UUID: ebe0ccbc-7a0a-4b0c-8a1a-6ff2997da3a6 Handle: 47 Def Handle: 46"
D NimBLERemoteCharacteristic: ">> retrieveDescriptors() for characteristic: ebe0ccbb-7a0a-4b0c-8a1a-6ff2997da3a6"
D FreeRTOS: "Semaphore taking: name: GetDescEvt (0x3ffcf18c), owner: <N/A> for retrieveDescriptors"
D FreeRTOS: "Semaphore taken:  name: GetDescEvt (0x3ffcf18c), owner: retrieveDescriptors"
D FreeRTOS: ">> wait: Semaphore waiting: name: GetDescEvt (0x3ffcf18c), owner: retrieveDescriptors for retrieveCharacteristics"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 0 handle: 0"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 14 handle: 0"
D FreeRTOS: "Semaphore giving: name: GetDescEvt (0x3ffcf18c), owner: retrieveDescriptors"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D FreeRTOS: "<< wait: Semaphore released: name: GetDescEvt (0x3ffcf18c), owner: <N/A>"
D NimBLERemoteService: "Found UUID: ebe0ccbc-7a0a-4b0c-8a1a-6ff2997da3a6 Handle: 47 Def Handle: 46"
D NimBLERemoteService: "Next UUID: ebe0ccbe-7a0a-4b0c-8a1a-6ff2997da3a6 Handle: 51 Def Handle: 50"
D NimBLERemoteCharacteristic: ">> retrieveDescriptors() for characteristic: ebe0ccbc-7a0a-4b0c-8a1a-6ff2997da3a6"
D FreeRTOS: "Semaphore taking: name: GetDescEvt (0x3ffcf474), owner: <N/A> for retrieveDescriptors"
D FreeRTOS: "Semaphore taken:  name: GetDescEvt (0x3ffcf474), owner: retrieveDescriptors"
D FreeRTOS: ">> wait: Semaphore waiting: name: GetDescEvt (0x3ffcf474), owner: retrieveDescriptors for retrieveCharacteristics"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 0 handle: 0"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 0 handle: 0"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 14 handle: 0"
D FreeRTOS: "Semaphore giving: name: GetDescEvt (0x3ffcf474), owner: retrieveDescriptors"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D FreeRTOS: "<< wait: Semaphore released: name: GetDescEvt (0x3ffcf474), owner: <N/A>"
D NimBLERemoteService: "Found UUID: ebe0ccbe-7a0a-4b0c-8a1a-6ff2997da3a6 Handle: 51 Def Handle: 50"
D NimBLERemoteService: "Next UUID: ebe0ccc1-7a0a-4b0c-8a1a-6ff2997da3a6 Handle: 54 Def Handle: 53"
D NimBLERemoteCharacteristic: ">> retrieveDescriptors() for characteristic: ebe0ccbe-7a0a-4b0c-8a1a-6ff2997da3a6"
D FreeRTOS: "Semaphore taking: name: GetDescEvt (0x3ffcf75c), owner: <N/A> for retrieveDescriptors"
D FreeRTOS: "Semaphore taken:  name: GetDescEvt (0x3ffcf75c), owner: retrieveDescriptors"
D FreeRTOS: ">> wait: Semaphore waiting: name: GetDescEvt (0x3ffcf75c), owner: retrieveDescriptors for retrieveCharacteristics"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 0 handle: 0"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 14 handle: 0"
D FreeRTOS: "Semaphore giving: name: GetDescEvt (0x3ffcf75c), owner: retrieveDescriptors"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D FreeRTOS: "<< wait: Semaphore released: name: GetDescEvt (0x3ffcf75c), owner: <N/A>"
D NimBLERemoteService: "Found UUID: ebe0ccc1-7a0a-4b0c-8a1a-6ff2997da3a6 Handle: 54 Def Handle: 53"
D NimBLERemoteService: "Next UUID: ebe0ccc4-7a0a-4b0c-8a1a-6ff2997da3a6 Handle: 58 Def Handle: 57"
D NimBLERemoteCharacteristic: ">> retrieveDescriptors() for characteristic: ebe0ccc1-7a0a-4b0c-8a1a-6ff2997da3a6"
D FreeRTOS: "Semaphore taking: name: GetDescEvt (0x3ffcfa44), owner: <N/A> for retrieveDescriptors"
D FreeRTOS: "Semaphore taken:  name: GetDescEvt (0x3ffcfa44), owner: retrieveDescriptors"
D FreeRTOS: ">> wait: Semaphore waiting: name: GetDescEvt (0x3ffcfa44), owner: retrieveDescriptors for retrieveCharacteristics"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 0 handle: 0"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 0 handle: 0"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 14 handle: 0"
D FreeRTOS: "Semaphore giving: name: GetDescEvt (0x3ffcfa44), owner: retrieveDescriptors"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D FreeRTOS: "<< wait: Semaphore released: name: GetDescEvt (0x3ffcfa44), owner: <N/A>"
D NimBLERemoteService: "Found UUID: ebe0ccc4-7a0a-4b0c-8a1a-6ff2997da3a6 Handle: 58 Def Handle: 57"
D NimBLERemoteService: "Next UUID: ebe0ccc8-7a0a-4b0c-8a1a-6ff2997da3a6 Handle: 61 Def Handle: 60"
D NimBLERemoteCharacteristic: ">> retrieveDescriptors() for characteristic: ebe0ccc4-7a0a-4b0c-8a1a-6ff2997da3a6"
D FreeRTOS: "Semaphore taking: name: GetDescEvt (0x3ffcfd2c), owner: <N/A> for retrieveDescriptors"
D FreeRTOS: "Semaphore taken:  name: GetDescEvt (0x3ffcfd2c), owner: retrieveDescriptors"
D FreeRTOS: ">> wait: Semaphore waiting: name: GetDescEvt (0x3ffcfd2c), owner: retrieveDescriptors for retrieveCharacteristics"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 0 handle: 0"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 14 handle: 0"
D FreeRTOS: "Semaphore giving: name: GetDescEvt (0x3ffcfd2c), owner: retrieveDescriptors"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D FreeRTOS: "<< wait: Semaphore released: name: GetDescEvt (0x3ffcfd2c), owner: <N/A>"
D NimBLERemoteService: "Found UUID: ebe0ccc8-7a0a-4b0c-8a1a-6ff2997da3a6 Handle: 61 Def Handle: 60"
D NimBLERemoteService: "Next UUID: ebe0ccd1-7a0a-4b0c-8a1a-6ff2997da3a6 Handle: 64 Def Handle: 63"
D NimBLERemoteCharacteristic: ">> retrieveDescriptors() for characteristic: ebe0ccc8-7a0a-4b0c-8a1a-6ff2997da3a6"
D FreeRTOS: "Semaphore taking: name: GetDescEvt (0x3ffd0014), owner: <N/A> for retrieveDescriptors"
D FreeRTOS: "Semaphore taken:  name: GetDescEvt (0x3ffd0014), owner: retrieveDescriptors"
D FreeRTOS: ">> wait: Semaphore waiting: name: GetDescEvt (0x3ffd0014), owner: retrieveDescriptors for retrieveCharacteristics"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 0 handle: 0"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 14 handle: 0"
D FreeRTOS: "Semaphore giving: name: GetDescEvt (0x3ffd0014), owner: retrieveDescriptors"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D FreeRTOS: "<< wait: Semaphore released: name: GetDescEvt (0x3ffd0014), owner: <N/A>"
D NimBLERemoteService: "Found UUID: ebe0ccd1-7a0a-4b0c-8a1a-6ff2997da3a6 Handle: 64 Def Handle: 63"
D NimBLERemoteService: "Next UUID: ebe0ccd7-7a0a-4b0c-8a1a-6ff2997da3a6 Handle: 67 Def Handle: 66"
D NimBLERemoteCharacteristic: ">> retrieveDescriptors() for characteristic: ebe0ccd1-7a0a-4b0c-8a1a-6ff2997da3a6"
D FreeRTOS: "Semaphore taking: name: GetDescEvt (0x3ffd02fc), owner: <N/A> for retrieveDescriptors"
D FreeRTOS: "Semaphore taken:  name: GetDescEvt (0x3ffd02fc), owner: retrieveDescriptors"
D FreeRTOS: ">> wait: Semaphore waiting: name: GetDescEvt (0x3ffd02fc), owner: retrieveDescriptors for retrieveCharacteristics"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 0 handle: 0"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 14 handle: 0"
D FreeRTOS: "Semaphore giving: name: GetDescEvt (0x3ffd02fc), owner: retrieveDescriptors"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D FreeRTOS: "<< wait: Semaphore released: name: GetDescEvt (0x3ffd02fc), owner: <N/A>"
D NimBLERemoteService: "Found UUID: ebe0ccd7-7a0a-4b0c-8a1a-6ff2997da3a6 Handle: 67 Def Handle: 66"
D NimBLERemoteService: "Next UUID: ebe0ccd8-7a0a-4b0c-8a1a-6ff2997da3a6 Handle: 70 Def Handle: 69"
D NimBLERemoteCharacteristic: ">> retrieveDescriptors() for characteristic: ebe0ccd7-7a0a-4b0c-8a1a-6ff2997da3a6"
D FreeRTOS: "Semaphore taking: name: GetDescEvt (0x3ffd05e4), owner: <N/A> for retrieveDescriptors"
D FreeRTOS: "Semaphore taken:  name: GetDescEvt (0x3ffd05e4), owner: retrieveDescriptors"
D FreeRTOS: ">> wait: Semaphore waiting: name: GetDescEvt (0x3ffd05e4), owner: retrieveDescriptors for retrieveCharacteristics"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 0 handle: 0"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 14 handle: 0"
D FreeRTOS: "Semaphore giving: name: GetDescEvt (0x3ffd05e4), owner: retrieveDescriptors"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D FreeRTOS: "<< wait: Semaphore released: name: GetDescEvt (0x3ffd05e4), owner: <N/A>"
D NimBLERemoteService: "Found UUID: ebe0ccd8-7a0a-4b0c-8a1a-6ff2997da3a6 Handle: 70 Def Handle: 69"
D NimBLERemoteService: "Next UUID: ebe0ccd9-7a0a-4b0c-8a1a-6ff2997da3a6 Handle: 73 Def Handle: 72"
D NimBLERemoteCharacteristic: ">> retrieveDescriptors() for characteristic: ebe0ccd8-7a0a-4b0c-8a1a-6ff2997da3a6"
D FreeRTOS: "Semaphore taking: name: GetDescEvt (0x3ffd08cc), owner: <N/A> for retrieveDescriptors"
D FreeRTOS: "Semaphore taken:  name: GetDescEvt (0x3ffd08cc), owner: retrieveDescriptors"
D FreeRTOS: ">> wait: Semaphore waiting: name: GetDescEvt (0x3ffd08cc), owner: retrieveDescriptors for retrieveCharacteristics"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 0 handle: 0"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 14 handle: 0"
D FreeRTOS: "Semaphore giving: name: GetDescEvt (0x3ffd08cc), owner: retrieveDescriptors"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D FreeRTOS: "<< wait: Semaphore released: name: GetDescEvt (0x3ffd08cc), owner: <N/A>"
D NimBLERemoteService: "Found UUID: ebe0ccd9-7a0a-4b0c-8a1a-6ff2997da3a6 Handle: 73 Def Handle: 72"
D NimBLERemoteService: "END CHARS"
D NimBLERemoteCharacteristic: ">> retrieveDescriptors() for characteristic: ebe0ccd9-7a0a-4b0c-8a1a-6ff2997da3a6"
D FreeRTOS: "Semaphore taking: name: GetDescEvt (0x3ffd0bb4), owner: <N/A> for retrieveDescriptors"
D FreeRTOS: "Semaphore taken:  name: GetDescEvt (0x3ffd0bb4), owner: retrieveDescriptors"
D FreeRTOS: ">> wait: Semaphore waiting: name: GetDescEvt (0x3ffd0bb4), owner: retrieveDescriptors for retrieveCharacteristics"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 0 handle: 0"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 0 handle: 0"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 14 handle: 0"
D FreeRTOS: "Semaphore giving: name: GetDescEvt (0x3ffd0bb4), owner: retrieveDescriptors"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D FreeRTOS: "<< wait: Semaphore released: name: GetDescEvt (0x3ffd0bb4), owner: <N/A>"
D NimBLERemoteService: "<< retrieveCharacteristics()"
D NimBLEClient: "<< retrieveServices"
D NimBLEClient: "Found 8 services"
D NimBLEClientCallbacks: "onConnect: default"
D NimBLEClient: "<< connect()"
Connected
D NimBLEClient: ">> getService: uuid: ebe0ccb0-7a0a-4b0c-8a1a-6ff2997da3a6"
D NimBLEClient: "<< getService: found the service with uuid: ebe0ccb0-7a0a-4b0c-8a1a-6ff2997da3a6"
 - Found our service
 - Found our characteristic
Can read
D NimBLERemoteCharacteristic: ">> readValue(): uuid: ebe0ccc1-7a0a-4b0c-8a1a-6ff2997da3a6, handle: 54 0x36"
D FreeRTOS: "Semaphore taking: name: ReadCharEvt (0x3ffcfaa4), owner: <N/A> for readValue"
D FreeRTOS: "Semaphore taken:  name: ReadCharEvt (0x3ffcfaa4), owner: readValue"
D FreeRTOS: ">> wait: Semaphore waiting: name: ReadCharEvt (0x3ffcfaa4), owner: readValue for readValue"
D NimBLEClient: "Got Client event BLE_GAP_EVENT_NOTIFY_RX"
D NimBLEClient: "Notify Recieved for handle: 54"
D NimBLEClient: "checking service 00000100-0065-6c62-2e74-6f696d2e696d for handle: 54"
D NimBLEClient: "checking service 0xfe95 for handle: 54"
D NimBLEClient: "checking service ebe0ccb0-7a0a-4b0c-8a1a-6ff2997da3a6 for handle: 54"
D NimBLEClient: "Got Notification for characteristic Characteristic: uuid: ebe0ccc1-7a0a-4b0c-8a1a-6ff2997da3a6, handle: 54 0x0036, props:  0x12
Descriptor: uuid: 0x2901, handle: 55
Descriptor: uuid: 0x2902, handle: 56"
D NimBLEClient: "De ontvangen data (5 bytes) is '��@⸮
', hum is 64, temp is 2051"
I NimBLERemoteCharacteristic: "Read complete; status=0 conn_handle=0"
D NimBLERemoteCharacteristic: "De data hier (5 bytes) is '��@⸮
'"
D FreeRTOS: "Semaphore giving: name: ReadCharEvt (0x3ffcfaa4), owner: readValue"
D FreeRTOS: "<< wait: Semaphore released: name: ReadCharEvt (0x3ffcfaa4), owner: <N/A>"
D NimBLERemoteCharacteristic: "<< readValue(): length: 5"
LYWSD03MMC temperature = 20.51 : humidity = 64
Can notify
D NimBLEClient: ">> disconnect()"
D NimBLEClient: "<< disconnect()"
D NimBLEClient: ">> clearServices"
D NimBLEClient: "<< clearServices"
D NimBLEClient: "Got Client event BLE_GAP_EVENT_DISCONNECT"

@h2zero
Copy link
Owner

h2zero commented Apr 28, 2020

I'm so far unable to reproduce the issue. I've setup a peripheral device with static values similar to what you are trying to read and am able to read them on a client just as they should be.

Maybe the peripheral is doing something and responding with 0 values?

I don't see anything wrong in your log, I'm assuming this is after you made changes?

@Jeroen88
Copy link
Author

@h2zero Thnx for helping me!

Yes the log is after the changes, but the only difference is the two Dutch sentences near the end.

Maybe the peripheral is doing something and responding with 0 values?

I don't think so, because the data read from the peripheral is correct. It is not passed correctly to the remote characteristic...

@h2zero
Copy link
Owner

h2zero commented Apr 28, 2020

Interesting how you are recieving notifications before you have registered for them. It also seems you get one right when you happen to be reading the value. I wonder if there is something going on there.

@Jeroen88
Copy link
Author

Jeroen88 commented Apr 28, 2020

Maybe I sent the wrong log, I was comparing logging with and without callback to pinpoint the possible rootcause of the issue. I'll send a new log tomorrow, it is late here already...

@Jeroen88
Copy link
Author

Digging deeper into this, I found out that the (standard UUID) battery characteristic is correct and the (proprietary UUID) temperature and humity characteristic has the right value in BLEClient, but the wrong value is set in BLERemoteCharacteristic. I provide a MVCE and the right logging below.

I also found out that in the original library another function is used to get the characteristic and another callback mechanism. I also saw that in the original library the value is returned in a similar way I checked the (correct) value in BLEClient (see above comment). Maybe I draft a PR for that, if you @h2zero could check if this is correct. Please also check if it has consequences for write(), because I did not use that yet, although I doubt it has any impact.

@Jeroen88
Copy link
Author

Updated MVCE, also reading the battery characteristic:

#include <NimBLEDevice.h>


void setup() {
  // put your setup code here, to run once:
  Serial.begin(230400);
  Serial.println("/n/nStarted");

  BLEDevice::init("ESP32");

  readBLEClients();
}


void readBLEClients() {
// LYWSD03MMC
  static BLEClient * pClient = BLEDevice::createClient();

  Serial.println("Connecting...");
  bool success = pClient->connect(BLEAddress("a4:c1:38:5d:ef:16"));
  if(!success) {
    BLEDevice::deleteClient(pClient);

    Serial.println("Failed to connect");
    return;
  }
  Serial.println("Connected");

  BLERemoteService * pRemoteService = pClient->getService(BLEUUID("ebe0ccb0-7a0a-4b0c-8a1a-6ff2997da3a6"));
  if(pRemoteService == nullptr) {
    Serial.print("Failed to find our service UUID: ");
  } else {
    Serial.println(" - Found our service");

    // Temperature and humidity (fails)
    // Obtain a reference to the characteristic in the service of the remote BLE server.
    BLERemoteCharacteristic * pRemoteCharacteristic = pRemoteService->getCharacteristic(BLEUUID("ebe0ccc1-7a0a-4b0c-8a1a-6ff2997da3a6"));
    if(pRemoteCharacteristic == nullptr) {
      Serial.print("Failed to find our characteristic UUID: ");
    } else {
      Serial.println(" - Found our characteristic");
      if(pRemoteCharacteristic->canRead()) {
        Serial.println("Can read");
//        Serial.printf("string value is '%s'\n", pRemoteCharacteristic->readValue().c_str());
//        Serial.printf("uint8_t value is %u\n", pRemoteCharacteristic->readUInt8());
//        Serial.printf("uint16_t value is %u\n", pRemoteCharacteristic->readUInt16());
//        const uint8_t * pData = pRemoteCharacteristic->readRawData();
        const uint8_t * pData = reinterpret_cast<const uint8_t*>(pRemoteCharacteristic->readValue().c_str());

        float temperature = (pData[0] | (pData[1] << 8)) * 0.01; //little endian 
        uint8_t humidity = pData[2];
        Serial.printf("LYWSD03MMC temperature = %.2f : humidity = %u\n", temperature, humidity);    
      }
      if(pRemoteCharacteristic->canNotify()) {
        Serial.println("Can notify");
//        pRemoteCharacteristic->registerForNotify(notifyCallback);
      }
    }

    // Battery (success)
    // Obtain a reference to the characteristic in the service of the remote BLE server.
    pRemoteCharacteristic = pRemoteService->getCharacteristic(BLEUUID("ebe0ccc4-7a0a-4b0c-8a1a-6ff2997da3a6"));
    if(pRemoteCharacteristic == nullptr) {
      Serial.print("Failed to find our characteristic UUID: ");
    } else {
      Serial.println(" - Found our characteristic");
      if(pRemoteCharacteristic->canRead()) {
        Serial.println("Can read");
//        Serial.printf("string value is '%s'\n", pRemoteCharacteristic->readValue().c_str());
//        Serial.printf("uint8_t value is %u\n", pRemoteCharacteristic->readUInt8());
//        Serial.printf("uint16_t value is %u\n", pRemoteCharacteristic->readUInt16());
//        const uint8_t * pData = pRemoteCharacteristic->readRawData();
        const uint8_t * pData = reinterpret_cast<const uint8_t*>(pRemoteCharacteristic->readValue().c_str());

        uint8_t battery = pData[0];
        Serial.printf("LYWSD03MMC battery = %u\n", battery);    
      }
      if(pRemoteCharacteristic->canNotify()) {
        Serial.println("Can notify");
//        pRemoteCharacteristic->registerForNotify(notifyCallback);
      }
    }
  }

  pClient->disconnect();
  BLEDevice::deleteClient(pClient);
}

void loop() {
}

@Jeroen88
Copy link
Author

Updated logging, using this library without any changes:

I NimBLEDevice: "BLE Host Task Started"
I NimBLEDevice: "NimBle host synced."
Connecting...
D NimBLEClient: ">> connect(a4:c1:38:5d:ef:16)"
D FreeRTOS: "Semaphore taking: name: OpenEvt (0x3ffc8b0c), owner: <N/A> for connect"
D FreeRTOS: "Semaphore taken:  name: OpenEvt (0x3ffc8b0c), owner: connect"
D FreeRTOS: ">> wait: Semaphore waiting: name: OpenEvt (0x3ffc8b0c), owner: connect for connect"
D NimBLEClient: "Got Client event BLE_GAP_EVENT_CONNECT "
D NimBLEClient: "Connection established"
D FreeRTOS: "Semaphore giving: name: OpenEvt (0x3ffc8b0c), owner: connect"
D FreeRTOS: "<< wait: Semaphore released: name: OpenEvt (0x3ffc8b0c), owner: <N/A>"
D NimBLEClient: "Refreshing Services for: (a4:c1:38:5d:ef:16)"
D NimBLEClient: ">> clearServices"
D NimBLEClient: "<< clearServices"
D NimBLEClient: ">> retrieveServices"
D FreeRTOS: "Semaphore taking: name: SearchCmplEvt (0x3ffc8b6c), owner: <N/A> for retrieveServices"
D FreeRTOS: "Semaphore taken:  name: SearchCmplEvt (0x3ffc8b6c), owner: retrieveServices"
D FreeRTOS: ">> wait: Semaphore waiting: name: SearchCmplEvt (0x3ffc8b6c), owner: retrieveServices for retrieveServices"
D NimBLEClient: "Got Client event BLE_GAP_EVENT_MTU"
I NimBLEClient: "mtu update event; conn_handle=0 mtu=23"
D FreeRTOS: "Semaphore giving: name: OpenEvt (0x3ffc8b0c), owner: <N/A>"
D NimBLEClient: "Service Discovered >> status: 0 handle: 0"
D NimBLERemoteService: ">> BLERemoteService()"
D NimBLERemoteService: "<< BLERemoteService()"
D NimBLEClient: "<< Service Discovered. status: 0"
D NimBLEClient: "Service Discovered >> status: 0 handle: 0"
D NimBLERemoteService: ">> BLERemoteService()"
D NimBLERemoteService: "<< BLERemoteService()"
D NimBLEClient: "<< Service Discovered. status: 0"
D NimBLEClient: "Service Discovered >> status: 0 handle: 0"
D NimBLERemoteService: ">> BLERemoteService()"
D NimBLERemoteService: "<< BLERemoteService()"
D NimBLEClient: "<< Service Discovered. status: 0"
D NimBLEClient: "Service Discovered >> status: 0 handle: 0"
D NimBLERemoteService: ">> BLERemoteService()"
D NimBLERemoteService: "<< BLERemoteService()"
D NimBLEClient: "<< Service Discovered. status: 0"
D NimBLEClient: "Service Discovered >> status: 0 handle: 0"
D NimBLERemoteService: ">> BLERemoteService()"
D NimBLERemoteService: "<< BLERemoteService()"
D NimBLEClient: "<< Service Discovered. status: 0"
D NimBLEClient: "Service Discovered >> status: 0 handle: 0"
D NimBLERemoteService: ">> BLERemoteService()"
D NimBLERemoteService: "<< BLERemoteService()"
D NimBLEClient: "<< Service Discovered. status: 0"
D NimBLEClient: "Service Discovered >> status: 0 handle: 0"
D NimBLERemoteService: ">> BLERemoteService()"
D NimBLERemoteService: "<< BLERemoteService()"
D NimBLEClient: "<< Service Discovered. status: 0"
D NimBLEClient: "Service Discovered >> status: 0 handle: 0"
D NimBLERemoteService: ">> BLERemoteService()"
D NimBLERemoteService: "<< BLERemoteService()"
D NimBLEClient: "<< Service Discovered. status: 0"
D NimBLEClient: "Service Discovered >> status: 14 handle: 0"
D FreeRTOS: "Semaphore giving: name: SearchCmplEvt (0x3ffc8b6c), owner: retrieveServices"
D NimBLEClient: "<< Service Discovered. status: 0"
D FreeRTOS: "<< wait: Semaphore released: name: SearchCmplEvt (0x3ffc8b6c), owner: <N/A>"
D NimBLERemoteService: ">> retrieveCharacteristics() for service: 00000100-0065-6c62-2e74-6f696d2e696d"
D FreeRTOS: "Semaphore taking: name: GetCharEvt (0x3ffc96d4), owner: <N/A> for retrieveCharacteristics"
D FreeRTOS: "Semaphore taken:  name: GetCharEvt (0x3ffc96d4), owner: retrieveCharacteristics"
D FreeRTOS: ">> wait: Semaphore waiting: name: GetCharEvt (0x3ffc96d4), owner: retrieveCharacteristics for retrieveCharacteristics"
D NimBLERemoteService: "Characteristic Discovered >> status: 0 handle: 0"
D NimBLERemoteService: "<< Characteristic Discovered. status: 0"
D NimBLERemoteService: "Characteristic Discovered >> status: 0 handle: 0"
D NimBLERemoteService: "<< Characteristic Discovered. status: 0"
D NimBLEClient: "Got Client event BLE_GAP_EVENT_L2CAP_UPDATE_REQ"
D NimBLEClient: "Peer requesting to update connection parameters"
D NimBLEClient: "MinInterval: 12, MaxInterval: 24, Latency: 0, Timeout: 90"
D NimBLEClientCallbacks: "onConnParamsUpdateRequest: default"
D NimBLEClient: "Accepted peer params"
D NimBLERemoteService: "Characteristic Discovered >> status: 14 handle: 0"
D FreeRTOS: "Semaphore giving: name: GetCharEvt (0x3ffc96d4), owner: retrieveCharacteristics"
D NimBLERemoteService: "<< Characteristic Discovered. status: 0"
D FreeRTOS: "<< wait: Semaphore released: name: GetCharEvt (0x3ffc96d4), owner: <N/A>"
D NimBLERemoteService: "Found 2 Characteristics"
D NimBLERemoteService: "Found UUID: 00000101-0065-6c62-2e74-6f696d2e696d Handle: 98 Def Handle: 97"
D NimBLERemoteService: "Next UUID: 00000102-0065-6c62-2e74-6f696d2e696d Handle: 102 Def Handle: 101"
D NimBLERemoteCharacteristic: ">> retrieveDescriptors() for characteristic: 00000101-0065-6c62-2e74-6f696d2e696d"
D FreeRTOS: "Semaphore taking: name: GetDescEvt (0x3ffc9904), owner: <N/A> for retrieveDescriptors"
D FreeRTOS: "Semaphore taken:  name: GetDescEvt (0x3ffc9904), owner: retrieveDescriptors"
D FreeRTOS: ">> wait: Semaphore waiting: name: GetDescEvt (0x3ffc9904), owner: retrieveDescriptors for retrieveCharacteristics"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 0 handle: 0"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 0 handle: 0"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 14 handle: 0"
D FreeRTOS: "Semaphore giving: name: GetDescEvt (0x3ffc9904), owner: retrieveDescriptors"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D FreeRTOS: "<< wait: Semaphore released: name: GetDescEvt (0x3ffc9904), owner: <N/A>"
D NimBLERemoteService: "Found UUID: 00000102-0065-6c62-2e74-6f696d2e696d Handle: 102 Def Handle: 101"
D NimBLERemoteService: "END CHARS"
D NimBLERemoteCharacteristic: ">> retrieveDescriptors() for characteristic: 00000102-0065-6c62-2e74-6f696d2e696d"
D FreeRTOS: "Semaphore taking: name: GetDescEvt (0x3ffc9bc4), owner: <N/A> for retrieveDescriptors"
D FreeRTOS: "Semaphore taken:  name: GetDescEvt (0x3ffc9bc4), owner: retrieveDescriptors"
D FreeRTOS: ">> wait: Semaphore waiting: name: GetDescEvt (0x3ffc9bc4), owner: retrieveDescriptors for retrieveCharacteristics"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 0 handle: 0"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 0 handle: 0"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 14 handle: 0"
D FreeRTOS: "Semaphore giving: name: GetDescEvt (0x3ffc9bc4), owner: retrieveDescriptors"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D FreeRTOS: "<< wait: Semaphore released: name: GetDescEvt (0x3ffc9bc4), owner: <N/A>"
D NimBLERemoteService: "<< retrieveCharacteristics()"
D NimBLERemoteService: ">> retrieveCharacteristics() for service: 00010203-0405-0607-0809-0a0b0c0d1912"
D FreeRTOS: "Semaphore taking: name: GetCharEvt (0x3ffc9298), owner: <N/A> for retrieveCharacteristics"
D FreeRTOS: "Semaphore taken:  name: GetCharEvt (0x3ffc9298), owner: retrieveCharacteristics"
D FreeRTOS: ">> wait: Semaphore waiting: name: GetCharEvt (0x3ffc9298), owner: retrieveCharacteristics for retrieveCharacteristics"
D NimBLEClient: "Got Client event BLE_GAP_EVENT_CONN_UPDATE"
I NimBLEClient: "Connection parameters updated."
D NimBLERemoteService: "Characteristic Discovered >> status: 0 handle: 0"
D NimBLERemoteService: "<< Characteristic Discovered. status: 0"
D NimBLERemoteService: "Characteristic Discovered >> status: 14 handle: 0"
D FreeRTOS: "Semaphore giving: name: GetCharEvt (0x3ffc9298), owner: retrieveCharacteristics"
D NimBLERemoteService: "<< Characteristic Discovered. status: 0"
D FreeRTOS: "<< wait: Semaphore released: name: GetCharEvt (0x3ffc9298), owner: <N/A>"
D NimBLERemoteService: "Found 1 Characteristics"
D NimBLERemoteService: "Found UUID: 00010203-0405-0607-0809-0a0b0c0d2b12 Handle: 31 Def Handle: 30"
D NimBLERemoteService: "END CHARS"
D NimBLERemoteCharacteristic: ">> retrieveDescriptors() for characteristic: 00010203-0405-0607-0809-0a0b0c0d2b12"
D FreeRTOS: "Semaphore taking: name: GetDescEvt (0x3ffca5bc), owner: <N/A> for retrieveDescriptors"
D FreeRTOS: "Semaphore taken:  name: GetDescEvt (0x3ffca5bc), owner: retrieveDescriptors"
D FreeRTOS: ">> wait: Semaphore waiting: name: GetDescEvt (0x3ffca5bc), owner: retrieveDescriptors for retrieveCharacteristics"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 0 handle: 0"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 14 handle: 0"
D FreeRTOS: "Semaphore giving: name: GetDescEvt (0x3ffca5bc), owner: retrieveDescriptors"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D FreeRTOS: "<< wait: Semaphore released: name: GetDescEvt (0x3ffca5bc), owner: <N/A>"
D NimBLERemoteService: "<< retrieveCharacteristics()"
D NimBLERemoteService: ">> retrieveCharacteristics() for service: 0x1800"
D FreeRTOS: "Semaphore taking: name: GetCharEvt (0x3ffc8d88), owner: <N/A> for retrieveCharacteristics"
D FreeRTOS: "Semaphore taken:  name: GetCharEvt (0x3ffc8d88), owner: retrieveCharacteristics"
D FreeRTOS: ">> wait: Semaphore waiting: name: GetCharEvt (0x3ffc8d88), owner: retrieveCharacteristics for retrieveCharacteristics"
D NimBLERemoteService: "Characteristic Discovered >> status: 0 handle: 0"
D NimBLERemoteService: "<< Characteristic Discovered. status: 0"
D NimBLERemoteService: "Characteristic Discovered >> status: 0 handle: 0"
D NimBLERemoteService: "<< Characteristic Discovered. status: 0"
D NimBLERemoteService: "Characteristic Discovered >> status: 0 handle: 0"
D NimBLERemoteService: "<< Characteristic Discovered. status: 0"
D NimBLERemoteService: "Characteristic Discovered >> status: 14 handle: 0"
D FreeRTOS: "Semaphore giving: name: GetCharEvt (0x3ffc8d88), owner: retrieveCharacteristics"
D NimBLERemoteService: "<< Characteristic Discovered. status: 0"
D FreeRTOS: "<< wait: Semaphore released: name: GetCharEvt (0x3ffc8d88), owner: <N/A>"
D NimBLERemoteService: "Found 3 Characteristics"
D NimBLERemoteService: "Found UUID: 0x2a00 Handle: 3 Def Handle: 2"
D NimBLERemoteService: "Next UUID: 0x2a01 Handle: 5 Def Handle: 4"
D NimBLERemoteService: "Found UUID: 0x2a01 Handle: 5 Def Handle: 4"
D NimBLERemoteService: "Next UUID: 0x2a04 Handle: 7 Def Handle: 6"
D NimBLERemoteService: "Found UUID: 0x2a04 Handle: 7 Def Handle: 6"
D NimBLERemoteService: "END CHARS"
D NimBLERemoteService: "<< retrieveCharacteristics()"
D NimBLERemoteService: ">> retrieveCharacteristics() for service: 0x1801"
D FreeRTOS: "Semaphore taking: name: GetCharEvt (0x3ffc8ecc), owner: <N/A> for retrieveCharacteristics"
D FreeRTOS: "Semaphore taken:  name: GetCharEvt (0x3ffc8ecc), owner: retrieveCharacteristics"
D FreeRTOS: ">> wait: Semaphore waiting: name: GetCharEvt (0x3ffc8ecc), owner: retrieveCharacteristics for retrieveCharacteristics"
D NimBLERemoteService: "Characteristic Discovered >> status: 0 handle: 0"
D NimBLERemoteService: "<< Characteristic Discovered. status: 0"
D NimBLERemoteService: "Characteristic Discovered >> status: 14 handle: 0"
D FreeRTOS: "Semaphore giving: name: GetCharEvt (0x3ffc8ecc), owner: retrieveCharacteristics"
D NimBLERemoteService: "<< Characteristic Discovered. status: 0"
D FreeRTOS: "<< wait: Semaphore released: name: GetCharEvt (0x3ffc8ecc), owner: <N/A>"
D NimBLERemoteService: "Found 1 Characteristics"
D NimBLERemoteService: "Found UUID: 0x2a05 Handle: 10 Def Handle: 9"
D NimBLERemoteService: "END CHARS"
D NimBLERemoteCharacteristic: ">> retrieveDescriptors() for characteristic: 0x2a05"
D FreeRTOS: "Semaphore taking: name: GetDescEvt (0x3ffcb278), owner: <N/A> for retrieveDescriptors"
D FreeRTOS: "Semaphore taken:  name: GetDescEvt (0x3ffcb278), owner: retrieveDescriptors"
D FreeRTOS: ">> wait: Semaphore waiting: name: GetDescEvt (0x3ffcb278), owner: retrieveDescriptors for retrieveCharacteristics"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 0 handle: 0"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 14 handle: 0"
D FreeRTOS: "Semaphore giving: name: GetDescEvt (0x3ffcb278), owner: retrieveDescriptors"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D FreeRTOS: "<< wait: Semaphore released: name: GetDescEvt (0x3ffcb278), owner: <N/A>"
D NimBLERemoteService: "<< retrieveCharacteristics()"
D NimBLERemoteService: ">> retrieveCharacteristics() for service: 0x180a"
D FreeRTOS: "Semaphore taking: name: GetCharEvt (0x3ffc9010), owner: <N/A> for retrieveCharacteristics"
D FreeRTOS: "Semaphore taken:  name: GetCharEvt (0x3ffc9010), owner: retrieveCharacteristics"
D FreeRTOS: ">> wait: Semaphore waiting: name: GetCharEvt (0x3ffc9010), owner: retrieveCharacteristics for retrieveCharacteristics"
D NimBLERemoteService: "Characteristic Discovered >> status: 0 handle: 0"
D NimBLERemoteService: "<< Characteristic Discovered. status: 0"
D NimBLERemoteService: "Characteristic Discovered >> status: 0 handle: 0"
D NimBLERemoteService: "<< Characteristic Discovered. status: 0"
D NimBLERemoteService: "Characteristic Discovered >> status: 0 handle: 0"
D NimBLERemoteService: "<< Characteristic Discovered. status: 0"
D NimBLERemoteService: "Characteristic Discovered >> status: 0 handle: 0"
D NimBLERemoteService: "<< Characteristic Discovered. status: 0"
D NimBLERemoteService: "Characteristic Discovered >> status: 0 handle: 0"
D NimBLERemoteService: "<< Characteristic Discovered. status: 0"
D NimBLERemoteService: "Characteristic Discovered >> status: 0 handle: 0"
D NimBLERemoteService: "<< Characteristic Discovered. status: 0"
D NimBLERemoteService: "Characteristic Discovered >> status: 14 handle: 0"
D FreeRTOS: "Semaphore giving: name: GetCharEvt (0x3ffc9010), owner: retrieveCharacteristics"
D NimBLERemoteService: "<< Characteristic Discovered. status: 0"
D FreeRTOS: "<< wait: Semaphore released: name: GetCharEvt (0x3ffc9010), owner: <N/A>"
D NimBLERemoteService: "Found 6 Characteristics"
D NimBLERemoteService: "Found UUID: 0x2a24 Handle: 14 Def Handle: 13"
D NimBLERemoteService: "Next UUID: 0x2a25 Handle: 16 Def Handle: 15"
D NimBLERemoteService: "Found UUID: 0x2a25 Handle: 16 Def Handle: 15"
D NimBLERemoteService: "Next UUID: 0x2a26 Handle: 18 Def Handle: 17"
D NimBLERemoteService: "Found UUID: 0x2a26 Handle: 18 Def Handle: 17"
D NimBLERemoteService: "Next UUID: 0x2a27 Handle: 20 Def Handle: 19"
D NimBLERemoteService: "Found UUID: 0x2a27 Handle: 20 Def Handle: 19"
D NimBLERemoteService: "Next UUID: 0x2a28 Handle: 22 Def Handle: 21"
D NimBLERemoteService: "Found UUID: 0x2a28 Handle: 22 Def Handle: 21"
D NimBLERemoteService: "Next UUID: 0x2a29 Handle: 24 Def Handle: 23"
D NimBLERemoteService: "Found UUID: 0x2a29 Handle: 24 Def Handle: 23"
D NimBLERemoteService: "END CHARS"
D NimBLERemoteService: "<< retrieveCharacteristics()"
D NimBLERemoteService: ">> retrieveCharacteristics() for service: 0x180f"
D FreeRTOS: "Semaphore taking: name: GetCharEvt (0x3ffc9154), owner: <N/A> for retrieveCharacteristics"
D FreeRTOS: "Semaphore taken:  name: GetCharEvt (0x3ffc9154), owner: retrieveCharacteristics"
D FreeRTOS: ">> wait: Semaphore waiting: name: GetCharEvt (0x3ffc9154), owner: retrieveCharacteristics for retrieveCharacteristics"
D NimBLERemoteService: "Characteristic Discovered >> status: 0 handle: 0"
D NimBLERemoteService: "<< Characteristic Discovered. status: 0"
D NimBLERemoteService: "Characteristic Discovered >> status: 14 handle: 0"
D FreeRTOS: "Semaphore giving: name: GetCharEvt (0x3ffc9154), owner: retrieveCharacteristics"
D NimBLERemoteService: "<< Characteristic Discovered. status: 0"
D FreeRTOS: "<< wait: Semaphore released: name: GetCharEvt (0x3ffc9154), owner: <N/A>"
D NimBLERemoteService: "Found 1 Characteristics"
D NimBLERemoteService: "Found UUID: 0x2a19 Handle: 27 Def Handle: 26"
D NimBLERemoteService: "END CHARS"
D NimBLERemoteCharacteristic: ">> retrieveDescriptors() for characteristic: 0x2a19"
D FreeRTOS: "Semaphore taking: name: GetDescEvt (0x3ffcc70c), owner: <N/A> for retrieveDescriptors"
D FreeRTOS: "Semaphore taken:  name: GetDescEvt (0x3ffcc70c), owner: retrieveDescriptors"
D FreeRTOS: ">> wait: Semaphore waiting: name: GetDescEvt (0x3ffcc70c), owner: retrieveDescriptors for retrieveCharacteristics"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 0 handle: 0"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 14 handle: 0"
D FreeRTOS: "Semaphore giving: name: GetDescEvt (0x3ffcc70c), owner: retrieveDescriptors"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D FreeRTOS: "<< wait: Semaphore released: name: GetDescEvt (0x3ffcc70c), owner: <N/A>"
D NimBLERemoteService: "<< retrieveCharacteristics()"
D NimBLERemoteService: ">> retrieveCharacteristics() for service: 0xfe95"
D FreeRTOS: "Semaphore taking: name: GetCharEvt (0x3ffc9590), owner: <N/A> for retrieveCharacteristics"
D FreeRTOS: "Semaphore taken:  name: GetCharEvt (0x3ffc9590), owner: retrieveCharacteristics"
D FreeRTOS: ">> wait: Semaphore waiting: name: GetCharEvt (0x3ffc9590), owner: retrieveCharacteristics for retrieveCharacteristics"
D NimBLERemoteService: "Characteristic Discovered >> status: 0 handle: 0"
D NimBLERemoteService: "<< Characteristic Discovered. status: 0"
D NimBLERemoteService: "Characteristic Discovered >> status: 0 handle: 0"
D NimBLERemoteService: "<< Characteristic Discovered. status: 0"
D NimBLERemoteService: "Characteristic Discovered >> status: 0 handle: 0"
D NimBLERemoteService: "<< Characteristic Discovered. status: 0"
D NimBLERemoteService: "Characteristic Discovered >> status: 0 handle: 0"
D NimBLERemoteService: "<< Characteristic Discovered. status: 0"
D NimBLERemoteService: "Characteristic Discovered >> status: 0 handle: 0"
D NimBLERemoteService: "<< Characteristic Discovered. status: 0"
D NimBLERemoteService: "Characteristic Discovered >> status: 14 handle: 0"
D FreeRTOS: "Semaphore giving: name: GetCharEvt (0x3ffc9590), owner: retrieveCharacteristics"
D NimBLERemoteService: "<< Characteristic Discovered. status: 0"
D FreeRTOS: "<< wait: Semaphore released: name: GetCharEvt (0x3ffc9590), owner: <N/A>"
D NimBLERemoteService: "Found 5 Characteristics"
D NimBLERemoteService: "Found UUID: 0x0004 Handle: 78 Def Handle: 77"
D NimBLERemoteService: "Next UUID: 0x0010 Handle: 81 Def Handle: 80"
D NimBLERemoteCharacteristic: ">> retrieveDescriptors() for characteristic: 0x0004"
D FreeRTOS: "Semaphore taking: name: GetDescEvt (0x3ffccb80), owner: <N/A> for retrieveDescriptors"
D FreeRTOS: "Semaphore taken:  name: GetDescEvt (0x3ffccb80), owner: retrieveDescriptors"
D FreeRTOS: ">> wait: Semaphore waiting: name: GetDescEvt (0x3ffccb80), owner: retrieveDescriptors for retrieveCharacteristics"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 0 handle: 0"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 14 handle: 0"
D FreeRTOS: "Semaphore giving: name: GetDescEvt (0x3ffccb80), owner: retrieveDescriptors"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D FreeRTOS: "<< wait: Semaphore released: name: GetDescEvt (0x3ffccb80), owner: <N/A>"
D NimBLERemoteService: "Found UUID: 0x0010 Handle: 81 Def Handle: 80"
D NimBLERemoteService: "Next UUID: 0x0017 Handle: 85 Def Handle: 84"
D NimBLERemoteCharacteristic: ">> retrieveDescriptors() for characteristic: 0x0010"
D FreeRTOS: "Semaphore taking: name: GetDescEvt (0x3ffcce30), owner: <N/A> for retrieveDescriptors"
D FreeRTOS: "Semaphore taken:  name: GetDescEvt (0x3ffcce30), owner: retrieveDescriptors"
D FreeRTOS: ">> wait: Semaphore waiting: name: GetDescEvt (0x3ffcce30), owner: retrieveDescriptors for retrieveCharacteristics"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 0 handle: 0"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 0 handle: 0"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 14 handle: 0"
D FreeRTOS: "Semaphore giving: name: GetDescEvt (0x3ffcce30), owner: retrieveDescriptors"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D FreeRTOS: "<< wait: Semaphore released: name: GetDescEvt (0x3ffcce30), owner: <N/A>"
D NimBLERemoteService: "Found UUID: 0x0017 Handle: 85 Def Handle: 84"
D NimBLERemoteService: "Next UUID: 0x0018 Handle: 89 Def Handle: 88"
D NimBLERemoteCharacteristic: ">> retrieveDescriptors() for characteristic: 0x0017"
D FreeRTOS: "Semaphore taking: name: GetDescEvt (0x3ffcd0e0), owner: <N/A> for retrieveDescriptors"
D FreeRTOS: "Semaphore taken:  name: GetDescEvt (0x3ffcd0e0), owner: retrieveDescriptors"
D FreeRTOS: ">> wait: Semaphore waiting: name: GetDescEvt (0x3ffcd0e0), owner: retrieveDescriptors for retrieveCharacteristics"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 0 handle: 0"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 0 handle: 0"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 14 handle: 0"
D FreeRTOS: "Semaphore giving: name: GetDescEvt (0x3ffcd0e0), owner: retrieveDescriptors"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D FreeRTOS: "<< wait: Semaphore released: name: GetDescEvt (0x3ffcd0e0), owner: <N/A>"
D NimBLERemoteService: "Found UUID: 0x0018 Handle: 89 Def Handle: 88"
D NimBLERemoteService: "Next UUID: 0x0019 Handle: 93 Def Handle: 92"
D NimBLERemoteCharacteristic: ">> retrieveDescriptors() for characteristic: 0x0018"
D FreeRTOS: "Semaphore taking: name: GetDescEvt (0x3ffcd390), owner: <N/A> for retrieveDescriptors"
D FreeRTOS: "Semaphore taken:  name: GetDescEvt (0x3ffcd390), owner: retrieveDescriptors"
D FreeRTOS: ">> wait: Semaphore waiting: name: GetDescEvt (0x3ffcd390), owner: retrieveDescriptors for retrieveCharacteristics"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 0 handle: 0"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 0 handle: 0"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 14 handle: 0"
D FreeRTOS: "Semaphore giving: name: GetDescEvt (0x3ffcd390), owner: retrieveDescriptors"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D FreeRTOS: "<< wait: Semaphore released: name: GetDescEvt (0x3ffcd390), owner: <N/A>"
D NimBLERemoteService: "Found UUID: 0x0019 Handle: 93 Def Handle: 92"
D NimBLERemoteService: "END CHARS"
D NimBLERemoteCharacteristic: ">> retrieveDescriptors() for characteristic: 0x0019"
D FreeRTOS: "Semaphore taking: name: GetDescEvt (0x3ffcd640), owner: <N/A> for retrieveDescriptors"
D FreeRTOS: "Semaphore taken:  name: GetDescEvt (0x3ffcd640), owner: retrieveDescriptors"
D FreeRTOS: ">> wait: Semaphore waiting: name: GetDescEvt (0x3ffcd640), owner: retrieveDescriptors for retrieveCharacteristics"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 0 handle: 0"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 0 handle: 0"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 14 handle: 0"
D FreeRTOS: "Semaphore giving: name: GetDescEvt (0x3ffcd640), owner: retrieveDescriptors"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D FreeRTOS: "<< wait: Semaphore released: name: GetDescEvt (0x3ffcd640), owner: <N/A>"
D NimBLERemoteService: "<< retrieveCharacteristics()"
D NimBLERemoteService: ">> retrieveCharacteristics() for service: ebe0ccb0-7a0a-4b0c-8a1a-6ff2997da3a6"
D FreeRTOS: "Semaphore taking: name: GetCharEvt (0x3ffc9414), owner: <N/A> for retrieveCharacteristics"
D FreeRTOS: "Semaphore taken:  name: GetCharEvt (0x3ffc9414), owner: retrieveCharacteristics"
D FreeRTOS: ">> wait: Semaphore waiting: name: GetCharEvt (0x3ffc9414), owner: retrieveCharacteristics for retrieveCharacteristics"
D NimBLERemoteService: "Characteristic Discovered >> status: 0 handle: 0"
D NimBLERemoteService: "<< Characteristic Discovered. status: 0"
D NimBLERemoteService: "Characteristic Discovered >> status: 0 handle: 0"
D NimBLERemoteService: "<< Characteristic Discovered. status: 0"
D NimBLERemoteService: "Characteristic Discovered >> status: 0 handle: 0"
D NimBLERemoteService: "<< Characteristic Discovered. status: 0"
D NimBLERemoteService: "Characteristic Discovered >> status: 0 handle: 0"
D NimBLERemoteService: "<< Characteristic Discovered. status: 0"
D NimBLERemoteService: "Characteristic Discovered >> status: 0 handle: 0"
D NimBLERemoteService: "<< Characteristic Discovered. status: 0"
D NimBLERemoteService: "Characteristic Discovered >> status: 0 handle: 0"
D NimBLERemoteService: "<< Characteristic Discovered. status: 0"
D NimBLERemoteService: "Characteristic Discovered >> status: 0 handle: 0"
D NimBLERemoteService: "<< Characteristic Discovered. status: 0"
D NimBLERemoteService: "Characteristic Discovered >> status: 0 handle: 0"
D NimBLERemoteService: "<< Characteristic Discovered. status: 0"
D NimBLERemoteService: "Characteristic Discovered >> status: 0 handle: 0"
D NimBLERemoteService: "<< Characteristic Discovered. status: 0"
D NimBLERemoteService: "Characteristic Discovered >> status: 0 handle: 0"
D NimBLERemoteService: "<< Characteristic Discovered. status: 0"
D NimBLERemoteService: "Characteristic Discovered >> status: 0 handle: 0"
D NimBLERemoteService: "<< Characteristic Discovered. status: 0"
D NimBLERemoteService: "Characteristic Discovered >> status: 0 handle: 0"
D NimBLERemoteService: "<< Characteristic Discovered. status: 0"
D NimBLERemoteService: "Characteristic Discovered >> status: 0 handle: 0"
D NimBLERemoteService: "<< Characteristic Discovered. status: 0"
D NimBLERemoteService: "Characteristic Discovered >> status: 14 handle: 0"
D FreeRTOS: "Semaphore giving: name: GetCharEvt (0x3ffc9414), owner: retrieveCharacteristics"
D NimBLERemoteService: "<< Characteristic Discovered. status: 0"
D FreeRTOS: "<< wait: Semaphore released: name: GetCharEvt (0x3ffc9414), owner: <N/A>"
D NimBLERemoteService: "Found 13 Characteristics"
D NimBLERemoteService: "Found UUID: ebe0ccb7-7a0a-4b0c-8a1a-6ff2997da3a6 Handle: 35 Def Handle: 34"
D NimBLERemoteService: "Next UUID: ebe0ccb9-7a0a-4b0c-8a1a-6ff2997da3a6 Handle: 38 Def Handle: 37"
D NimBLERemoteCharacteristic: ">> retrieveDescriptors() for characteristic: ebe0ccb7-7a0a-4b0c-8a1a-6ff2997da3a6"
D FreeRTOS: "Semaphore taking: name: GetDescEvt (0x3ffce8d4), owner: <N/A> for retrieveDescriptors"
D FreeRTOS: "Semaphore taken:  name: GetDescEvt (0x3ffce8d4), owner: retrieveDescriptors"
D FreeRTOS: ">> wait: Semaphore waiting: name: GetDescEvt (0x3ffce8d4), owner: retrieveDescriptors for retrieveCharacteristics"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 0 handle: 0"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 14 handle: 0"
D FreeRTOS: "Semaphore giving: name: GetDescEvt (0x3ffce8d4), owner: retrieveDescriptors"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D FreeRTOS: "<< wait: Semaphore released: name: GetDescEvt (0x3ffce8d4), owner: <N/A>"
D NimBLERemoteService: "Found UUID: ebe0ccb9-7a0a-4b0c-8a1a-6ff2997da3a6 Handle: 38 Def Handle: 37"
D NimBLERemoteService: "Next UUID: ebe0ccba-7a0a-4b0c-8a1a-6ff2997da3a6 Handle: 41 Def Handle: 40"
D NimBLERemoteCharacteristic: ">> retrieveDescriptors() for characteristic: ebe0ccb9-7a0a-4b0c-8a1a-6ff2997da3a6"
D FreeRTOS: "Semaphore taking: name: GetDescEvt (0x3ffcebbc), owner: <N/A> for retrieveDescriptors"
D FreeRTOS: "Semaphore taken:  name: GetDescEvt (0x3ffcebbc), owner: retrieveDescriptors"
D FreeRTOS: ">> wait: Semaphore waiting: name: GetDescEvt (0x3ffcebbc), owner: retrieveDescriptors for retrieveCharacteristics"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 0 handle: 0"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 14 handle: 0"
D FreeRTOS: "Semaphore giving: name: GetDescEvt (0x3ffcebbc), owner: retrieveDescriptors"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D FreeRTOS: "<< wait: Semaphore released: name: GetDescEvt (0x3ffcebbc), owner: <N/A>"
D NimBLERemoteService: "Found UUID: ebe0ccba-7a0a-4b0c-8a1a-6ff2997da3a6 Handle: 41 Def Handle: 40"
D NimBLERemoteService: "Next UUID: ebe0ccbb-7a0a-4b0c-8a1a-6ff2997da3a6 Handle: 44 Def Handle: 43"
D NimBLERemoteCharacteristic: ">> retrieveDescriptors() for characteristic: ebe0ccba-7a0a-4b0c-8a1a-6ff2997da3a6"
D FreeRTOS: "Semaphore taking: name: GetDescEvt (0x3ffceea4), owner: <N/A> for retrieveDescriptors"
D FreeRTOS: "Semaphore taken:  name: GetDescEvt (0x3ffceea4), owner: retrieveDescriptors"
D FreeRTOS: ">> wait: Semaphore waiting: name: GetDescEvt (0x3ffceea4), owner: retrieveDescriptors for retrieveCharacteristics"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 0 handle: 0"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 14 handle: 0"
D FreeRTOS: "Semaphore giving: name: GetDescEvt (0x3ffceea4), owner: retrieveDescriptors"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D FreeRTOS: "<< wait: Semaphore released: name: GetDescEvt (0x3ffceea4), owner: <N/A>"
D NimBLERemoteService: "Found UUID: ebe0ccbb-7a0a-4b0c-8a1a-6ff2997da3a6 Handle: 44 Def Handle: 43"
D NimBLERemoteService: "Next UUID: ebe0ccbc-7a0a-4b0c-8a1a-6ff2997da3a6 Handle: 47 Def Handle: 46"
D NimBLERemoteCharacteristic: ">> retrieveDescriptors() for characteristic: ebe0ccbb-7a0a-4b0c-8a1a-6ff2997da3a6"
D FreeRTOS: "Semaphore taking: name: GetDescEvt (0x3ffcf18c), owner: <N/A> for retrieveDescriptors"
D FreeRTOS: "Semaphore taken:  name: GetDescEvt (0x3ffcf18c), owner: retrieveDescriptors"
D FreeRTOS: ">> wait: Semaphore waiting: name: GetDescEvt (0x3ffcf18c), owner: retrieveDescriptors for retrieveCharacteristics"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 0 handle: 0"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 14 handle: 0"
D FreeRTOS: "Semaphore giving: name: GetDescEvt (0x3ffcf18c), owner: retrieveDescriptors"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D FreeRTOS: "<< wait: Semaphore released: name: GetDescEvt (0x3ffcf18c), owner: <N/A>"
D NimBLERemoteService: "Found UUID: ebe0ccbc-7a0a-4b0c-8a1a-6ff2997da3a6 Handle: 47 Def Handle: 46"
D NimBLERemoteService: "Next UUID: ebe0ccbe-7a0a-4b0c-8a1a-6ff2997da3a6 Handle: 51 Def Handle: 50"
D NimBLERemoteCharacteristic: ">> retrieveDescriptors() for characteristic: ebe0ccbc-7a0a-4b0c-8a1a-6ff2997da3a6"
D FreeRTOS: "Semaphore taking: name: GetDescEvt (0x3ffcf474), owner: <N/A> for retrieveDescriptors"
D FreeRTOS: "Semaphore taken:  name: GetDescEvt (0x3ffcf474), owner: retrieveDescriptors"
D FreeRTOS: ">> wait: Semaphore waiting: name: GetDescEvt (0x3ffcf474), owner: retrieveDescriptors for retrieveCharacteristics"
D NimBLEClient: "Got Client event BLE_GAP_EVENT_NOTIFY_RX"
D NimBLEClient: "Notify Recieved for handle: 54"
D NimBLEClient: "checking service 00000100-0065-6c62-2e74-6f696d2e696d for handle: 54"
D NimBLEClient: "checking service 0xfe95 for handle: 54"
D NimBLEClient: "checking service ebe0ccb0-7a0a-4b0c-8a1a-6ff2997da3a6 for handle: 54"
D NimBLEClient: "Got Notification for characteristic Characteristic: uuid: ebe0ccc1-7a0a-4b0c-8a1a-6ff2997da3a6, handle: 54 0x0036, props:  0x12"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 0 handle: 0"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 0 handle: 0"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 14 handle: 0"
D FreeRTOS: "Semaphore giving: name: GetDescEvt (0x3ffcf474), owner: retrieveDescriptors"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D FreeRTOS: "<< wait: Semaphore released: name: GetDescEvt (0x3ffcf474), owner: <N/A>"
D NimBLERemoteService: "Found UUID: ebe0ccbe-7a0a-4b0c-8a1a-6ff2997da3a6 Handle: 51 Def Handle: 50"
D NimBLERemoteService: "Next UUID: ebe0ccc1-7a0a-4b0c-8a1a-6ff2997da3a6 Handle: 54 Def Handle: 53"
D NimBLERemoteCharacteristic: ">> retrieveDescriptors() for characteristic: ebe0ccbe-7a0a-4b0c-8a1a-6ff2997da3a6"
D FreeRTOS: "Semaphore taking: name: GetDescEvt (0x3ffcf75c), owner: <N/A> for retrieveDescriptors"
D FreeRTOS: "Semaphore taken:  name: GetDescEvt (0x3ffcf75c), owner: retrieveDescriptors"
D FreeRTOS: ">> wait: Semaphore waiting: name: GetDescEvt (0x3ffcf75c), owner: retrieveDescriptors for retrieveCharacteristics"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 0 handle: 0"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 14 handle: 0"
D FreeRTOS: "Semaphore giving: name: GetDescEvt (0x3ffcf75c), owner: retrieveDescriptors"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D FreeRTOS: "<< wait: Semaphore released: name: GetDescEvt (0x3ffcf75c), owner: <N/A>"
D NimBLERemoteService: "Found UUID: ebe0ccc1-7a0a-4b0c-8a1a-6ff2997da3a6 Handle: 54 Def Handle: 53"
D NimBLERemoteService: "Next UUID: ebe0ccc4-7a0a-4b0c-8a1a-6ff2997da3a6 Handle: 58 Def Handle: 57"
D NimBLERemoteCharacteristic: ">> retrieveDescriptors() for characteristic: ebe0ccc1-7a0a-4b0c-8a1a-6ff2997da3a6"
D FreeRTOS: "Semaphore taking: name: GetDescEvt (0x3ffcfa44), owner: <N/A> for retrieveDescriptors"
D FreeRTOS: "Semaphore taken:  name: GetDescEvt (0x3ffcfa44), owner: retrieveDescriptors"
D FreeRTOS: ">> wait: Semaphore waiting: name: GetDescEvt (0x3ffcfa44), owner: retrieveDescriptors for retrieveCharacteristics"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 0 handle: 0"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 0 handle: 0"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 14 handle: 0"
D FreeRTOS: "Semaphore giving: name: GetDescEvt (0x3ffcfa44), owner: retrieveDescriptors"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D FreeRTOS: "<< wait: Semaphore released: name: GetDescEvt (0x3ffcfa44), owner: <N/A>"
D NimBLERemoteService: "Found UUID: ebe0ccc4-7a0a-4b0c-8a1a-6ff2997da3a6 Handle: 58 Def Handle: 57"
D NimBLERemoteService: "Next UUID: ebe0ccc8-7a0a-4b0c-8a1a-6ff2997da3a6 Handle: 61 Def Handle: 60"
D NimBLERemoteCharacteristic: ">> retrieveDescriptors() for characteristic: ebe0ccc4-7a0a-4b0c-8a1a-6ff2997da3a6"
D FreeRTOS: "Semaphore taking: name: GetDescEvt (0x3ffcfd2c), owner: <N/A> for retrieveDescriptors"
D FreeRTOS: "Semaphore taken:  name: GetDescEvt (0x3ffcfd2c), owner: retrieveDescriptors"
D FreeRTOS: ">> wait: Semaphore waiting: name: GetDescEvt (0x3ffcfd2c), owner: retrieveDescriptors for retrieveCharacteristics"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 0 handle: 0"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 14 handle: 0"
D FreeRTOS: "Semaphore giving: name: GetDescEvt (0x3ffcfd2c), owner: retrieveDescriptors"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D FreeRTOS: "<< wait: Semaphore released: name: GetDescEvt (0x3ffcfd2c), owner: <N/A>"
D NimBLERemoteService: "Found UUID: ebe0ccc8-7a0a-4b0c-8a1a-6ff2997da3a6 Handle: 61 Def Handle: 60"
D NimBLERemoteService: "Next UUID: ebe0ccd1-7a0a-4b0c-8a1a-6ff2997da3a6 Handle: 64 Def Handle: 63"
D NimBLERemoteCharacteristic: ">> retrieveDescriptors() for characteristic: ebe0ccc8-7a0a-4b0c-8a1a-6ff2997da3a6"
D FreeRTOS: "Semaphore taking: name: GetDescEvt (0x3ffd0014), owner: <N/A> for retrieveDescriptors"
D FreeRTOS: "Semaphore taken:  name: GetDescEvt (0x3ffd0014), owner: retrieveDescriptors"
D FreeRTOS: ">> wait: Semaphore waiting: name: GetDescEvt (0x3ffd0014), owner: retrieveDescriptors for retrieveCharacteristics"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 0 handle: 0"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 14 handle: 0"
D FreeRTOS: "Semaphore giving: name: GetDescEvt (0x3ffd0014), owner: retrieveDescriptors"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D FreeRTOS: "<< wait: Semaphore released: name: GetDescEvt (0x3ffd0014), owner: <N/A>"
D NimBLERemoteService: "Found UUID: ebe0ccd1-7a0a-4b0c-8a1a-6ff2997da3a6 Handle: 64 Def Handle: 63"
D NimBLERemoteService: "Next UUID: ebe0ccd7-7a0a-4b0c-8a1a-6ff2997da3a6 Handle: 67 Def Handle: 66"
D NimBLERemoteCharacteristic: ">> retrieveDescriptors() for characteristic: ebe0ccd1-7a0a-4b0c-8a1a-6ff2997da3a6"
D FreeRTOS: "Semaphore taking: name: GetDescEvt (0x3ffd02fc), owner: <N/A> for retrieveDescriptors"
D FreeRTOS: "Semaphore taken:  name: GetDescEvt (0x3ffd02fc), owner: retrieveDescriptors"
D FreeRTOS: ">> wait: Semaphore waiting: name: GetDescEvt (0x3ffd02fc), owner: retrieveDescriptors for retrieveCharacteristics"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 0 handle: 0"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 14 handle: 0"
D FreeRTOS: "Semaphore giving: name: GetDescEvt (0x3ffd02fc), owner: retrieveDescriptors"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D FreeRTOS: "<< wait: Semaphore released: name: GetDescEvt (0x3ffd02fc), owner: <N/A>"
D NimBLERemoteService: "Found UUID: ebe0ccd7-7a0a-4b0c-8a1a-6ff2997da3a6 Handle: 67 Def Handle: 66"
D NimBLERemoteService: "Next UUID: ebe0ccd8-7a0a-4b0c-8a1a-6ff2997da3a6 Handle: 70 Def Handle: 69"
D NimBLERemoteCharacteristic: ">> retrieveDescriptors() for characteristic: ebe0ccd7-7a0a-4b0c-8a1a-6ff2997da3a6"
D FreeRTOS: "Semaphore taking: name: GetDescEvt (0x3ffd05e4), owner: <N/A> for retrieveDescriptors"
D FreeRTOS: "Semaphore taken:  name: GetDescEvt (0x3ffd05e4), owner: retrieveDescriptors"
D FreeRTOS: ">> wait: Semaphore waiting: name: GetDescEvt (0x3ffd05e4), owner: retrieveDescriptors for retrieveCharacteristics"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 0 handle: 0"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 14 handle: 0"
D FreeRTOS: "Semaphore giving: name: GetDescEvt (0x3ffd05e4), owner: retrieveDescriptors"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D FreeRTOS: "<< wait: Semaphore released: name: GetDescEvt (0x3ffd05e4), owner: <N/A>"
D NimBLERemoteService: "Found UUID: ebe0ccd8-7a0a-4b0c-8a1a-6ff2997da3a6 Handle: 70 Def Handle: 69"
D NimBLERemoteService: "Next UUID: ebe0ccd9-7a0a-4b0c-8a1a-6ff2997da3a6 Handle: 73 Def Handle: 72"
D NimBLERemoteCharacteristic: ">> retrieveDescriptors() for characteristic: ebe0ccd8-7a0a-4b0c-8a1a-6ff2997da3a6"
D FreeRTOS: "Semaphore taking: name: GetDescEvt (0x3ffd08cc), owner: <N/A> for retrieveDescriptors"
D FreeRTOS: "Semaphore taken:  name: GetDescEvt (0x3ffd08cc), owner: retrieveDescriptors"
D FreeRTOS: ">> wait: Semaphore waiting: name: GetDescEvt (0x3ffd08cc), owner: retrieveDescriptors for retrieveCharacteristics"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 0 handle: 0"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 14 handle: 0"
D FreeRTOS: "Semaphore giving: name: GetDescEvt (0x3ffd08cc), owner: retrieveDescriptors"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D FreeRTOS: "<< wait: Semaphore released: name: GetDescEvt (0x3ffd08cc), owner: <N/A>"
D NimBLERemoteService: "Found UUID: ebe0ccd9-7a0a-4b0c-8a1a-6ff2997da3a6 Handle: 73 Def Handle: 72"
D NimBLERemoteService: "END CHARS"
D NimBLERemoteCharacteristic: ">> retrieveDescriptors() for characteristic: ebe0ccd9-7a0a-4b0c-8a1a-6ff2997da3a6"
D FreeRTOS: "Semaphore taking: name: GetDescEvt (0x3ffd0bb4), owner: <N/A> for retrieveDescriptors"
D FreeRTOS: "Semaphore taken:  name: GetDescEvt (0x3ffd0bb4), owner: retrieveDescriptors"
D FreeRTOS: ">> wait: Semaphore waiting: name: GetDescEvt (0x3ffd0bb4), owner: retrieveDescriptors for retrieveCharacteristics"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 0 handle: 0"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 0 handle: 0"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D NimBLERemoteCharacteristic: "Descriptor Discovered >> status: 14 handle: 0"
D FreeRTOS: "Semaphore giving: name: GetDescEvt (0x3ffd0bb4), owner: retrieveDescriptors"
D NimBLERemoteCharacteristic: "<< Descriptor Discovered. status: 0"
D FreeRTOS: "<< wait: Semaphore released: name: GetDescEvt (0x3ffd0bb4), owner: <N/A>"
D NimBLERemoteService: "<< retrieveCharacteristics()"
D NimBLEClient: "<< retrieveServices"
D NimBLEClient: "Found 8 services"
D NimBLEClientCallbacks: "onConnect: default"
D NimBLEClient: "<< connect()"
Connected
D NimBLEClient: ">> getService: uuid: ebe0ccb0-7a0a-4b0c-8a1a-6ff2997da3a6"
D NimBLEClient: "<< getService: found the service with uuid: ebe0ccb0-7a0a-4b0c-8a1a-6ff2997da3a6"
 - Found our service
 - Found our characteristic
Can read
D NimBLERemoteCharacteristic: ">> readValue(): uuid: ebe0ccc1-7a0a-4b0c-8a1a-6ff2997da3a6, handle: 54 0x36"
D FreeRTOS: "Semaphore taking: name: ReadCharEvt (0x3ffcfaa4), owner: <N/A> for readValue"
D FreeRTOS: "Semaphore taken:  name: ReadCharEvt (0x3ffcfaa4), owner: readValue"
D FreeRTOS: ">> wait: Semaphore waiting: name: ReadCharEvt (0x3ffcfaa4), owner: readValue for readValue"
D NimBLEClient: "Got Client event BLE_GAP_EVENT_NOTIFY_RX"
D NimBLEClient: "Notify Recieved for handle: 54"
D NimBLEClient: "checking service 00000100-0065-6c62-2e74-6f696d2e696d for handle: 54"
D NimBLEClient: "checking service 0xfe95 for handle: 54"
D NimBLEClient: "checking service ebe0ccb0-7a0a-4b0c-8a1a-6ff2997da3a6 for handle: 54"
D NimBLEClient: "Got Notification for characteristic Characteristic: uuid: ebe0ccc1-7a0a-4b0c-8a1a-6ff2997da3a6, handle: 54 0x0036, props:  0x12
Descriptor: uuid: 0x2901, handle: 55
Descriptor: uuid: 0x2902, handle: 56"
I NimBLERemoteCharacteristic: "Read complete; status=0 conn_handle=0"
D FreeRTOS: "Semaphore giving: name: ReadCharEvt (0x3ffcfaa4), owner: readValue"
D FreeRTOS: "<< wait: Semaphore released: name: ReadCharEvt (0x3ffcfaa4), owner: <N/A>"
D NimBLERemoteCharacteristic: "<< readValue(): length: 3"
LYWSD03MMC temperature = 0.00 : humidity = 0
Can notify
 - Found our characteristic
Can read
D NimBLERemoteCharacteristic: ">> readValue(): uuid: ebe0ccc4-7a0a-4b0c-8a1a-6ff2997da3a6, handle: 58 0x3a"
D FreeRTOS: "Semaphore taking: name: ReadCharEvt (0x3ffcfd8c), owner: <N/A> for readValue"
D FreeRTOS: "Semaphore taken:  name: ReadCharEvt (0x3ffcfd8c), owner: readValue"
D FreeRTOS: ">> wait: Semaphore waiting: name: ReadCharEvt (0x3ffcfd8c), owner: readValue for readValue"
I NimBLERemoteCharacteristic: "Read complete; status=0 conn_handle=0"
D FreeRTOS: "Semaphore giving: name: ReadCharEvt (0x3ffcfd8c), owner: readValue"
D FreeRTOS: "<< wait: Semaphore released: name: ReadCharEvt (0x3ffcfd8c), owner: <N/A>"
D NimBLERemoteCharacteristic: "<< readValue(): length: 1"
LYWSD03MMC battery = 100
D NimBLEClient: ">> disconnect()"
D NimBLEClient: "<< disconnect()"
D NimBLEClient: ">> clearServices"
D NimBLEClient: "<< clearServices"
D NimBLEClient: "Got Client event BLE_GAP_EVENT_DISCONNECT"

@Jeroen88 Jeroen88 mentioned this issue Apr 29, 2020
@h2zero
Copy link
Owner

h2zero commented Apr 29, 2020

This part of the log is strange:

D NimBLERemoteCharacteristic: ">> readValue(): uuid: ebe0ccc1-7a0a-4b0c-8a1a-6ff2997da3a6, handle: 54 0x36"
D FreeRTOS: "Semaphore taking: name: ReadCharEvt (0x3ffcfaa4), owner: <N/A> for readValue"
D FreeRTOS: "Semaphore taken:  name: ReadCharEvt (0x3ffcfaa4), owner: readValue"
D FreeRTOS: ">> wait: Semaphore waiting: name: ReadCharEvt (0x3ffcfaa4), owner: readValue for readValue"
D NimBLEClient: "Got Client event BLE_GAP_EVENT_NOTIFY_RX"
D NimBLEClient: "Notify Recieved for handle: 54"
D NimBLEClient: "checking service 00000100-0065-6c62-2e74-6f696d2e696d for handle: 54"
D NimBLEClient: "checking service 0xfe95 for handle: 54"
D NimBLEClient: "checking service ebe0ccb0-7a0a-4b0c-8a1a-6ff2997da3a6 for handle: 54"
D NimBLEClient: "Got Notification for characteristic Characteristic: uuid: ebe0ccc1-7a0a-4b0c-8a1a-6ff2997da3a6, handle: 54 0x0036, props:  0x12
Descriptor: uuid: 0x2901, handle: 55
Descriptor: uuid: 0x2902, handle: 56"
I NimBLERemoteCharacteristic: "Read complete; status=0 conn_handle=0"
D FreeRTOS: "Semaphore giving: name: ReadCharEvt (0x3ffcfaa4), owner: readValue"
D FreeRTOS: "<< wait: Semaphore released: name: ReadCharEvt (0x3ffcfaa4), owner: <N/A>"
D NimBLERemoteCharacteristic: "<< readValue(): length: 3"
LYWSD03MMC temperature = 0.00 : humidity = 0
Can notify
 - Found our characteristic
Can read
D NimBLERemoteCharacteristic: ">> readValue(): uuid: ebe0ccc4-7a0a-4b0c-8a1a-6ff2997da3a6, handle: 58 0x3a"
D FreeRTOS: "Semaphore taking: name: ReadCharEvt (0x3ffcfd8c), owner: <N/A> for readValue"
D FreeRTOS: "Semaphore taken:  name: ReadCharEvt (0x3ffcfd8c), owner: readValue"
D FreeRTOS: ">> wait: Semaphore waiting: name: ReadCharEvt (0x3ffcfd8c), owner: readValue for readValue"
I NimBLERemoteCharacteristic: "Read complete; status=0 conn_handle=0"
D FreeRTOS: "Semaphore giving: name: ReadCharEvt (0x3ffcfd8c), owner: readValue"
D FreeRTOS: "<< wait: Semaphore released: name: ReadCharEvt (0x3ffcfd8c), owner: <N/A>"
D NimBLERemoteCharacteristic: "<< readValue(): length: 1"
LYWSD03MMC battery = 100
D NimBLEClient: ">> disconnect()"
D NimBLEClient: "<< disconnect()"
D NimBLEClient: ">> clearServices"
D NimBLEClient: "<< clearServices"
D NimBLEClient: "Got Client event BLE_GAP_EVENT_DISCONNECT"

Is this your own custom peripheral device?

It looks like when you try to read the temp/humidity characteristic the peripheral sends a notification instead of returning a read response with the data. However the battery characteristic does not, so you get the correct reading.

Could you add this:

for(int i=0; i<attr->om->om_len; i++) {
	NIMBLE_LOGD(LOG_TAG, "byte%d = 0x%02x", i, attr->om->om_data[i]);
}

here to see what data NimBLE returns?

@Jeroen88
Copy link
Author

Jeroen88 commented Apr 29, 2020

No this is not a custom device, it is a standard (square, new type) Xiaomi temp/humidity sensor. I also saw that the same call for the read of a characteristic leads to different paths through the program. For the battery this leads to the correct result, for the temp / humidity it does not.

I wil try your suggestion later, probably tomorrow. For now, from my own tests I found out that for the humidity and temperature, the right values are here (in NimBLEClient::handleGapEvent)

            for(auto &sPair : client->m_servicesMap){
                // Dont waste cycles searching services without this handle in their range
                if(sPair.second->getEndHandle() < event->notify_rx.attr_handle) {
                    continue;
                }
                auto cMap = sPair.second->getCharacteristicsByHandle();
                NIMBLE_LOGD(LOG_TAG, "checking service %s for handle: %d", sPair.second->getUUID().toString().c_str(),event->notify_rx.attr_handle);
                auto characteristic = cMap->find(event->notify_rx.attr_handle);
                if(characteristic != cMap->end()) {
                    NIMBLE_LOGD(LOG_TAG, "Got Notification for characteristic %s", characteristic->second->toString().c_str());
char buf[256];
memcpy(buf, event->notify_rx.om->om_data, event->notify_rx.om->om_len);
*(event->notify_rx.om->om_data + event->notify_rx.om->om_len) = '\0';
characteristic->second->m_value = std::string(buf, event->notify_rx.om->om_len);
//event->notify_rx.om->om_data -= 2;
//event->notify_rx.om->om_len += 2;

NIMBLE_LOGD(LOG_TAG, "HERE length is %u and value is'%s'\n", event->notify_rx.om->om_len, (char*) event->notify_rx.om->om_data);

The assignment to characteristic->second->m_value works to get the right value to BLERemoteCharacteristic::readValue(), but I did not find out yet how to differentiate between the two cases, because this messes up the battery value...

WITH above assignment to m_value the right temperature and humidity is in characteristic->m_value while the right battery value is in attr->om->om_data in NimBLERemoteCharacteristic::onReadCB. The code below shows the right temp / humdity for the first call in the first log, and the right battery for the second call in the second log:

    if(characteristic->m_rawData != nullptr) {
        free(characteristic->m_rawData);
    }
    
    if (error->status == 0) {       
NIMBLE_LOGI(LOG_TAG, "In CB value length is %u and value is '%s', humidity is %u\n", characteristic->m_value.length(), characteristic->m_value.c_str(), characteristic->m_value[2]);
NIMBLE_LOGI(LOG_TAG, "In CB om    length is %u and value is '%s', battery is %u\n", attr->om->om_len, (char*) attr->om->om_data, attr->om->om_data[0]);
        characteristic->m_value = std::string((char*) attr->om->om_data, attr->om->om_len);
        characteristic->m_rawData = (uint8_t*) calloc(attr->om->om_len, sizeof(uint8_t));
        memcpy(characteristic->m_rawData, attr->om->om_data, attr->om->om_len);
        characteristic->m_semaphoreReadCharEvt.give(0);
    } else {
        characteristic->m_rawData = nullptr;
        characteristic->m_value = "";
        characteristic->m_semaphoreReadCharEvt.give(error->status);
    }

Does this make any sense to you?

@h2zero
Copy link
Owner

h2zero commented Apr 29, 2020

Well my thoughts on this are that the device you're connecting to does not support reading properly and was only intended to send notifications of those values. Which makes sense in a way but it should not have it's readable flag set. Would not be the first time an off the shelf device didn't follow the core specification 😄.

So for an explanation of what your code change has done is it has populated the remote characteristic value with the data sent in a notification, but if the battery characteristic doesn't send those you won't get the value updated there and you will have to read it. The readValue() method here is quite simple, makes a call to the NimBLE stack, and waits for the returned response in the onReadCB(). The fact you are getting the correct data when reading the battery characteristic shows that this is working. The temp/humidity characteristic however does not respond with the data when read but sends notifications instead, which also seems to happen when you have not subscribed to them yet lol, again not following the spec.

Unless I'm missing something here, it seems to me to be an incorrectly coded peripheral. For your puropses I would suggest waiting for a notification to obtain the value, then read the battery then disconnect/delete client.

@Staars
Copy link
Contributor

Staars commented Apr 29, 2020

Hi,

the LYWSD03MMC definitely provides hum/temp via notifications and it is working without any problem with your library. You can check this behavior with every BLE-APP on your phone (i.e. BLE Scanner). In contrast the battery is a readValue and BTW it always gives you 99% as it seems to be hard coded ;)

@Jeroen88
Copy link
Author

@Staars Hi Christiaan, it certainly does, but it makes my use case less elegant. I just need the values at regular intervals, and reading the values at those times is more logical than registrating a call back and waiting for the result. But maybe it is the only option...

@h2zero Thanks for your extensive analysis. Would it be an option to have the library support such a scheme, reading a characteristic and pick it up from the notification?

@chegewara
Copy link

Sorry, i ddint read all posts in this topic, but after reading this one:
#19
i may know what problem you have.

You are trying to read raw data with function that is using std::string. You need to use getData() instead (its function from old library, dont know if this library got it).
Now, when you know what data are sent you can use casting to type you need, ie:

uint8_t* data = pChar->getData(); // 5 bytes
int integer = *data; // int is sizeof 4 bytes
uint8_t short = data[4]; // last one remaining byte

@Jeroen88
Copy link
Author

@chegewara the function getData() does not exist indeed, neither on the NimBLECharacteristic nor on the BLECharacteristic. I would love to have such a function, do you have example code?

The issue is that the peripheral responds in a, according to @h2zero, off specs way. Does the getData() that you have in mind solve that problem?

@chegewara
Copy link

Yes, i think it is in BLERemoteCharacteristic.

@Jeroen88
Copy link
Author

@chegewara I meant, it is not (Nim-)BLERemoteCharacteristic. I made a PR #27 for this, but if the functionality is already available, that would be better.

@h2zero
Copy link
Owner

h2zero commented Apr 30, 2020

I think @chegewara was referring to the getRawData() method, which does exist.

I am unsure what you are trying to accomplish in your app, just trying to avoid using the callbacks? I don't think that would be realistic considering the nature of the peripheral. BLE only has 3 ways to get data from a server, 1 is a read operation, 2 is notifications, 3 is in advertisement packets.

The trouble with this peripheral is it does not respond to a read request with a read response containing the data and instead sends a notification with it. The good news is it sends the notification immediately after the read request, so it seems from your logs, at least you don't have to wait long for it.

From what I've seen on other posts about this device is you may be able to extract the data you want from the advertisement packet, but you need to decrypt it.

@Jeroen88
Copy link
Author

Jeroen88 commented May 1, 2020

getRawData() uses readValue() under the hood, so that leads to the same problem.

I try to accomplish simple and easy to maintain code. Reading a characteristic is far more simple than reading it, registering a callback, monitoring if the callback has completed, stopping the callback, using the value*. I realize that reading a characteristic is also async, but this is abstracted away from the sketch by the library, which is a good thing!

*I am now testing with a second device, that sets canRead() to false, so I think I must indeed implement this one with a notify callback.

@Jeroen88
Copy link
Author

Solved by PR #49

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

4 participants