使用小米MiBand和BLE测量心率 [英] Heart Rate measuring using Xiaomi MiBand and BLE

查看:380
本文介绍了使用小米MiBand和BLE测量心率的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用简单的sdk来与健身追踪器小米米乐队合作。目前我可以跟踪步骤,启动振动,处理传感器触摸,但我有心率测量的问题。我的sdk基于 https://github.com/pangliang/miband-sdk-android 。为了测量心率,我需要将描述符写入适当的特征,以便在改变该特征的值时处理回调,然后将适当的数据写入心率控制点特征以直接启动心率测量过程。问题是,在启动此过程的数据成功写入特征后,心率测量过程未开始(当Mi Band开始测量心率时,底部传感器闪烁绿色)。这可能是由健身追踪器的新固件(固件版本:4.15.12.10; HeartRate版本:1.3.74.64)引起的,或者我的代码中存在一些缺陷:

I'm trying to implement simple sdk for working with fitness tracker Xiaomi Mi Band. Currently I can track steps, actuate the vibration, handle the sensor touch but I have a problem with heart rate measuring. My sdk based on https://github.com/pangliang/miband-sdk-android. To measure heart rate, I need to write descriptor to appropriate characteristic to enable handling callback when the value of this characteristic was changed and then write appropriate data to heart rate control point characteristic to directly start the heart rate measure process. The problem is that the heart rate measuring process was not started after the data to initiate this process was successfully written to the characteristic (when the Mi Band starts to measure heart rate then the bottom sensor blinks green). This can be caused by a new firmware of fitness tracker (firmware version: 4.15.12.10; HeartRate version: 1.3.74.64) or there are some defects in my code:

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

也许协议已被弃用且有人谁可以与我分享新的协议。我会很高兴的。谢谢。

Maybe the protocol is deprecated and there are people who can share me a new protocol. I will be very glad) Thanks.

推荐答案

我解决了这个问题!在调用 setNotifyListener 来跟踪脉冲值的变化之前,你必须将用户信息(年龄,体重)写入适当的特征,因为没有这个Mi Band就不会开始测量。

I solved the problem! Before calling setNotifyListener to track the change of pulse value you must to write User Information (age, weight) to appropriate characteristic, because without this Mi Band doesn't start the measuring.

这篇关于使用小米MiBand和BLE测量心率的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