[BREAKING]- Refactor client

* General code cleanup and rename variables to use a consistent style.
* Removes the disconnect timer and will use the BLE_GAP_EVENT_TERM_FAILURE event to handle failed disconnects.
* `NimBLEClient::getConnId` has been renamed to `getConnHandle` to be consistent with bluetooth terminology.
* `NimBLEClient::disconnect` now returns a `bool = true on success` instead of an int to be consistent with the rest of the library.
* `NimBLEClient::setPeerAddress` now returns a bool, true on success.
* `NimBLEClientCallbacks::onConfirmPIN` renamed to `NimBLEClientCallbacks::onConfirmPasskey` to be consistent with bluetooth terminology.
* `NimBLEClient::setDataLen` now returns bool, true if successful.
* `NimBLEClient::updateConnParams` now returns bool, true if successful.
* `NimBLEClient::getServices` now returns a const reference to std::vector<NimBLERemoteService*> instead of a pointer to the internal vector.
This commit is contained in:
h2zero
2024-11-02 19:00:07 -06:00
committed by h2zero
parent 68b82f5b85
commit 020c61700d
19 changed files with 532 additions and 667 deletions

View File

@ -383,7 +383,7 @@ The security callback methods are now incorporated in the `NimBLEServerCallbacks
The callback methods are: The callback methods are:
> `bool onConfirmPIN(NimBLEConnInfo& connInfo, uint32_t pin)` > `bool onConfirmPasskey(NimBLEConnInfo& connInfo, uint32_t pin)`
Receives the pin when using numeric comparison authentication. Receives the pin when using numeric comparison authentication.
Call `NimBLEDevice::injectConfirmPIN(connInfo, true);` to accept or `NimBLEDevice::injectConfirmPIN(connInfo, false);` to reject. Call `NimBLEDevice::injectConfirmPIN(connInfo, true);` to accept or `NimBLEDevice::injectConfirmPIN(connInfo, false);` to reject.

View File

@ -47,7 +47,7 @@ class ClientCallbacks : public NimBLEClientCallbacks {
NimBLEDevice::injectPassKey(connInfo, 123456); NimBLEDevice::injectPassKey(connInfo, 123456);
}; };
void onConfirmPIN(NimBLEConnInfo& connInfo, uint32_t pass_key){ void onConfirmPasskey(NimBLEConnInfo& connInfo, uint32_t pass_key){
printf("The passkey YES/NO number: %" PRIu32 "\n", pass_key); printf("The passkey YES/NO number: %" PRIu32 "\n", pass_key);
/** Inject false if passkeys don't match. */ /** Inject false if passkeys don't match. */
NimBLEDevice::injectConfirmPasskey(connInfo, true); NimBLEDevice::injectConfirmPasskey(connInfo, true);

View File

@ -52,7 +52,7 @@ class ServerCallbacks: public NimBLEServerCallbacks {
return 123456; return 123456;
}; };
void onConfirmPIN(NimBLEConnInfo& connInfo, uint32_t pass_key){ void onConfirmasskeyN(NimBLEConnInfo& connInfo, uint32_t pass_key){
printf("The passkey YES/NO number: %" PRIu32 "\n", pass_key); printf("The passkey YES/NO number: %" PRIu32 "\n", pass_key);
/** Inject false if passkeys don't match. */ /** Inject false if passkeys don't match. */
NimBLEDevice::injectConfirmPasskey(connInfo, true); NimBLEDevice::injectConfirmPasskey(connInfo, true);

View File

@ -59,7 +59,7 @@ class MyClientCallback : public BLEClientCallbacks {
NimBLEDevice::injectPassKey(connInfo, 123456); NimBLEDevice::injectPassKey(connInfo, 123456);
}; };
void onConfirmPIN(NimBLEConnInfo& connInfo, uint32_t pass_key){ void onConfirmPasskey(NimBLEConnInfo& connInfo, uint32_t pass_key){
printf("The passkey YES/NO number: %" PRIu32 "\n", pass_key); printf("The passkey YES/NO number: %" PRIu32 "\n", pass_key);
/** Inject false if passkeys don't match. */ /** Inject false if passkeys don't match. */
NimBLEDevice::injectConfirmPasskey(connInfo, true); NimBLEDevice::injectConfirmPasskey(connInfo, true);

View File

@ -65,7 +65,7 @@ class MyServerCallbacks: public BLEServerCallbacks {
return 123456; return 123456;
}; };
void onConfirmPIN(NimBLEConnInfo& connInfo, uint32_t pass_key){ void onConfirmPasskey(NimBLEConnInfo& connInfo, uint32_t pass_key){
printf("The passkey YES/NO number: %" PRIu32 "\n", pass_key); printf("The passkey YES/NO number: %" PRIu32 "\n", pass_key);
/** Inject false if passkeys don't match. */ /** Inject false if passkeys don't match. */
NimBLEDevice::injectConfirmPasskey(connInfo, true); NimBLEDevice::injectConfirmPasskey(connInfo, true);

View File

@ -67,7 +67,7 @@ class MyServerCallbacks: public BLEServerCallbacks {
return 123456; return 123456;
}; };
void onConfirmPIN(NimBLEConnInfo& connInfo, uint32_t pass_key){ void onConfirmPasskey(NimBLEConnInfo& connInfo, uint32_t pass_key){
printf("The passkey YES/NO number: %" PRIu32 "\n", pass_key); printf("The passkey YES/NO number: %" PRIu32 "\n", pass_key);
/** Inject false if passkeys don't match. */ /** Inject false if passkeys don't match. */
NimBLEDevice::injectConfirmPasskey(connInfo, true); NimBLEDevice::injectConfirmPasskey(connInfo, true);

File diff suppressed because it is too large Load Diff

View File

@ -11,116 +11,121 @@
* Author: kolban * Author: kolban
*/ */
#ifndef MAIN_NIMBLECLIENT_H_ #ifndef NIMBLE_CPP_CLIENT_H_
#define MAIN_NIMBLECLIENT_H_ #define NIMBLE_CPP_CLIENT_H_
#include "nimconfig.h" #include "nimconfig.h"
#if defined(CONFIG_BT_ENABLED) && defined(CONFIG_BT_NIMBLE_ROLE_CENTRAL) #if defined(CONFIG_BT_ENABLED) && defined(CONFIG_BT_NIMBLE_ROLE_CENTRAL)
#include "NimBLEAddress.h" # if defined(CONFIG_NIMBLE_CPP_IDF)
#include "NimBLEUUID.h" # include "host/ble_gap.h"
#include "NimBLEUtils.h" # else
#include "NimBLEConnInfo.h" # include "nimble/nimble/host/include/host/ble_gap.h"
#include "NimBLEAttValue.h" # endif
#include "NimBLEAdvertisedDevice.h"
#include <vector> # include "NimBLEAddress.h"
#include <string>
# include <stdint.h>
# include <vector>
# include <string>
class NimBLEAddress;
class NimBLEUUID;
class NimBLERemoteService; class NimBLERemoteService;
class NimBLERemoteCharacteristic; class NimBLERemoteCharacteristic;
class NimBLEAdvertisedDevice; class NimBLEAdvertisedDevice;
class NimBLEAttValue;
class NimBLEClientCallbacks; class NimBLEClientCallbacks;
class NimBLEConnInfo;
struct BleTaskData;
/** /**
* @brief A model of a %BLE client. * @brief A model of a BLE client.
*/ */
class NimBLEClient { class NimBLEClient {
public: public:
bool connect(NimBLEAdvertisedDevice* device, bool deleteAttributes = true); bool connect(NimBLEAdvertisedDevice* device, bool deleteAttributes = true);
bool connect(const NimBLEAddress &address, bool deleteAttributes = true); bool connect(const NimBLEAddress& address, bool deleteAttributes = true);
bool connect(bool deleteAttributes = true); bool connect(bool deleteAttributes = true);
int disconnect(uint8_t reason = BLE_ERR_REM_USER_CONN_TERM); bool disconnect(uint8_t reason = BLE_ERR_REM_USER_CONN_TERM);
NimBLEAddress getPeerAddress() const; NimBLEAddress getPeerAddress() const;
void setPeerAddress(const NimBLEAddress &address); bool setPeerAddress(const NimBLEAddress& address);
int getRssi(); int getRssi() const;
std::vector<NimBLERemoteService*>* getServices(bool refresh = false); bool isConnected() const;
void setClientCallbacks(NimBLEClientCallbacks* pClientCallbacks, bool deleteCallbacks = true);
std::string toString() const;
uint16_t getConnHandle() const;
void clearConnection();
bool setConnection(const NimBLEConnInfo& connInfo);
bool setConnection(uint16_t connHandle);
uint16_t getMTU() const;
bool secureConnection() const;
void setConnectTimeout(uint32_t timeout);
bool setDataLen(uint16_t txOctets);
bool discoverAttributes();
NimBLEConnInfo getConnInfo() const;
int getLastError() const;
bool updateConnParams(uint16_t minInterval, uint16_t maxInterval, uint16_t latency, uint16_t timeout);
void setConnectionParams(uint16_t minInterval,
uint16_t maxInterval,
uint16_t latency,
uint16_t timeout,
uint16_t scanInterval = 16,
uint16_t scanWindow = 16);
const std::vector<NimBLERemoteService*>& getServices(bool refresh = false);
std::vector<NimBLERemoteService*>::iterator begin(); std::vector<NimBLERemoteService*>::iterator begin();
std::vector<NimBLERemoteService*>::iterator end(); std::vector<NimBLERemoteService*>::iterator end();
NimBLERemoteCharacteristic* getCharacteristic(uint16_t handle);
NimBLERemoteService* getService(const char* uuid); NimBLERemoteService* getService(const char* uuid);
NimBLERemoteService* getService(const NimBLEUUID &uuid); NimBLERemoteService* getService(const NimBLEUUID& uuid);
void deleteServices(); void deleteServices();
size_t deleteService(const NimBLEUUID &uuid); size_t deleteService(const NimBLEUUID& uuid);
NimBLEAttValue getValue(const NimBLEUUID &serviceUUID, const NimBLEUUID &characteristicUUID); NimBLEAttValue getValue(const NimBLEUUID& serviceUUID, const NimBLEUUID& characteristicUUID);
bool setValue(const NimBLEUUID &serviceUUID, const NimBLEUUID &characteristicUUID, bool setValue(const NimBLEUUID& serviceUUID,
const NimBLEAttValue &value, bool response = false); const NimBLEUUID& characteristicUUID,
NimBLERemoteCharacteristic* getCharacteristic(const uint16_t handle); const NimBLEAttValue& value,
bool isConnected(); bool response = false);
void setClientCallbacks(NimBLEClientCallbacks *pClientCallbacks,
bool deleteCallbacks = true);
std::string toString();
uint16_t getConnId() const;
void clearConnection();
bool setConnection(NimBLEConnInfo &conn_info);
bool setConnection(uint16_t conn_id);
uint16_t getMTU() const;
bool secureConnection() const;
void setConnectTimeout(uint32_t timeout);
void setConnectionParams(uint16_t minInterval, uint16_t maxInterval,
uint16_t latency, uint16_t timeout,
uint16_t scanInterval=16, uint16_t scanWindow=16);
void updateConnParams(uint16_t minInterval, uint16_t maxInterval,
uint16_t latency, uint16_t timeout);
void setDataLen(uint16_t tx_octets);
bool discoverAttributes();
NimBLEConnInfo getConnInfo();
int getLastError();
#if CONFIG_BT_NIMBLE_EXT_ADV
void setConnectPhy(uint8_t mask);
#endif
private: # if CONFIG_BT_NIMBLE_EXT_ADV
NimBLEClient(const NimBLEAddress &peerAddress); void setConnectPhy(uint8_t mask);
# endif
private:
NimBLEClient(const NimBLEAddress& peerAddress);
~NimBLEClient(); ~NimBLEClient();
NimBLEClient(const NimBLEClient&) = delete;
NimBLEClient& operator=(const NimBLEClient&) = delete;
friend class NimBLEDevice; bool retrieveServices(const NimBLEUUID* uuidFilter = nullptr);
friend class NimBLERemoteService; static int handleGapEvent(struct ble_gap_event* event, void* arg);
static int serviceDiscoveredCB(uint16_t connHandle,
const struct ble_gatt_error* error,
const struct ble_gatt_svc* service,
void* arg);
static int handleGapEvent(struct ble_gap_event *event, void *arg); NimBLEAddress m_peerAddress;
static int serviceDiscoveredCB(uint16_t conn_handle, mutable int m_lastErr;
const struct ble_gatt_error *error, int32_t m_connectTimeout;
const struct ble_gatt_svc *service, mutable BleTaskData* m_pTaskData;
void *arg); std::vector<NimBLERemoteService*> m_svcVec;
static void dcTimerCb(ble_npl_event *event); NimBLEClientCallbacks* m_pClientCallbacks;
bool retrieveServices(const NimBLEUUID *uuidFilter = nullptr); uint16_t m_connHandle;
uint8_t m_terminateFailCount;
NimBLEAddress m_peerAddress; bool m_deleteCallbacks;
mutable int m_lastErr; bool m_connEstablished;
uint16_t m_conn_id; # if CONFIG_BT_NIMBLE_EXT_ADV
bool m_connEstablished; uint8_t m_phyMask;
bool m_deleteCallbacks; # endif
int32_t m_connectTimeout; ble_gap_conn_params m_connParams;
NimBLEClientCallbacks* m_pClientCallbacks;
mutable ble_task_data_t* m_pTaskData;
ble_npl_callout m_dcTimer;
#if CONFIG_BT_NIMBLE_EXT_ADV
uint8_t m_phyMask;
#endif
std::vector<NimBLERemoteService*> m_servicesVector;
private:
friend class NimBLEClientCallbacks;
ble_gap_conn_params m_pConnParams;
friend class NimBLEDevice;
}; // class NimBLEClient }; // class NimBLEClient
/** /**
* @brief Callbacks associated with a %BLE client. * @brief Callbacks associated with a %BLE client.
*/ */
class NimBLEClientCallbacks { class NimBLEClientCallbacks {
public: public:
virtual ~NimBLEClientCallbacks() {}; virtual ~NimBLEClientCallbacks() {};
/** /**
@ -162,7 +167,7 @@ public:
* @param [in] connInfo A reference to a NimBLEConnInfo instance containing the peer info. * @param [in] connInfo A reference to a NimBLEConnInfo instance containing the peer info.
* @param [in] pin The pin to compare with the server. * @param [in] pin The pin to compare with the server.
*/ */
virtual void onConfirmPIN(NimBLEConnInfo& connInfo, uint32_t pin); virtual void onConfirmPasskey(NimBLEConnInfo& connInfo, uint32_t pin);
/** /**
* @brief Called when the peer identity address is resolved. * @brief Called when the peer identity address is resolved.
@ -172,4 +177,4 @@ public:
}; };
#endif /* CONFIG_BT_ENABLED && CONFIG_BT_NIMBLE_ROLE_CENTRAL */ #endif /* CONFIG_BT_ENABLED && CONFIG_BT_NIMBLE_ROLE_CENTRAL */
#endif /* MAIN_NIMBLECLIENT_H_ */ #endif /* NIMBLE_CPP_CLIENT_H_ */

View File

@ -324,8 +324,7 @@ bool NimBLEDevice::deleteClient(NimBLEClient* pClient) {
int rc = 0; int rc = 0;
if (pClient->isConnected()) { if (pClient->isConnected()) {
rc = pClient->disconnect(); if (!pClient->disconnect()) {
if (rc != 0 && rc != BLE_HS_EALREADY && rc != BLE_HS_ENOTCONN) {
return false; return false;
} }
@ -378,7 +377,7 @@ size_t NimBLEDevice::getCreatedClientCount() {
*/ */
NimBLEClient* NimBLEDevice::getClientByHandle(uint16_t connHandle) { NimBLEClient* NimBLEDevice::getClientByHandle(uint16_t connHandle) {
for (const auto clt : m_pClients) { for (const auto clt : m_pClients) {
if (clt != nullptr && clt->getConnId() == connHandle) { if (clt != nullptr && clt->getConnHandle() == connHandle) {
return clt; return clt;
} }
} }

View File

@ -65,7 +65,7 @@ int NimBLERemoteCharacteristic::descriptorDiscCB(
NIMBLE_LOGD(LOG_TAG, "Descriptor Discovery >> status: %d handle: %d", rc, (rc == 0) ? dsc->handle : -1); NIMBLE_LOGD(LOG_TAG, "Descriptor Discovery >> status: %d handle: %d", rc, (rc == 0) ? dsc->handle : -1);
auto filter = (desc_filter_t*)arg; auto filter = (desc_filter_t*)arg;
auto pTaskData = (ble_task_data_t*)filter->task_data; auto pTaskData = (BleTaskData*)filter->task_data;
const auto pChr = (NimBLERemoteCharacteristic*)pTaskData->pATT; const auto pChr = (NimBLERemoteCharacteristic*)pTaskData->pATT;
const NimBLEUUID* uuidFilter = filter->uuid; const NimBLEUUID* uuidFilter = filter->uuid;
@ -102,10 +102,10 @@ bool NimBLERemoteCharacteristic::retrieveDescriptors(const NimBLEUUID* uuidFilte
NIMBLE_LOGD(LOG_TAG, ">> retrieveDescriptors() for characteristic: %s", getUUID().toString().c_str()); NIMBLE_LOGD(LOG_TAG, ">> retrieveDescriptors() for characteristic: %s", getUUID().toString().c_str());
TaskHandle_t cur_task = xTaskGetCurrentTaskHandle(); TaskHandle_t cur_task = xTaskGetCurrentTaskHandle();
ble_task_data_t taskData = {const_cast<NimBLERemoteCharacteristic*>(this), cur_task, 0, nullptr}; BleTaskData taskData = {const_cast<NimBLERemoteCharacteristic*>(this), cur_task, 0, nullptr};
desc_filter_t filter = {uuidFilter, &taskData}; desc_filter_t filter = {uuidFilter, &taskData};
int rc = ble_gattc_disc_all_dscs(getClient()->getConnId(), int rc = ble_gattc_disc_all_dscs(getClient()->getConnHandle(),
getHandle(), getHandle(),
getRemoteService()->getEndHandle(), getRemoteService()->getEndHandle(),
NimBLERemoteCharacteristic::descriptorDiscCB, NimBLERemoteCharacteristic::descriptorDiscCB,

View File

@ -145,11 +145,11 @@ int NimBLERemoteService::characteristicDiscCB(uint16_t conn_handle,
const ble_gatt_chr* chr, const ble_gatt_chr* chr,
void* arg) { void* arg) {
NIMBLE_LOGD(LOG_TAG, "Characteristic Discovery >>"); NIMBLE_LOGD(LOG_TAG, "Characteristic Discovery >>");
auto pTaskData = (ble_task_data_t*)arg; auto pTaskData = (BleTaskData*)arg;
const auto pSvc = (NimBLERemoteService*)pTaskData->pATT; const auto pSvc = (NimBLERemoteService*)pTaskData->pATT;
// Make sure the discovery is for this device // Make sure the discovery is for this device
if (pSvc->getClient()->getConnId() != conn_handle) { if (pSvc->getClient()->getConnHandle() != conn_handle) {
return 0; return 0;
} }
@ -173,16 +173,16 @@ bool NimBLERemoteService::retrieveCharacteristics(const NimBLEUUID* uuidFilter)
NIMBLE_LOGD(LOG_TAG, ">> retrieveCharacteristics()"); NIMBLE_LOGD(LOG_TAG, ">> retrieveCharacteristics()");
int rc = 0; int rc = 0;
TaskHandle_t cur_task = xTaskGetCurrentTaskHandle(); TaskHandle_t cur_task = xTaskGetCurrentTaskHandle();
ble_task_data_t taskData = {const_cast<NimBLERemoteService*>(this), cur_task, 0, nullptr}; BleTaskData taskData = {const_cast<NimBLERemoteService*>(this), cur_task, 0, nullptr};
if (uuidFilter == nullptr) { if (uuidFilter == nullptr) {
rc = ble_gattc_disc_all_chrs(m_pClient->getConnId(), rc = ble_gattc_disc_all_chrs(m_pClient->getConnHandle(),
getHandle(), getHandle(),
getEndHandle(), getEndHandle(),
NimBLERemoteService::characteristicDiscCB, NimBLERemoteService::characteristicDiscCB,
&taskData); &taskData);
} else { } else {
rc = ble_gattc_disc_chrs_by_uuid(m_pClient->getConnId(), rc = ble_gattc_disc_chrs_by_uuid(m_pClient->getConnHandle(),
getHandle(), getHandle(),
getEndHandle(), getEndHandle(),
uuidFilter->getBase(), uuidFilter->getBase(),

View File

@ -10,6 +10,7 @@
# include "NimBLERemoteValueAttribute.h" # include "NimBLERemoteValueAttribute.h"
# include "NimBLEClient.h" # include "NimBLEClient.h"
# include "NimBLEUtils.h"
# include <climits> # include <climits>
@ -20,7 +21,7 @@ bool NimBLERemoteValueAttribute::writeValue(const uint8_t* data, size_t length,
const NimBLEClient* pClient = getClient(); const NimBLEClient* pClient = getClient();
TaskHandle_t cur_task = xTaskGetCurrentTaskHandle(); TaskHandle_t cur_task = xTaskGetCurrentTaskHandle();
ble_task_data_t taskData = {const_cast<NimBLERemoteValueAttribute*>(this), cur_task, 0, nullptr}; BleTaskData taskData = {const_cast<NimBLERemoteValueAttribute*>(this), cur_task, 0, nullptr};
int retryCount = 1; int retryCount = 1;
int rc = 0; int rc = 0;
uint16_t mtu = pClient->getMTU() - 3; uint16_t mtu = pClient->getMTU() - 3;
@ -28,7 +29,7 @@ bool NimBLERemoteValueAttribute::writeValue(const uint8_t* data, size_t length,
// Check if the data length is longer than we can write in one connection event. // Check if the data length is longer than we can write in one connection event.
// If so we must do a long write which requires a response. // If so we must do a long write which requires a response.
if (length <= mtu && !response) { if (length <= mtu && !response) {
rc = ble_gattc_write_no_rsp_flat(pClient->getConnId(), getHandle(), data, length); rc = ble_gattc_write_no_rsp_flat(pClient->getConnHandle(), getHandle(), data, length);
goto Done; goto Done;
} }
@ -36,9 +37,9 @@ bool NimBLERemoteValueAttribute::writeValue(const uint8_t* data, size_t length,
if (length > mtu) { if (length > mtu) {
NIMBLE_LOGI(LOG_TAG, "writeValue: long write"); NIMBLE_LOGI(LOG_TAG, "writeValue: long write");
os_mbuf* om = ble_hs_mbuf_from_flat(data, length); os_mbuf* om = ble_hs_mbuf_from_flat(data, length);
rc = ble_gattc_write_long(pClient->getConnId(), getHandle(), 0, om, NimBLERemoteValueAttribute::onWriteCB, &taskData); rc = ble_gattc_write_long(pClient->getConnHandle(), getHandle(), 0, om, NimBLERemoteValueAttribute::onWriteCB, &taskData);
} else { } else {
rc = ble_gattc_write_flat(pClient->getConnId(), rc = ble_gattc_write_flat(pClient->getConnHandle(),
getHandle(), getHandle(),
data, data,
length, length,
@ -93,10 +94,10 @@ Done:
* @return success == 0 or error code. * @return success == 0 or error code.
*/ */
int NimBLERemoteValueAttribute::onWriteCB(uint16_t conn_handle, const ble_gatt_error* error, ble_gatt_attr* attr, void* arg) { int NimBLERemoteValueAttribute::onWriteCB(uint16_t conn_handle, const ble_gatt_error* error, ble_gatt_attr* attr, void* arg) {
auto pTaskData = static_cast<ble_task_data_t*>(arg); auto pTaskData = static_cast<BleTaskData*>(arg);
const auto pAtt = static_cast<NimBLERemoteValueAttribute*>(pTaskData->pATT); const auto pAtt = static_cast<NimBLERemoteValueAttribute*>(pTaskData->pATT);
if (pAtt->getClient()->getConnId() != conn_handle) { if (pAtt->getClient()->getConnHandle() != conn_handle) {
return 0; return 0;
} }
@ -119,10 +120,10 @@ NimBLEAttValue NimBLERemoteValueAttribute::readValue(time_t* timestamp) const {
int rc = 0; int rc = 0;
int retryCount = 1; int retryCount = 1;
TaskHandle_t cur_task = xTaskGetCurrentTaskHandle(); TaskHandle_t cur_task = xTaskGetCurrentTaskHandle();
ble_task_data_t taskData = {const_cast<NimBLERemoteValueAttribute*>(this), cur_task, 0, &value}; BleTaskData taskData = {const_cast<NimBLERemoteValueAttribute*>(this), cur_task, 0, &value};
do { do {
rc = ble_gattc_read_long(pClient->getConnId(), getHandle(), 0, NimBLERemoteValueAttribute::onReadCB, &taskData); rc = ble_gattc_read_long(pClient->getConnHandle(), getHandle(), 0, NimBLERemoteValueAttribute::onReadCB, &taskData);
if (rc != 0) { if (rc != 0) {
goto Done; goto Done;
} }
@ -142,7 +143,7 @@ NimBLEAttValue NimBLERemoteValueAttribute::readValue(time_t* timestamp) const {
// Characteristic is not long-readable, return with what we have. // Characteristic is not long-readable, return with what we have.
case BLE_HS_ATT_ERR(BLE_ATT_ERR_ATTR_NOT_LONG): case BLE_HS_ATT_ERR(BLE_ATT_ERR_ATTR_NOT_LONG):
NIMBLE_LOGI(LOG_TAG, "Attribute not long"); NIMBLE_LOGI(LOG_TAG, "Attribute not long");
rc = ble_gattc_read(pClient->getConnId(), getHandle(), NimBLERemoteValueAttribute::onReadCB, &taskData); rc = ble_gattc_read(pClient->getConnHandle(), getHandle(), NimBLERemoteValueAttribute::onReadCB, &taskData);
if (rc != 0) { if (rc != 0) {
goto Done; goto Done;
} }
@ -179,10 +180,10 @@ Done:
* @return success == 0 or error code. * @return success == 0 or error code.
*/ */
int NimBLERemoteValueAttribute::onReadCB(uint16_t conn_handle, const ble_gatt_error* error, ble_gatt_attr* attr, void* arg) { int NimBLERemoteValueAttribute::onReadCB(uint16_t conn_handle, const ble_gatt_error* error, ble_gatt_attr* attr, void* arg) {
auto pTaskData = static_cast<ble_task_data_t*>(arg); auto pTaskData = static_cast<BleTaskData*>(arg);
const auto pAtt = static_cast<NimBLERemoteValueAttribute*>(pTaskData->pATT); const auto pAtt = static_cast<NimBLERemoteValueAttribute*>(pTaskData->pATT);
if (pAtt->getClient()->getConnId() != conn_handle) { if (pAtt->getClient()->getConnHandle() != conn_handle) {
return 0; return 0;
} }

View File

@ -457,7 +457,7 @@ NimBLEScanResults NimBLEScan::getResults(uint32_t duration, bool is_continue) {
} }
TaskHandle_t cur_task = xTaskGetCurrentTaskHandle(); TaskHandle_t cur_task = xTaskGetCurrentTaskHandle();
ble_task_data_t taskData = {nullptr, cur_task, 0, nullptr}; BleTaskData taskData = {nullptr, cur_task, 0, nullptr};
m_pTaskData = &taskData; m_pTaskData = &taskData;
if(start(duration, is_continue)) { if(start(duration, is_continue)) {

View File

@ -94,7 +94,7 @@ private:
bool m_ignoreResults; bool m_ignoreResults;
NimBLEScanResults m_scanResults; NimBLEScanResults m_scanResults;
uint32_t m_duration; uint32_t m_duration;
ble_task_data_t *m_pTaskData; BleTaskData *m_pTaskData;
uint8_t m_maxResults; uint8_t m_maxResults;
}; };

View File

@ -368,7 +368,7 @@ int NimBLEServer::peerNameCB(uint16_t conn_handle,
const struct ble_gatt_error *error, const struct ble_gatt_error *error,
struct ble_gatt_attr *attr, struct ble_gatt_attr *attr,
void *arg) { void *arg) {
ble_task_data_t *pTaskData = (ble_task_data_t*)arg; BleTaskData *pTaskData = (BleTaskData*)arg;
std::string *name = (std::string*)pTaskData->buf; std::string *name = (std::string*)pTaskData->buf;
int rc = error->status; int rc = error->status;
@ -414,7 +414,7 @@ int NimBLEServer::peerNameCB(uint16_t conn_handle,
*/ */
std::string NimBLEServer::getPeerNameInternal(uint16_t conn_handle, TaskHandle_t task, int cb_type) { std::string NimBLEServer::getPeerNameInternal(uint16_t conn_handle, TaskHandle_t task, int cb_type) {
std::string *buf = new std::string{}; std::string *buf = new std::string{};
ble_task_data_t *taskData = new ble_task_data_t{this, task, cb_type, buf}; BleTaskData *taskData = new BleTaskData{this, task, cb_type, buf};
ble_uuid16_t uuid {{BLE_UUID_TYPE_16}, BLE_SVC_GAP_CHR_UUID16_DEVICE_NAME}; ble_uuid16_t uuid {{BLE_UUID_TYPE_16}, BLE_SVC_GAP_CHR_UUID16_DEVICE_NAME};
int rc = ble_gattc_read_by_uuid(conn_handle, int rc = ble_gattc_read_by_uuid(conn_handle,
1, 1,
@ -628,7 +628,7 @@ int NimBLEServer::handleGapEvent(struct ble_gap_event *event, void *arg) {
if (rc != 0) { if (rc != 0) {
return 0; return 0;
} }
pServer->m_pServerCallbacks->onConnParamsUpdate(peerInfo); pServer->m_pServerCallbacks->onConnParamsUpdate(peerInfo);
return 0; return 0;
} // BLE_GAP_EVENT_CONN_UPDATE } // BLE_GAP_EVENT_CONN_UPDATE

View File

@ -19,6 +19,11 @@
# include "NimBLEUUID.h" # include "NimBLEUUID.h"
# include "NimBLELog.h" # include "NimBLELog.h"
/**** FIX COMPILATION ****/
# undef min
# undef max
/**************************/
# include <algorithm> # include <algorithm>
static const char* LOG_TAG = "NimBLEUUID"; static const char* LOG_TAG = "NimBLEUUID";

View File

@ -24,11 +24,6 @@
# include "nimble/nimble/host/include/host/ble_uuid.h" # include "nimble/nimble/host/include/host/ble_uuid.h"
# endif # endif
/**** FIX COMPILATION ****/
# undef min
# undef max
/**************************/
# include <string> # include <string>
# include <cstring> # include <cstring>

View File

@ -13,6 +13,17 @@
#include "NimBLEAddress.h" #include "NimBLEAddress.h"
#include "NimBLELog.h" #include "NimBLELog.h"
# if defined(CONFIG_NIMBLE_CPP_IDF)
# include "host/ble_hs.h"
# else
# include "nimble/nimble/host/include/host/ble_hs.h"
# endif
/**** FIX COMPILATION ****/
#undef min
#undef max
/**************************/
#include <stdlib.h> #include <stdlib.h>
static const char* LOG_TAG = "NimBLEUtils"; static const char* LOG_TAG = "NimBLEUtils";

View File

@ -12,28 +12,21 @@
#include "nimconfig.h" #include "nimconfig.h"
#if defined(CONFIG_BT_ENABLED) #if defined(CONFIG_BT_ENABLED)
#if defined(CONFIG_NIMBLE_CPP_IDF) # include <freertos/FreeRTOS.h>
#include "host/ble_gap.h" # include <freertos/task.h>
#else
#include "nimble/nimble/host/include/host/ble_gap.h"
#endif
/**** FIX COMPILATION ****/
#undef min
#undef max
/**************************/
#include <string> #include <string>
class NimBLEAddress; class NimBLEAddress;
typedef struct { struct BleTaskData {
void *pATT; void* pATT;
TaskHandle_t task; TaskHandle_t task;
int rc; int rc;
void *buf; void* buf;
} ble_task_data_t; };
struct ble_gap_event;
/** /**
* @brief A BLE Utility class with methods for debugging and general purpose use. * @brief A BLE Utility class with methods for debugging and general purpose use.
@ -48,6 +41,5 @@ public:
static NimBLEAddress generateAddr(bool nrpa); static NimBLEAddress generateAddr(bool nrpa);
}; };
#endif // CONFIG_BT_ENABLED #endif // CONFIG_BT_ENABLED
#endif // COMPONENTS_NIMBLEUTILS_H_ #endif // COMPONENTS_NIMBLEUTILS_H_