1

J'essaie de lire les valeurs caractéristiques du GATT à partir d'un appareil Bluetooth LE (un bracelet de fréquence cardiaque). Ses caractéristiques sont les suivantes:Utilisation de BLE - Lire les caractéristiques du GATT

Services

Characteristics

Je ne l'ai pas encore compris comment les "lire" les spécifications et "traduire" dans le code.

Je dois montrer sur mon application les battements de coeur détectés par l'appareil. Quelle est la manière de lire les valeurs du GATT? Un exemple de code serait très apprécié :)

Suivez mon code source actuel.


CONFIGURATION DU Bluetoot CONNEXION

private BluetoothAdapter mBluetoothAdapter; 
    private BluetoothGatt mBluetoothGatt; 
    private Handler mHandler; 

    private static final int REQUEST_ENABLE_BT = 1; 
    private static final long SCAN_PERIOD = 10000; 

    // ... 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_bluetooth); 
     mHandler = new Handler(); 

     // BLE is supported? 
     if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) { 
      Toast.makeText(this, "Bluetooth Low Energy non supportato", Toast.LENGTH_SHORT).show(); 
      finish(); 
     } 

     final BluetoothManager bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE); 
     mBluetoothAdapter = bluetoothManager.getAdapter(); 

     // Bluetooth is supported? 
     if (mBluetoothAdapter == null) { 
      Toast.makeText(this, "Bluetooth non supportato", Toast.LENGTH_SHORT).show(); 
      finish(); 
     } 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 

     // Bluetooth is enabled? 
     if (!mBluetoothAdapter.isEnabled()) { 
      Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); 
      startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT); 
     } 

     scanLeDevice(true); 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 
     if (mBluetoothAdapter != null && mBluetoothAdapter.isEnabled()) { 
      scanLeDevice(false); 
     } 
    } 

DÉCOUVRIR DISPOSITIFS BLE ET CONNEXION AVEC cardiofréquencemètre

// Device scan callback. 
    private BluetoothAdapter.LeScanCallback mLeScanCallback = 
      new BluetoothAdapter.LeScanCallback() { 
       @Override 
       public void onLeScan(final BluetoothDevice device, int rssi, byte[] scanRecord) { 
        runOnUiThread(new Runnable() { 
         @Override 
         public void run() { 
          Log.i(TAG, "Name: " + device.getName() + " (" + device.getAddress() + ")"); 
          String deviceAddress = device.getAddress(); 
          if (deviceAddress.equals("C0:19:37:54:9F:30")) { 
           connectToDevice(device); 
          } 
         } 
        }); 
       } 
      }; 

    public void connectToDevice(BluetoothDevice device) { 
     if (mBluetoothGatt == null) { 
      Log.i(TAG, "Attempting to connect to device " + device.getName() + " (" + device.getAddress() + ")"); 
      mBluetoothGatt = device.connectGatt(this, true, gattCallback); 
      scanLeDevice(false);// will stop after first device detection 
     } 
    } 

    private final BluetoothGattCallback gattCallback = new BluetoothGattCallback() { 
     @Override 
     public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) { 
      Log.i(TAG, "Status: " + status); 
      switch (newState) { 
       case BluetoothProfile.STATE_CONNECTED: 
        Log.i(TAG, "STATE_CONNECTED"); 
        //BluetoothDevice device = gatt.getDevice(); // Get device 
        gatt.discoverServices(); 
        break; 
       case BluetoothProfile.STATE_DISCONNECTED: 
        Log.e(TAG, "STATE_DISCONNECTED"); 
        break; 
       default: 
        Log.e(TAG, "STATE_OTHER"); 
      } 
     } 

     @Override 
     public void onServicesDiscovered(BluetoothGatt gatt, int status) { 
      List<BluetoothGattService> services = gatt.getServices(); 
      Log.i(TAG, "Services: " + services.toString()); 

      BluetoothGattCharacteristic bpm = services.get(2).getCharacteristics().get(0); 
      gatt.readCharacteristic(services.get(0).getCharacteristics().get(0)); 
     } 

     @Override 
     public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) { 
      // my attempt to read and print characteristics 
      byte[] charValue = characteristic.getValue(); 
      byte flag = charValue[0]; 
      Log.i(TAG, "Characteristic: " + flag); 
      //gatt.disconnect(); 
     } 
    }; 

Répondre

1

essayer avec ceci à l'intérieur gattCallback:

 @Override 
     public synchronized void onCharacteristicChanged(BluetoothGatt gatt, 
              BluetoothGattCharacteristic characteristic) { 


      final byte[] dataInput = characteristic.getValue(); 

} 

EDIT

Et je pense que vous allez recevoir un octet avec les données de Cardiofrequencemetres, utilisez cette fonction pour obtenir la valeur int:

public int unsignedByteToInt(byte b) { 
    return b & 0xFF; 
} 

et l'appeler à l'intérieur onCharacteristicChanged():

final byte[] dataInput = characteristic.getValue(); 
int hearRate = unsignedByteToInt(dataInput); 

EDIT 2

Créer un écouteur de notification pour la fréquence cardiaque:

public void setHeartRateNotification(boolean enable){ 

    String uuidHRCharacteristic = "YOUR CHARACTERISTIC"; 

    BluetoothGattService mBluetoothLeService = null; 
    BluetoothGattCharacteristic mBluetoothGattCharacteristic = null; 

    for (BluetoothGattService service : mBluetoothGatt.getServices()) { 
     if ((service == null) || (service.getUuid() == null)) { 

      continue; 
     } 
     if (uuidAccelService.equalsIgnoreCase(service.getUuid().toString())) { 

      mBluetoothLeService = service; 
     } 
    } 

    if(mBluetoothLeService!=null) { 
     mBluetoothGattCharacteristic = 
       mBluetoothLeService.getCharacteristic(UUID.fromString(uuidHRCharacteristic)); 
    } 
    else{ 
     Log.i("Test","mBluetoothLeService is null"); 
    } 

    if(mBluetoothGattCharacteristic!=null) { 

     setCharacteristicNotification(mBluetoothGattCharacteristic, enable); 

     Log.i("Test","setCharacteristicNotification:"+true); 
    } 
    else{ 
     Log.i("Test","mBluetoothGattCharacteristic is null"); 
    } 


} 

et mettez-onServiceDiscover l'intérieur gattCallback:

@Override 
public void onServicesDiscovered(BluetoothGatt gatt, int status) { 

    Log.i("Test", "onServicesDiscovered received: " + status); 

    setHeartRateNotification(true); 

} 
+0

J'ai essayé votre code, mais l'application ne fonctionne pas onCharacteristicChanged(). – eldivino87

+0

Désolé j'ai oublié du code :) –

+0

Ne fonctionne toujours pas :( – eldivino87