【问题标题】:Bluetooth GATT: Set value and flag field correct蓝牙 GATT:设置值和标志字段正确
【发布时间】:2022-11-01 22:29:02
【问题描述】:

通过了解蓝牙特性中的标志字段,我遇到了一些问题。

例如心率测量特性:

及其标志:

根据我的理解,值的第一部分必须包含标志。 例如 0x06 用于:

  • 心率值格式设置为 uint8
  • 检测到传感器接触 = true
  • 传感器触点支持 = true

然后值的第二部分是字节(心率)。

在 Python 中,我像这样填充值:

value = []
value.append(dbus.Byte(0x06))
value.append(dbus.Byte(randint(90, 130)))

整个事情也很完美。当我使用应用程序 nRF connect 连接到服务器时,我得到的所有信息都与所有信息完美显示。

现在关于我的问题:

我试图实现重量测量特性。

我想要以 kg 为单位的体重、BMI 和身高。因此,据我所知,我必须用 0x08 填充标志字段以表示 00001000。

在 Python 中,它看起来像这样:

value = []
value.append(dbus.Byte(0x08))
value.append(dbus.Byte(randint(1, 13))) #weight
value.append(dbus.Byte(randint(1, 25))) #BMI
value.append(dbus.Byte(randint(1, 25))) #height

现在我在 nRF Connect 应用程序中收到消息无效数据语法。

我的问题是:

  1. 分辨率0.0001如何处理?值 = 高度/0.0001 还是高度*0.0001?
  2. 表示的值 M = 1, d=-1, ... 是什么意思?
  3. 为什么我在第二个 python 代码中的值无效?

    非常感谢您的帮助!

    我正在为我的服务器使用 bluez5.63/test/example-gatt-server.py!

【问题讨论】:

标签: bluetooth bluetooth-lowenergy gatt bluetooth-gatt characteristics


【解决方案1】:

构建特征值的常用方法是使用 Python struct 库将该值打包成字节。

特征中发送的值始终是只能表示整数的字节。因此,要将height 值转换为整数,就是说对于字段值上的1 的每一个增量,hight 值都会增加0.001。这意味着小数点需要在发送的高度值上向右移动 3 位。所以要发送0.001 的高度值,您实际上将发送1 的值。这意味着您的混乱需要乘以value * 10**3,或者如果您更喜欢value / 0.001

对于重量,它是相似的,但除了移动小数点之外,您还必须更改值。这可以是value / 0.005 value * (1 / 5) * 10 ** 3

python代码的外观示例:

import struct

weight_char = struct.Struct('<BHHH')


def pack_flags(units, timestamp, user_id, bmi_height):
    flags = 0
    for idx, _flag in enumerate((units, timestamp, user_id, bmi_height)):
        flags |= _flag << idx
    return flags


flags = pack_flags(False, False, False, True)
weight = 42.4  # example weight in KG
height = 1.49  # Height in meters
bmi = 20.1

value = weight_char.pack(flags,
                         int(weight * 0.2 * 10**3),
                         int(bmi * 10**1),
                         int(height * 10**3))
print(f"Value to send: {value.hex()}")


这给出了以下输出:

Value to send: 082021c900d205

【讨论】:

  • 非常感谢!在我的情况下,我必须在 dbus.Byte() 元素中拆分这些字节以发送值,但这只是一个小功能!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-16
  • 1970-01-01
相关资源
最近更新 更多