2017-08-14 4 views
9

J'ai un lecteur de codes-barres bluetooth qui prend en charge bluetooth LE et j'essaie d'obtenir les informations de code à barres de celui-ci lors de la numérisation.Comment obtenir des données à partir d'un périphérique Bluetooth LE

Je peux me connecter très bien onServicesDiscovered est appelé dans mon BluetoothGattCallback mais je ne suis pas sûr quoi faire à partir de là.

Avec une connexion Bluetooth classique, vous obtiendrez un InputStream d'un BluetoothSocket et vous attendez pour le read() pour vous donner des données, mais je ne sais pas comment cela fonctionne avec Bluetooth LE. J'ai essayé de boucler le BluetoothGattCharacteristic vérifiant la propriété et si c'est une propriété de lecture j'appelle gatt.readCharacteristic(characteristic); mais cela me donne juste l'information inutile et c'est même avant que j'essaye de balayer quelque chose.

Alors, comment puis-je obtenir les données de code à barres du scanner?

c'est le scanner je https://www.zebra.com/us/en/support-downloads/scanners/ultra-rugged-scanners/li3608-li3678.html

+0

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. –

+0

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

+0

Alors, quelle partie avez-vous exactement problème? Comment obtenir des valeurs significatives à partir des caractéristiques? Oui –

Répondre

10

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.

+0

Ok, alors je dois connaître la caractéristique spécifique que je suis à la recherche et faire 'mGatt.setCharacteristicNotification (caractéristique, true);' dire l'appareil que je veux savoir quand quelque chose change avec ça. Puis je reçois un rappel dans onCharacteristicChanged' quand c'est le cas et c'est là qu'intervient le code que vous avez ci-dessus? Quelle partie, le cas échéant, les descripteurs ont-ils dans ce processus? – tyczj

+0

Dire à la pile que vous voulez être notifié par des changements dans les caractéristiques est une chose, mais vous devez également indiquer au serveur (le périphérique distant) que vous voulez qu'il vous envoie des notifications/indications et c'est là que les descripteurs entrent dans le image. Veuillez consulter [Recevoir les notifications du GATT] (https://developer.android.com/guide/topics/connectivity/bluetooth-le.html#notification) pour plus d'informations. L'exemple d'UUID du descripteur 'CLIENT_CHARACTERISTIC_CONFIG' (' 0x2902') (avec les autres) peut être trouvé sur le site [BT website] (https://www.bluetooth.com/specifications/gatt/descriptors). –