Skip to content

CallBack onWrite notWork #1982

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

Closed
gigirizzi opened this issue Oct 21, 2018 · 7 comments
Closed

CallBack onWrite notWork #1982

gigirizzi opened this issue Oct 21, 2018 · 7 comments
Labels
Status: Stale Issue is stale stage (outdated/stuck)

Comments

@gigirizzi
Copy link

gigirizzi commented Oct 21, 2018

Hi, i try to send message from my Iphone on NodeMCU32S using the 0000ffe0-0000-1000-8000-00805f9b34fb charatcheristic but callback onWrite never call.
I try using advertising but nothing.
I use simple example.
I have commented notify for txCharacteristic .
/*
Video: https://www.youtube.com/watch?v=oCMOYS71NIU
Based on Neil Kolban example for IDF: https://github.com/nkolban/esp32-snippets/blob/master/cpp_utils/tests/BLE%20Tests/SampleNotify.cpp
Ported to Arduino ESP32 by Evandro Copercini

Create a BLE server that, once we receive a connection, will send periodic notifications.
The service advertises itself as: 6E400001-B5A3-F393-E0A9-E50E24DCCA9E
Has a characteristic of: 6E400002-B5A3-F393-E0A9-E50E24DCCA9E - used for receiving data with "WRITE"
Has a characteristic of: 6E400003-B5A3-F393-E0A9-E50E24DCCA9E - used to send data with "NOTIFY"

The design of creating the BLE server is:

  1. Create a BLE Server
  2. Create a BLE Service
  3. Create a BLE Characteristic on the Service
  4. Create a BLE Descriptor on the characteristic
  5. Start the service.
  6. Start advertising.

In this example rxValue is the data received (only accessible inside that function).
And txValue is the data to be sent, in this example just a byte incremented every second.
*/
#include <BLEDevice.h>
#include <BLEServer.h>
#include <BLEUtils.h>
#include <BLE2902.h>
#include "esp_bt_main.h"
#include "esp_bt_device.h"
#include "esp_log.h"
BLEServer *pServer = NULL;
BLECharacteristic * pTxCharacteristic;
bool deviceConnected = false;
bool oldDeviceConnected = false;
uint8_t txValue = 0;

// See the following for generating UUIDs:
// https://www.uuidgenerator.net/

#define SERVICE_UUID "0000ffe0-0000-1000-8000-00805f9b34fb" // UART service UUID
#define CHARACTERISTIC_UUID_RX "0000ffe0-0000-1000-8000-00805f9b34fb"
#define CHARACTERISTIC_UUID_TX "0000ffe0-0000-1000-8000-00805f9b34fb"

class MyServerCallbacks: public BLEServerCallbacks {
void onConnect(BLEServer* pServer){

// esp_ble_set_encryption( (uint8_t*) esp_bt_dev_get_address(), ESP_BLE_SEC_ENCRYPT_MITM);
deviceConnected = true;
};

void onDisconnect(BLEServer* pServer) {
  deviceConnected = false;
}

};

class MyCallbacks: public BLECharacteristicCallbacks {
void onWrite(BLECharacteristic *pCharacteristic) {
std::string rxValue = pCharacteristic->getValue();

  if (rxValue.length() > 0) {
    Serial.println("*********");
    Serial.print("Received Value: ");
    for (int i = 0; i < rxValue.length(); i++)
      Serial.print(rxValue[i]);

    Serial.println();
    Serial.println("*********");
  }
}



void onRead(BLECharacteristic *pCharacteristic) {
     Serial.print("aaaReceived Value: ");
 
   
}

};

