Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Medición de la frecuencia cardíaca usando Xiaomi MiBand y BLE

Estoy tratando de implementar sdk simple para trabajar con la pista de fitness Xiaomi Mi banda. Actualmente puedo seguir pasos, accionar la vibración, manejar el tacto del sensor pero tengo un problema con la medición de la frecuencia cardíaca. Mi sdk basado en https://github.com/pangliang/miband-sdk-android . Para medir la frecuencia cardíaca, necesito escribir el descriptor en la característica apropiada para permitir el manejo de la devolución de llamada cuando el valor de esta característica fue cambiado y luego escribir los datos apropiados a la característica del punto de control de la frecuencia cardíaca para iniciar directamente el proceso de medición de la frecuencia cardíaca. El problema es que el proceso de medición de la frecuencia cardíaca no se inició después de que los datos para iniciar este proceso se escribieron con éxito en la característica (cuando la banda Mi comienza a medir la frecuencia cardíaca y el sensor inferior parpadea en verde). Esto puede ser causado por un nuevo firmware del rastreador de fitness (versión de firmware: 4.15.12.10; versión de HeartRate: 1.3.74.64) o hay algunos defectos en mi 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 charaUUID, NotifyListener listener) { //enable chara notofication if (this.mGatt == null || !this.mIsServicesDiscovered) { if (DBG) Log.d(Debug.TAG, "Device is not connected or services are not discovered"); return; } BluetoothGattCharacteristic chara = this.mGatt.getService(serviceUUID).getCharacteristic(charaUUID); if (DBG) Log.d(Debug.TAG, "setCharacteristicNotification: " + this.mGatt.setCharacteristicNotification(chara, true)); BluetoothGattDescriptor descriptor = chara.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(charaUUID, listener); } @Override public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) { //this method must be called when the characteristic value was changed but nothing happened :( super.onCharacteristicChanged(gatt, characteristic); if (this.mNotifyListeners.containsKey(characteristic.getUuid())) { this.mNotifyListeners.get(characteristic.getUuid()).onNotify(characteristic.getValue()); } } } //end BleProvider . . . setNotifyListener(MiBandProfile.UUID_SERVICE_HEARTRATE, MiBandProfile.UUID_NOTIFICATION_HEARTRATE, new BleProvider.NotifyListener(){...}); //waiting few seconds writeCharacteristic(MiBandProfile.UUID_SERVICE_HEARTRATE, MiBandProfile.UUID_CHAR_HEARTRATE, MiBandProtocol.START_HEART_RATE_SCAN); 

Tal vez el protocolo está obsoleto y hay personas que pueden compartirme un nuevo protocolo. Estaré muy contento) Gracias.

  • Edittext de Android quitar foco después de hacer clic en un botón
  • Advertencia sobre <uses-sdk> en Manifest?
  • Android módulo de apache desaprobado (HttpClient, HttpResponse, etc.)
  • SwipeRefreshLayout con NestedScrollView y LinearLayout
  • Enlace profundo de Android: utiliza el mismo enlace para la aplicación y la tienda de reproducción
  • ¿Cuál es el sustituto adecuado de "managedQuery" obsoleta?
  • TextView - cómo hacer la segunda línea sangría
  • Actualizando ExpandableListView con notifyDataSetChanged ()
  • Cómo sacar datos JSON correctamente usando PHP
  • RecyclerView se bloquea al actualizar en la parte superior
  • VideoView para que coincida con la altura de los padres y mantenga la relación de aspecto
  • Formatos Xamarin desajuste de tamaño de imagen
  • 2 Solutions collect form web for “Medición de la frecuencia cardíaca usando Xiaomi MiBand y BLE”

    He resuelto el problema! Antes de llamar a setNotifyListener para realizar un seguimiento del cambio de valor del pulso, debe escribir Información del usuario (edad, peso) a la característica apropiada, porque sin este Mi Band no inicia la medición.

    Im que trabaja con BLE A & D, al obatin el iformation uso:

    Para encontrar 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<BluetoothGattCharacteristic> gattCharacteristics = gattService .getCharacteristics(); if (uuid.equals("00001810-0000-1000-8000-00805f9b34fb")) { // salida.append("Ecnontro"); for (BluetoothGattCharacteristic gattCharacteristic : gattCharacteristics) { String uuid1 = gattCharacteristic.getUuid().toString(); if (uuid1.equals("00002a35-0000-1000-8000-00805f9b34fb")) { // salida.append("Envio caracterisitca"); mensaje(getResources().getString(R.string.Espere_res)); mBluetoothLeService.setCharacteristicNotification( gattCharacteristic, true); } } } } } 

    Para configurar UUID

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

    Utilice el ejemplo de BleGatt https://github.com/googlesamples/android-BluetoothLeGatt

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.