Les données fournies par les dispositifs BLE est appelé Caractéristiques. Ces paquets de données sont des tableaux d'octets spécialement formés et étroitement codés qui codent des valeurs spécifiques pour des services spécifiques Services. Vous pouvez consulter le Services sur le site Web officiel de Bluetooth. Vous trouverez ici les services du GATT définis (faisant autorité) et les caractéristiques d'appartenance. Par exemple, vous avez un ordinateur de cyclisme BLE qui rapporte la vitesse et la cadence. Vous recherchez l'article Cycling Speed and Cadence dans la liste. Cette entrée contient l'UUID (0x1816) du service et un lien vers la feuille de données contenant les caractéristiques. Maintenant, si vous allez au tableau Caractéristiques du service, vous trouverez quelques entrées. Vous voulez la vitesse et la cadence, vous allez ouvrir CSC Measurement (le champ Type de l'entrée) qui vous permettra d'accéder à la fiche technique de la fiche. Ici, vous verrez le tableau Value Fields qui définit les valeurs spécifiques pouvant être lues à partir de la caractéristique.
C'était la partie Bluetooth LE en général, maintenant de retour à Android. Notez que vous devrez rechercher ces champs pour obtenir les valeurs des caractéristiques. Je vais juste supposer que vous avez déjà la caractéristique que vous voulez obtenir les données. Voici un exemple rapide qui récupère les révolutions de roue et de manivelle (si disponible).
BluetoothGattCharacteristic characteristic = ... ;
int offset = 0; // we define the offset that is to be used when reading the next field
// FORMAT_* values are constants in BluetoothGattCharacteristic
// these represent the values you can find in the "Value Fields" table in the "Format" column
int flags = characteristic.getIntValue(FORMAT_UINT8, offset);
offset += 1; // UINT8 = 8 bits = 1 byte
// we have to check the flags' 0th bit to see if C1 field exists
if ((flags & 1) != 0) {
int cumulativeWheelRevolutions = characteristic.getIntValue(FORMAT_UINT32, offset);
offset += 4; // UINT32 = 32 bits = 4 bytes
int lastWheelEventTime = characteristic.getIntValue(FORMAT_UINT16, offset);
offset += 2; // UINT16 = 16 bits = 2 bytes
}
// we have to check the flags' 1st bit to see if C2 field exists
if ((flags & 2) != 0) {
int cumulativeCrankRevolutions = characteristic.getIntValue(FORMAT_UINT16, offset);
offset += 2;
int lastCrankEventTime = characteristic.getIntValue(FORMAT_UINT16, offset);
offset += 2;
}
Le champ flags
doit être cochée pour les bits spécifiques, car il est possible que l'appareil ne se présente pas tous les types de données, par exemple ça ne compte pas les révolutions de la roue. La feuille de caractéristique sélectionnée contient toujours les informations pertinentes sur ce champ (s'il existe).
Il est également intéressant de noter que la documentation indique que
La caractéristique de mesure du SCC (SCC se réfère à vélo vitesse et de cadence) est une structure de longueur variable contenant un champ de drapeaux et, en fonction du contenu des drapeaux champ, peut contenir un ou plusieurs champs supplémentaires [...]
Ceci est la raison pour laquelle on ne peut pas supposer que la valeur en tours de manivelle cumulatifs se trouve à 7 octets (8 + 32 + 16 bits, 1 + 4 + 2 octets respectivement) de décalage et le décalage doit être compté comme vous progressez le long des champs. Il s'agit d'un exemple de lecture des valeurs de vitesse et de cadence de cyclage à partir d'un périphérique BLE. Vous devrez rechercher ces champs et valeurs disponibles pour chaque périphérique (ou plutôt le service) que vous souhaitez prendre en charge dans votre application. Si l'appareil est un appareil spécial et qu'il ne figure pas dans ce répertoire du GATT, vous devrez consulter le manuel de l'appareil, le SDK ou le fournisseur pour plus d'informations.
Avez-vous essayé le [SDK Scanner pour Android] (https://www.zebra.com/us/en/support-downloads/software/developer-tools/scanner-sdk-for-android.html)? Je sais que le titre de votre question demande une lecture de données BLE générique, mais vous semblez être intéressé par le lecteur de code-barres, donc ce SDK semble être un bon point de départ au lieu de lire des données brutes. –
Oui, je sais que le SDK fonctionne mais je dois supporter plus que ce simple scanner, c'est pourquoi je veux lancer ma propre logique Bluetooth – tyczj
Alors, quelle partie avez-vous exactement problème? Comment obtenir des valeurs significatives à partir des caractéristiques? Oui –