2015-10-26 1 views
0

Я пытаюсь добавить некоторые характерные пользовательские описания в свою обычную службу BLE GATT, используя mbed API. До сих пор моя работа основывалась на структуре кода this. Однако я хотел бы добавить имена к этим характеристикам. Не так много информации о том, как это сделать. Однако ниже приведен код, который добавляет информацию к характеристике.Добавление характерного пользовательского описания для нескольких пользовательских служб C++ BLE GATT

Конструктор для 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 *)); 

EDIT

Работа с обсуждения ниже, теперь у меня есть:

#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*)); 

Это строит, но не дает характерное название.

+0

Что вы имеете в виду 'не дает характерный в name' ли characterstic иметь дескриптор при подключении устройства? Если да, то каково его содержание? – jpo38

+0

@ jpo38 Служба создана, но характеристика имеет только описание 0xA001 и ничего больше. –

+0

Вы пытались отладить выполнение функции WriteOnlyArrayGattCharacteristic в обеих ситуациях? – jpo38

ответ

0

Вот предложение вспомогательного класса шаблона, который может инкапсулировать характерный объект и его дескриптор. Это немного сложно понять, если вы не знакомы с шаблонами.

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 *)); 
+0

Хорошо, просто работая через это сейчас, я получаю сообщение об ошибке: выражение должно иметь тип указателя на характеристике 'GattCharacteristic * [= = процентная черта-> charac};'. Там также, кажется, что-то не так со структурой дескриптора (BLE_UUID_DESCRIPTOR_CHAR_USER_DESC, (uint8_t *) name.c_str(), sizeof (name))) ', поскольку он выдает ошибку' Error: Ожидаемый a '{"' –

+0

У меня есть сделал несколько других незначительных изменений, чтобы исправить некоторые другие ошибки сборки, я опубликую, когда мы его построим. –

+0

ОК, похоже ли это работает в этот раз? – jpo38

Смежные вопросы