2015-10-26 5 views
0

J'essaie d'ajouter des descriptions d'utilisateur caractéristiques à mon service BLE GATT personnalisé, en utilisant le mbed API. Mon travail a jusqu'à présent été basé sur la structure du code this. Cependant, j'aimerais ajouter des noms à ces caractéristiques. Il n'y a pas beaucoup d'informations que je pourrais trouver sur la façon de le faire. Cependant, ci-dessous est le code qui ajoute l'information à une caractéristique.Ajout de la description de l'utilisateur caractéristique à plusieurs services BLE GATT C++ personnalisés

Le constructeur de GattCharacteristic() prend un tableau de GattAttribtues en tant qu'argument optionnel. Vous pouvez remplir votre User-Description dans un GattAttribute et le transmettre à la caractéristique. J'ai cette structure fonctionnant pour une caractéristique, mais j'ai du mal à la reproduire pour 3 caractères. Je ne peux pas reproduire le tout 3 fois, car je le lance à beaucoup de questions sur les tableaux, etc. étant déjà définis. Si j'empile les descriptions dans le tableau, il ne sera pas accepté par le 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

Travailler avec la discussion ci-dessous, j'ai maintenant:

#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]; 
}; 

et

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

Cela construit, mais ne donne pas un nom caractéristique.

+0

Que voulez-vous dire par 'ne donne pas une name' caractéristique ne le characterstic ont un descripteur lorsque vous vous connectez l'appareil? Si oui, quel est son contenu? – jpo38

+0

@ jpo38 Le service est créé, mais la caractéristique n'a que la description 0xA001 et rien d'autre. –

+0

Avez-vous essayé de déboguer l'exécution de la fonction 'WriteOnlyArrayGattCharacteristic' dans les deux situations? – jpo38

Répondre

0

Voici une proposition de classe d'aide de modèle qui peut encapsuler l'objet caractéristique et son descripteur. C'est un peu difficile à comprendre si vous n'êtes pas familier avec les modèles.

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]; 
}; 

Ensuite, vous faites simplement:

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

Ok, juste en passant par ceci maintenant, je reçois une erreur: L'expression doit avoir un type de pointeur sur la ligne 'GattCharacteristic * caractéristiques [] = {percentageChar-> charac};' Il semble également que quelque chose ne va pas avec la structure de 'descriptor (BLE_UUID_DESCRIPTOR_CHAR_USER_DESC, (uint8_t *) name.c_str(), sizeof (nom)))' car il génère une erreur 'Erreur: Attendu un" {"' –

+0

J'ai J'ai fait quelques autres modifications mineures pour corriger d'autres erreurs de compilation, je posterai quand nous l'aurons à construire. –

+0

OK, cela semble-t-il fonctionner cette fois? – jpo38