/** * Create a sample BLE client that connects to a BLE server and then waits for server generated * notifications and logs them when they arrive. */ #include <esp_log.h> #include <string> #include <sstream> #include <sys/time.h> #include "BLEDevice.h" #include "BLEAdvertisedDevice.h" #include "BLEClient.h" #include "BLEScan.h" #include "BLEUtils.h" #include "Task.h" #include "sdkconfig.h" static const char* LOG_TAG = "SampleClient_Notify"; // See the following for generating UUIDs: // https://www.uuidgenerator.net/ // The remote service we wish to connect to. static BLEUUID serviceUUID("91bad492-b950-4226-aa2b-4ede9fa42f59"); // The characteristic of the remote service we are interested in. static BLEUUID charUUID("0d563a58-196a-48ce-ace2-dfec78acc814"); static void notifyCallback( BLERemoteCharacteristic* pBLERemoteCharacteristic, uint8_t* pData, size_t length, bool isNotify) { ESP_LOGD(LOG_TAG, "Notify callback for characteristic %s of data length %d", pBLERemoteCharacteristic->getUUID().toString().c_str(), length); } /** * Become a BLE client to a remote BLE server. We are passed in the address of the BLE server * as the input parameter when the task is created. */ class MyClient: public Task { void run(void* data) { BLEAddress* pAddress = (BLEAddress*)data; BLEClient* pClient = BLEDevice::createClient(); // Connect to the remove BLE Server. pClient->connect(*pAddress); // Obtain a reference to the service we are after in the remote BLE server. BLERemoteService* pRemoteService = pClient->getService(serviceUUID); if (pRemoteService == nullptr) { ESP_LOGD(LOG_TAG, "Failed to find our service UUID: %s", serviceUUID.toString().c_str()); return; } // Obtain a reference to the characteristic in the service of the remote BLE server. BLERemoteCharacteristic* pRemoteCharacteristic = pRemoteService->getCharacteristic(charUUID); if (pRemoteCharacteristic == nullptr) { ESP_LOGD(LOG_TAG, "Failed to find our characteristic UUID: %s", charUUID.toString().c_str()); return; } // Read the value of the characteristic. std::string value = pRemoteCharacteristic->readValue(); ESP_LOGD(LOG_TAG, "The characteristic value was: %s", value.c_str()); pRemoteCharacteristic->registerForNotify(notifyCallback); ESP_LOGD(LOG_TAG, "%s", pClient->toString().c_str()); ESP_LOGD(LOG_TAG, "-- End of task"); } // run }; // MyClient /** * Scan for BLE servers and find the first one that advertises the service we are looking for. */ class MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks { /** * Called for each advertising BLE server. */ void onResult(BLEAdvertisedDevice advertisedDevice) { ESP_LOGD(LOG_TAG, "Advertised Device: %s", advertisedDevice.toString().c_str()); if (advertisedDevice.haveServiceUUID() && advertisedDevice.getServiceUUID().equals(serviceUUID)) { advertisedDevice.getScan()->stop(); ESP_LOGD(LOG_TAG, "Found our device! address: %s", advertisedDevice.getAddress().toString().c_str()); MyClient* pMyClient = new MyClient(); pMyClient->setStackSize(18000); pMyClient->start(new BLEAddress(*advertisedDevice.getAddress().getNative())); } // Found our server } // onResult }; // MyAdvertisedDeviceCallbacks /** * Perform the work of a sample BLE client. */ void SampleClient_Notify(void) { ESP_LOGD(LOG_TAG, "SampleClient_Notify starting"); BLEDevice::init(""); BLEScan *pBLEScan = BLEDevice::getScan(); pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks()); pBLEScan->setActiveScan(true); pBLEScan->start(30); } // SampleClient