void setup() {
Serial.begin(115200);
esp_log_level_set("*", ESP_LOG_VERBOSE);
// Create the BLE Device
BLEDevice::init("UART Service");

// Create the BLE Server
pServer = BLEDevice::createServer();
pServer->setCallbacks(new MyServerCallbacks());

// Create the BLE Service
BLEService *pService = pServer->createService(SERVICE_UUID);

// Create a BLE Characteristic
pTxCharacteristic = pService->createCharacteristic(
CHARACTERISTIC_UUID_TX,
BLECharacteristic::PROPERTY_NOTIFY
);

pTxCharacteristic->addDescriptor(new BLE2902());

BLECharacteristic * pRxCharacteristic = pService->createCharacteristic(
CHARACTERISTIC_UUID_RX,
BLECharacteristic::PROPERTY_WRITE
);

pRxCharacteristic->setCallbacks(new MyCallbacks());

// Start the service
pService->start();

BLEAdvertising *pAdvertising = pServer->getAdvertising();
pAdvertising->setScanFilter(1,0);
pAdvertising->addServiceUUID(SERVICE_UUID);
pAdvertising->start();
BLESecurity *pSecurity = new BLESecurity();
pSecurity->setAuthenticationMode(ESP_LE_AUTH_REQ_SC_BOND);
pSecurity->setCapability(ESP_IO_CAP_OUT);
pSecurity->setInitEncryptionKey(ESP_BLE_ENC_KEY_MASK | ESP_BLE_ID_KEY_MASK);
Serial.println("Characteristic defined! Now you can read it in your phone!");

// Start advertising
pServer->getAdvertising()->start();
Serial.println("Waiting a client connection to notify...");
}

void loop() {

if (deviceConnected) {
  //pTxCharacteristic->setValue(&txValue, 1);
   //  pTxCharacteristic->notify();
    
    txValue++;
delay(1000); // bluetooth stack will go into congestion, if too many packets are sent

}

// disconnecting
if (!deviceConnected && oldDeviceConnected) {
    delay(500); // give the bluetooth stack the chance to get things ready
    pServer->startAdvertising(); // restart advertising
    Serial.println("start advertising");
    oldDeviceConnected = deviceConnected;
}
// connecting
if (deviceConnected && !oldDeviceConnected) {
// do stuff here on connecting
    oldDeviceConnected = deviceConnected;
}

}

@chegewara
Copy link
Contributor

Hi, how do you know its not working?
Do you have any logs you could paste here?

@gigirizzi
Copy link
Author

gigirizzi commented Oct 21, 2018

