2020-03-30 01:44:20 +02:00
|
|
|
/*
|
|
|
|
* NimBLERemoteService.cpp
|
|
|
|
*
|
|
|
|
* Created: on Jan 27 2020
|
|
|
|
* Author H2zero
|
2020-05-14 06:03:56 +02:00
|
|
|
*
|
2020-03-30 01:44:20 +02:00
|
|
|
* Originally:
|
|
|
|
*
|
|
|
|
* BLERemoteService.cpp
|
|
|
|
*
|
|
|
|
* Created on: Jul 8, 2017
|
|
|
|
* Author: kolban
|
|
|
|
*/
|
|
|
|
|
2020-05-14 06:03:56 +02:00
|
|
|
#include "nimconfig.h"
|
2021-09-07 05:14:43 +02:00
|
|
|
#if defined(CONFIG_BT_ENABLED) && defined(CONFIG_BT_NIMBLE_ROLE_CENTRAL)
|
2020-05-14 06:03:56 +02:00
|
|
|
|
2020-03-30 01:44:20 +02:00
|
|
|
#include "NimBLERemoteService.h"
|
|
|
|
#include "NimBLEUtils.h"
|
|
|
|
#include "NimBLEDevice.h"
|
|
|
|
#include "NimBLELog.h"
|
|
|
|
|
2022-01-15 04:45:24 +01:00
|
|
|
#include <climits>
|
|
|
|
|
2020-03-30 01:44:20 +02:00
|
|
|
static const char* LOG_TAG = "NimBLERemoteService";
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Remote Service constructor.
|
2020-07-09 03:27:26 +02:00
|
|
|
* @param [in] pClient A pointer to the client this belongs to.
|
|
|
|
* @param [in] service A pointer to the structure with the service information.
|
2020-05-14 06:03:56 +02:00
|
|
|
*/
|
2020-03-30 01:44:20 +02:00
|
|
|
NimBLERemoteService::NimBLERemoteService(NimBLEClient* pClient, const struct ble_gatt_svc* service) {
|
|
|
|
|
2020-05-23 18:27:32 +02:00
|
|
|
NIMBLE_LOGD(LOG_TAG, ">> NimBLERemoteService()");
|
2020-03-30 01:44:20 +02:00
|
|
|
m_pClient = pClient;
|
|
|
|
switch (service->uuid.u.type) {
|
2020-05-14 06:03:56 +02:00
|
|
|
case BLE_UUID_TYPE_16:
|
2020-03-30 01:44:20 +02:00
|
|
|
m_uuid = NimBLEUUID(service->uuid.u16.value);
|
|
|
|
break;
|
2020-05-14 06:03:56 +02:00
|
|
|
case BLE_UUID_TYPE_32:
|
2020-03-30 01:44:20 +02:00
|
|
|
m_uuid = NimBLEUUID(service->uuid.u32.value);
|
|
|
|
break;
|
2020-05-14 06:03:56 +02:00
|
|
|
case BLE_UUID_TYPE_128:
|
2020-03-30 01:44:20 +02:00
|
|
|
m_uuid = NimBLEUUID(const_cast<ble_uuid128_t*>(&service->uuid.u128));
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
m_startHandle = service->start_handle;
|
|
|
|
m_endHandle = service->end_handle;
|
2020-12-28 20:05:54 +01:00
|
|
|
NIMBLE_LOGD(LOG_TAG, "<< NimBLERemoteService(): %s", m_uuid.toString().c_str());
|
2020-03-30 01:44:20 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief When deleting the service make sure we delete all characteristics and descriptors.
|
2020-05-14 06:03:56 +02:00
|
|
|
*/
|
2020-03-30 01:44:20 +02:00
|
|
|
NimBLERemoteService::~NimBLERemoteService() {
|
2020-05-30 05:21:56 +02:00
|
|
|
deleteCharacteristics();
|
2020-03-30 01:44:20 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
Add iterators to client remote attributes.
Add iterators for NimBLEScan: NimBLEadvertisedDevice, NimBLEClient: NimBLERemoteService, NimBLERemoteService: NimBLERemoteCharacteristic and NimBLERemoteCharacteristic: NimBLERemoteDescriptor
This is handy e.g. for showing every address of the advertised devices from a scan. To do so, first get a new scan and next:
```
for(auto pAdvertisedDevice: pBLEScan->getResults()) {
Serial.printf("Address is %s\n", std::string(pAdvertisedDevice->getAddress()).c_str());
}
```
Of course any other property of the advertised device can be shown (or looked up, if that is your use case)
Also this is handy e.g. for showing every UUID in a peripheral. To do so, first connect to a peripheral and next:
```
for(auto pService: *pClient) {
Serial.printf("Service UUID is %s\n", std::string(pService->getUUID()).c_str());
for(auto pCharacteristic: *pService) {
Serial.printf("Characteristic UUID is %s\n", std::string(pCharacteristic->getUUID()).c_str());
for(auto pDescriptor: *pCharacteristic) {
Serial.printf("Descriptor UUID is %s\n", std::string(pDescriptor->getUUID()).c_str());
}
}
}
```
Again of course any other property can be shown, or looked up.
2020-05-23 04:13:52 +02:00
|
|
|
/**
|
|
|
|
* @brief Get iterator to the beginning of the vector of remote characteristic pointers.
|
|
|
|
* @return An iterator to the beginning of the vector of remote characteristic pointers.
|
|
|
|
*/
|
|
|
|
std::vector<NimBLERemoteCharacteristic*>::iterator NimBLERemoteService::begin() {
|
|
|
|
return m_characteristicVector.begin();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Get iterator to the end of the vector of remote characteristic pointers.
|
|
|
|
* @return An iterator to the end of the vector of remote characteristic pointers.
|
|
|
|
*/
|
|
|
|
std::vector<NimBLERemoteCharacteristic*>::iterator NimBLERemoteService::end() {
|
|
|
|
return m_characteristicVector.end();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2020-03-30 01:44:20 +02:00
|
|
|
/**
|
|
|
|
* @brief Get the remote characteristic object for the characteristic UUID.
|
|
|
|
* @param [in] uuid Remote characteristic uuid.
|
2020-07-09 03:27:26 +02:00
|
|
|
* @return A pointer to the remote characteristic object.
|
2020-05-14 06:03:56 +02:00
|
|
|
*/
|
2020-03-30 01:44:20 +02:00
|
|
|
NimBLERemoteCharacteristic* NimBLERemoteService::getCharacteristic(const char* uuid) {
|
|
|
|
return getCharacteristic(NimBLEUUID(uuid));
|
|
|
|
} // getCharacteristic
|
|
|
|
|
2020-05-14 06:03:56 +02:00
|
|
|
|
2020-03-30 01:44:20 +02:00
|
|
|
/**
|
|
|
|
* @brief Get the characteristic object for the UUID.
|
|
|
|
* @param [in] uuid Characteristic uuid.
|
2020-07-09 03:27:26 +02:00
|
|
|
* @return A pointer to the characteristic object, or nullptr if not found.
|
2020-03-30 01:44:20 +02:00
|
|
|
*/
|
2020-05-10 15:21:46 +02:00
|
|
|
NimBLERemoteCharacteristic* NimBLERemoteService::getCharacteristic(const NimBLEUUID &uuid) {
|
2020-12-28 23:40:01 +01:00
|
|
|
NIMBLE_LOGD(LOG_TAG, ">> getCharacteristic: uuid: %s", uuid.toString().c_str());
|
|
|
|
|
2020-05-23 18:27:32 +02:00
|
|
|
for(auto &it: m_characteristicVector) {
|
|
|
|
if(it->getUUID() == uuid) {
|
2020-12-28 23:40:01 +01:00
|
|
|
NIMBLE_LOGD(LOG_TAG, "<< getCharacteristic: found the characteristic with uuid: %s", uuid.toString().c_str());
|
2020-05-23 18:27:32 +02:00
|
|
|
return it;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
size_t prev_size = m_characteristicVector.size();
|
|
|
|
if(retrieveCharacteristics(&uuid)) {
|
|
|
|
if(m_characteristicVector.size() > prev_size) {
|
|
|
|
return m_characteristicVector.back();
|
2020-03-30 01:44:20 +02:00
|
|
|
}
|
2020-12-28 23:40:01 +01:00
|
|
|
|
2022-01-18 22:48:07 +01:00
|
|
|
// If the request was successful but 16/32 bit uuid not found
|
2020-12-28 23:40:01 +01:00
|
|
|
// try again with the 128 bit uuid.
|
|
|
|
if(uuid.bitSize() == BLE_UUID_TYPE_16 ||
|
|
|
|
uuid.bitSize() == BLE_UUID_TYPE_32)
|
|
|
|
{
|
|
|
|
NimBLEUUID uuid128(uuid);
|
|
|
|
uuid128.to128();
|
2022-02-15 04:18:18 +01:00
|
|
|
if (retrieveCharacteristics(&uuid128)) {
|
|
|
|
if(m_characteristicVector.size() > prev_size) {
|
|
|
|
return m_characteristicVector.back();
|
|
|
|
}
|
|
|
|
}
|
2022-01-18 22:48:07 +01:00
|
|
|
} else {
|
|
|
|
// If the request was successful but the 128 bit uuid not found
|
|
|
|
// try again with the 16 bit uuid.
|
|
|
|
NimBLEUUID uuid16(uuid);
|
|
|
|
uuid16.to16();
|
|
|
|
// if the uuid was 128 bit but not of the BLE base type this check will fail
|
|
|
|
if (uuid16.bitSize() == BLE_UUID_TYPE_16) {
|
2022-02-15 04:18:18 +01:00
|
|
|
if(retrieveCharacteristics(&uuid16)) {
|
|
|
|
if(m_characteristicVector.size() > prev_size) {
|
|
|
|
return m_characteristicVector.back();
|
|
|
|
}
|
|
|
|
}
|
2022-01-18 22:48:07 +01:00
|
|
|
}
|
2020-12-28 23:40:01 +01:00
|
|
|
}
|
2020-03-30 01:44:20 +02:00
|
|
|
}
|
|
|
|
|
2020-12-28 23:40:01 +01:00
|
|
|
NIMBLE_LOGD(LOG_TAG, "<< getCharacteristic: not found");
|
2020-03-30 01:44:20 +02:00
|
|
|
return nullptr;
|
|
|
|
} // getCharacteristic
|
|
|
|
|
|
|
|
|
2020-05-23 18:27:32 +02:00
|
|
|
/**
|
2020-07-09 03:27:26 +02:00
|
|
|
* @brief Get a pointer to the vector of found characteristics.
|
|
|
|
* @param [in] refresh If true the current characteristics vector will cleared and
|
|
|
|
* all characteristics for this service retrieved from the peripheral.
|
|
|
|
* If false the vector will be returned with the currently stored characteristics of this service.
|
|
|
|
* @return A pointer to the vector of descriptors for this characteristic.
|
2020-05-23 18:27:32 +02:00
|
|
|
*/
|
|
|
|
std::vector<NimBLERemoteCharacteristic*>* NimBLERemoteService::getCharacteristics(bool refresh) {
|
|
|
|
if(refresh) {
|
2020-05-30 05:21:56 +02:00
|
|
|
deleteCharacteristics();
|
2020-05-23 18:27:32 +02:00
|
|
|
|
|
|
|
if (!retrieveCharacteristics()) {
|
|
|
|
NIMBLE_LOGE(LOG_TAG, "Error: Failed to get characteristics");
|
|
|
|
}
|
|
|
|
else{
|
|
|
|
NIMBLE_LOGI(LOG_TAG, "Found %d characteristics", m_characteristicVector.size());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return &m_characteristicVector;
|
|
|
|
} // getCharacteristics
|
|
|
|
|
|
|
|
|
2020-03-30 01:44:20 +02:00
|
|
|
/**
|
2022-07-31 19:00:12 +02:00
|
|
|
* @brief Callback for Characteristic discovery.
|
2020-07-09 03:27:26 +02:00
|
|
|
* @return success == 0 or error code.
|
2020-03-30 01:44:20 +02:00
|
|
|
*/
|
2020-05-14 06:03:56 +02:00
|
|
|
int NimBLERemoteService::characteristicDiscCB(uint16_t conn_handle,
|
2020-03-30 01:44:20 +02:00
|
|
|
const struct ble_gatt_error *error,
|
2020-05-14 06:03:56 +02:00
|
|
|
const struct ble_gatt_chr *chr, void *arg)
|
2020-03-30 01:44:20 +02:00
|
|
|
{
|
2020-05-23 18:27:32 +02:00
|
|
|
NIMBLE_LOGD(LOG_TAG,"Characteristic Discovered >> status: %d handle: %d",
|
|
|
|
error->status, (error->status == 0) ? chr->val_handle : -1);
|
2020-05-14 06:03:56 +02:00
|
|
|
|
2020-06-22 06:07:01 +02:00
|
|
|
ble_task_data_t *pTaskData = (ble_task_data_t*)arg;
|
|
|
|
NimBLERemoteService *service = (NimBLERemoteService*)pTaskData->pATT;
|
2020-03-30 01:44:20 +02:00
|
|
|
|
|
|
|
// Make sure the discovery is for this device
|
|
|
|
if(service->getClient()->getConnId() != conn_handle){
|
|
|
|
return 0;
|
|
|
|
}
|
2020-05-14 06:03:56 +02:00
|
|
|
|
2020-06-22 06:07:01 +02:00
|
|
|
if(error->status == 0) {
|
|
|
|
// Found a service - add it to the vector
|
|
|
|
NimBLERemoteCharacteristic* pRemoteCharacteristic = new NimBLERemoteCharacteristic(service, chr);
|
|
|
|
service->m_characteristicVector.push_back(pRemoteCharacteristic);
|
|
|
|
return 0;
|
2020-03-30 01:44:20 +02:00
|
|
|
}
|
2020-06-22 06:07:01 +02:00
|
|
|
|
|
|
|
if(error->status == BLE_HS_EDONE) {
|
|
|
|
pTaskData->rc = 0;
|
|
|
|
} else {
|
|
|
|
NIMBLE_LOGE(LOG_TAG, "characteristicDiscCB() rc=%d %s",
|
|
|
|
error->status,
|
|
|
|
NimBLEUtils::returnCodeToString(error->status));
|
|
|
|
pTaskData->rc = error->status;
|
2020-03-30 01:44:20 +02:00
|
|
|
}
|
2020-06-22 06:07:01 +02:00
|
|
|
|
|
|
|
xTaskNotifyGive(pTaskData->task);
|
|
|
|
|
|
|
|
NIMBLE_LOGD(LOG_TAG,"<< Characteristic Discovered");
|
|
|
|
return error->status;
|
2020-03-30 01:44:20 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Retrieve all the characteristics for this service.
|
|
|
|
* This function will not return until we have all the characteristics.
|
2020-07-09 03:27:26 +02:00
|
|
|
* @return True if successful.
|
2020-03-30 01:44:20 +02:00
|
|
|
*/
|
2020-05-23 18:27:32 +02:00
|
|
|
bool NimBLERemoteService::retrieveCharacteristics(const NimBLEUUID *uuid_filter) {
|
2020-03-30 01:44:20 +02:00
|
|
|
NIMBLE_LOGD(LOG_TAG, ">> retrieveCharacteristics() for service: %s", getUUID().toString().c_str());
|
2020-05-14 06:03:56 +02:00
|
|
|
|
2020-03-30 01:44:20 +02:00
|
|
|
int rc = 0;
|
2022-01-10 03:04:41 +01:00
|
|
|
TaskHandle_t cur_task = xTaskGetCurrentTaskHandle();
|
|
|
|
ble_task_data_t taskData = {this, cur_task, 0, nullptr};
|
2020-05-14 06:03:56 +02:00
|
|
|
|
2020-05-23 18:27:32 +02:00
|
|
|
if(uuid_filter == nullptr) {
|
|
|
|
rc = ble_gattc_disc_all_chrs(m_pClient->getConnId(),
|
|
|
|
m_startHandle,
|
|
|
|
m_endHandle,
|
|
|
|
NimBLERemoteService::characteristicDiscCB,
|
2020-06-22 06:07:01 +02:00
|
|
|
&taskData);
|
2020-05-23 18:27:32 +02:00
|
|
|
} else {
|
|
|
|
rc = ble_gattc_disc_chrs_by_uuid(m_pClient->getConnId(),
|
|
|
|
m_startHandle,
|
|
|
|
m_endHandle,
|
|
|
|
&uuid_filter->getNative()->u,
|
|
|
|
NimBLERemoteService::characteristicDiscCB,
|
2020-06-22 06:07:01 +02:00
|
|
|
&taskData);
|
2020-05-23 18:27:32 +02:00
|
|
|
}
|
|
|
|
|
2020-03-30 01:44:20 +02:00
|
|
|
if (rc != 0) {
|
|
|
|
NIMBLE_LOGE(LOG_TAG, "ble_gattc_disc_all_chrs: rc=%d %s", rc, NimBLEUtils::returnCodeToString(rc));
|
|
|
|
return false;
|
|
|
|
}
|
2020-05-14 06:03:56 +02:00
|
|
|
|
2022-01-10 03:04:41 +01:00
|
|
|
#ifdef ulTaskNotifyValueClear
|
|
|
|
// Clear the task notification value to ensure we block
|
|
|
|
ulTaskNotifyValueClear(cur_task, ULONG_MAX);
|
|
|
|
#endif
|
2020-06-22 06:07:01 +02:00
|
|
|
ulTaskNotifyTake(pdTRUE, portMAX_DELAY);
|
|
|
|
|
|
|
|
if(taskData.rc == 0){
|
2021-05-17 22:37:03 +02:00
|
|
|
if (uuid_filter == nullptr) {
|
|
|
|
if (m_characteristicVector.size() > 1) {
|
|
|
|
for (auto it = m_characteristicVector.begin(); it != m_characteristicVector.end(); ++it ) {
|
|
|
|
auto nx = std::next(it, 1);
|
|
|
|
if (nx == m_characteristicVector.end()) {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
(*it)->m_endHandle = (*nx)->m_defHandle - 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-04-02 22:22:23 +02:00
|
|
|
if (m_characteristicVector.size() > 0) {
|
|
|
|
m_characteristicVector.back()->m_endHandle = getEndHandle();
|
|
|
|
}
|
2021-05-17 22:37:03 +02:00
|
|
|
}
|
|
|
|
|
2020-03-30 01:44:20 +02:00
|
|
|
NIMBLE_LOGD(LOG_TAG, "<< retrieveCharacteristics()");
|
|
|
|
return true;
|
|
|
|
}
|
2020-05-14 06:03:56 +02:00
|
|
|
|
2020-03-30 01:44:20 +02:00
|
|
|
NIMBLE_LOGE(LOG_TAG, "Could not retrieve characteristics");
|
|
|
|
return false;
|
2020-05-14 06:03:56 +02:00
|
|
|
|
2020-03-30 01:44:20 +02:00
|
|
|
} // retrieveCharacteristics
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Get the client associated with this service.
|
|
|
|
* @return A reference to the client associated with this service.
|
|
|
|
*/
|
|
|
|
NimBLEClient* NimBLERemoteService::getClient() {
|
|
|
|
return m_pClient;
|
|
|
|
} // getClient
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Get the service end handle.
|
|
|
|
*/
|
|
|
|
uint16_t NimBLERemoteService::getEndHandle() {
|
|
|
|
return m_endHandle;
|
|
|
|
} // getEndHandle
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Get the service start handle.
|
|
|
|
*/
|
|
|
|
uint16_t NimBLERemoteService::getStartHandle() {
|
|
|
|
return m_startHandle;
|
|
|
|
} // getStartHandle
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Get the service UUID.
|
|
|
|
*/
|
|
|
|
NimBLEUUID NimBLERemoteService::getUUID() {
|
|
|
|
return m_uuid;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Read the value of a characteristic associated with this service.
|
|
|
|
* @param [in] characteristicUuid The characteristic to read.
|
|
|
|
* @returns a string containing the value or an empty string if not found or error.
|
|
|
|
*/
|
2020-05-10 15:21:46 +02:00
|
|
|
std::string NimBLERemoteService::getValue(const NimBLEUUID &characteristicUuid) {
|
2020-03-30 01:44:20 +02:00
|
|
|
NIMBLE_LOGD(LOG_TAG, ">> readValue: uuid: %s", characteristicUuid.toString().c_str());
|
2020-05-14 06:03:56 +02:00
|
|
|
|
2020-03-30 01:44:20 +02:00
|
|
|
std::string ret = "";
|
|
|
|
NimBLERemoteCharacteristic* pChar = getCharacteristic(characteristicUuid);
|
2020-05-14 06:03:56 +02:00
|
|
|
|
2020-03-30 01:44:20 +02:00
|
|
|
if(pChar != nullptr) {
|
|
|
|
ret = pChar->readValue();
|
|
|
|
}
|
|
|
|
|
|
|
|
NIMBLE_LOGD(LOG_TAG, "<< readValue");
|
|
|
|
return ret;
|
|
|
|
} // readValue
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Set the value of a characteristic.
|
|
|
|
* @param [in] characteristicUuid The characteristic to set.
|
|
|
|
* @param [in] value The value to set.
|
|
|
|
* @returns true on success, false if not found or error
|
|
|
|
*/
|
2020-05-10 15:21:46 +02:00
|
|
|
bool NimBLERemoteService::setValue(const NimBLEUUID &characteristicUuid, const std::string &value) {
|
2020-03-30 01:44:20 +02:00
|
|
|
NIMBLE_LOGD(LOG_TAG, ">> setValue: uuid: %s", characteristicUuid.toString().c_str());
|
2020-05-14 06:03:56 +02:00
|
|
|
|
2020-03-30 01:44:20 +02:00
|
|
|
bool ret = false;
|
|
|
|
NimBLERemoteCharacteristic* pChar = getCharacteristic(characteristicUuid);
|
2020-05-14 06:03:56 +02:00
|
|
|
|
2020-03-30 01:44:20 +02:00
|
|
|
if(pChar != nullptr) {
|
|
|
|
ret = pChar->writeValue(value);
|
|
|
|
}
|
|
|
|
|
|
|
|
NIMBLE_LOGD(LOG_TAG, "<< setValue");
|
|
|
|
return ret;
|
|
|
|
} // setValue
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
2020-05-18 04:21:35 +02:00
|
|
|
* @brief Delete the characteristics in the characteristics vector.
|
2020-07-09 03:27:26 +02:00
|
|
|
* @details We maintain a vector called m_characteristicsVector that contains pointers to BLERemoteCharacteristic
|
2020-05-18 04:21:35 +02:00
|
|
|
* object references. Since we allocated these in this class, we are also responsible for deleting
|
|
|
|
* them. This method does just that.
|
2020-03-30 01:44:20 +02:00
|
|
|
*/
|
2020-05-30 05:21:56 +02:00
|
|
|
void NimBLERemoteService::deleteCharacteristics() {
|
|
|
|
NIMBLE_LOGD(LOG_TAG, ">> deleteCharacteristics");
|
2020-05-18 04:21:35 +02:00
|
|
|
for(auto &it: m_characteristicVector) {
|
|
|
|
delete it;
|
2020-03-30 01:44:20 +02:00
|
|
|
}
|
2020-06-22 06:07:01 +02:00
|
|
|
m_characteristicVector.clear();
|
2020-05-30 05:21:56 +02:00
|
|
|
NIMBLE_LOGD(LOG_TAG, "<< deleteCharacteristics");
|
|
|
|
} // deleteCharacteristics
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Delete characteristic by UUID
|
2020-07-09 03:27:26 +02:00
|
|
|
* @param [in] uuid The UUID of the characteristic to be removed from the local database.
|
2020-05-30 05:21:56 +02:00
|
|
|
* @return Number of characteristics left.
|
|
|
|
*/
|
|
|
|
size_t NimBLERemoteService::deleteCharacteristic(const NimBLEUUID &uuid) {
|
|
|
|
NIMBLE_LOGD(LOG_TAG, ">> deleteCharacteristic");
|
2020-06-22 06:07:01 +02:00
|
|
|
|
2020-05-30 05:21:56 +02:00
|
|
|
for(auto it = m_characteristicVector.begin(); it != m_characteristicVector.end(); ++it) {
|
|
|
|
if((*it)->getUUID() == uuid) {
|
|
|
|
delete *it;
|
|
|
|
m_characteristicVector.erase(it);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
NIMBLE_LOGD(LOG_TAG, "<< deleteCharacteristic");
|
|
|
|
|
|
|
|
return m_characteristicVector.size();
|
|
|
|
} // deleteCharacteristic
|
2020-03-30 01:44:20 +02:00
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Create a string representation of this remote service.
|
|
|
|
* @return A string representation of this remote service.
|
|
|
|
*/
|
|
|
|
std::string NimBLERemoteService::toString() {
|
|
|
|
std::string res = "Service: uuid: " + m_uuid.toString();
|
|
|
|
char val[6];
|
|
|
|
res += ", start_handle: ";
|
|
|
|
snprintf(val, sizeof(val), "%d", m_startHandle);
|
|
|
|
res += val;
|
|
|
|
snprintf(val, sizeof(val), "%04x", m_startHandle);
|
|
|
|
res += " 0x";
|
|
|
|
res += val;
|
|
|
|
res += ", end_handle: ";
|
|
|
|
snprintf(val, sizeof(val), "%d", m_endHandle);
|
|
|
|
res += val;
|
|
|
|
snprintf(val, sizeof(val), "%04x", m_endHandle);
|
|
|
|
res += " 0x";
|
|
|
|
res += val;
|
2020-05-14 06:03:56 +02:00
|
|
|
|
2020-05-18 04:21:35 +02:00
|
|
|
for (auto &it: m_characteristicVector) {
|
|
|
|
res += "\n" + it->toString();
|
2020-03-30 01:44:20 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
return res;
|
|
|
|
} // toString
|
|
|
|
|
2021-09-07 05:14:43 +02:00
|
|
|
#endif /* CONFIG_BT_ENABLED && CONFIG_BT_NIMBLE_ROLE_CENTRAL */
|