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.
Alex, czy możesz mi powiedzieć, czy śledzenie kroków mierzysz za pomocą akcelerometru? Czy jest jakiś inny magiczny czujnik? – Krystian
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 –