Where I find log?
In monitor Serial in read this.
⸮⸮D (669) FreeRTOS: Semaphore taking: name: RegisterAppEvt (0x3ffe1fec), owner: <N/A> for registerApp
D (670) FreeRTOS: Semaphore taken: name: RegisterAppEvt (0x3ffe1fec), owner: registerApp
V (676) FreeRTOS: >> wait: Semaphore waiting: name: RegisterAppEvt (0x3ffe1fec), owner: registerApp for registerApp
V (1496) FreeRTOS: Semaphore giving: name: RegisterAppEvt (0x3ffe1fec), owner: registerApp
V (1514) FreeRTOS: << wait: Semaphore released: name: RegisterAppEvt (0x3ffe1fec), owner: registerApp
D (1523) FreeRTOS: Semaphore taking: name: CreateEvt (0x3ffe2214), owner: <N/A> for createService
D (1532) FreeRTOS: Semaphore taken: name: CreateEvt (0x3ffe2214), owner: createService
D (1540) FreeRTOS: Semaphore taking: name: CreateEvt (0x3ffe25c8), owner: <N/A> for executeCreate
D (1548) FreeRTOS: Semaphore taken: name: CreateEvt (0x3ffe25c8), owner: executeCreate
V (1556) FreeRTOS: >> wait: Semaphore waiting: name: CreateEvt (0x3ffe25c8), owner: executeCreate for executeCreate
V (1556) FreeRTOS: Semaphore giving: name: CreateEvt (0x3ffe25c8), owner: executeCreate
V (1574) FreeRTOS: << wait: Semaphore released: name: CreateEvt (0x3ffe25c8), owner: executeCreate
V (1574) FreeRTOS: Semaphore giving: name: CreateEvt (0x3ffe2214), owner: createService
V (1582) FreeRTOS: >> wait: Semaphore waiting: name: CreateEvt (0x3ffe2214), owner: createService for createService
V (1600) FreeRTOS: << wait: Semaphore released: name: CreateEvt (0x3ffe2214), owner: createService
D (1610) FreeRTOS: Semaphore taking: name: CreateEvt (0x3ffe2748), owner: <N/A> for executeCreate
D (1617) FreeRTOS: Semaphore taken: name: CreateEvt (0x3ffe2748), owner: executeCreate
V (1625) FreeRTOS: >> wait: Semaphore waiting: name: CreateEvt (0x3ffe2748), owner: executeCreate for executeCreate
V (1626) FreeRTOS: Semaphore giving: name: CreateEvt (0x3ffe2748), owner: executeCreate
V (1643) FreeRTOS: << wait: Semaphore released: name: CreateEvt (0x3ffe2748), owner: executeCreate
D (1652) FreeRTOS: Semaphore taking: name: CreateEvt (0x3ffe2f4c), owner: <N/A> for executeCreate
D (1660) FreeRTOS: Semaphore taken: name: CreateEvt (0x3ffe2f4c), owner: executeCreate
V (1668) FreeRTOS: >> wait: Semaphore waiting: name: CreateEvt (0x3ffe2f4c), owner: executeCreate for executeCreate
V (1668) FreeRTOS: Semaphore giving: name: CreateEvt (0x3ffe2f4c), owner: executeCreate
V (1686) FreeRTOS: << wait: Semaphore released: name: CreateEvt (0x3ffe2f4c), owner: executeCreate
D (1695) FreeRTOS: Semaphore taking: name: CreateEvt (0x3ffe3020), owner: <N/A> for executeCreate
D (1703) FreeRTOS: Semaphore taken: name: CreateEvt (0x3ffe3020), owner: executeCreate
V (1711) FreeRTOS: >> wait: Semaphore waiting: name: CreateEvt (0x3ffe3020), owner: executeCreate for executeCreate
V (1711) FreeRTOS: Semaphore giving: name: CreateEvt (0x3ffe3020), owner: executeCreate
V (1729) FreeRTOS: << wait: Semaphore released: name: CreateEvt (0x3ffe3020), owner: executeCreate
D (1737) FreeRTOS: Semaphore taking: name: StartEvt (0x3ffe2688), owner: <N/A> for start
D (1745) FreeRTOS: Semaphore taken: name: StartEvt (0x3ffe2688), owner: start
V (1752) FreeRTOS: >> wait: Semaphore waiting: name: StartEvt (0x3ffe2688), owner: start for start
V (1753) FreeRTOS: Semaphore giving: name: StartEvt (0x3ffe2688), owner: start
V (1768) FreeRTOS: << wait: Semaphore released: name: StartEvt (0x3ffe2688), owner: start
Characteristic defined! Now you can read it in your phone!
Waiting a client connection to notify...
V (36922) FreeRTOS: Semaphore giving: name: ConfEvt (0x3ffe2e30), owner: <N/A>
V (36923) FreeRTOS: Semaphore giving: name: ConfEvt (0x3ffe3464), owner: <N/A>

but when i write on characterist with iphone , in log i can't found message....
i have modify sketch , i have commented notify txCharacteristich for a log cleaning.

@chegewara
Copy link
Contributor

This is last useful message:
Waiting a client connection to notify...
You are not connected with iPhone, so how you want to write to characteristic?

@gigirizzi
Copy link
Author

hi, i have resolved , i have modify
BLECharacteristic * pRxCharacteristic = pService->createCharacteristic(
CHARACTERISTIC_UUID_RX,
BLECharacteristic::PROPERTY_WRITE
| BLECharacteristic::PROPERTY_WRITE_NR
);
now onWrite will call;
One ask in onWrite how can send message of response?
i try with one notify but not work on onWrite but only in loop() method? there is an alternative?

@chegewara
Copy link
Contributor

Hi,
sorry, its a glitch in library i havent solved yet. You cant send notify/indicate from onRead/onWrite callbacks or read/write characteristic from onNotifications callback. You have to set flag and do it from loop or start create new task from within onWrite and then call notify() inside this task (i prefer task option).

@stale
Copy link

stale bot commented Aug 1, 2019

This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions.

@stale stale bot added the Status: Stale Issue is stale stage (outdated/stuck) label Aug 1, 2019
@stale
Copy link

stale bot commented Aug 15, 2019

This stale issue has been automatically closed. Thank you for your contributions.

@stale stale bot closed this as completed Aug 15, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Status: Stale Issue is stale stage (outdated/stuck)
Projects
None yet
Development

No branches or pull requests

2 participants