Esp32 ble polar HR

https://forum.arduino.cc/t/ble-notifycalback-is-not-working/877134

I am trying to replicate the same code to extract PPI data from my polar verity sense. I am stuck at the same point where in I get no responses from my device regardless of what I send.

Any help would be appreciated



//===== header file & define & global variable ===== 
#include"BLEDevice.h"
char val1 = 0;
char incomingByte;
boolean doConnect = false;
volatile boolean isConnected = false;
boolean doScan = false;

BLEUUID pmd_serviceUUID ("FB005C80-02E7-F387-1CAD-8ACD2D8DF0C8");
BLEUUID pmd_dataUUID ("FB005C82-02E7-F387-1CAD-8ACD2D8DF0C8");
BLEUUID pmd_ctrlUUID ("FB005C81-02E7-F387-1CAD-8ACD2D8DF0C8");
BLEAdvertisedDevice* myDevice;
BLEClient* pClient;
//---------------------------------------------------------------
static BLERemoteCharacteristic* pDataCharacteristic;
static BLERemoteCharacteristic* pControlCharacteristic;

String SensorName = "Polar Sense 91102B26"; // SDから読み取る
//===========================================


//===== class & function ====================
class MyClientCallback: public BLEClientCallbacks{
  void onConnect(BLEClient* pclient){ }
  void onDisconnect(BLEClient* pclient){
    isConnected = false;
    Serial.println("onDisconnetct");  
  }
};

// BLEデバイスを検索する
class MyAdvertisedDeviceCallback: public BLEAdvertisedDeviceCallbacks{
  void onResult(BLEAdvertisedDevice advertisedDevice) {
    Serial.println(advertisedDevice.toString().c_str());
    // 指定デバイスなら接続する
    if(SensorName.equals(advertisedDevice.getName().c_str())){
      Serial.print("Connect BLE device : ");
      Serial.println(advertisedDevice.toString().c_str());
      BLEDevice::getScan()->stop();
      myDevice = new BLEAdvertisedDevice(advertisedDevice);
      doConnect = true;
      doScan = true;
    }
  }
};

void notifyCallback(BLERemoteCharacteristic* pBLERemoteCharacteristic, uint8_t* pData, size_t length, bool isNotify){
  Serial.print("Notify callback for characteristic ");
  Serial.print(pBLERemoteCharacteristic->getUUID().toString().c_str());
  Serial.print(" of data length ");
  Serial.println(length);
  Serial.print("data: ");
  for (int i = 0; i <= length - 1; i++) {
    Serial.print(String(*(pData + i), HEX));
    Serial.print(" ");
  }
  Serial.println();
}

