Problème callback BLE

Je n'ai pas compris ou je dois mettre ça ? Car je n'en mets pas et à quoi sert-il ?

comme vous utilisez ce champs comme un cString la chaîne se termine par un caractère nul. donc quand vous changez le contenu, il faut mettre un caractère nul à la fin. Je ne sais pas si l'application le fait et Je ne sais plus combien d'espace est alloué pour stocker du contenu (de mémoire je pense à 512 octets mais je ne suis pas sûr) donc il se peut aussi qu'écrire un truc trop long mette le bazar.

Il me faudrait plus d'infos car je connais très peu le bluetooth du coup je n'ai pas compris.

trop long à expliquer toute l'architecture BLE. lisez des tutos qui expliquent les concepts. Quelques liens

La spécification

Introduction to Bluetooth Low Energy

BLE C++ Guide.pdf

Getting Started with ESP32 Bluetooth Low Energy (BLE) on Arduino IDE

ESP32 Bluetooth Low Energy (BLE) on Arduino IDE [Tutorial]

A quoi sert le (uint16_t)0x2901 ?

La description du profil ressemble à cela


et chaque élément est porteur d'un ID. certains IDs sont définis par la norme.

Ici 0x2901 c'est l'identifiant de référence du descripteur de caractéristique User Description. (GATT)

j'avais gardé dans un coin tous les identifiants référencés (le consortium en rajoute de temps en temps)

0x1811 "Alert Notification Service"
0x180F "Battery Service"
0x1810 "Blood Pressure"
0x1805 "Current Time Service"
0x1818 "Cycling Power"
0x1816 "Cycling Speed and Cadence"
0x180A "Device Information"
0x1800 "Generic Access"
0x1801 "Generic Attribute"
0x1808 "Glucose"
0x1809 "Health Thermometer"
0x180D "Heart Rate"
0x1812 "Human Interface Device"
0x1802 "Immediate Alert"
0x1803 "Link Loss"
0x1819 "Location and Navigation"
0x1807 "Next DST Change Service"
0x180E "Phone Alert Status Service"
0x1806 "Reference Time Update Service"
0x1814 "Running Speed and Cadence"
0x1813 "Scan Parameters"
0x1804 "Tx Power"
0x181A "Environmental Sensing"
0x181B "Environmental Sensing2"
0x181C "User Data"

//+++++++++++++++++++USER DEFINED SERVICES++++++++++++++++++
0xFF10 "led service"

