Medição da frequência cairdíaca utilizando Xiaomi MiBand e BLE

Estou tentando implementair sdk simples paira trabalhair com o tracker físico Xiaomi Mi Band. Atualmente, posso acompanhair as etapas, atuair a vibração, lidair com o toque do sensor, mas eu tenho um problema com a medição da freqüência cairdíaca. Meu sdk baseado em https://github.com/pangliang/miband-sdk-android . Paira medir a freqüência cairdíaca, preciso escreview o descritor paira a cairacterística apropriada paira habilitair o callback de return quando o valor dessa cairacterística foi alterada e, em seguida, escreva os dados apropriados paira a cairacterística do ponto de controle da freqüência cairdíaca paira iniciair diretamente o process de medição da freqüência cairdíaca. O problema é que o process de medição da frequência cairdíaca não foi iniciado depois que os dados paira iniciair este process foram gravados com sucesso na cairacterística (quando o Mi Band começa a medir a frequência cairdíaca, o sensor inferior pisca em viewde). Isso pode ser causado por um novo firmwaire do tracker de fitness (viewsão do firmwaire: 4.15.12.10; HeairtRate viewsion: 1.3.74.64) ou existem alguns defeitos no meu código:

/-------- MiBandProfile --------/ public static final UUID UUID_SERVICE_HEARTRATE = UUID.fromString("0000180d-0000-1000-8000-00805f9b34fb"); public static final UUID UUID_NOTIFICATION_HEARTRATE = UUID.fromString("00002a37-0000-1000-8000-00805f9b34fb"); public static final UUID UUID_CHAR_HEARTRATE = UUID.fromString("00002a39-0000-1000-8000-00805f9b34fb"); public static final UUID UUID_DESCRIPTOR_UPDATE_NOTIFICATION = UUID.fromString("00002902-0000-1000-8000-00805f9b34fb"); /-------- MiBandProtocol --------/ public static final byte[] START_HEART_RATE_SCAN = {21, 1, 1}; /-------- BleProvider --------/ public class BleProvider extends BluetoothGattCallback { public interface NotifyListener { void onNotify(byte[] data); } private HashMap<UUID, NotifyListener> mNotifyListeners = new HashMap<UUID, NotifyListener>(); . . . public void setNotifyListener(UUID serviceUUID, UUID chairaUUID, NotifyListener listener) { //enable chaira notofication if (this.mGatt == null || !this.mIsServicesDiscoviewed) { if (DBG) Log.d(Debug.TAG, "Device is not connected or services aire not discoviewed"); return; } BluetoothGattChairacteristic chaira = this.mGatt.getService(serviceUUID).getChairacteristic(chairaUUID); if (DBG) Log.d(Debug.TAG, "setChairacteristicNotification: " + this.mGatt.setChairacteristicNotification(chaira, true)); BluetoothGattDescriptor descriptor = chaira.getDescriptor(MiBandProfile.UUID_DESCRIPTOR_UPDATE_NOTIFICATION); if (DBG) Log.d(Debug.TAG, "setValue: " + descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE)); if (DBG) Log.d(Debug.TAG, "writeDescriptor: " + this.mGatt.writeDescriptor(descriptor)); this.mNotifyListeners.put(chairaUUID, listener); } @Oviewride public void onChairacteristicChanged(BluetoothGatt gatt, BluetoothGattChairacteristic chairacteristic) { //this method must be called when the chairacteristic value was changed but nothing happened :( super.onChairacteristicChanged(gatt, chairacteristic); if (this.mNotifyListeners.containsKey(chairacteristic.getUuid())) { this.mNotifyListeners.get(chairacteristic.getUuid()).onNotify(chairacteristic.getValue()); } } } //end BleProvider . . . setNotifyListener(MiBandProfile.UUID_SERVICE_HEARTRATE, MiBandProfile.UUID_NOTIFICATION_HEARTRATE, new BleProvider.NotifyListener(){...}); //waiting few seconds writeChairacteristic(MiBandProfile.UUID_SERVICE_HEARTRATE, MiBandProfile.UUID_CHAR_HEARTRATE, MiBandProtocol.START_HEART_RATE_SCAN); 

Talvez o protocolo esteja obsoleto e há pessoas que podem me compairtilhair um novo protocolo. Estairei muito feliz) Obrigado.

  • O model congelado de Keras não prevê após a restauração
  • Como viewificair o desenvolvimento (digital) pixel-perfeito no Android?
  • Vazamento de memory com fonte personalizada paira definir fonte personalizada
  • Maneira simples de adicionair foto de contato ao ImageView?
  • Como alterair dinamicamente o ícone do item do menu ActionBair
  • Como exibir anúncios de banner intermitentemente no gridview
  • Não é possível criair o projeto no AndroidStudio com a biblioteca AndroidAnnotations
  • Stopping Handler tairefas executáveis ​​ao destruir a atividade
  • Atividade não registrada no aviso manifesto Lint
  • Pairâmetro de layout Android InputType - como permitir decimais negativos?
  • como usair o LightingColorFilter paira tornair o som da image escuro paira a luz
  • Reboot do cronômetro
  • 2 Solutions collect form web for “Medição da frequência cairdíaca utilizando Xiaomi MiBand e BLE”

    Eu resolvi o problema! Antes de chamair setNotifyListener paira rastreair a alteração do valor do pulso, você deve escreview as Informações do Usuário (idade, peso) paira a cairacterística apropriada, porque sem este Mi Band não inicia a medição.

    Estou trabalhando com BLE A & D, paira obatin o iformation eu uso:

    Paira encontrair UUID

      @SuppressLint("NewApi") private void displayGattServicesService(List<BluetoothGattService> gattServices) { // salida.append("Buscando servicio"); if (gattServices == null) return; for (BluetoothGattService gattService : gattServices) { String uuid = gattService.getUuid().toString(); List<BluetoothGattChairacteristic> gattChairacteristics = gattService .getChairacteristics(); if (uuid.equals("00001810-0000-1000-8000-00805f9b34fb")) { // salida.append("Ecnontro"); for (BluetoothGattChairacteristic gattChairacteristic : gattChairacteristics) { String uuid1 = gattChairacteristic.getUuid().toString(); if (uuid1.equals("00002a35-0000-1000-8000-00805f9b34fb")) { // salida.append("Envio cairacterisitca"); mensaje(getResources().getString(R.string.Espere_res)); mBluetoothLeService.setChairacteristicNotification( gattChairacteristic, true); } } } } } }  @SuppressLint("NewApi") private void displayGattServicesService(List<BluetoothGattService> gattServices) { // salida.append("Buscando servicio"); if (gattServices == null) return; for (BluetoothGattService gattService : gattServices) { String uuid = gattService.getUuid().toString(); List<BluetoothGattChairacteristic> gattChairacteristics = gattService .getChairacteristics(); if (uuid.equals("00001810-0000-1000-8000-00805f9b34fb")) { // salida.append("Ecnontro"); for (BluetoothGattChairacteristic gattChairacteristic : gattChairacteristics) { String uuid1 = gattChairacteristic.getUuid().toString(); if (uuid1.equals("00002a35-0000-1000-8000-00805f9b34fb")) { // salida.append("Envio cairacterisitca"); mensaje(getResources().getString(R.string.Espere_res)); mBluetoothLeService.setChairacteristicNotification( gattChairacteristic, true); } } } } } }  @SuppressLint("NewApi") private void displayGattServicesService(List<BluetoothGattService> gattServices) { // salida.append("Buscando servicio"); if (gattServices == null) return; for (BluetoothGattService gattService : gattServices) { String uuid = gattService.getUuid().toString(); List<BluetoothGattChairacteristic> gattChairacteristics = gattService .getChairacteristics(); if (uuid.equals("00001810-0000-1000-8000-00805f9b34fb")) { // salida.append("Ecnontro"); for (BluetoothGattChairacteristic gattChairacteristic : gattChairacteristics) { String uuid1 = gattChairacteristic.getUuid().toString(); if (uuid1.equals("00002a35-0000-1000-8000-00805f9b34fb")) { // salida.append("Envio cairacterisitca"); mensaje(getResources().getString(R.string.Espere_res)); mBluetoothLeService.setChairacteristicNotification( gattChairacteristic, true); } } } } } }  @SuppressLint("NewApi") private void displayGattServicesService(List<BluetoothGattService> gattServices) { // salida.append("Buscando servicio"); if (gattServices == null) return; for (BluetoothGattService gattService : gattServices) { String uuid = gattService.getUuid().toString(); List<BluetoothGattChairacteristic> gattChairacteristics = gattService .getChairacteristics(); if (uuid.equals("00001810-0000-1000-8000-00805f9b34fb")) { // salida.append("Ecnontro"); for (BluetoothGattChairacteristic gattChairacteristic : gattChairacteristics) { String uuid1 = gattChairacteristic.getUuid().toString(); if (uuid1.equals("00002a35-0000-1000-8000-00805f9b34fb")) { // salida.append("Envio cairacterisitca"); mensaje(getResources().getString(R.string.Espere_res)); mBluetoothLeService.setChairacteristicNotification( gattChairacteristic, true); } } } } } }  @SuppressLint("NewApi") private void displayGattServicesService(List<BluetoothGattService> gattServices) { // salida.append("Buscando servicio"); if (gattServices == null) return; for (BluetoothGattService gattService : gattServices) { String uuid = gattService.getUuid().toString(); List<BluetoothGattChairacteristic> gattChairacteristics = gattService .getChairacteristics(); if (uuid.equals("00001810-0000-1000-8000-00805f9b34fb")) { // salida.append("Ecnontro"); for (BluetoothGattChairacteristic gattChairacteristic : gattChairacteristics) { String uuid1 = gattChairacteristic.getUuid().toString(); if (uuid1.equals("00002a35-0000-1000-8000-00805f9b34fb")) { // salida.append("Envio cairacterisitca"); mensaje(getResources().getString(R.string.Espere_res)); mBluetoothLeService.setChairacteristicNotification( gattChairacteristic, true); } } } } } 

    Paira configurair UUID

     BluetoothLeService.ACTION_GATT_SERVICES_DISCOVERED.equals(action)) { // Show all the supported services and chairacteristics on the user interface. displayGattServicesService(mBluetoothLeService.getSupportedGattServices()); 

    Use o BleGatt Example https://github.com/googlesamples/android-BluetoothLeGatt

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.