Я пытаюсь добавить несколько характерных описаний пользователей в свою пользовательскую службу BLE GATT, используя API mbed. Моя работа до сих пор была основана на этот структура кода. Тем не менее, я хотел бы добавить имена к этим характеристикам. Я не могу найти много информации о том, как это сделать. Однако ниже приведен код, который добавляет информацию к характеристике.
Конструктор для GattCharacteristic () принимает массив GattAttribtues в качестве необязательного аргумента. Вы можете заполнить свое описание пользователя в атрибуте GattAttribute и передать его в характеристику. У меня есть эта структура, работающая на одну характеристику, но я пытаюсь воспроизвести ее для 3 персонажей. Я не могу повторить все это 3 раза, так как я запускаю его для множества проблем, связанных с массивами и т. Д., Которые уже определены. Если я сложу описания в массиве, он не будет принят GattArray?
uint16_t newServiceUUID = 0xA000;
uint16_t PercentageUUID = 0xA001;
uint16_t TimeUUID = 0xA002;
uint16_t UseProfileUUID = 0xA003;
const static char DEVICE_NAME[] = "Device"; // Device name
static const uint16_t uuid16_list[] = {0xFFF};
static uint8_t percentageValue[10] = {0};
GattAttribute nameDescr( BLE_UUID_DESCRIPTOR_CHAR_USER_DESC, (uint8_t *)"Percentage", strlen("Percentage"));
GattAttribute *descriptors[] = {&nameDescr};
WriteOnlyArrayGattCharacteristic<uint8_t,sizeof(percentageValue)>
percentageChar( PercentageUUID,
percentageValue,
GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_EXTENDED_PROPERTIES,
descriptors,
sizeof(descriptors) / sizeof(GattAttribute*) );
GattCharacteristic *characteristics[] = {&percentageChar, &timeChar, &UseProfileChar};
GattService newService(newServiceUUID, characteristics, sizeof(characteristics) / sizeof(GattCharacteristic *));
Работая с обсуждением ниже, у меня теперь есть:
#include <string>
class MyGattArray
{
public:
MyGattArray( const std::string& name ) :
attr( BLE_UUID_DESCRIPTOR_CHAR_USER_DESC, (uint8_t *)name.c_str(), (name.size()+1) )
{
descriptors[0] = &attr;
}
GattAttribute attr;
GattAttribute *descriptors[1];
};
а также
static uint8_t percentageValue[10] = {0};
MyGattArray PercentageName( "Percentage" );
GattAttribute *descriptors[] = {&(PercentageName.attr)};
WriteOnlyArrayGattCharacteristic<uint8_t,sizeof(percentageValue)>
percentageChar( PercentageUUID,
percentageValue,
GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_EXTENDED_PROPERTIES,
descriptors,
sizeof(descriptors) / sizeof(GattAttribute*) );
Это строит, но не дает характеристику имя.
Вот предложение вспомогательного класса шаблона, который может инкапсулировать характерный объект и его дескриптор. Это немного сложно понять, если вы не знакомы с шаблонами.
template <typename T, unsigned NUM_ELEMENTS, template <typename T, unsigned NUM_ELEMENTS> class CharacType>
class CharacteristicWithNameDescrptorHelper
{
public:
CharacteristicWithNameDescrptorHelper( const UUID &uuid,
T valuePtr[NUM_ELEMENTS],
uint8_t additionalProperties,
const std::string& characName ) :
name( characName )
{
descriptor = new GattAttribute( BLE_UUID_DESCRIPTOR_CHAR_USER_DESC, (uint8_t *)name.c_str(), name.size() )
// create descriptor array
descriptors[0] = descriptor;
// create characteristic object:
charac = new CharacType<T,NUM_ELEMENTS>( uuid, valuePtr, additionalProperties, descriptors, 1 );
}
~CharacteristicWithNameDescrptorHelper()
{
delete charac;
delete descriptor;
}
CharacType<T,NUM_ELEMENTS>* charac;
std::string name;
GattAttribute* descriptor;
GattAttribute *descriptors[1];
};
Затем вы просто делаете:
CharacteristicWithNameDescrptorHelper<uint8_t,sizeof(percentageValue),WriteOnlyArrayGattCharacteristic>
percentageChar( PercentageUUID,
percentageValue,
GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_EXTENDED_PROPERTIES,
"Percentage" );
GattCharacteristic *characteristics[] = {percentageChar.charac};
GattService newService(newServiceUUID, characteristics, sizeof(characteristics) / sizeof(GattCharacteristic *));
Других решений пока нет …