2020-03-30 01:44:20 +02:00
|
|
|
/*
|
|
|
|
* NimBLERemoteService.h
|
|
|
|
*
|
|
|
|
* 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.h
|
|
|
|
*
|
|
|
|
* Created on: Jul 8, 2017
|
|
|
|
* Author: kolban
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef COMPONENTS_NIMBLEREMOTESERVICE_H_
|
|
|
|
#define COMPONENTS_NIMBLEREMOTESERVICE_H_
|
|
|
|
|
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 "NimBLEClient.h"
|
|
|
|
#include "NimBLEUUID.h"
|
|
|
|
#include "NimBLERemoteCharacteristic.h"
|
|
|
|
|
2020-05-18 04:21:35 +02:00
|
|
|
#include <vector>
|
2020-03-30 01:44:20 +02:00
|
|
|
|
|
|
|
class NimBLEClient;
|
|
|
|
class NimBLERemoteCharacteristic;
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief A model of a remote %BLE service.
|
|
|
|
*/
|
|
|
|
class NimBLERemoteService {
|
|
|
|
public:
|
|
|
|
virtual ~NimBLERemoteService();
|
|
|
|
|
|
|
|
// Public methods
|
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
|
|
|
std::vector<NimBLERemoteCharacteristic*>::iterator begin();
|
|
|
|
std::vector<NimBLERemoteCharacteristic*>::iterator end();
|
2020-05-23 18:27:32 +02:00
|
|
|
NimBLERemoteCharacteristic* getCharacteristic(const char* uuid);
|
|
|
|
NimBLERemoteCharacteristic* getCharacteristic(const NimBLEUUID &uuid);
|
2020-05-30 05:21:56 +02:00
|
|
|
void deleteCharacteristics();
|
|
|
|
size_t deleteCharacteristic(const NimBLEUUID &uuid);
|
2020-05-23 18:27:32 +02:00
|
|
|
NimBLEClient* getClient(void);
|
2020-07-09 03:27:26 +02:00
|
|
|
//uint16_t getHandle();
|
2020-05-23 18:27:32 +02:00
|
|
|
NimBLEUUID getUUID(void);
|
|
|
|
std::string getValue(const NimBLEUUID &characteristicUuid);
|
|
|
|
bool setValue(const NimBLEUUID &characteristicUuid,
|
|
|
|
const std::string &value);
|
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
|
|
|
std::string toString(void);
|
2020-05-23 18:27:32 +02:00
|
|
|
std::vector<NimBLERemoteCharacteristic*>* getCharacteristics(bool refresh = false);
|
2020-03-30 01:44:20 +02:00
|
|
|
|
|
|
|
private:
|
|
|
|
// Private constructor ... never meant to be created by a user application.
|
2020-05-14 06:03:56 +02:00
|
|
|
NimBLERemoteService(NimBLEClient* pClient, const struct ble_gatt_svc *service);
|
2020-03-30 01:44:20 +02:00
|
|
|
|
|
|
|
// Friends
|
|
|
|
friend class NimBLEClient;
|
|
|
|
friend class NimBLERemoteCharacteristic;
|
|
|
|
|
|
|
|
// Private methods
|
2020-05-23 18:27:32 +02:00
|
|
|
bool retrieveCharacteristics(const NimBLEUUID *uuid_filter = nullptr);
|
2020-05-14 06:03:56 +02:00
|
|
|
static int characteristicDiscCB(uint16_t conn_handle,
|
2020-05-23 18:27:32 +02:00
|
|
|
const struct ble_gatt_error *error,
|
|
|
|
const struct ble_gatt_chr *chr,
|
|
|
|
void *arg);
|
2020-03-30 01:44:20 +02:00
|
|
|
|
2020-05-23 18:27:32 +02:00
|
|
|
uint16_t getStartHandle();
|
|
|
|
uint16_t getEndHandle();
|
2020-03-30 01:44:20 +02:00
|
|
|
void releaseSemaphores();
|
|
|
|
|
|
|
|
// Properties
|
|
|
|
|
2020-05-18 04:21:35 +02:00
|
|
|
// We maintain a vector of characteristics owned by this service.
|
|
|
|
std::vector<NimBLERemoteCharacteristic*> m_characteristicVector;
|
2020-03-30 01:44:20 +02:00
|
|
|
|
|
|
|
NimBLEClient* m_pClient;
|
2020-05-23 18:27:32 +02:00
|
|
|
NimBLEUUID m_uuid;
|
|
|
|
uint16_t m_startHandle;
|
|
|
|
uint16_t m_endHandle;
|
|
|
|
}; // NimBLERemoteService
|
2020-03-30 01:44:20 +02:00
|
|
|
|
2021-09-07 05:14:43 +02:00
|
|
|
#endif /* CONFIG_BT_ENABLED && CONFIG_BT_NIMBLE_ROLE_CENTRAL */
|
2020-03-30 01:44:20 +02:00
|
|
|
#endif /* COMPONENTS_NIMBLEREMOTESERVICE_H_ */
|