bool connectToServer(){
  Serial.print("connection to : ");
  Serial.println(myDevice->getAddress().toString().c_str());
  pClient = BLEDevice::createClient();
  Serial.println(" - Created client");
  pClient->setClientCallbacks(new MyClientCallback() );
  pClient->connect(myDevice);
  Serial.println(" - Created to server");

  BLERemoteService* pRemoteService = pClient->getService(pmd_serviceUUID);
  if (pRemoteService == nullptr) {
     Serial.println("Failed to find our service UUID: ");
     Serial.println(pmd_serviceUUID.toString().c_str());
     pClient->disconnect();
     return false;
  }
  Serial.print(" - Found service ( ");
  Serial.print(pmd_serviceUUID.toString().c_str());
  Serial.println(" )");

  
  pControlCharacteristic = pRemoteService->getCharacteristic(pmd_ctrlUUID);
  if( pControlCharacteristic == nullptr ){
    Serial.print("Failed to find out characteristic UUID : ");
    Serial.println(pmd_ctrlUUID.toString().c_str());
    pClient->disconnect();
    return false;
  }

  Serial.println("characteristics");
  std::map<uint16_t, BLERemoteCharacteristic*>* mapCharacteristics = pRemoteService->getCharacteristicsByHandle();
  for (std::map<uint16_t, BLERemoteCharacteristic*>::iterator i = mapCharacteristics->begin(); i != mapCharacteristics->end(); ++i) {
    Serial.print(" - characteristic UUID : ");
    Serial.print(i->second->getUUID().toString().c_str());
    Serial.print(" Broadcast:");
    Serial.print(i->second->canBroadcast()?'O':'X');
    Serial.print(" Read:");
    Serial.print(i->second->canRead()?'O':'X');
    Serial.print(" WriteNoResponse:");
    Serial.print(i->second->canWriteNoResponse()?'O':'X');
    Serial.print(" Write:");
    Serial.print(i->second->canWrite()?'O':'X');
    Serial.print(" Notify:");
    Serial.print(i->second->canNotify()?'O':'X');
    Serial.print(" Indicate:");
    Serial.print(i->second->canIndicate()?'O':'X');
    Serial.println();
  }

  
  pDataCharacteristic = pRemoteService->getCharacteristic(pmd_dataUUID);
    if( pDataCharacteristic == nullptr ){
    Serial.print("Failed to find out characteristic UUID : ");
    Serial.println(pmd_dataUUID.toString().c_str());
    pClient->disconnect();
    return false;
  }
  Serial.print(" - Add Notify ( ");
  Serial.print(pmd_dataUUID.toString().c_str());
  Serial.println(" )");
  pDataCharacteristic->registerForNotify(notifyCallback);
  pControlCharacteristic->registerForNotify(notifyCallback);
  if(pDataCharacteristic->canNotify()){
    //std::string value = pControlCharacteristic->readValue();
    
    const uint8_t data[2] = {0x01,0x00};
    pControlCharacteristic->writeValue((uint8_t*)data,2,false);
    Serial.println(" - Set value");
    
    Serial.println(" - Can Notify");
    
  }
  
  isConnected = true;
  return true;
}
//===========================================
bool flag = false;
long timeT = 0;
//===== setting =============================
void setup() {
  Serial.begin(115200);
  Serial.println("Starting Arduino BLE Client application...");
  BLEDevice::init("");
  static BLEScan* pBLEScan = BLEDevice::getScan();
  pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallback());
  pBLEScan->setInterval(1349);
  pBLEScan->setWindow(449);
  pBLEScan->setActiveScan(true);
  pBLEScan->start(5, false);
  timeT = millis();
}
//===========================================


//===== main ================================
void loop(){
  if(doConnect==true){
    if(connectToServer()){
      Serial.println("now connected to BLE Server.");
    }else{
      Serial.println("faild to connect to the server.");
    }
    doConnect = false;
  }

  if( isConnected == false && doScan == true ) BLEDevice::getScan()->start(0);
  delay(1000);

  if(millis()-timeT > 10 && flag  == false){
    
  }
  if (Serial.available() > 0) {
    // read the incoming byte:
    incomingByte = Serial.read();  
    val1 = incomingByte; 

    // say what you got:
    Serial.print("I received: ");
    Serial.println(incomingByte, DEC);

    switch (val1) {    
        case '0':
          if(pDataCharacteristic->canNotify()){    
            const uint8_t data[10] = {0x02, 0x00, 0x00, 0x01, 0x82, 0x00, 0x01, 0x01, 0x0E, 0x00};
            pControlCharacteristic->writeValue((uint8_t*)data,10,false);
            Serial.println(" - Set value");    
            Serial.println(" - Can Notify");    
          }
          break;
        case '1':
          if(pDataCharacteristic->canNotify()){    
            const uint8_t data[2] = {0x01,0x03};
            pControlCharacteristic->writeValue((uint8_t*)data,2,false);
            Serial.println(" - Set value");    
            Serial.println(" - Can Notify");    
          }
          break;
        case '2':
          if(pDataCharacteristic->canNotify()){    
            const uint8_t data[2] = {0x02,0x03};
            pControlCharacteristic->writeValue((uint8_t*)data,2,false);
            Serial.println(" - Set value");    
            Serial.println(" - Can Notify");    
          }
          break;
        case '3':
          if(pDataCharacteristic->canNotify()){    
            const uint8_t data[2] = {0x01,0x00};
            pControlCharacteristic->writeValue((uint8_t*)data,2,false);
            Serial.println(" - Set value");    
            Serial.println(" - Can Notify");    
          }
          break;
    }
  }
}
//===========================================

toshiki_imai have you had any success with this?

1 Like

I'm stuck with this also.
Can read from Control Characteristic no problem.
Write anything to Control Characteristic and get no reply on the PMD data Characteristic.
Can read all the standard GATT services no problem.

Their documentation isn't very clear, but
somewhere in there it tells you to set the MTU to 232, doing that's solved it for me. By default, I believe it's set to 25.

While establishing a connection, use the below line to set the MTU to 232

pClient->setMTU(232);

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.