我有一项任务,需要从BLE信标读取2个参数。文档严重缺乏,经过相当多的努力,我设法获得了一些有关从BLE信标读取数据的基本信息。
要读取的参数为
1) 传感器的蓄电池电压
2) 温度信标具有内置温度传感器。
我想我已经尝试了几乎所有流行的Python BLE库,但我似乎无法从灯塔中读取温度读数。“我想”我能够读取电压。我之所以说“我认为”,是因为该值似乎与最小文档中提供的值相匹配。而且,当我把信标放进充电器时,我可以看到数值上升,这表明它是电压读数。因为我无法读取温度(因为文档中提到的UUID,该值似乎没有改变)。我已经尝试过以所描述的每种可能的方式和方法启用传感器-通过编写01:00等。我花了相当多的时间对其进行反向工程。我运行了一个数据包嗅探器,并设法捕获在信标和移动应用程序之间传输的数据(他们有一个移动应用程序)。但我还是无法弄清楚灯塔和应用程序之间的温度读数是如何通信的。让我把整个东西分成小块。
硬件:可读取电压和温度的BLE信标。温度传感器内置在信标中。信标本身来自德克萨斯仪器公司,但温度、电压传感部分由第三方完成。他们向我们提供了一些最低限度的信息,有些句子很难理解,因为他们用英语交流有困难。
获取数据的顺序如下
-
扫描信标
-
找到信标后,连接到它
-
启用通知
-
设置通知间隔
-
获取电压和温度读数。
我已经能够很快地完成前4项和第5项的“一半”,即获得电压部分。当我说真的快的时候,我的意思是我当时几乎没有可用的文档。
根据我掌握的信息,数据位于这些特征/UUID中。另外,请注意,UUID不是标准的128位,这导致我在使用某些库时出现问题。但经过一些尝试后,我开始使用句柄等来读/写它们。我打印的句柄和其他东西都是我使用的
PYGATT
(
A Python wrapper for gatttool
)。
UUID被标记为第一、第二、第三和第四个参数,它对这些参数有以下说明
- 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这样的数字(启用传感器?)。如果可能的话,我可以马上悬赏。我很少被一个问题困扰这么久。这让我有点疯狂。我快疯了——我想是时候做个超级英雄了——有人吗?:)如果有人能指出问题所在,我可以提供所需的每一点信息。我甚至写了一个cordova应用程序。。。还尝试了我的Android手机上的一些东西。我可以连接。。。写特性,读材料等,但温度准备好了,不!!!它就是一动不动。我得到的只是相同的一组值(我使用JSON.stringify来显示a、B和C)。我可以稍后再考虑字节顺序。我想这是一个较小的问题。
信标和第三方移动应用程序之间的通信正常,能够读取温度信息。
我一直在查看wireshark数据,我非常确定温度数据在现阶段正在进行通信。但当我解码“值”时,它看起来像是电压。它提到l2cap,但我不确定这里是如何使用l2cap来发送温度读数的(如果它首先使用的是l2cap)。
更新:写入每个可写特征。在每个可写特征上写入值,如1、0100、2、7。与此同时,我正在读取每个可读的特征(在循环中),并与之前的一组值进行比较(仅为真/假)。这似乎是一种快速而简单的方法,可以知道是否发生了变化。不想冒险将十六进制转换为浮点。稍后我可以计算出字节顺序。
从嗅探数据(wireshark)中,我只能看到信标上发生了3次写入。