// Characteristics.
0x2A7E "Aerobic Heart Rate Lower Limit"
0x2A84 "Aerobic Heart Rate Upper Limit"
0x2A7F "Aerobic Threshold"
0x2A80 "Age"
0x2A43 "Alert Category ID"
0x2A42 "Alert Category ID Bit Mask"
0x2A06 "Alert Level"
0x2A44 "Alert Notification Control Point"
0x2A3F "Alert Status"
0x2A81 "Anaerobic Heart Rate Lower Limit"
0x2A82 "Anaerobic Heart Rate Upper Limit"
0x2A83 "Anaerobic Threshold"
0x2A01 "Appearance"
0x2A19 "Battery Level"
0x2A49 "Blood Pressure Feature"
0x2A35 "Blood Pressure Measurement"
0x2A38 "Body Sensor Location"
0x2A22 "Boot Keyboard Input Report"
0x2A32 "Boot Keyboard Output Report"
0x2A33 "Boot Mouse Input Report"
0x2A5C "CSC Feature"
0x2A5B "CSC Measurement"
0x2A2B "Current Time"
0x2A66 "Cycling Power Control Point"
0x2A65 "Cycling Power Feature"
0x2A63 "Cycling Power Measurement"
0x2A64 "Cycling Power Vector"
0x2A99 "Database Change Increment"
0x2A85 "Date of Birth"
0x2A86 "Date of Threshold Assessment "
0x2A08 "Date Time"
0x2A0A "Day Date Time"
0x2A09 "Day of Week"
0x2A00 "Device Name"
0x2A0D "DST Offset"
0x2A87 "Email Address"
0x2A0C "Exact Time 256"
0x2A88 "Fat Burn Heart Rate Lower Limit"
0x2A89 "Fat Burn Heart Rate Upper Limit"
0x2A26 "Firmware Revision String"
0x2A8A "First Name"
0x2A8B "Five Zone Heart Rate Limits"
0x2A8C "Gender"
0x2A51 "Glucose Feature"
0x2A18 "Glucose Measurement"
0x2A34 "Glucose Measurement Context"
0x2A27 "Hardware Revision String"
0x2A39 "Heart Rate Control Point"
0x2A8D "Heart Rate Max"
0x2A37 "Heart Rate Measurement"
0x2A8E "Height"
0x2A4C "HID Control Point"
0x2A4A "HID Information"
0x2A8F "Hip Circumference"
0x2A6F "Humidity"
0x2A2A "IEEE 11073-20601 Regulatory Certification Data List"
0x2A36 "Intermediate Cuff Pressure"
0x2A1E "Intermediate Temperature"
0x2AA2 "Language"
0x2A90 "Last Name"
0x2A6B "LN Control Point"
0x2A6A "LN Feature"
0x2A0F "Local Time Information"
0x2A67 "Location and Speed"
0x2A29 "Manufacturer Name String"
0x2A91 "Maximum Recommended Heart Rate"
0x2A21 "Measurement Interval"
0x2A24 "Model Number String"
0x2A68 "Navigation"
0x2A46 "New Alert"
0x2A04 "Peripheral Preferred Connection Parameters"
0x2A02 "Peripheral Privacy Flag"
0x2A50 "PnP ID"
0x2A69 "Position Quality"
0x2A6D "Pressure"
0x2A4E "Protocol Mode"
0x2A03 "Reconnection Address"
0x2A52 "Record Access Control Point"
0x2A14 "Reference Time Information"
0x2A4D "Report"
0x2A4B "Report Map"
0x2A92 "Resting Heart Rate"
0x2A40 "Ringer Control Point"
0x2A41 "Ringer Setting"
0x2A54 "RSC Feature"
0x2A53 "RSC Measurement"
0x2A55 "SC Control Point"
0x2A4F "Scan Interval Window"
0x2A31 "Scan Refresh"
0x2A5D "Sensor Location"
0x2A25 "Serial Number String"
0x2A05 "Service Changed"
0x2A28 "Software Revision String"
0x2A93 "Sport Type for Aerobic and Anaerobic Thresholds"
0x2A47 "Supported New Alert Category"
0x2A48 "Supported Unread Alert Category"
0x2A23 "System ID"
0x2A6E "Temperature"
0x2A1C "Temperature Measurement"
0x2A1D "Temperature Type"
0x2A94 "Three Zone Heart Rate Limits"
0x2A12 "Time Accuracy"
0x2A13 "Time Source"
0x2A71 "True Wind Direction"
//+++++++++++++++++++USER DEFINED CHAR++++++++++++++++++
0xFF12 "switch led"
0xFF11 "led state"
 
// GATT
0x1800 "Generic Access Profile"
0x1801 "Generic Attribute Profile"
0x2800 "Primary Service"
0x2801 "Secondary Service"
0x2802 "Include"
0x2803 "Characteristic"
0x2900 "Characteristic Extended Properties"
0x2901 "Characteristic User Description"
0x2902 "Client Characteristic Configuration"
0x2903 "Server Characteristic Configuration"
0x2904 "Characteristic Format"
0x2905 "Characteristic Aggregate Format"
0x2A00 "Device Name"
0x2A01 "Appearance"
0x2A02 "Peripheral Privacy Flag"
0x2A03 "Reconnection Address"
0x2A04 "Peripheral Preferred Connection Parameters"
0x2A05 "Service Changed"

Je vais essayer pour le "/0" et j'étudierais le BLE quand j'aurais 5 minutes.

Merci beaucoup

pepemax:
Je vais essayer pour le "/0" et j'étudierais le BLE quand j'aurais 5 minutes.

si votre code dépend du BT, ce serait bien de lire au moins un tuto (pas forcément la spec qui est assez indigeste)

Bon en réfléchissant j'ai peut être trouver un moyen de supprimer le problème d'appel de mes callbacks.

Je récupère la valeur de la caractéristique et je lui demande si elle commence par un certain string unique pour chaque callback. Et après je remet la valeur de la caractéristique à "";

