当蓝牙 GATT 特性相互依赖时,是否应该按字段分组?

Should Bluetooth GATT characteristics be grouped in fields when they depend on each other?

我正在为移动机器人底座设计自定义 GATT 配置文件以连接到平板电脑。除其他外,基地正在报告其在 x 和 y 坐标中的位置。问题是,我应该如何在 GATT 配置文件中组织这两个值?它们应该包含在两个单独的特征中,还是应该将它们归为一个特征。例如。 (为简洁起见,我省略了 UUID):

<Service name="Odometry Service">
    <Characteristic name="Base Position" >
        <Value>
            <Field name="Position on the X axis">
                <Format>sint32</Format>
                <Unit>org.bluetooth.unit.length.metre</Unit>
                <Exponent>-3</Exponent>
            </Field>
            <Field name="Position on the Y axis">
                <Format>sint32</Format>
                <Unit>org.bluetooth.unit.length.metre</Unit>
                <Exponent>-3</Exponent>
            </Field>
        </Value>
    </Characteristic>
</Service>

<Service name="Odometry Service">
    <Characteristic name="Position on the X axis" >
        <Value>
            <Format>sint32</Format>
            <Unit>org.bluetooth.unit.length.metre</Unit>
            <Exponent>-3</Exponent>
        </Value>
    </Characteristic>
    <Characteristic name="Position on the Y axis" >
        <Value>
            <Format>sint32</Format>
            <Unit>org.bluetooth.unit.length.metre</Unit>
            <Exponent>-3</Exponent>
        </Value>
    </Characteristic>
</Service>

显然,从技术上讲,我可以做到这两点,并查看 the official Bluetooth adopted characteristics some characteristics lump the information together e.g. the Location and Speed characteristic used in the Location and Navigation service. Where the Indoor Positioning Service 报告个体特征中的纬度和经度。

一方面,将它们放在一起是有意义的,因为位置的变化可能会改变两个值,并导致客户端只有一个指示。另一方面,客户端需要做一些摆弄来获取值,如果它们是个人特征,这将很容易处理。

我似乎找不到规范中的推荐,两种类型的采用似乎表明它取决于我?但是,我可能在某处遗漏了一点。

TL/DR: 将值打包在一起

我使用过在单个属性中报告加速度计的传感器,以及将轴分成单独属性的传感器。没有对错,全看你的应用了。

但是,当值被分开时,如果您希望一起使用轴值,您最终会遇到一些问题。如果您得到 notification/indication 一个轴已更改,您将只会得到该值的报告,并且必须假定另一个值。如果两个轴都更改了值,您将分别获得两个指示,这有点竞争条件。

这样想:

你目前是X,Y值是(1,1)然后值变为(2,2)。如果您将这些值打包在一个属性中,您将得到:

  • 当前状态:(1,1)
  • 指示更改为 (2,2)
  • 更新状态:(2,2)

如果你把它们分开,你会得到这个(在可能的情况下):

  • 当前状态:(1,1)
  • 指示 X 变为 2
  • 当前状态:(2,1)
  • Y 变为 2 的指示
  • 当前状态:(2,2)

主要问题是,您可以接受可能不是设备实际状态的 (2,1) 中间状态吗?它也有可能获得 (1,2) 状态,具体取决于哪个轴首先注册了更改。

再次阅读你的问题,我不太确定你的选择是否反映了我在我的案例#1 中所说的...你想要做的是报告一个包含两个值的值单个二进制文件中的 X 和 Y 值,然后监听端必须解包。我不熟悉您使用的符号,所以我不确定这是否是您的首选。