当前位置: 首页 > 知识库问答 >
问题:

用小米MiBand和BLE测量心率

陆飞龙
2023-03-14

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

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

可能该协议已被弃用,有些人可以与我共享一个新协议。我将非常高兴)谢谢。

共有2个答案

唐珂
2023-03-14

我在BLE A工作

查找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);
                }
            }
        }
    }
}

设置UUID

BluetoothLeService.ACTION_GATT_SERVICES_DISCOVERED.equals(action)) {

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

使用BleGatt示例https://github.com/googlesamples/android-BluetoothLeGatt

尉迟京
2023-03-14

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

 类似资料:
  • 我正在尝试使用Python和pygattlib从小米MiBand 1S的计算机上获取心率测量通知。 我可以使用用户信息成功初始化设备(将传感器点击为“配对”),使用相同的用户信息进行以下连接,振动设备,读取设备信息和步数并监听步数通知。 但一旦我将心率传感器控制点更改为手动模式(将0x150201写入值句柄0x4e/uuid 0x2a39),设备背面的光学传感器开始闪烁,但我没有收到写入响应,蓝牙

  • 自我介绍 为什么选择小米 介绍自己的项目 测试的流程 怎么测试CPU 快排 python装饰器 自己的优势 反问。。。 还是太菜了

  • ###小米一面 项目问了一嘴 具体记不得了 岗位方向有要求吗 为什么干测开 coding:最长不重复子序列; 找k个数,和为n,在1~9中选择,字典序排序输出(dfs+剪枝,没调出来,整体对了) sql题 测开理解 sql会吗 ACID 场景:取快递 ###小米二面 面试官很和蔼 上来说一面对基础知识什么的已经考察过了 这轮面试主要考察一些场景 先询问了实习相关的知识,如软件从开始到上线的整个流程

  • #2023春招##内推##校招##小米2023秋招求职进度交流##测试开发# 10月18日,感觉问题考察的非常全面,后端、前端、QT开发相关都问了一些,算法也是hard,前前后后一个小时。 1、SpringBoot的开始注解 2、解释一下AOP 3、SpringMVC是什么 4、Spring中的层级结构(Controller、Service、Dao、Entity层) 5、get和post请求,po

  • #软件开发2024笔面经# 只能说我看的面经有点离谱,居然是错的。结果面试问了一样的,面完发现错了! 1,计网三次握手,为什么不是二次和四次 2,java内存模型 3,count(1)和count(*)区别,看的面经上告诉我性能一样。。。。面完百度发现错了 4,死锁是什么,必要条件有哪些 5,linux指令,说出十个 6,手撕代码,红包金额n,数量m,随机且发完。 希望下次不要一紧张就忘。。。。差

  • 面试官不开摄像头,时长也才四十分钟,不会凉了吧 问: 实习经历 Java程序怎么运行的,底层发生了什么 New一个对象之后发生了什么 Tcp三次握手四次挥手 熟悉哪些自动化测试工具 Jmeter怎么进行压力测试的 Qps是什么,怎么通过它测试系统的瓶颈 手撕: 快排,写完递归后让我写个非递归的 反转链表 #如何判断面试是否凉了#