微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

BLE 心率传感器值解读

如何解决BLE 心率传感器值解读

我有一个 Android 应用程序,可以从 Polar H10 设备获取心率测量值。 我完全不知道如何解释心率。不幸的是,指向 bluetooth.com 站点的各种链接导致 404 错误

特征值是 [16,59,83,4]

据我所知,第二个字节 (59) 是 BPM 中的心率。但这似乎不是十进制,因为该值上升到 127,然后继续 -127、-126、-125,......它也不是十六进制。

我试图(在科特林)

characteristic.value[1].toUInt() 
characteristic.value[1].toInt()
characteristic.value[1].toShort()
characteristic.value[1].toULong()
characteristic.value[1].todouble()

-127 一出现,所有值都会出现异常。

我是否必须将 59 转换为二进制 (59=111011) 并在其中查看?请给我一些见解。

### 编辑(2021 年 4 月 12 日)###

我为获得这些值所做的是一个 BluetoothDevice.connectGatt()。 然后持有关贸总协定。 为了获得我寻找的心率值

  • 服务 0x180d 及其
  • 特性 0x2a37 和它唯一的
  • 描述符 0x2902。

然后我通过在描述符上设置 0x01 来启用通知。然后我在 GattClientCallback.onCharacteristicChanged() 回调中获取正在进行的事件。我将在下面添加包含所有数据的屏幕截图。

据我所知,响应长度应该是 6 个字节而不是 4 个字节,对吗?我做错了什么?

图片你看到的最顶部的特征。它链接到服务 180d 并且该特性保存了底部 4 个字节的值。

The characteristic 0x2a37

解决方法

有关文档的链接,请参阅 Heart Rate Value in BLE。就像那个答案一样,这里是解码:

字节 0 - 标志:16 (0001 0000)

位从 LSB (0) 到 MSB (7) 编号。

  • 位 0 - 心率值格式:0 => UINT8 每分钟心跳次数
  • 位 1-2 - 传感器接触状态:00 => 不支持或检测到
  • 位 3 - 能量消耗状态:0 => 不存在
  • 位 4 - RR 间隔:1 => 存在一个或多个值

所以第一个字节是UInt8格式的心率,接下来的两个字节是RR间隔。

要在 Kotlin 中阅读:

characteristic.getIntValue(FORMAT_UINT8,1)

这会返回 56 bpm 的心率。

并忽略其他两个字节,除非您想要 RR。

,

我似乎通过如下检索值找到了一种方法

public class Try {
    public static void main(String args[]) throws Exception {
        JFrame frame = new JFrame();
        JTextPane textPane = new JTextPane();
        JScrollPane pane = new JScrollPane(textPane);
        JPopupMenu popupMenu = new JPopupMenu();
        textPane.setText("SOME RANDOME TEXT FHDFFHNGHNFKJ!");
        textPane.addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                try {
                    Rectangle2D rectangle = textPane.modelToView2D(textPane.getCaretPosition());
                    popupMenu.show(frame,(int) rectangle.getX(),80 + (int) rectangle.getY());
                } catch (Exception ex) {}
                frame.requestFocus();
                frame.requestFocusInWindow();
                textPane.requestFocusInWindow();
            }
        });
        String itms[] = {
            "HI","Hello"
        };
        ArrayList < String > items = new ArrayList < > (Arrays.asList(itms));
        for (String item: items)
            popupMenu.add(new JMenuItem(item));
        frame.add(pane);
        frame.setSize(900,500);
        frame.setVisible(true);
    }
}

有两件事很重要 首先 - UINT8 的格式(虽然我不知道什么时候使用 UINT8,什么时候使用 UINT16。其实我想我需要使用 UINT16 因为第一个字节实际上是 16(见上面的问题) 第二个 - 偏移参数 1

我现在得到的是一个甚至超过 127 的整数 -> 127,128,129,130,...

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。