2017-03-10 14:53:19 +01:00
|
|
|
/* Copyright (C) 2015-2017 Andreas Shimokawa, Carsten Pfeiffer, Daniele
|
|
|
|
Gobbetti, Kasha
|
|
|
|
|
|
|
|
This file is part of Gadgetbridge.
|
|
|
|
|
|
|
|
Gadgetbridge is free software: you can redistribute it and/or modify
|
|
|
|
it under the terms of the GNU Affero General Public License as published
|
|
|
|
by the Free Software Foundation, either version 3 of the License, or
|
|
|
|
(at your option) any later version.
|
|
|
|
|
|
|
|
Gadgetbridge is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
GNU Affero General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU Affero General Public License
|
|
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
2015-08-03 23:09:49 +02:00
|
|
|
package nodomain.freeyourgadget.gadgetbridge.devices.miband;
|
2015-04-19 02:37:29 +02:00
|
|
|
|
|
|
|
import java.util.HashMap;
|
|
|
|
import java.util.Map;
|
|
|
|
import java.util.UUID;
|
|
|
|
|
2017-03-05 21:45:39 +01:00
|
|
|
import nodomain.freeyourgadget.gadgetbridge.service.btle.GattCharacteristic;
|
|
|
|
import nodomain.freeyourgadget.gadgetbridge.service.btle.GattService;
|
|
|
|
|
2015-08-07 16:59:52 +02:00
|
|
|
import static nodomain.freeyourgadget.gadgetbridge.service.btle.AbstractBTLEDeviceSupport.BASE_UUID;
|
|
|
|
|
2015-04-19 02:37:29 +02:00
|
|
|
public class MiBandService {
|
|
|
|
|
2015-05-24 00:11:14 +02:00
|
|
|
|
2016-01-06 23:38:17 +01:00
|
|
|
public static final String MAC_ADDRESS_FILTER_1_1A = "88:0F:10";
|
|
|
|
public static final String MAC_ADDRESS_FILTER_1S = "C8:0F:10";
|
2015-04-19 02:37:29 +02:00
|
|
|
|
|
|
|
public static final UUID UUID_SERVICE_MIBAND_SERVICE = UUID.fromString(String.format(BASE_UUID, "FEE0"));
|
2016-07-25 00:00:22 +02:00
|
|
|
public static final UUID UUID_SERVICE_MIBAND2_SERVICE = UUID.fromString(String.format(BASE_UUID, "FEE1"));
|
2017-03-05 21:45:39 +01:00
|
|
|
public static final UUID UUID_SERVICE_HEART_RATE = GattService.UUID_SERVICE_HEART_RATE;
|
2016-07-25 00:00:22 +02:00
|
|
|
public static final String UUID_SERVICE_WEIGHT_SERVICE = "00001530-0000-3512-2118-0009af100700";
|
2015-12-28 14:38:56 +01:00
|
|
|
|
2015-04-19 02:37:29 +02:00
|
|
|
public static final UUID UUID_CHARACTERISTIC_DEVICE_INFO = UUID.fromString(String.format(BASE_UUID, "FF01"));
|
|
|
|
|
|
|
|
public static final UUID UUID_CHARACTERISTIC_DEVICE_NAME = UUID.fromString(String.format(BASE_UUID, "FF02"));
|
|
|
|
|
|
|
|
public static final UUID UUID_CHARACTERISTIC_NOTIFICATION = UUID.fromString(String.format(BASE_UUID, "FF03"));
|
|
|
|
|
|
|
|
public static final UUID UUID_CHARACTERISTIC_USER_INFO = UUID.fromString(String.format(BASE_UUID, "FF04"));
|
|
|
|
|
|
|
|
public static final UUID UUID_CHARACTERISTIC_CONTROL_POINT = UUID.fromString(String.format(BASE_UUID, "FF05"));
|
|
|
|
|
|
|
|
public static final UUID UUID_CHARACTERISTIC_REALTIME_STEPS = UUID.fromString(String.format(BASE_UUID, "FF06"));
|
|
|
|
|
|
|
|
public static final UUID UUID_CHARACTERISTIC_ACTIVITY_DATA = UUID.fromString(String.format(BASE_UUID, "FF07"));
|
|
|
|
|
|
|
|
public static final UUID UUID_CHARACTERISTIC_FIRMWARE_DATA = UUID.fromString(String.format(BASE_UUID, "FF08"));
|
|
|
|
|
|
|
|
public static final UUID UUID_CHARACTERISTIC_LE_PARAMS = UUID.fromString(String.format(BASE_UUID, "FF09"));
|
|
|
|
|
|
|
|
public static final UUID UUID_CHARACTERISTIC_DATE_TIME = UUID.fromString(String.format(BASE_UUID, "FF0A"));
|
|
|
|
|
|
|
|
public static final UUID UUID_CHARACTERISTIC_STATISTICS = UUID.fromString(String.format(BASE_UUID, "FF0B"));
|
|
|
|
|
|
|
|
public static final UUID UUID_CHARACTERISTIC_BATTERY = UUID.fromString(String.format(BASE_UUID, "FF0C"));
|
|
|
|
|
|
|
|
public static final UUID UUID_CHARACTERISTIC_TEST = UUID.fromString(String.format(BASE_UUID, "FF0D"));
|
|
|
|
|
|
|
|
public static final UUID UUID_CHARACTERISTIC_SENSOR_DATA = UUID.fromString(String.format(BASE_UUID, "FF0E"));
|
|
|
|
|
|
|
|
public static final UUID UUID_CHARACTERISTIC_PAIR = UUID.fromString(String.format(BASE_UUID, "FF0F"));
|
|
|
|
|
2017-03-05 21:45:39 +01:00
|
|
|
public static final UUID UUID_CHARACTERISTIC_HEART_RATE_CONTROL_POINT = GattCharacteristic.UUID_CHARACTERISTIC_HEART_RATE_CONTROL_POINT;
|
|
|
|
public static final UUID UUID_CHARACTERISTIC_HEART_RATE_MEASUREMENT = GattCharacteristic.UUID_CHARACTERISTIC_HEART_RATE_MEASUREMENT;
|
2015-12-28 14:38:56 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
2015-08-05 17:32:02 +02:00
|
|
|
/* FURTHER UUIDS that were mixed with the other params below. The base UUID for these is unknown */
|
2015-05-24 00:11:14 +02:00
|
|
|
|
2015-08-05 17:32:02 +02:00
|
|
|
public static final byte ALIAS_LEN = 0xa;
|
|
|
|
|
|
|
|
/*NOTIFICATIONS: usually received on the UUID_CHARACTERISTIC_NOTIFICATION characteristic */
|
|
|
|
|
|
|
|
public static final byte NOTIFY_NORMAL = 0x0;
|
2015-04-19 02:37:29 +02:00
|
|
|
|
|
|
|
public static final byte NOTIFY_FIRMWARE_UPDATE_FAILED = 0x1;
|
|
|
|
|
|
|
|
public static final byte NOTIFY_FIRMWARE_UPDATE_SUCCESS = 0x2;
|
|
|
|
|
2015-08-05 17:32:02 +02:00
|
|
|
public static final byte NOTIFY_CONN_PARAM_UPDATE_FAILED = 0x3;
|
2015-04-19 02:37:29 +02:00
|
|
|
|
2015-08-05 17:32:02 +02:00
|
|
|
public static final byte NOTIFY_CONN_PARAM_UPDATE_SUCCESS = 0x4;
|
2015-04-19 02:37:29 +02:00
|
|
|
|
2015-08-05 17:32:02 +02:00
|
|
|
public static final byte NOTIFY_AUTHENTICATION_SUCCESS = 0x5;
|
2015-04-19 02:37:29 +02:00
|
|
|
|
2015-08-05 17:32:02 +02:00
|
|
|
public static final byte NOTIFY_AUTHENTICATION_FAILED = 0x6;
|
2015-04-19 02:37:29 +02:00
|
|
|
|
2015-08-05 17:32:02 +02:00
|
|
|
public static final byte NOTIFY_FITNESS_GOAL_ACHIEVED = 0x7;
|
|
|
|
|
|
|
|
public static final byte NOTIFY_SET_LATENCY_SUCCESS = 0x8;
|
2015-04-19 02:37:29 +02:00
|
|
|
|
|
|
|
public static final byte NOTIFY_RESET_AUTHENTICATION_FAILED = 0x9;
|
|
|
|
|
|
|
|
public static final byte NOTIFY_RESET_AUTHENTICATION_SUCCESS = 0xa;
|
|
|
|
|
2015-08-05 17:32:02 +02:00
|
|
|
public static final byte NOTIFY_FW_CHECK_FAILED = 0xb;
|
2015-04-19 02:37:29 +02:00
|
|
|
|
2015-08-05 17:32:02 +02:00
|
|
|
public static final byte NOTIFY_FW_CHECK_SUCCESS = 0xc;
|
2015-04-19 02:37:29 +02:00
|
|
|
|
2015-08-05 17:32:02 +02:00
|
|
|
public static final byte NOTIFY_STATUS_MOTOR_NOTIFY = 0xd;
|
2015-04-19 02:37:29 +02:00
|
|
|
|
|
|
|
public static final byte NOTIFY_STATUS_MOTOR_CALL = 0xe;
|
|
|
|
|
|
|
|
public static final byte NOTIFY_STATUS_MOTOR_DISCONNECT = 0xf;
|
|
|
|
|
2015-08-05 17:32:02 +02:00
|
|
|
public static final byte NOTIFY_STATUS_MOTOR_SMART_ALARM = 0x10;
|
|
|
|
|
|
|
|
public static final byte NOTIFY_STATUS_MOTOR_ALARM = 0x11;
|
|
|
|
|
2015-04-19 02:37:29 +02:00
|
|
|
public static final byte NOTIFY_STATUS_MOTOR_GOAL = 0x12;
|
|
|
|
|
2015-08-05 17:32:02 +02:00
|
|
|
public static final byte NOTIFY_STATUS_MOTOR_AUTH = 0x13;
|
2015-04-19 02:37:29 +02:00
|
|
|
|
|
|
|
public static final byte NOTIFY_STATUS_MOTOR_SHUTDOWN = 0x14;
|
|
|
|
|
2015-08-05 17:32:02 +02:00
|
|
|
public static final byte NOTIFY_STATUS_MOTOR_AUTH_SUCCESS = 0x15;
|
2015-04-19 02:37:29 +02:00
|
|
|
|
|
|
|
public static final byte NOTIFY_STATUS_MOTOR_TEST = 0x16;
|
|
|
|
|
2015-09-07 12:06:56 +02:00
|
|
|
// 0x18 is returned when we cancel data sync, perhaps is an ack for this message
|
|
|
|
|
2015-04-19 02:37:29 +02:00
|
|
|
public static final byte NOTIFY_UNKNOWN = -0x1;
|
|
|
|
|
2015-08-05 17:32:02 +02:00
|
|
|
public static final int NOTIFY_PAIR_CANCEL = 0xef;
|
2015-04-19 02:37:29 +02:00
|
|
|
|
2015-08-05 17:32:02 +02:00
|
|
|
public static final int NOTIFY_DEVICE_MALFUNCTION = 0xff;
|
2015-04-19 02:37:29 +02:00
|
|
|
|
|
|
|
|
2015-08-05 17:32:02 +02:00
|
|
|
/* MESSAGES: unknown */
|
2015-04-19 02:37:29 +02:00
|
|
|
|
|
|
|
public static final byte MSG_CONNECTED = 0x0;
|
|
|
|
|
|
|
|
public static final byte MSG_DISCONNECTED = 0x1;
|
|
|
|
|
|
|
|
public static final byte MSG_CONNECTION_FAILED = 0x2;
|
|
|
|
|
|
|
|
public static final byte MSG_INITIALIZATION_FAILED = 0x3;
|
|
|
|
|
|
|
|
public static final byte MSG_INITIALIZATION_SUCCESS = 0x4;
|
|
|
|
|
|
|
|
public static final byte MSG_STEPS_CHANGED = 0x5;
|
|
|
|
|
|
|
|
public static final byte MSG_DEVICE_STATUS_CHANGED = 0x6;
|
|
|
|
|
|
|
|
public static final byte MSG_BATTERY_STATUS_CHANGED = 0x7;
|
|
|
|
|
2015-08-05 17:32:02 +02:00
|
|
|
/* COMMANDS: usually sent to UUID_CHARACTERISTIC_CONTROL_POINT characteristic */
|
|
|
|
|
2015-07-31 13:33:28 +02:00
|
|
|
public static final byte COMMAND_SET_TIMER = 0x4;
|
2015-05-21 18:19:07 +02:00
|
|
|
|
2015-07-31 13:33:28 +02:00
|
|
|
public static final byte COMMAND_SET_FITNESS_GOAL = 0x5;
|
2015-06-06 00:40:16 +02:00
|
|
|
|
|
|
|
public static final byte COMMAND_FETCH_DATA = 0x6;
|
2015-06-24 20:14:08 +02:00
|
|
|
|
2015-07-23 17:14:51 +02:00
|
|
|
public static final byte COMMAND_SEND_FIRMWARE_INFO = 0x7;
|
|
|
|
|
2015-07-31 13:33:28 +02:00
|
|
|
public static final byte COMMAND_SEND_NOTIFICATION = 0x8;
|
|
|
|
|
|
|
|
public static final byte COMMAND_CONFIRM_ACTIVITY_DATA_TRANSFER_COMPLETE = 0xa;
|
|
|
|
|
2015-07-23 17:14:51 +02:00
|
|
|
public static final byte COMMAND_SYNC = 0xb;
|
|
|
|
|
2015-07-31 13:33:28 +02:00
|
|
|
public static final byte COMMAND_REBOOT = 0xc;
|
|
|
|
|
2015-07-31 13:48:11 +02:00
|
|
|
public static final byte COMMAND_SET_WEAR_LOCATION = 0xf;
|
|
|
|
|
2015-09-07 12:06:56 +02:00
|
|
|
public static final byte COMMAND_STOP_SYNC_DATA = 0x11;
|
|
|
|
|
2015-07-31 13:33:28 +02:00
|
|
|
public static final byte COMMAND_STOP_MOTOR_VIBRATE = 0x13;
|
2015-07-23 17:14:51 +02:00
|
|
|
|
2015-09-02 08:00:26 +02:00
|
|
|
public static final byte COMMAND_SET_REALTIME_STEPS_NOTIFICATION = 0x3;
|
|
|
|
|
|
|
|
public static final byte COMMAND_SET_REALTIME_STEP = 0x10;
|
|
|
|
|
2015-12-28 14:38:56 +01:00
|
|
|
// Test HR
|
2016-02-29 20:54:39 +01:00
|
|
|
public static final byte COMMAND_SET_HR_SLEEP = 0x0;
|
|
|
|
public static final byte COMMAND_SET__HR_CONTINUOUS = 0x1;
|
|
|
|
public static final byte COMMAND_SET_HR_MANUAL = 0x2;
|
2015-12-28 14:38:56 +01:00
|
|
|
|
2016-10-11 23:13:40 +02:00
|
|
|
public static final byte COMMAND_GET_SENSOR_DATA = 0x12;
|
2015-12-28 14:38:56 +01:00
|
|
|
|
2015-08-05 17:32:02 +02:00
|
|
|
/* FURTHER COMMANDS: unchecked therefore left commented
|
2015-04-19 02:37:29 +02:00
|
|
|
|
|
|
|
|
|
|
|
public static final byte COMMAND_FACTORY_RESET = 0x9t;
|
|
|
|
|
|
|
|
public static final int COMMAND_SET_COLOR_THEME = et;
|
|
|
|
|
2015-08-05 17:32:02 +02:00
|
|
|
*/
|
2015-04-19 02:37:29 +02:00
|
|
|
|
2015-08-05 17:32:02 +02:00
|
|
|
/* CONNECTION: unknown
|
2015-04-19 02:37:29 +02:00
|
|
|
|
2015-08-05 17:32:02 +02:00
|
|
|
public static final CONNECTION_LATENCY_LEVEL_LOW = 0x0t;
|
2015-04-19 02:37:29 +02:00
|
|
|
|
|
|
|
public static final CONNECTION_LATENCY_LEVEL_MEDIUM = 0x1t;
|
|
|
|
|
2015-08-05 17:32:02 +02:00
|
|
|
public static final CONNECTION_LATENCY_LEVEL_HIGH = 0x2t;
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
2015-09-17 15:39:44 +02:00
|
|
|
/* MODES: probably related to the sample data structure
|
2015-09-24 14:45:21 +02:00
|
|
|
*/
|
2015-08-05 17:32:02 +02:00
|
|
|
|
2015-09-24 14:45:21 +02:00
|
|
|
public static final byte MODE_REGULAR_DATA_LEN_BYTE = 0x0;
|
2015-04-19 02:37:29 +02:00
|
|
|
|
2015-09-17 15:39:44 +02:00
|
|
|
// was MODE_REGULAR_DATA_LEN_MINITE
|
2015-09-24 14:45:21 +02:00
|
|
|
public static final byte MODE_REGULAR_DATA_LEN_MINUTE = 0x1;
|
2015-04-19 02:37:29 +02:00
|
|
|
|
2015-08-05 17:32:02 +02:00
|
|
|
/* PROFILE: unknown
|
2015-04-19 02:37:29 +02:00
|
|
|
|
2015-08-05 17:32:02 +02:00
|
|
|
public static final PROFILE_STATE_UNKNOWN:I = 0x0
|
|
|
|
|
|
|
|
public static final PROFILE_STATE_INITIALIZATION_SUCCESS:I = 0x1
|
2015-04-19 02:37:29 +02:00
|
|
|
|
|
|
|
public static final PROFILE_STATE_INITIALIZATION_FAILED:I = 0x2
|
|
|
|
|
2015-08-05 17:32:02 +02:00
|
|
|
public static final PROFILE_STATE_AUTHENTICATION_SUCCESS:I = 0x3
|
2015-04-19 02:37:29 +02:00
|
|
|
|
2015-08-05 17:32:02 +02:00
|
|
|
public static final PROFILE_STATE_AUTHENTICATION_FAILED:I = 0x4
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
2016-07-14 20:37:20 +02:00
|
|
|
// TEST_*: sent to UUID_CHARACTERISTIC_TEST characteristic
|
2015-04-19 02:37:29 +02:00
|
|
|
|
2016-07-14 20:37:20 +02:00
|
|
|
public static final byte TEST_DISCONNECTED_REMINDER = 0x5;
|
2015-04-19 02:37:29 +02:00
|
|
|
|
2016-07-14 20:37:20 +02:00
|
|
|
public static final byte TEST_NOTIFICATION = 0x3;
|
2015-04-19 02:37:29 +02:00
|
|
|
|
2016-07-14 20:37:20 +02:00
|
|
|
public static final byte TEST_REMOTE_DISCONNECT = 0x1;
|
2015-04-19 02:37:29 +02:00
|
|
|
|
2016-07-14 20:37:20 +02:00
|
|
|
public static final byte TEST_SELFTEST = 0x2;
|
2015-04-19 02:37:29 +02:00
|
|
|
|
2015-11-23 23:04:46 +01:00
|
|
|
private static final Map<UUID, String> MIBAND_DEBUG;
|
2015-04-19 02:37:29 +02:00
|
|
|
|
|
|
|
static {
|
|
|
|
MIBAND_DEBUG = new HashMap<>();
|
|
|
|
MIBAND_DEBUG.put(UUID_SERVICE_MIBAND_SERVICE, "MiBand Service");
|
2015-12-28 14:38:56 +01:00
|
|
|
MIBAND_DEBUG.put(UUID_SERVICE_HEART_RATE, "MiBand HR Service");
|
2015-04-19 02:37:29 +02:00
|
|
|
|
|
|
|
MIBAND_DEBUG.put(UUID_CHARACTERISTIC_DEVICE_INFO, "Device Info");
|
|
|
|
MIBAND_DEBUG.put(UUID_CHARACTERISTIC_DEVICE_NAME, "Device Name");
|
|
|
|
MIBAND_DEBUG.put(UUID_CHARACTERISTIC_NOTIFICATION, "Notification");
|
|
|
|
MIBAND_DEBUG.put(UUID_CHARACTERISTIC_USER_INFO, "User Info");
|
|
|
|
MIBAND_DEBUG.put(UUID_CHARACTERISTIC_CONTROL_POINT, "Control Point");
|
|
|
|
MIBAND_DEBUG.put(UUID_CHARACTERISTIC_REALTIME_STEPS, "Realtime Steps");
|
|
|
|
MIBAND_DEBUG.put(UUID_CHARACTERISTIC_ACTIVITY_DATA, "Activity Data");
|
|
|
|
MIBAND_DEBUG.put(UUID_CHARACTERISTIC_FIRMWARE_DATA, "Firmware Data");
|
|
|
|
MIBAND_DEBUG.put(UUID_CHARACTERISTIC_LE_PARAMS, "LE Params");
|
|
|
|
MIBAND_DEBUG.put(UUID_CHARACTERISTIC_DATE_TIME, "Date/Time");
|
|
|
|
MIBAND_DEBUG.put(UUID_CHARACTERISTIC_STATISTICS, "Statistics");
|
|
|
|
MIBAND_DEBUG.put(UUID_CHARACTERISTIC_BATTERY, "Battery");
|
|
|
|
MIBAND_DEBUG.put(UUID_CHARACTERISTIC_TEST, "Test");
|
|
|
|
MIBAND_DEBUG.put(UUID_CHARACTERISTIC_SENSOR_DATA, "Sensor Data");
|
|
|
|
MIBAND_DEBUG.put(UUID_CHARACTERISTIC_PAIR, "Pair");
|
2016-02-27 11:18:16 +01:00
|
|
|
MIBAND_DEBUG.put(UUID_CHARACTERISTIC_HEART_RATE_CONTROL_POINT, "Heart Rate Control Point");
|
|
|
|
MIBAND_DEBUG.put(UUID_CHARACTERISTIC_HEART_RATE_MEASUREMENT, "Heart Rate Measure");
|
2015-04-19 02:37:29 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
public static String lookup(UUID uuid, String fallback) {
|
|
|
|
String name = MIBAND_DEBUG.get(uuid);
|
|
|
|
if (name == null) {
|
|
|
|
name = fallback;
|
|
|
|
}
|
|
|
|
return name;
|
|
|
|
}
|
|
|
|
}
|