3#include <NimBLEDevice.h>
9 static auto* LOG_TAG =
"utils";
11 static bool isNull(
const NimBLEUUID& uuid) {
return uuid.bitSize() == 0; }
13 static std::string remoteCharToStr(
const NimBLERemoteCharacteristic* pChar) {
14 auto str = pChar->toString();
16 std::string::size_type pos = str.find(
'\n');
17 if (pos != std::string::npos) {
18 return str.substr(0, pos);
23 static bool discoverAttributes(
const NimBLEAddress address) {
24 auto* pClient = BLEDevice::getClientByPeerAddress(address);
26 BLEGC_LOGE(LOG_TAG,
"BLE client not found, address %s", std::string(address).c_str());
29 if (!pClient->discoverAttributes()) {
30 BLEGC_LOGE(LOG_TAG,
"Failed to discover attributes, address %s", std::string(address).c_str());
34#if CONFIG_BT_BLEGC_LOG_LEVEL >= 4
35 for (
auto& pService : pClient->getServices(
false)) {
36 BLEGC_LOGD(LOG_TAG,
"Discovered service %s", std::string(pService->getUUID()).c_str());
37 for (
auto& pChar : pService->getCharacteristics(
false)) {
38 BLEGC_LOGD(LOG_TAG,
"Discovered characteristic %s", remoteCharToStr(pChar).c_str());
45 using BLECharacteristicFilter = std::function<bool(NimBLERemoteCharacteristic*)>;
47 static NimBLERemoteCharacteristic* findCharacteristic(
48 const NimBLEAddress address,
49 const NimBLEUUID& serviceUUID,
50 const NimBLEUUID& characteristicUUID = NimBLEUUID(),
51 const BLECharacteristicFilter& filter = [](NimBLERemoteCharacteristic*) {
return true; }) {
52 BLEGC_LOGD(LOG_TAG,
"Looking up for characteristic, service uuid: %s, characteristic uuid: %s.",
53 std::string(serviceUUID).c_str(),
54 isNull(characteristicUUID) ?
"null" : std::string(characteristicUUID).c_str());
56 auto* pBleClient = NimBLEDevice::getClientByPeerAddress(address);
58 BLEGC_LOGE(LOG_TAG,
"BLE client not found, address %s", std::string(address).c_str());
62 auto* pService = pBleClient->getService(serviceUUID);
64 BLEGC_LOGE(LOG_TAG,
"Service not found, service uuid: %s", std::string(serviceUUID).c_str());
68 for (
auto* pChar : pService->getCharacteristics(
false)) {
69 if (!isNull(characteristicUUID) && characteristicUUID != pChar->getUUID()) {
80 BLEGC_LOGE(LOG_TAG,
"Characteristic not found, service uuid: %s, characteristic uuid: %s.", std::string(serviceUUID).c_str(),
81 isNull(characteristicUUID) ?
"null" : std::string(characteristicUUID).c_str());