2016-03-30 10 views
10

Próbuję zaimplementować prosty sdk do pracy z trackerem fitness Xiaomi Mi Band. Obecnie mogę śledzić kroki, uruchomić wibracje, obsługiwać dotyk czujnika, ale mam problem z pomiarem tętna. Mój sdk oparty na https://github.com/pangliang/miband-sdk-android. Aby zmierzyć częstość akcji serca, muszę napisać deskryptor do odpowiedniej charakterystyki, aby umożliwić obsługę oddzwaniania, gdy wartość tej cechy uległa zmianie, a następnie wpisać odpowiednie dane do charakterystyki punktu kontroli rytmu serca, aby bezpośrednio rozpocząć pomiar tętna. Problem polega na tym, że proces pomiaru tętna nie rozpoczął się po tym, jak dane do zainicjowania tego procesu zostały pomyślnie zapisane w charakterystyce (gdy pasmo Mi zaczyna mierzyć tętno, dolny czujnik miga na zielono). Może to być spowodowane przez nowy firmware przydatności tracker (wersja oprogramowania: 4.15.12.10; wersja heartrate: 1.3.74.64) lub istnieją pewne wady mojego kodu:Pomiar tętna za pomocą Xiaomi MiBand i BLE

/-------- 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); 

Może protokół jest przestarzała i nie są ludzie, którzy mogą mi udostępnić nowy protokół. Będę bardzo zadowolony) Dzięki.

+0

Alex, czy możesz mi powiedzieć, czy śledzenie kroków mierzysz za pomocą akcelerometru? Czy jest jakiś inny magiczny czujnik? – Krystian

+0

Krystian, możesz sprawdzić moje repozytorium tam, gdzie jest aplikacja z zaimplementowanym śledzeniem kroków w czasie rzeczywistym i mierzeniem tętna https://github.com/AlexanderHryk/MiFood –

Odpowiedz

4

I rozwiązać problem! Przed wywołaniem zmiany wartości impulsu należy wpisać Informacje o użytkowniku (wiek, waga) do odpowiedniej charakterystyki, ponieważ bez tego Mi Band nie rozpocznie pomiaru.

+0

Próbuję zrobić to samo, bez powodzenia. Mogę odczytać poprzednie zapisane wartości częstości akcji serca, ale nie mogę uruchomić pomiaru. Czy znasz specyfikację charakterystyk informacji o użytkowniku? Czy mógłbyś udostępnić te informacje? – javsmo

+0

Nie martw się, znalazłem charakterystykę Inforacji Użytkownika [tutaj] (https://github.com/pangliang/miband-sdk-android/blob/master/miband-sdk/src/main/java/com/zhaoxiaodan/ miband/model/UserInfo.java) – javsmo

1

Im pracy z BLE A & D, aby obatin się iformation używam:

Aby znaleźć 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); 
       } 
      } 
     } 
    } 
} 

Aby ustawić UUID

BluetoothLeService.ACTION_GATT_SERVICES_DISCOVERED.equals(action)) { 

      // Show all the supported services and characteristics on the user interface. 
      displayGattServicesService(mBluetoothLeService.getSupportedGattServices()); 

Zastosowanie BleGatt Przykład https://github.com/googlesamples/android-BluetoothLeGatt