低功耗蓝牙重量测量特性时间戳

Bluetooth Low Energy Weight Measurement Characteristic Timestamps

当我的设备未连接时,我正在缓冲数据,因此我需要实现时间戳,以便我可以知道什么时候测量的。

幸运的是,重量测量特征包括时间戳。

不幸的是,不清楚如何将这些数据写入包,因为它不是正常的数据类型,而且肯定不只是一个字节。

https://www.bluetooth.com/wp-content/uploads/Sitecore-Media-Library/Gatt/Xml/Characteristics/org.bluetooth.characteristic.weight_measurement.xml

我正在使用 Adafruit 的 bluefruit arduino 库,所以我尝试忽略模式并在 SI 权重之后写一个 unix 时间戳,但不出所料,模式似乎不允许这样做,所以我没有看到我收到通知时的时间戳(但我仍然看到正确的体重读数)

这是 date_time 特征的 link,这显然是它期望的格式 https://www.bluetooth.com/wp-content/uploads/Sitecore-Media-Library/Gatt/Xml/Characteristics/org.bluetooth.characteristic.date_time.xml

我试着看一下 nRF52 SDK,看看是否可以通过他们的 API 更好地处理这个问题,但是学习曲线有点陡峭,我只需要完成最后一点来制作我的设备工作。

更新:

对于遇到此问题的任何其他人,解决方案原来是我使用的通知方法与 adafruit 示例中所写的方法相同

wmc.notify(notification, sizeof(notification))

因为我正在通过一个 N x 7 缓冲数据数组进行索引,但是 notification 是指向我要提供的 1 x 7 数组中第一个元素的指针,所以 sizeof 总是返回 4 (我假设的地址的大小)而不是最初写入的数组的长度 7

weight_scale 服务有两个强制性特征:

<Characteristic type="org.bluetooth.characteristic.weight_scale_feature" name="Weight Scale Feature">
  <Requirement>Mandatory</Requirement>
<Characteristic type="org.bluetooth.characteristic.weight_measurement" name="Weight Measurement">
  <Requirement>Mandatory</Requirement>

weight_measurement特征(uuid="2A9D")中,第一个字节是flags。其中 <Bit index="1" size="1" name="Time stamp present"> 需要 1 表示会有一个“时间戳”字段。该“时间戳”字段将是:

<Field name="Year"> <Format>uint16</Format> = 2 bytes
<Field name="Month"> <Format>uint8</Format> = 1 byte
<Field name="Day"> <Format>uint8</Format> = 1 byte
<Field name="Hours"> <Format>uint8</Format> = 1 byte
<Field name="Minutes"> <Format>uint8</Format> = 1 byte
<Field name="Seconds"> <Format>uint8</Format> = 1 byte

这使得“时间戳”字段的宽度为 7 个字节。

如果你想要重量(以千克为单位)和时间戳,给出一个如何创建完整数据包的工作示例,它需要 10 个字节长:

<Field name="Flags"> <Format>8bit</Format>  = 1 byte
<Field name="Weight - SI "> <Format>uint16</Format> = 2 bytes
<Field name="Time Stamp"> = 7 bytes

我用Python计算了一个数据包的价值:

import struct

flags = 0b00000010 # Include time. SI units
weight_raw = 38.1 #  Weight of 38.1 Kg
weight = int((weight_raw/5)*1000) # Formula from XML
year = 1972
month = 12
day = 11
hour = 23
minute = 22
second = 8

packet = struct.pack('<BHHBBBBB', flags, weight, year, month, day, hour, minute, second)
print(packet)

这将给出一个 10 字节长的数据包:

b'\x02\xc4\x1d\xb4\x07\x0c\x0b\x17\x16\x08'