From 4b5810a1a096661daeafd36fee31b6980f2ec719 Mon Sep 17 00:00:00 2001 From: Josef Gajdusek Date: Wed, 22 Nov 2017 18:48:34 +0100 Subject: [PATCH] Mi Band 2: Add rudimentary raw sensor data support Note that this is extremely hacky (and does not really work all that great) and some more investigation into the mechanism/flags is needed. --- .../devices/miband/MiBand2Service.java | 4 ++-- .../devices/miband2/MiBand2Support.java | 22 ++++++++++++++++++- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/miband/MiBand2Service.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/miband/MiBand2Service.java index d18707577..996ee938e 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/miband/MiBand2Service.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/miband/MiBand2Service.java @@ -35,8 +35,8 @@ public class MiBand2Service { public static final UUID UUID_CHARACTERISTIC_FIRMWARE_DATA = UUID.fromString("00001532-0000-3512-2118-0009af100700"); public static final UUID UUID_UNKNOWN_CHARACTERISTIC0 = UUID.fromString("00000000-0000-3512-2118-0009af100700"); - public static final UUID UUID_UNKNOWN_CHARACTERISTIC1 = UUID.fromString("00000001-0000-3512-2118-0009af100700"); - public static final UUID UUID_UNKNOWN_CHARACTERISTIC2 = UUID.fromString("00000002-0000-3512-2118-0009af100700"); + public static final UUID UUID_CHARACTERISTIC_1_SENSOR_CONTROL = UUID.fromString("00000001-0000-3512-2118-0009af100700"); + public static final UUID UUID_CHARACTERISTIC_2_SENSOR_DATA = UUID.fromString("00000002-0000-3512-2118-0009af100700"); /** * Alarms, Display and other configuration. */ diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband2/MiBand2Support.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband2/MiBand2Support.java index b05bba84a..b82950028 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband2/MiBand2Support.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband2/MiBand2Support.java @@ -154,12 +154,17 @@ public class MiBand2Support extends AbstractBTLEDeviceSupport { private boolean needsAuth; private volatile boolean telephoneRinging; private volatile boolean isLocatingDevice; + private volatile boolean isReadingSensorData; private final GBDeviceEventVersionInfo versionCmd = new GBDeviceEventVersionInfo(); private final GBDeviceEventBatteryInfo batteryCmd = new GBDeviceEventBatteryInfo(); private RealtimeSamplesSupport realtimeSamplesSupport; private boolean alarmClockRinging; + private static final byte[] startSensorRead1 = new byte[]{0x01, 0x01, 0x19}; + private static final byte[] startSensorRead2 = new byte[]{0x02}; + private static final byte[] stopSensorRead = new byte[]{0x03}; + public MiBand2Support() { this(LOG); } @@ -271,6 +276,7 @@ public class MiBand2Support extends AbstractBTLEDeviceSupport { builder.notify(getCharacteristic(MiBand2Service.UUID_CHARACTERISTIC_3_CONFIGURATION), enable); builder.notify(getCharacteristic(MiBand2Service.UUID_CHARACTERISTIC_6_BATTERY_INFO), enable); builder.notify(getCharacteristic(MiBand2Service.UUID_CHARACTERISTIC_DEVICEEVENT), enable); + builder.notify(getCharacteristic(MiBand2Service.UUID_CHARACTERISTIC_2_SENSOR_DATA), enable); return this; } @@ -1037,6 +1043,9 @@ public class MiBand2Support extends AbstractBTLEDeviceSupport { } else if (MiBand2Service.UUID_CHARACTERISTIC_7_REALTIME_STEPS.equals(characteristicUUID)) { handleRealtimeSteps(characteristic.getValue()); return true; + } else if (MiBand2Service.UUID_CHARACTERISTIC_2_SENSOR_DATA.equals(characteristicUUID)) { + handleSensorData(characteristic.getValue()); + return true; } else { LOG.info("Unhandled characteristic changed: " + characteristicUUID); logMessageContent(characteristic.getValue()); @@ -1131,6 +1140,10 @@ public class MiBand2Support extends AbstractBTLEDeviceSupport { } } + private void handleSensorData(byte[] value) { + // See logcat for raw data output + } + private void enableRealtimeSamplesTimer(boolean enable) { if (enable) { getRealtimeSamplesSupport().start(); @@ -1350,9 +1363,16 @@ public class MiBand2Support extends AbstractBTLEDeviceSupport { public void onTestNewFunction() { try { TransactionBuilder builder = performInitialized("test realtime steps"); - builder.read(getCharacteristic(MiBand2Service.UUID_CHARACTERISTIC_7_REALTIME_STEPS)); + if (isReadingSensorData) { + builder.write(getCharacteristic(MiBand2Service.UUID_CHARACTERISTIC_1_SENSOR_CONTROL), stopSensorRead); + } else { + builder.write(getCharacteristic(MiBand2Service.UUID_CHARACTERISTIC_1_SENSOR_CONTROL), startSensorRead1); + builder.write(getCharacteristic(MiBand2Service.UUID_CHARACTERISTIC_1_SENSOR_CONTROL), startSensorRead2); + } builder.queue(getQueue()); + isReadingSensorData = !isReadingSensorData; } catch (IOException e) { + LOG.error("Unable to toggle sensor reading MI2", e); } }