From 70ba09147f2b0ec90b9aa641b11d9bcc5d37323c Mon Sep 17 00:00:00 2001 From: Mariano Goluboff Date: Tue, 22 Sep 2020 12:00:51 -0400 Subject: [PATCH 1/7] Add characteristic discovery to BleService --- wiring/inc/spark_wiring_ble.h | 7 +++ wiring/src/spark_wiring_ble.cpp | 95 ++++++++++++++++++++++++++++++++- 2 files changed, 100 insertions(+), 2 deletions(-) diff --git a/wiring/inc/spark_wiring_ble.h b/wiring/inc/spark_wiring_ble.h index 2e44959d70..152416e9ec 100644 --- a/wiring/inc/spark_wiring_ble.h +++ b/wiring/inc/spark_wiring_ble.h @@ -576,6 +576,13 @@ class BleService { BleUuid UUID() const; + // Discover all characteristics on this service + Vector discoverAllCharacteristics(); + + // Fetch the discovered characteristics on this service + Vector characteristics(); + bool getCharacteristicByUUID(BleCharacteristic& characteristic, const BleUuid& uuid) const; + BleService& operator=(const BleService& service); bool operator==(const BleService& service) const; diff --git a/wiring/src/spark_wiring_ble.cpp b/wiring/src/spark_wiring_ble.cpp index e1a8146b75..0fe3661b04 100644 --- a/wiring/src/spark_wiring_ble.cpp +++ b/wiring/src/spark_wiring_ble.cpp @@ -976,9 +976,11 @@ class BleCharacteristicImpl { class BleServiceImpl { public: BleServiceImpl() - : uuid_(), + : connHandle_(BLE_INVALID_CONN_HANDLE), + uuid_(), startHandle_(BLE_INVALID_ATTR_HANDLE), - endHandle_(BLE_INVALID_ATTR_HANDLE) { + endHandle_(BLE_INVALID_ATTR_HANDLE), + characteristicsDiscovered_(false) { } BleServiceImpl(const BleUuid& svcUuid) @@ -1000,10 +1002,75 @@ class BleServiceImpl { return endHandle_; } + BleConnectionHandle& connHandle() { + return connHandle_; + } + + bool& characteristicsDiscovered() { + return characteristicsDiscovered_; + } + + Vector& characteristics() { + return characteristics_; + } + + int discoverAllCharacteristics(BleService& service) { + LOG(TRACE, "Start discovering characteristics."); + hal_ble_svc_t halService; + halService.size = sizeof(hal_ble_svc_t); + halService.start_handle = service.impl()->startHandle(); + halService.end_handle = service.impl()->endHandle(); + CHECK(hal_ble_gatt_client_discover_characteristics(service.impl()->connHandle(), &halService, onCharacteristicsDiscovered, &service, nullptr)); + for (auto& characteristic : service.impl()->characteristics()) { + // Read the user description string if presented. + if (characteristic.impl()->attrHandles().user_desc_handle != BLE_INVALID_ATTR_HANDLE) { + char desc[BLE_MAX_DESC_LEN] = {}; + size_t len = hal_ble_gatt_client_read(service.impl()->connHandle(), characteristic.impl()->attrHandles().user_desc_handle, (uint8_t*)desc, sizeof(desc) - 1, nullptr); + if (len > 0) { + desc[len] = '\0'; + characteristic.impl()->description() = desc; + LOG_DEBUG(TRACE, "User description: %s.", desc); + } + } + } + return SYSTEM_ERROR_NONE; + } + private: + BleConnectionHandle connHandle_; // For peer service BleUuid uuid_; BleAttributeHandle startHandle_; BleAttributeHandle endHandle_; + bool characteristicsDiscovered_; + Vector characteristics_; + + static void onCharacteristicsDiscovered(const hal_ble_char_discovered_evt_t* event, void* context) { + BleService* service = static_cast(context); + for (size_t i = 0; i < event->count; i++) { + BleCharacteristic characteristic; + characteristic.impl()->connHandle() = event->conn_handle; + if (event->characteristics[i].properties & BLE_SIG_CHAR_PROP_READ) { + characteristic.impl()->properties() |= BleCharacteristicProperty::READ; + } + if (event->characteristics[i].properties & BLE_SIG_CHAR_PROP_WRITE_WO_RESP) { + characteristic.impl()->properties() |= BleCharacteristicProperty::WRITE_WO_RSP; + } + if (event->characteristics[i].properties & BLE_SIG_CHAR_PROP_WRITE) { + characteristic.impl()->properties() |= BleCharacteristicProperty::WRITE; + } + if (event->characteristics[i].properties & BLE_SIG_CHAR_PROP_NOTIFY) { + characteristic.impl()->properties() |= BleCharacteristicProperty::NOTIFY; + } + if (event->characteristics[i].properties & BLE_SIG_CHAR_PROP_INDICATE) { + characteristic.impl()->properties() |= BleCharacteristicProperty::INDICATE; + } + characteristic.impl()->charUUID() = event->characteristics[i].uuid; + characteristic.impl()->attrHandles() = event->characteristics[i].charHandles; + if (!service->impl()->characteristics().append(characteristic)) { + LOG(ERROR, "Failed to append discovered characteristic."); + } + } + } }; @@ -1421,6 +1488,29 @@ BleUuid BleService::UUID() const { return impl()->UUID(); } +Vector BleService::discoverAllCharacteristics() { + if (!impl()->characteristicsDiscovered()) { + if (impl()->discoverAllCharacteristics(*this) == SYSTEM_ERROR_NONE) { + impl()->characteristicsDiscovered() = true; + } + } + return characteristics(); +} + +Vector BleService::characteristics() { + return impl()->characteristics(); +} + +bool BleService::getCharacteristicByUUID(BleCharacteristic& characteristic, const BleUuid& uuid) const { + for (auto& existChar : impl()->characteristics()) { + if (existChar.UUID() == uuid) { + characteristic = existChar; + return true; + } + } + return false; +} + BleService& BleService::operator=(const BleService& service) { impl_ = service.impl_; return *this; @@ -1487,6 +1577,7 @@ class BleDiscoveryDelegator { BlePeerDevice* peer = static_cast(context); for (size_t i = 0; i < event->count; i++) { BleService service; + service.impl()->connHandle() = event->conn_handle; service.impl()->UUID() = event->services[i].uuid; service.impl()->startHandle() = event->services[i].start_handle; service.impl()->endHandle() = event->services[i].end_handle; From 4dee1a3246d7b275460416acdf31a99ee8979735 Mon Sep 17 00:00:00 2001 From: XuGuohui Date: Mon, 28 Sep 2020 21:43:55 +0800 Subject: [PATCH 2/7] [wiring] BLE: add API to discover characteristics under a service. --- .../ble_central/central.cpp | 79 +++++- .../ble_peripheral/peripheral.cpp | 9 +- wiring/inc/spark_wiring_ble.h | 25 +- wiring/src/spark_wiring_ble.cpp | 253 ++++++++---------- 4 files changed, 207 insertions(+), 159 deletions(-) diff --git a/user/tests/wiring/ble_central_peripheral/ble_central/central.cpp b/user/tests/wiring/ble_central_peripheral/ble_central/central.cpp index dfbcf31e09..af2d613fc0 100644 --- a/user/tests/wiring/ble_central_peripheral/ble_central/central.cpp +++ b/user/tests/wiring/ble_central_peripheral/ble_central/central.cpp @@ -26,6 +26,8 @@ const String str7("d4b4249bbbe3"); bool str1Rec = false, str2Rec = false, str3Rec = false, str4Rec = false, str5Rec = false, str6Rec = false, str7Rec = false; +BleAddress peerAddr; + static void onDataReceived(const uint8_t* data, size_t len, const BlePeerDevice& peer, void* context) { String str((const char*)data, len); if (str == str1) { @@ -69,7 +71,13 @@ test(BLE_01_Central_Scan_And_Connect) { BleUuid foundServiceUUID; size_t svcCount = results[i].advertisingData().serviceUUID(&foundServiceUUID, 1); if (svcCount > 0 && foundServiceUUID == "6E400000-B5A3-F393-E0A9-E50E24DCCA9E") { - peer = BLE.connect(results[i].address()); + assertTrue(results[i].scanResponse().length() > 0); + BleUuid uuids[2]; + assertEqual(results[i].scanResponse().serviceUUID(uuids, 2), 2); + assertTrue(uuids[0] == 0x1234); + assertTrue(uuids[1] == 0x5678); + peerAddr = results[i].address(); + peer = BLE.connect(peerAddr); if (peer.connected()) { assertTrue(peer.getCharacteristicByDescription(peerCharRead, "read")); assertTrue(peer.getCharacteristicByDescription(peerCharWrite, "write")); @@ -213,6 +221,75 @@ test(BLE_18_Central_Received_Characteristic_With_Notify_Indicate_Property_Nack) wait--; } assertTrue(wait > 0); + + BLE.disconnect(peer); + int ret = BLE.setScanTimeout(500); // Scan timeout: 5s + assertEqual(ret, 0); +} + +test(BLE_19_Central_Discover_All_Services) { + peer = BLE.connect(peerAddr, false); + assertTrue(peer.connected()); + + Vector services = peer.discoverAllServices(); + BleService ctrlService; + assertTrue(peer.getServiceByUUID(ctrlService, "6FA90001-5C4E-48A8-94F4-8030546F36FC")); + BleService customService; + assertTrue(peer.getServiceByUUID(customService, "6E400000-B5A3-F393-E0A9-E50E24DCCA9E")); + + BLE.disconnect(peer); +} + +test(BLE_20_Central_Discover_All_Characteristics) { + peer = BLE.connect(peerAddr, false); + assertTrue(peer.connected()); + + Vector allCharacteristics = peer.discoverAllCharacteristics(); + BleService ctrlService; + assertTrue(peer.getServiceByUUID(ctrlService, "6FA90001-5C4E-48A8-94F4-8030546F36FC")); + BleService customService; + assertTrue(peer.getServiceByUUID(customService, "6E400000-B5A3-F393-E0A9-E50E24DCCA9E")); + + Vector characteristicsOfCtrlService = peer.characteristics(ctrlService); + assertTrue(characteristicsOfCtrlService[0].UUID() == "6FA90002-5C4E-48A8-94F4-8030546F36FC"); + assertTrue(characteristicsOfCtrlService[1].UUID() == "6FA90003-5C4E-48A8-94F4-8030546F36FC"); + assertTrue(characteristicsOfCtrlService[2].UUID() == "6FA90004-5C4E-48A8-94F4-8030546F36FC"); + + Vector characteristicsOfCustomService = peer.characteristics(customService); + assertTrue(characteristicsOfCustomService[0].UUID() == "6E400001-B5A3-F393-E0A9-E50E24DCCA9E"); + assertTrue(characteristicsOfCustomService[1].UUID() == "6E400002-B5A3-F393-E0A9-E50E24DCCA9E"); + assertTrue(characteristicsOfCustomService[2].UUID() == "6E400003-B5A3-F393-E0A9-E50E24DCCA9E"); + assertTrue(characteristicsOfCustomService[3].UUID() == "6E400004-B5A3-F393-E0A9-E50E24DCCA9E"); + assertTrue(characteristicsOfCustomService[4].UUID() == "6E400005-B5A3-F393-E0A9-E50E24DCCA9E"); + assertTrue(characteristicsOfCustomService[5].UUID() == "6E400006-B5A3-F393-E0A9-E50E24DCCA9E"); + assertTrue(characteristicsOfCustomService[6].UUID() == "6E400007-B5A3-F393-E0A9-E50E24DCCA9E"); + + BLE.disconnect(peer); +} + +test(BLE_21_Central_Discover_Characteristics_Of_Service) { + peer = BLE.connect(peerAddr, false); + assertTrue(peer.connected()); + + Vector services = peer.discoverAllServices(); + BleService ctrlService; + assertTrue(peer.getServiceByUUID(ctrlService, "6FA90001-5C4E-48A8-94F4-8030546F36FC")); + BleService customService; + assertTrue(peer.getServiceByUUID(customService, "6E400000-B5A3-F393-E0A9-E50E24DCCA9E")); + + Vector characteristicsOfCtrlService = peer.discoverCharacteristicsOfService(ctrlService); + assertTrue(characteristicsOfCtrlService[0].UUID() == "6FA90002-5C4E-48A8-94F4-8030546F36FC"); + assertTrue(characteristicsOfCtrlService[1].UUID() == "6FA90003-5C4E-48A8-94F4-8030546F36FC"); + assertTrue(characteristicsOfCtrlService[2].UUID() == "6FA90004-5C4E-48A8-94F4-8030546F36FC"); + + Vector characteristicsOfCustomService = peer.discoverCharacteristicsOfService(customService); + assertTrue(characteristicsOfCustomService[0].UUID() == "6E400001-B5A3-F393-E0A9-E50E24DCCA9E"); + assertTrue(characteristicsOfCustomService[1].UUID() == "6E400002-B5A3-F393-E0A9-E50E24DCCA9E"); + assertTrue(characteristicsOfCustomService[2].UUID() == "6E400003-B5A3-F393-E0A9-E50E24DCCA9E"); + assertTrue(characteristicsOfCustomService[3].UUID() == "6E400004-B5A3-F393-E0A9-E50E24DCCA9E"); + assertTrue(characteristicsOfCustomService[4].UUID() == "6E400005-B5A3-F393-E0A9-E50E24DCCA9E"); + assertTrue(characteristicsOfCustomService[5].UUID() == "6E400006-B5A3-F393-E0A9-E50E24DCCA9E"); + assertTrue(characteristicsOfCustomService[6].UUID() == "6E400007-B5A3-F393-E0A9-E50E24DCCA9E"); } #endif // #if Wiring_BLE == 1 diff --git a/user/tests/wiring/ble_central_peripheral/ble_peripheral/peripheral.cpp b/user/tests/wiring/ble_central_peripheral/ble_peripheral/peripheral.cpp index b3a9a85f9f..faee95bac6 100644 --- a/user/tests/wiring/ble_central_peripheral/ble_peripheral/peripheral.cpp +++ b/user/tests/wiring/ble_central_peripheral/ble_peripheral/peripheral.cpp @@ -79,9 +79,12 @@ test(BLE_01_Peripheral_Advertising) { temp = BLE.addCharacteristic(charNotifyAndIndicate); assertTrue(temp.isValid()); - BleAdvertisingData data; - data.appendServiceUUID(serviceUuid); - ret = BLE.advertise(&data); + BleAdvertisingData advData; + advData.appendServiceUUID(serviceUuid); + BleAdvertisingData srData; + uint8_t uuids[] = {0x34, 0x12, 0x78, 0x56}; // little endian, i.e. 0x1234 and 0x5678. + srData.append(BleAdvertisingDataType::SERVICE_UUID_16BIT_MORE_AVAILABLE, uuids, sizeof(uuids)); + ret = BLE.advertise(&advData, &srData); assertEqual(ret, 0); Serial.println("BLE starts advertising..."); diff --git a/wiring/inc/spark_wiring_ble.h b/wiring/inc/spark_wiring_ble.h index 152416e9ec..8fac81b659 100644 --- a/wiring/inc/spark_wiring_ble.h +++ b/wiring/inc/spark_wiring_ble.h @@ -576,13 +576,6 @@ class BleService { BleUuid UUID() const; - // Discover all characteristics on this service - Vector discoverAllCharacteristics(); - - // Fetch the discovered characteristics on this service - Vector characteristics(); - bool getCharacteristicByUUID(BleCharacteristic& characteristic, const BleUuid& uuid) const; - BleService& operator=(const BleService& service); bool operator==(const BleService& service) const; @@ -786,18 +779,28 @@ class BlePeerDevice { Vector discoverAllCharacteristics(); ssize_t discoverAllCharacteristics(BleCharacteristic* characteristics, size_t count); + // Discover all characteristics of a service + Vector discoverCharacteristicsOfService(const BleService& service); + // Fetch the discovered services on peer device. - Vector services(); - size_t services(BleService* services, size_t count); + Vector services() const; + size_t services(BleService* services, size_t count) const; bool getServiceByUUID(BleService& service, const BleUuid& uuid) const; // Fetch the discovered characteristics on peer device. - Vector characteristics(); - size_t characteristics(BleCharacteristic* characteristics, size_t count); + Vector characteristics() const; + size_t characteristics(BleCharacteristic* characteristics, size_t count) const; bool getCharacteristicByDescription(BleCharacteristic& characteristic, const char* desc) const; bool getCharacteristicByDescription(BleCharacteristic& characteristic, const String& desc) const; bool getCharacteristicByUUID(BleCharacteristic& characteristic, const BleUuid& uuid) const; + // Fetch the discovered characteristics under a service. + Vector characteristics(const BleService& service) const; + size_t characteristics(const BleService& service, BleCharacteristic* characteristics, size_t count) const; + bool getCharacteristicByDescription(const BleService& service, BleCharacteristic& characteristic, const char* desc) const; + bool getCharacteristicByDescription(const BleService& service, BleCharacteristic& characteristic, const String& desc) const; + bool getCharacteristicByUUID(const BleService& service, BleCharacteristic& characteristic, const BleUuid& uuid) const; + int connect(const BleAddress& addr, const BleConnectionParams* params, bool automatic = true); int connect(const BleAddress& addr, const BleConnectionParams& params, bool automatic = true); int connect(const BleAddress& addr, uint16_t interval, uint16_t latency, uint16_t timeout, bool automatic = true); diff --git a/wiring/src/spark_wiring_ble.cpp b/wiring/src/spark_wiring_ble.cpp index 0fe3661b04..9bdf2a1bf2 100644 --- a/wiring/src/spark_wiring_ble.cpp +++ b/wiring/src/spark_wiring_ble.cpp @@ -976,8 +976,7 @@ class BleCharacteristicImpl { class BleServiceImpl { public: BleServiceImpl() - : connHandle_(BLE_INVALID_CONN_HANDLE), - uuid_(), + : uuid_(), startHandle_(BLE_INVALID_ATTR_HANDLE), endHandle_(BLE_INVALID_ATTR_HANDLE), characteristicsDiscovered_(false) { @@ -1002,75 +1001,15 @@ class BleServiceImpl { return endHandle_; } - BleConnectionHandle& connHandle() { - return connHandle_; - } - bool& characteristicsDiscovered() { return characteristicsDiscovered_; } - Vector& characteristics() { - return characteristics_; - } - - int discoverAllCharacteristics(BleService& service) { - LOG(TRACE, "Start discovering characteristics."); - hal_ble_svc_t halService; - halService.size = sizeof(hal_ble_svc_t); - halService.start_handle = service.impl()->startHandle(); - halService.end_handle = service.impl()->endHandle(); - CHECK(hal_ble_gatt_client_discover_characteristics(service.impl()->connHandle(), &halService, onCharacteristicsDiscovered, &service, nullptr)); - for (auto& characteristic : service.impl()->characteristics()) { - // Read the user description string if presented. - if (characteristic.impl()->attrHandles().user_desc_handle != BLE_INVALID_ATTR_HANDLE) { - char desc[BLE_MAX_DESC_LEN] = {}; - size_t len = hal_ble_gatt_client_read(service.impl()->connHandle(), characteristic.impl()->attrHandles().user_desc_handle, (uint8_t*)desc, sizeof(desc) - 1, nullptr); - if (len > 0) { - desc[len] = '\0'; - characteristic.impl()->description() = desc; - LOG_DEBUG(TRACE, "User description: %s.", desc); - } - } - } - return SYSTEM_ERROR_NONE; - } - private: - BleConnectionHandle connHandle_; // For peer service BleUuid uuid_; BleAttributeHandle startHandle_; BleAttributeHandle endHandle_; bool characteristicsDiscovered_; - Vector characteristics_; - - static void onCharacteristicsDiscovered(const hal_ble_char_discovered_evt_t* event, void* context) { - BleService* service = static_cast(context); - for (size_t i = 0; i < event->count; i++) { - BleCharacteristic characteristic; - characteristic.impl()->connHandle() = event->conn_handle; - if (event->characteristics[i].properties & BLE_SIG_CHAR_PROP_READ) { - characteristic.impl()->properties() |= BleCharacteristicProperty::READ; - } - if (event->characteristics[i].properties & BLE_SIG_CHAR_PROP_WRITE_WO_RESP) { - characteristic.impl()->properties() |= BleCharacteristicProperty::WRITE_WO_RSP; - } - if (event->characteristics[i].properties & BLE_SIG_CHAR_PROP_WRITE) { - characteristic.impl()->properties() |= BleCharacteristicProperty::WRITE; - } - if (event->characteristics[i].properties & BLE_SIG_CHAR_PROP_NOTIFY) { - characteristic.impl()->properties() |= BleCharacteristicProperty::NOTIFY; - } - if (event->characteristics[i].properties & BLE_SIG_CHAR_PROP_INDICATE) { - characteristic.impl()->properties() |= BleCharacteristicProperty::INDICATE; - } - characteristic.impl()->charUUID() = event->characteristics[i].uuid; - characteristic.impl()->attrHandles() = event->characteristics[i].charHandles; - if (!service->impl()->characteristics().append(characteristic)) { - LOG(ERROR, "Failed to append discovered characteristic."); - } - } - } }; @@ -1082,8 +1021,7 @@ class BlePeerDeviceImpl { BlePeerDeviceImpl() : connHandle_(BLE_INVALID_CONN_HANDLE), address_(), - servicesDiscovered_(false), - characteristicsDiscovered_(false) { + servicesDiscovered_(false) { } ~BlePeerDeviceImpl() = default; @@ -1100,10 +1038,6 @@ class BlePeerDeviceImpl { return servicesDiscovered_; } - bool& characteristicsDiscovered() { - return characteristicsDiscovered_; - } - Vector& services() { return services_; } @@ -1112,22 +1046,30 @@ class BlePeerDeviceImpl { return characteristics_; } + bool locateService(BleService& service, BleCharacteristicHandles handles) { + for (const auto& svc : services_) { + if (handles.value_handle <= svc.impl()->endHandle() && handles.value_handle >= svc.impl()->startHandle()) { + service = svc; + return true; + } + } + return false; + } + void onDisconnected() { connHandle_ = BLE_INVALID_CONN_HANDLE; - for (auto& characteristic : characteristics_) { + for (auto& characteristic : characteristics()) { characteristic.impl()->connHandle() = BLE_INVALID_CONN_HANDLE; } services_.clear(); characteristics_.clear(); servicesDiscovered_ = false; - characteristicsDiscovered_ = false; } private: BleConnectionHandle connHandle_; BleAddress address_; bool servicesDiscovered_; - bool characteristicsDiscovered_; Vector services_; Vector characteristics_; }; @@ -1488,29 +1430,6 @@ BleUuid BleService::UUID() const { return impl()->UUID(); } -Vector BleService::discoverAllCharacteristics() { - if (!impl()->characteristicsDiscovered()) { - if (impl()->discoverAllCharacteristics(*this) == SYSTEM_ERROR_NONE) { - impl()->characteristicsDiscovered() = true; - } - } - return characteristics(); -} - -Vector BleService::characteristics() { - return impl()->characteristics(); -} - -bool BleService::getCharacteristicByUUID(BleCharacteristic& characteristic, const BleUuid& uuid) const { - for (auto& existChar : impl()->characteristics()) { - if (existChar.UUID() == uuid) { - characteristic = existChar; - return true; - } - } - return false; -} - BleService& BleService::operator=(const BleService& service) { impl_ = service.impl_; return *this; @@ -1530,26 +1449,18 @@ class BleDiscoveryDelegator { BleDiscoveryDelegator() = default; ~BleDiscoveryDelegator() = default; - int discoverAllServiceAndCharacteristics(BlePeerDevice& peer) { - CHECK(discoverAllServices(peer)); - CHECK(discoverAllCharacteristics(peer)); - return SYSTEM_ERROR_NONE; - } - int discoverAllServices(BlePeerDevice& peer) { LOG(TRACE, "Start discovering services."); return hal_ble_gatt_client_discover_all_services(peer.impl()->connHandle(), onServicesDiscovered, &peer, nullptr); } - int discoverAllCharacteristics(BlePeerDevice& peer) { - LOG(TRACE, "Start discovering characteristics."); - for (auto& service : peer.impl()->services()) { - hal_ble_svc_t halService; - halService.size = sizeof(hal_ble_svc_t); - halService.start_handle = service.impl()->startHandle(); - halService.end_handle = service.impl()->endHandle(); - CHECK(hal_ble_gatt_client_discover_characteristics(peer.impl()->connHandle(), &halService, onCharacteristicsDiscovered, &peer, nullptr)); - } + int discoverCharacteristics(const BlePeerDevice& peer, const BleService& service) const { + LOG(TRACE, "Start discovering characteristics of service: %s.", service.impl()->UUID().toString().c_str()); + hal_ble_svc_t halService; + halService.size = sizeof(hal_ble_svc_t); + halService.start_handle = service.impl()->startHandle(); + halService.end_handle = service.impl()->endHandle(); + CHECK(hal_ble_gatt_client_discover_characteristics(peer.impl()->connHandle(), &halService, onCharacteristicsDiscovered, peer.impl(), nullptr)); for (auto& characteristic : peer.impl()->characteristics()) { // Read the user description string if presented. if (characteristic.impl()->attrHandles().user_desc_handle != BLE_INVALID_ATTR_HANDLE) { @@ -1577,7 +1488,6 @@ class BleDiscoveryDelegator { BlePeerDevice* peer = static_cast(context); for (size_t i = 0; i < event->count; i++) { BleService service; - service.impl()->connHandle() = event->conn_handle; service.impl()->UUID() = event->services[i].uuid; service.impl()->startHandle() = event->services[i].start_handle; service.impl()->endHandle() = event->services[i].end_handle; @@ -1595,29 +1505,35 @@ class BleDiscoveryDelegator { * SoftDevice events in queue. */ static void onCharacteristicsDiscovered(const hal_ble_char_discovered_evt_t* event, void* context) { - BlePeerDevice* peer = static_cast(context); + BlePeerDeviceImpl* peerImpl = static_cast(context); for (size_t i = 0; i < event->count; i++) { BleCharacteristic characteristic; - characteristic.impl()->connHandle() = event->conn_handle; - if (event->characteristics[i].properties & BLE_SIG_CHAR_PROP_READ) { - characteristic.impl()->properties() |= BleCharacteristicProperty::READ; - } - if (event->characteristics[i].properties & BLE_SIG_CHAR_PROP_WRITE_WO_RESP) { - characteristic.impl()->properties() |= BleCharacteristicProperty::WRITE_WO_RSP; - } - if (event->characteristics[i].properties & BLE_SIG_CHAR_PROP_WRITE) { - characteristic.impl()->properties() |= BleCharacteristicProperty::WRITE; - } - if (event->characteristics[i].properties & BLE_SIG_CHAR_PROP_NOTIFY) { - characteristic.impl()->properties() |= BleCharacteristicProperty::NOTIFY; - } - if (event->characteristics[i].properties & BLE_SIG_CHAR_PROP_INDICATE) { - characteristic.impl()->properties() |= BleCharacteristicProperty::INDICATE; - } - characteristic.impl()->charUUID() = event->characteristics[i].uuid; + BleService service; characteristic.impl()->attrHandles() = event->characteristics[i].charHandles; - if (!peer->impl()->characteristics().append(characteristic)) { - LOG(ERROR, "Failed to append discovered characteristic."); + if (peerImpl->locateService(service, characteristic.impl()->attrHandles())) { + characteristic.impl()->svcUUID() = service.impl()->UUID(); + characteristic.impl()->connHandle() = event->conn_handle; + if (event->characteristics[i].properties & BLE_SIG_CHAR_PROP_READ) { + characteristic.impl()->properties() |= BleCharacteristicProperty::READ; + } + if (event->characteristics[i].properties & BLE_SIG_CHAR_PROP_WRITE_WO_RESP) { + characteristic.impl()->properties() |= BleCharacteristicProperty::WRITE_WO_RSP; + } + if (event->characteristics[i].properties & BLE_SIG_CHAR_PROP_WRITE) { + characteristic.impl()->properties() |= BleCharacteristicProperty::WRITE; + } + if (event->characteristics[i].properties & BLE_SIG_CHAR_PROP_NOTIFY) { + characteristic.impl()->properties() |= BleCharacteristicProperty::NOTIFY; + } + if (event->characteristics[i].properties & BLE_SIG_CHAR_PROP_INDICATE) { + characteristic.impl()->properties() |= BleCharacteristicProperty::INDICATE; + } + characteristic.impl()->charUUID() = event->characteristics[i].uuid; + if (!peerImpl->characteristics().append(characteristic)) { + LOG(ERROR, "Failed to append discovered characteristic."); + } + } else { + LOG(ERROR, "Discovered characteristic's handle is invalid."); } } } @@ -1667,26 +1583,29 @@ Vector BlePeerDevice::discoverAllCharacteristics() { if (!impl()->servicesDiscovered()) { discoverAllServices(); } - if (!impl()->characteristicsDiscovered()) { - BleDiscoveryDelegator discovery; - if (discovery.discoverAllCharacteristics(*this) == SYSTEM_ERROR_NONE) { - impl()->characteristicsDiscovered() = true; - } + for (const auto& service : impl()->services()) { + discoverCharacteristicsOfService(service); } return characteristics(); } ssize_t BlePeerDevice::discoverAllCharacteristics(BleCharacteristic* chars, size_t count) { CHECK_TRUE(chars && count > 0, SYSTEM_ERROR_INVALID_ARGUMENT); + discoverAllCharacteristics(); + return characteristics(chars, count); +} + +Vector BlePeerDevice::discoverCharacteristicsOfService(const BleService& service) { if (!impl()->servicesDiscovered()) { - discoverAllServices(); + return Vector(); } - if (!impl()->characteristicsDiscovered()) { + if (!service.impl()->characteristicsDiscovered()) { BleDiscoveryDelegator discovery; - CHECK(discovery.discoverAllCharacteristics(*this)); - impl()->characteristicsDiscovered() = true; + if (discovery.discoverCharacteristics(*this, service) == SYSTEM_ERROR_NONE) { + service.impl()->characteristicsDiscovered() = true; + } } - return characteristics(chars, count); + return characteristics(service); } Vector BlePeerDevice::services() { @@ -1715,17 +1634,38 @@ bool BlePeerDevice::getServiceByUUID(BleService& service, const BleUuid& uuid) c return false; } -Vector BlePeerDevice::characteristics() { +Vector BlePeerDevice::characteristics() const { WiringBleLock lk; return impl()->characteristics(); } -size_t BlePeerDevice::characteristics(BleCharacteristic* chars, size_t count) { +Vector BlePeerDevice::characteristics(const BleService& service) const { WiringBleLock lk; - CHECK_TRUE(chars && count > 0, SYSTEM_ERROR_INVALID_ARGUMENT); + Vector characteristics; + for (const auto& characteristic : impl()->characteristics()) { + if (characteristic.impl()->svcUUID() == service.impl()->UUID()) { + characteristics.append(characteristic); + } + } + return characteristics; +} + +size_t BlePeerDevice::characteristics(BleCharacteristic* characteristics, size_t count) const { + WiringBleLock lk; + CHECK_TRUE(characteristics && count > 0, SYSTEM_ERROR_INVALID_ARGUMENT); count = std::min((int)count, impl()->characteristics().size()); for (size_t i = 0; i < count; i++) { - chars[i] = impl()->characteristics()[i]; + characteristics[i] = impl()->characteristics()[i]; + } + return count; +} + +size_t BlePeerDevice::characteristics(const BleService& service, BleCharacteristic* characteristics, size_t count) const { + CHECK_TRUE(characteristics && count > 0, SYSTEM_ERROR_INVALID_ARGUMENT); + Vector chars = this->characteristics(service); + count = std::min((int)count, chars.size()); + for (size_t i = 0; i < count; i++) { + characteristics[i] = chars[i]; } return count; } @@ -1757,6 +1697,31 @@ bool BlePeerDevice::getCharacteristicByUUID(BleCharacteristic& characteristic, c return false; } +bool BlePeerDevice::getCharacteristicByDescription(const BleService& service, BleCharacteristic& characteristic, const char* desc) const { + CHECK_TRUE(desc, false); + for (auto& existChar : impl()->characteristics()) { + if (existChar.impl()->svcUUID() == service.UUID() && !strcmp(existChar.description().c_str(), desc)) { + characteristic = existChar; + return true; + } + } + return true; +} + +bool BlePeerDevice::getCharacteristicByDescription(const BleService& service, BleCharacteristic& characteristic, const String& desc) const { + return getCharacteristicByDescription(service, characteristic, desc.c_str()); +} + +bool BlePeerDevice::getCharacteristicByUUID(const BleService& service, BleCharacteristic& characteristic, const BleUuid& uuid) const { + for (auto& existChar : impl()->characteristics()) { + if (existChar.impl()->svcUUID() == service.UUID() && existChar.UUID() == uuid) { + characteristic = existChar; + return true; + } + } + return false; +} + int BlePeerDevice::connect(const BleAddress& addr, const BleConnectionParams* params, bool automatic) { hal_ble_conn_cfg_t connCfg = {}; connCfg.version = BLE_API_VERSION; From 55bab0b7b4af2b9e538c9514923e8e11fbea74ad Mon Sep 17 00:00:00 2001 From: XuGuohui Date: Wed, 30 Sep 2020 13:37:52 +0800 Subject: [PATCH 3/7] [wiring] BLE: add more apis. --- wiring/inc/spark_wiring_ble.h | 4 +++ wiring/src/spark_wiring_ble.cpp | 45 +++++++++++++++++++++++++++++---- 2 files changed, 44 insertions(+), 5 deletions(-) diff --git a/wiring/inc/spark_wiring_ble.h b/wiring/inc/spark_wiring_ble.h index 8fac81b659..0271961a86 100644 --- a/wiring/inc/spark_wiring_ble.h +++ b/wiring/inc/spark_wiring_ble.h @@ -781,11 +781,15 @@ class BlePeerDevice { // Discover all characteristics of a service Vector discoverCharacteristicsOfService(const BleService& service); + ssize_t discoverCharacteristicsOfService(const BleService& service, BleCharacteristic* characteristics, size_t count); // Fetch the discovered services on peer device. Vector services() const; size_t services(BleService* services, size_t count) const; bool getServiceByUUID(BleService& service, const BleUuid& uuid) const; + // In case that there are several services with the same UUID. + Vector getServiceByUUID(const BleUuid& uuid) const; + size_t getServiceByUUID(BleService* services, size_t count, const BleUuid& uuid) const; // Fetch the discovered characteristics on peer device. Vector characteristics() const; diff --git a/wiring/src/spark_wiring_ble.cpp b/wiring/src/spark_wiring_ble.cpp index 9bdf2a1bf2..3520e3973a 100644 --- a/wiring/src/spark_wiring_ble.cpp +++ b/wiring/src/spark_wiring_ble.cpp @@ -1005,11 +1005,20 @@ class BleServiceImpl { return characteristicsDiscovered_; } + bool hasCharacteristic(const BleCharacteristic& characteristic) { + if ( characteristic.impl()->svcUUID() == uuid_ && + characteristic.impl()->attrHandles().value_handle >= startHandle_ && + characteristic.impl()->attrHandles().value_handle <= endHandle_) { + return true; + } + return false; + } + private: BleUuid uuid_; BleAttributeHandle startHandle_; BleAttributeHandle endHandle_; - bool characteristicsDiscovered_; + bool characteristicsDiscovered_; // For peer service only }; @@ -1608,7 +1617,13 @@ Vector BlePeerDevice::discoverCharacteristicsOfService(const return characteristics(service); } -Vector BlePeerDevice::services() { +ssize_t BlePeerDevice::discoverCharacteristicsOfService(const BleService& service, BleCharacteristic* chars, size_t count) { + CHECK_TRUE(chars && count > 0, SYSTEM_ERROR_INVALID_ARGUMENT); + discoverCharacteristicsOfService(service); + return characteristics(service, chars, count); +} + +Vector BlePeerDevice::services() const { WiringBleLock lk; return impl()->services(); } @@ -1634,6 +1649,26 @@ bool BlePeerDevice::getServiceByUUID(BleService& service, const BleUuid& uuid) c return false; } +Vector BlePeerDevice::getServiceByUUID(const BleUuid& uuid) const { + Vector services; + for (auto& existSvc : impl()->services()) { + if (existSvc.UUID() == uuid) { + services.append(existSvc); + } + } + return services; +} + +size_t BlePeerDevice::getServiceByUUID(BleService* svcs, size_t count, const BleUuid& uuid) const { + CHECK_TRUE(svcs && count > 0, SYSTEM_ERROR_INVALID_ARGUMENT); + Vector services = getServiceByUUID(uuid); + count = std::min((int)count, services.size()); + for (size_t i = 0; i < count; i++) { + svcs[i] = services[i]; + } + return count; +} + Vector BlePeerDevice::characteristics() const { WiringBleLock lk; return impl()->characteristics(); @@ -1643,7 +1678,7 @@ Vector BlePeerDevice::characteristics(const BleService& servi WiringBleLock lk; Vector characteristics; for (const auto& characteristic : impl()->characteristics()) { - if (characteristic.impl()->svcUUID() == service.impl()->UUID()) { + if (service.impl()->hasCharacteristic(characteristic)) { characteristics.append(characteristic); } } @@ -1700,7 +1735,7 @@ bool BlePeerDevice::getCharacteristicByUUID(BleCharacteristic& characteristic, c bool BlePeerDevice::getCharacteristicByDescription(const BleService& service, BleCharacteristic& characteristic, const char* desc) const { CHECK_TRUE(desc, false); for (auto& existChar : impl()->characteristics()) { - if (existChar.impl()->svcUUID() == service.UUID() && !strcmp(existChar.description().c_str(), desc)) { + if (service.impl()->hasCharacteristic(characteristic) && !strcmp(existChar.description().c_str(), desc)) { characteristic = existChar; return true; } @@ -1714,7 +1749,7 @@ bool BlePeerDevice::getCharacteristicByDescription(const BleService& service, Bl bool BlePeerDevice::getCharacteristicByUUID(const BleService& service, BleCharacteristic& characteristic, const BleUuid& uuid) const { for (auto& existChar : impl()->characteristics()) { - if (existChar.impl()->svcUUID() == service.UUID() && existChar.UUID() == uuid) { + if (service.impl()->hasCharacteristic(characteristic) && existChar.UUID() == uuid) { characteristic = existChar; return true; } From d6b45f3819b6b524a088ff2fea9b1ea4e6221989 Mon Sep 17 00:00:00 2001 From: Mariano Goluboff Date: Thu, 8 Oct 2020 09:30:09 -0400 Subject: [PATCH 4/7] Fix inability to discover: check handles of existing char instead of passed value --- wiring/src/spark_wiring_ble.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/wiring/src/spark_wiring_ble.cpp b/wiring/src/spark_wiring_ble.cpp index 3520e3973a..404b2cf035 100644 --- a/wiring/src/spark_wiring_ble.cpp +++ b/wiring/src/spark_wiring_ble.cpp @@ -1735,7 +1735,7 @@ bool BlePeerDevice::getCharacteristicByUUID(BleCharacteristic& characteristic, c bool BlePeerDevice::getCharacteristicByDescription(const BleService& service, BleCharacteristic& characteristic, const char* desc) const { CHECK_TRUE(desc, false); for (auto& existChar : impl()->characteristics()) { - if (service.impl()->hasCharacteristic(characteristic) && !strcmp(existChar.description().c_str(), desc)) { + if (service.impl()->hasCharacteristic(existChar) && !strcmp(existChar.description().c_str(), desc)) { characteristic = existChar; return true; } @@ -1749,7 +1749,7 @@ bool BlePeerDevice::getCharacteristicByDescription(const BleService& service, Bl bool BlePeerDevice::getCharacteristicByUUID(const BleService& service, BleCharacteristic& characteristic, const BleUuid& uuid) const { for (auto& existChar : impl()->characteristics()) { - if (service.impl()->hasCharacteristic(characteristic) && existChar.UUID() == uuid) { + if (existChar.UUID() == uuid && service.impl()->hasCharacteristic(existChar)) { characteristic = existChar; return true; } From 2b20deac9e6d9fb7ccb10a582fda6858c080c3df Mon Sep 17 00:00:00 2001 From: XuGuohui Date: Mon, 26 Oct 2020 22:23:09 +0800 Subject: [PATCH 5/7] [wiring] BLE: add api test. --- user/tests/wiring/api/ble.cpp | 21 +++++++++++++++++---- wiring/inc/spark_wiring_ble.h | 3 +++ wiring/src/spark_wiring_ble.cpp | 20 ++++++++++++++++++++ 3 files changed, 40 insertions(+), 4 deletions(-) diff --git a/user/tests/wiring/api/ble.cpp b/user/tests/wiring/api/ble.cpp index df91df1a6b..58e2f136c6 100644 --- a/user/tests/wiring/api/ble.cpp +++ b/user/tests/wiring/api/ble.cpp @@ -536,20 +536,33 @@ test(ble_peer_device) { BleConnectionParams params; API_COMPILE({ Vector services = peer.discoverAllServices(); }); - API_COMPILE({ BleService services[1]; size_t ret = peer.discoverAllServices(services, 1); (void)ret; }); + API_COMPILE({ BleService services[1]; ssize_t ret = peer.discoverAllServices(services, 1); (void)ret; }); API_COMPILE({ Vector characteristics = peer.discoverAllCharacteristics(); }); - API_COMPILE({ BleCharacteristic characteristics[1]; size_t ret = peer.discoverAllCharacteristics(characteristics, 1); (void)ret; }); + API_COMPILE({ BleCharacteristic characteristics[1]; ssize_t ret = peer.discoverAllCharacteristics(characteristics, 1); (void)ret; }); + + API_COMPILE({ Vector characteristics = peer.discoverCharacteristicsOfService(BleService()); }); + API_COMPILE({ BleCharacteristic characteristics[1]; ssize_t ret = peer.discoverCharacteristicsOfService(BleService(), characteristics, 1); (void)ret; }); API_COMPILE({ Vector services = peer.services(); }); API_COMPILE({ BleService services[1]; size_t ret = peer.services(services, 1); (void)ret; }); API_COMPILE({ BleService service; bool ret = peer.getServiceByUUID(service, uuid); (void)ret; }); + API_COMPILE({ Vector services = peer.getServiceByUUID(uuid); }); + API_COMPILE({ BleService services[1]; size_t ret = peer.getServiceByUUID(services, 1, uuid); (void)ret; }); API_COMPILE({ Vector characteristics = peer.characteristics(); }); API_COMPILE({ BleCharacteristic characteristics[1]; size_t ret = peer.characteristics(characteristics, 1); (void)ret; }); API_COMPILE({ BleCharacteristic characteristic; bool ret = peer.getCharacteristicByDescription(characteristic, "1234"); (void)ret; }); API_COMPILE({ BleCharacteristic characteristic; bool ret = peer.getCharacteristicByDescription(characteristic, String("1234")); (void)ret; }); API_COMPILE({ BleCharacteristic characteristic; bool ret = peer.getCharacteristicByUUID(characteristic, uuid); (void)ret; }); + API_COMPILE({ Vector characteristics = peer.getCharacteristicByUUID(uuid); }); + API_COMPILE({ BleCharacteristic characteristics[1]; size_t ret = peer.getCharacteristicByUUID(characteristics, 1, uuid); (void)ret; }); + + API_COMPILE({ Vector characteristics = peer.characteristics(BleService()); }); + API_COMPILE({ BleCharacteristic characteristics[1]; size_t ret = peer.characteristics(BleService(), characteristics, 1); (void)ret; }); + API_COMPILE({ BleCharacteristic characteristic; bool ret = peer.getCharacteristicByDescription(BleService(), characteristic, "1234"); (void)ret; }); + API_COMPILE({ BleCharacteristic characteristic; bool ret = peer.getCharacteristicByDescription(BleService(), characteristic, String("1234")); (void)ret; }); + API_COMPILE({ BleCharacteristic characteristic; bool ret = peer.getCharacteristicByUUID(BleService(), characteristic, uuid); (void)ret; }); API_COMPILE({ int ret = peer.connect(addr); (void)ret; }); API_COMPILE({ int ret = peer.connect(addr, false); (void)ret; }); @@ -557,7 +570,7 @@ test(ble_peer_device) { API_COMPILE({ int ret = peer.connect(addr, ¶ms, false); (void)ret; }); API_COMPILE({ int ret = peer.connect(addr, params); (void)ret; }); API_COMPILE({ int ret = peer.connect(addr, params, false); (void)ret; }); - API_COMPILE({ int ret = peer.connect(addr, 0 , 0, 0); (void)ret; }); + API_COMPILE({ int ret = peer.connect(addr, 0, 0, 0); (void)ret; }); API_COMPILE({ int ret = peer.connect(addr, 0, 0, 0, false); (void)ret; }); API_COMPILE({ int ret = peer.connect(); (void)ret; }); API_COMPILE({ int ret = peer.connect(false); (void)ret; }); @@ -565,7 +578,7 @@ test(ble_peer_device) { API_COMPILE({ int ret = peer.connect(¶ms, false); (void)ret; }); API_COMPILE({ int ret = peer.connect(params); (void)ret; }); API_COMPILE({ int ret = peer.connect(params, false); (void)ret; }); - API_COMPILE({ int ret = peer.connect(0 , 0, 0); (void)ret; }); + API_COMPILE({ int ret = peer.connect(0, 0, 0); (void)ret; }); API_COMPILE({ int ret = peer.connect(0, 0, 0, false); (void)ret; }); API_COMPILE({ int ret = peer.disconnect(); (void)ret; }); API_COMPILE({ bool ret = peer.connected(); (void)ret; }); diff --git a/wiring/inc/spark_wiring_ble.h b/wiring/inc/spark_wiring_ble.h index 0271961a86..de887640f9 100644 --- a/wiring/inc/spark_wiring_ble.h +++ b/wiring/inc/spark_wiring_ble.h @@ -797,6 +797,9 @@ class BlePeerDevice { bool getCharacteristicByDescription(BleCharacteristic& characteristic, const char* desc) const; bool getCharacteristicByDescription(BleCharacteristic& characteristic, const String& desc) const; bool getCharacteristicByUUID(BleCharacteristic& characteristic, const BleUuid& uuid) const; + // In case that there are several characteristics with the same UUID. + Vector getCharacteristicByUUID(const BleUuid& uuid) const; + size_t getCharacteristicByUUID(BleCharacteristic* characteristics, size_t count, const BleUuid& uuid) const; // Fetch the discovered characteristics under a service. Vector characteristics(const BleService& service) const; diff --git a/wiring/src/spark_wiring_ble.cpp b/wiring/src/spark_wiring_ble.cpp index 404b2cf035..8ca2eec69d 100644 --- a/wiring/src/spark_wiring_ble.cpp +++ b/wiring/src/spark_wiring_ble.cpp @@ -1732,6 +1732,26 @@ bool BlePeerDevice::getCharacteristicByUUID(BleCharacteristic& characteristic, c return false; } +Vector BlePeerDevice::getCharacteristicByUUID(const BleUuid& uuid) const { + Vector characteristics; + for (auto& existChar : impl()->characteristics()) { + if (existChar.UUID() == uuid) { + characteristics.append(existChar); + } + } + return characteristics; +} + +size_t BlePeerDevice::getCharacteristicByUUID(BleCharacteristic* characteristics, size_t count, const BleUuid& uuid) const { + CHECK_TRUE(characteristics && count > 0, SYSTEM_ERROR_INVALID_ARGUMENT); + Vector chars = getCharacteristicByUUID(uuid); + count = std::min((int)count, chars.size()); + for (size_t i = 0; i < count; i++) { + characteristics[i] = chars[i]; + } + return count; +} + bool BlePeerDevice::getCharacteristicByDescription(const BleService& service, BleCharacteristic& characteristic, const char* desc) const { CHECK_TRUE(desc, false); for (auto& existChar : impl()->characteristics()) { From ccaff131da9bc5b95d54c21ffea03023c886c2bc Mon Sep 17 00:00:00 2001 From: XuGuohui Date: Fri, 20 Nov 2020 23:40:39 +0800 Subject: [PATCH 6/7] [wiring] BLE: minor --- wiring/src/spark_wiring_ble.cpp | 34 ++++++++++++++++++++++----------- 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/wiring/src/spark_wiring_ble.cpp b/wiring/src/spark_wiring_ble.cpp index 8ca2eec69d..f0b4833456 100644 --- a/wiring/src/spark_wiring_ble.cpp +++ b/wiring/src/spark_wiring_ble.cpp @@ -892,10 +892,14 @@ class BleCharacteristicImpl { ~BleCharacteristicImpl() = default; - bool& local() { + bool isLocal() { return isLocal_; } + void isLocal(bool local) { + isLocal_ = local; + } + BleConnectionHandle& connHandle() { return connHandle_; } @@ -1001,10 +1005,14 @@ class BleServiceImpl { return endHandle_; } - bool& characteristicsDiscovered() { + bool characteristicsDiscovered() { return characteristicsDiscovered_; } + void characteristicsDiscovered(bool discovered) { + characteristicsDiscovered_ = discovered; + } + bool hasCharacteristic(const BleCharacteristic& characteristic) { if ( characteristic.impl()->svcUUID() == uuid_ && characteristic.impl()->attrHandles().value_handle >= startHandle_ && @@ -1043,10 +1051,14 @@ class BlePeerDeviceImpl { return address_; } - bool& servicesDiscovered() { + bool servicesDiscovered() { return servicesDiscovered_; } + void servicesDiscovered(bool discovered) { + servicesDiscovered_ = discovered; + } + Vector& services() { return services_; } @@ -1292,7 +1304,7 @@ bool BleCharacteristic::valid() const { } bool BleCharacteristic::isValid() const { - return (impl()->local() || impl()->connHandle() != BLE_INVALID_CONN_HANDLE); + return (impl()->isLocal() || impl()->connHandle() != BLE_INVALID_CONN_HANDLE); } BleUuid BleCharacteristic::UUID() const { @@ -1322,7 +1334,7 @@ ssize_t BleCharacteristic::setValue(const uint8_t* buf, size_t len, BleTxRxType return SYSTEM_ERROR_INVALID_ARGUMENT; } len = std::min(len, (size_t)BLE_MAX_ATTR_VALUE_PACKET_SIZE); - if (impl()->local()) { + if (impl()->isLocal()) { int ret = SYSTEM_ERROR_NOT_SUPPORTED; // Updates the local characteristic value for peer to read. if (impl()->properties().isSet(BleCharacteristicProperty::READ)) { @@ -1361,7 +1373,7 @@ ssize_t BleCharacteristic::getValue(uint8_t* buf, size_t len) const { return SYSTEM_ERROR_INVALID_ARGUMENT; } len = std::min(len, (size_t)BLE_MAX_ATTR_VALUE_PACKET_SIZE); - if (impl()->local()) { + if (impl()->isLocal()) { return hal_ble_gatt_server_get_characteristic_value(impl()->attrHandles().value_handle, buf, len, nullptr); } if (impl()->connHandle() != BLE_INVALID_CONN_HANDLE) { @@ -1386,7 +1398,7 @@ ssize_t BleCharacteristic::getValue(String& str) const { } int BleCharacteristic::subscribe(bool enable) const { - CHECK_FALSE(impl()->local(), SYSTEM_ERROR_INVALID_STATE); + CHECK_FALSE(impl()->isLocal(), SYSTEM_ERROR_INVALID_STATE); CHECK_TRUE(impl()->connHandle() != BLE_INVALID_CONN_HANDLE, SYSTEM_ERROR_INVALID_STATE); CHECK_TRUE(impl()->attrHandles().cccd_handle != BLE_INVALID_ATTR_HANDLE, SYSTEM_ERROR_NOT_SUPPORTED); hal_ble_cccd_config_t config = {}; @@ -1572,7 +1584,7 @@ Vector BlePeerDevice::discoverAllServices() { if (!impl()->servicesDiscovered()) { BleDiscoveryDelegator discovery; if (discovery.discoverAllServices(*this) == SYSTEM_ERROR_NONE) { - impl()->servicesDiscovered() = true; + impl()->servicesDiscovered(true); } } return services(); @@ -1583,7 +1595,7 @@ ssize_t BlePeerDevice::discoverAllServices(BleService* svcs, size_t count) { if (!impl()->servicesDiscovered()) { BleDiscoveryDelegator discovery; CHECK(discovery.discoverAllServices(*this)); - impl()->servicesDiscovered() = true; + impl()->servicesDiscovered(true); } return services(svcs, count); } @@ -1611,7 +1623,7 @@ Vector BlePeerDevice::discoverCharacteristicsOfService(const if (!service.impl()->characteristicsDiscovered()) { BleDiscoveryDelegator discovery; if (discovery.discoverCharacteristics(*this, service) == SYSTEM_ERROR_NONE) { - service.impl()->characteristicsDiscovered() = true; + service.impl()->characteristicsDiscovered(true); } } return characteristics(service); @@ -2635,7 +2647,7 @@ BleCharacteristic BleLocalDevice::addCharacteristic(const BleCharacteristic& cha if (hal_ble_gatt_server_add_characteristic(&charInit, &charImpl->attrHandles(), nullptr) != SYSTEM_ERROR_NONE) { return characteristic; } - charImpl->local() = true; + charImpl->isLocal(true); LOG_DEBUG(TRACE, "Add new local characteristic."); if(!impl()->characteristics().append(characteristic)) { LOG(ERROR, "Failed to append local characteristic."); From 28175ba07e0deba15de0b731378944c411715bed Mon Sep 17 00:00:00 2001 From: XuGuohui Date: Sat, 21 Nov 2020 00:08:07 +0800 Subject: [PATCH 7/7] [wiring] BLE: minor --- wiring/src/spark_wiring_ble.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/wiring/src/spark_wiring_ble.cpp b/wiring/src/spark_wiring_ble.cpp index f0b4833456..d559ed019f 100644 --- a/wiring/src/spark_wiring_ble.cpp +++ b/wiring/src/spark_wiring_ble.cpp @@ -1640,7 +1640,7 @@ Vector BlePeerDevice::services() const { return impl()->services(); } -size_t BlePeerDevice::services(BleService* svcs, size_t count) { +size_t BlePeerDevice::services(BleService* svcs, size_t count) const { WiringBleLock lk; CHECK_TRUE(svcs && count > 0, SYSTEM_ERROR_INVALID_ARGUMENT); count = std::min((int)count, impl()->services().size()); @@ -1662,6 +1662,7 @@ bool BlePeerDevice::getServiceByUUID(BleService& service, const BleUuid& uuid) c } Vector BlePeerDevice::getServiceByUUID(const BleUuid& uuid) const { + WiringBleLock lk; Vector services; for (auto& existSvc : impl()->services()) { if (existSvc.UUID() == uuid) { @@ -1672,6 +1673,7 @@ Vector BlePeerDevice::getServiceByUUID(const BleUuid& uuid) const { } size_t BlePeerDevice::getServiceByUUID(BleService* svcs, size_t count, const BleUuid& uuid) const { + WiringBleLock lk; CHECK_TRUE(svcs && count > 0, SYSTEM_ERROR_INVALID_ARGUMENT); Vector services = getServiceByUUID(uuid); count = std::min((int)count, services.size()); @@ -1708,6 +1710,7 @@ size_t BlePeerDevice::characteristics(BleCharacteristic* characteristics, size_t } size_t BlePeerDevice::characteristics(const BleService& service, BleCharacteristic* characteristics, size_t count) const { + WiringBleLock lk; CHECK_TRUE(characteristics && count > 0, SYSTEM_ERROR_INVALID_ARGUMENT); Vector chars = this->characteristics(service); count = std::min((int)count, chars.size()); @@ -1745,6 +1748,7 @@ bool BlePeerDevice::getCharacteristicByUUID(BleCharacteristic& characteristic, c } Vector BlePeerDevice::getCharacteristicByUUID(const BleUuid& uuid) const { + WiringBleLock lk; Vector characteristics; for (auto& existChar : impl()->characteristics()) { if (existChar.UUID() == uuid) { @@ -1755,6 +1759,7 @@ Vector BlePeerDevice::getCharacteristicByUUID(const BleUuid& } size_t BlePeerDevice::getCharacteristicByUUID(BleCharacteristic* characteristics, size_t count, const BleUuid& uuid) const { + WiringBleLock lk; CHECK_TRUE(characteristics && count > 0, SYSTEM_ERROR_INVALID_ARGUMENT); Vector chars = getCharacteristicByUUID(uuid); count = std::min((int)count, chars.size()); @@ -1765,6 +1770,7 @@ size_t BlePeerDevice::getCharacteristicByUUID(BleCharacteristic* characteristics } bool BlePeerDevice::getCharacteristicByDescription(const BleService& service, BleCharacteristic& characteristic, const char* desc) const { + WiringBleLock lk; CHECK_TRUE(desc, false); for (auto& existChar : impl()->characteristics()) { if (service.impl()->hasCharacteristic(existChar) && !strcmp(existChar.description().c_str(), desc)) { @@ -1780,6 +1786,7 @@ bool BlePeerDevice::getCharacteristicByDescription(const BleService& service, Bl } bool BlePeerDevice::getCharacteristicByUUID(const BleService& service, BleCharacteristic& characteristic, const BleUuid& uuid) const { + WiringBleLock lk; for (auto& existChar : impl()->characteristics()) { if (existChar.UUID() == uuid && service.impl()->hasCharacteristic(existChar)) { characteristic = existChar;