class changeTimedArduinoCallBacks : public BLECharacteristicCallbacks
{
  void onWrite(BLECharacteristic *pSetTimeCharacteristic)
  {
    std::string value = pSetTimeCharacteristic->getValue();
    String written_time;

    if (value.length() > 0)
    {
      for (int i = 0; i < value.length(); i++)
      {
        written_time.concat(value[i]);
      }
    }
    if (written_time.startsWith("time"))
    {
      rtc.adjust(
          DateTime(
              2020,
              10,
              20,
              written_time.substring(5, written_time.indexOf(":")).toInt(),
              written_time.substring(written_time.indexOf(":") + 1, written_time.indexOf(":") + 3).toInt(),
              written_time.substring(written_time.indexOf(":") + 4).toInt()));
      Serial.println("Mise à jour de l''heure effectué");
      print_date_time();
      pSetTimeCharacteristic->setValue("");
    }
  }
};

Je reviens sur le "/0", je n'ai pas encore testé. Dans mon code coté mobile je n'envoie pas ça mais en gros si mon appli envoie aujourd'hui "time 15:56:47" je devrais plutôt envoyer "time 15:56:47 /0"* c'est bien ça ?*

Je reviens sur le "/0", je n'ai pas encore testé. Dans mon code coté mobile je n'envoie pas ça mais en gros si mon appli envoie aujourd'hui "time 15:56:47" je devrais plutôt envoyer "time 15:56:47 /0" c'est bien ça ?

Quand vous faites setValue() vus passez une chaîne.
Quand vous faites un getValue() sur la caractéristique ça retourne une chaîne. Cette partie doit fonctionner tant qu'on utilise l'API qui je suppose qu'il lit cela dans le buffer associé.

Mais je me dis que si vous effectuez la mise à jour par l'application BT sur un téléphone et n'avez pas mis de '\0', le prochain getValue() va lire jusqu'au premier '\0' qu'il va trouver et que ça peut créer des erreurs de débordements suivant comment c'est géré

D'accord mais vu que maintenant je fais macaractéristique->setvalue('""), je n'ai pas besoin de rajouter le "/0" non ?

y-aura-t-il des modifications à distance (en BLE) ? si oui il faut envoyer le '\0'

Bah depuis mon téléphone je pointe vers une caractéristique spécifique pour appeler les fonctions que je souhaite mais à chaque fois que je pointerais sur une caractéristique, sauf dans 1% des cas les valeurs changeront.

Savoir si j'ai bien compris si j'envoie ceci depuis mon tel à l'arduino en bluetooth :

Dans mon exemple c'est du json qui est converti en bytes et envoyé

save1: {"id":1,"duration":25,"startTime":"2000-01-01T04:00:00+01:00","lancementAvance":true,"electrovannes":[{"id":1,"isSelected":true,"durationC":25},{"id":2,"isSelected":true,"durationC":25},{"id":3,"isSelected":true,"durationC":25},{"id":4,"isSelected":true,"durationC":25}]}

Ici il n'y a pas de "/0", donc si j'ai bien compris ça devrait donner ça :

save1: {"id":1,"duration":25,"startTime":"2000-01-01T04:00:00+01:00","lancementAvance":true,"electrovannes":[{"id":1,"isSelected":true,"durationC":25},{"id":2,"isSelected":true,"durationC":25},{"id":3,"isSelected":true,"durationC":25},{"id":4,"isSelected":true,"durationC":25}]} "/0"

Ou :

save1: {"id":1,"duration":25,"startTime":"2000-01-01T04:00:00+01:00","lancementAvance":true,"electrovannes":[{"id":1,"isSelected":true,"durationC":25},{"id":2,"isSelected":true,"durationC":25},{"id":3,"isSelected":true,"durationC":25},{"id":4,"isSelected":true,"durationC":25}]} /0

Merci beaucoup

la notation c'est '\0' pour le caractère nul

je suppose que votre JSON est dans une cString ? si oui (disons dans jsonBuffer) elle se termine par un '\0' donc au lieu d'émettre strlen(jsonBuffer) octets (qui ne compte pas le caractère nul), envoyez en 1 de plus