我有一项任务需要从 BLE 信标读取 2 个参数。文档严重缺乏,经过相当多的努力,我设法获得了一些关于从 BLE Beacon 读取数据的基本信息。
要读取的参数是
1) 传感器的电池电压
2) 温度 信标具有内置温度传感器。
我想我已经尝试了几乎所有流行的 Python BLE 库,但我似乎无法从信标中读取温度读数。“我认为”我能够读取电压。我之所以说“我认为”是因为该值似乎与最小文档中提供的值相匹配。而且当我将信标放入充电器时,我可以看到值上升 - 这表明它是电压读数。由于我无法读取温度(因为文档中提到的 UUID,该值似乎没有改变)。我已经尝试以所描述的所有可能的方式和方法启用传感器 - 通过写 01:00 等。我花了相当多的时间对这件事进行逆向工程。我运行了一个数据包嗅探器并设法捕获了在信标和移动应用程序之间传输的数据(他们有一个移动应用程序)。但话又说回来,我无法弄清楚信标和应用程序之间的温度读数是如何通信的。让我把整个东西分成更小的块。
硬件:可以读取电压和温度的 BLE 信标。温度传感器内置在信标中。信标本身来自德州仪器,但温度、电压感应部分由第三方完成。他们为我们提供了一些最少的信息,并且很难理解其中的一些句子,因为他们无法用英语交流。
获取数据的顺序是这样的
- 扫描信标
- 找到信标后,连接到它
- 启用通知
- 设置通知间隔
- 获取电压和温度读数。
我已经能够真正快速地完成前 4 个,并且是第 5 个的“一半”,即获得电压部分。当我说真正快速时,我的意思是我当时几乎没有可用的文档。
根据我拥有的信息,数据位于这些特征/UUID 中。另请注意,UUID 不是标准的 128 位,这导致我在使用某些库时出现问题。但是经过一些尝试后,我开始使用句柄等对它们进行读/写。我打印的句柄和其他东西是我使用PYGATT( gatttool的 Python 包装器)读取的。
UUID 被标记为第 1、第 2、第 3 和第 4 个参数,关于参数有以下说明
- A: 1 byte (2nd Param)
- B: Maj + Min values, 4 bytes (4th Param)
- C: 4 bytes (3rd Param)
- D: Enable/disable notification ( I have been able to turn this on )
- E: Set notification interval ( I have been able to set this and can notice the change in notification interval )
这是最小的,因此没有大文件。它所做的就是——移动应用程序连接到信标,然后通知开始,移动应用程序检索温带读数。就像我提到的那样,我似乎没有读取电压的问题,这只是我卡在的温度。我已经做了一个星期了。我想我已经尝试了几乎所有我能想到的东西。我什至列举了所有可写的特征,并尝试写出像 1 这样的数字(启用传感器?)。如果可能的话,我本可以立即为此提供赏金。我很少被一个问题困住这么久。这让我有点发疯。我快要崩溃了——我想是时候成为超级英雄了——有人在吗?:) 如果有人能指出问题所在,我可以提供所需的每一点信息。我什至写了一个科尔多瓦应用程序......并从我的安卓手机上尝试了很多东西。我可以连接...写入特性,读取东西等,但温度准备好了,不!!!它只是不会让步。我得到的只是相同的一组值(我使用 JSON.stringify 来显示 A、B 和 C)。我可以稍后再考虑字节顺序。我想这是一个较小的问题。
信标与第三方移动应用程序之间的通信很好,它能够很好地读取温度信息。
我一直在查看 Wireshark 数据,我相当确定在这个阶段正在传达温度数据。但是当我解码“值”时,它看起来像是电压。它提到了 l2cap,但我不确定如何在这里使用它来发送温度读数(如果它首先使用它)。
更新:写到每一个可写的特征。在每个可写特征上写入 1、0100、2、7 等值。同时,我正在读取每个可读特征(在循环中)并与前一组值进行比较(只是真/假)。这似乎是一种快速简便的方法来了解是否有变化。不想冒险将十六进制转换为浮点数。我可以稍后弄清楚字节顺序。
从嗅探的数据(wireshark)中,我只能看到信标上发生了 3 次写入。