2017-06-05 3 views
0

Je possède une ceinture pectorale Polar H10 qui fonctionne avec une faible énergie et qui offre une variabilité de la fréquence cardiaque et de la fréquence cardiaque.Lecture de valeurs à partir d'un appareil BLE

Je veux lire ces valeurs avec une application Android. Je suis capable de me connecter à l'appareil grâce à l'aide du official BLE tutorial. Le problème est maintenant de lire les valeurs de fréquence cardiaque et de variabilité de la fréquence cardiaque de l'appareil. Chaque fois qu'une nouvelle valeur est disponible sur l'appareil, je veux lire cette valeur (et il y a au moins toutes les deux nouvelles valeurs).

J'ai trouvé les morceaux de code suivants:

private static double extractHeartRate(
      BluetoothGattCharacteristic characteristic) { 

     int flag = characteristic.getProperties(); 
     Log.d(TAG, "Heart rate flag: " + flag); 
     int format = -1; 
     // Heart rate bit number format 
     if ((flag & 0x01) != 0) { 
      format = BluetoothGattCharacteristic.FORMAT_UINT16; 
      Log.d(TAG, "Heart rate format UINT16."); 
     } else { 
      format = BluetoothGattCharacteristic.FORMAT_UINT8; 
      Log.d(TAG, "Heart rate format UINT8."); 
     } 
     final int heartRate = characteristic.getIntValue(format, 1); 
     Log.d(TAG, String.format("Received heart rate: %d", heartRate)); 
     return heartRate; 
    } 



private static Integer[] extractBeatToBeatInterval(
      BluetoothGattCharacteristic characteristic) { 

     int flag = characteristic.getIntValue(BluetoothGattCharacteristic.FORMAT_UINT8, 0); 
     int format = -1; 
     int energy = -1; 
     int offset = 1; // This depends on hear rate value format and if there is energy data 
     int rr_count = 0; 

     if ((flag & 0x01) != 0) { 
      format = BluetoothGattCharacteristic.FORMAT_UINT16; 
      Log.d(TAG, "Heart rate format UINT16."); 
      offset = 3; 
     } else { 
      format = BluetoothGattCharacteristic.FORMAT_UINT8; 
      Log.d(TAG, "Heart rate format UINT8."); 
      offset = 2; 
     } 
     if ((flag & 0x08) != 0) { 
      // calories present 
      energy = characteristic.getIntValue(BluetoothGattCharacteristic.FORMAT_UINT16, offset); 
      offset += 2; 
      Log.d(TAG, "Received energy: {}"+ energy); 
     } 
     if ((flag & 0x16) != 0){ 
      // RR stuff. 
      Log.d(TAG, "RR stuff found at offset: "+ offset); 
      Log.d(TAG, "RR length: "+ (characteristic.getValue()).length); 
      rr_count = ((characteristic.getValue()).length - offset)/2; 
      Log.d(TAG, "RR length: "+ (characteristic.getValue()).length); 
      Log.d(TAG, "rr_count: "+ rr_count); 
      if (rr_count > 0) { 
       Integer[] mRr_values = new Integer[rr_count]; 
       for (int i = 0; i < rr_count; i++) { 
        mRr_values[i] = characteristic.getIntValue(
          BluetoothGattCharacteristic.FORMAT_UINT16, offset); 
        offset += 2; 
        Log.d(TAG, "Received RR: " + mRr_values[i]); 
       } 
       return mRr_values; 
      } 
     } 
     Log.d(TAG, "No RR data on this update: "); 
     return null; 
    } 

Comment puis-je utiliser pour extraire la fréquence cardiaque et les intervalles r-r (battement à intervalles) en supposant que j'ai une connexion à l'appareil? Je serais heureux si quelqu'un pouvait faire un court exemple. De plus, je voudrais utiliser un service de sorte qu'il fonctionne en arrière-plan et que je puisse faire un autre travail et qu'il draine moins de batterie. Mais le service devrait avoir la plus haute priorité afin qu'il ne soit pas tué.

Dans la méthode extractBeatToBeatInterval() il y a une int offset = 1; avec la description

Cela dépend du taux d'entendre le format de valeur et s'il y a des données d'énergie

Je ne comprends pas le sens de ce offest . Quelle valeur de décalage dois-je utiliser? Deuxièmement, si la connexion se casse, j'aimerais recevoir une notification pour que je puisse la gérer (par exemple, afficher un message). Comment puis je faire ça?

Répondre

0

Je peux vous aider avec quelques petites choses à ce sujet. Pour les pauses, vous pouvez le manipuler comme connexion cette

public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) { 
      if (newState == BluetoothGatt.STATE_CONNECTED) { 
       Log.e(Constants.TAGGattConnectThread, "Connected to the GATT Server " + status + " " +newState); 
       Log.e(Constants.TAGGattConnectThread, "Attempting to discover services"); 
       bluetoothGatt.discoverServices(); 
      } 
      else if(newState == BluetoothGatt.STATE_DISCONNECTED) 
      { 
       Log.e(Constants.TAGGattConnectThread,"Band disconnected"); 
       //Write you disconnect handling code here 
      } 

Vous pouvez également définir l'option « AutoConnect 'True' lors de la connexion à Gatt

bluetoothGatt = bluetoothDevice.connectGatt(context, true, bluetoothGattCallback); 

Pour la création d'un service, vous pouvez créer un service Sticky qui redémarrera à moins que la force ne soit arrêtée.