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;
}
}
}
//===========================================