代码之家  ›  专栏  ›  技术社区  ›  R.W

无法从ble信标获取温度读数。。我现在已经不知所措了。我想这需要一个超级英雄

  •  0
  • R.W  · 技术社区  · 8 年前

    我有一项任务,需要从BLE信标读取2个参数。文档严重缺乏,经过相当多的努力,我设法获得了一些有关从BLE信标读取数据的基本信息。

    要读取的参数为
    1) 传感器的蓄电池电压
    2) 温度信标具有内置温度传感器。

    我想我已经尝试了几乎所有流行的Python BLE库,但我似乎无法从灯塔中读取温度读数。“我想”我能够读取电压。我之所以说“我认为”,是因为该值似乎与最小文档中提供的值相匹配。而且,当我把信标放进充电器时,我可以看到数值上升,这表明它是电压读数。因为我无法读取温度(因为文档中提到的UUID,该值似乎没有改变)。我已经尝试过以所描述的每种可能的方式和方法启用传感器-通过编写01:00等。我花了相当多的时间对其进行反向工程。我运行了一个数据包嗅探器,并设法捕获在信标和移动应用程序之间传输的数据(他们有一个移动应用程序)。但我还是无法弄清楚灯塔和应用程序之间的温度读数是如何通信的。让我把整个东西分成小块。

    硬件:可读取电压和温度的BLE信标。温度传感器内置在信标中。信标本身来自德克萨斯仪器公司,但温度、电压传感部分由第三方完成。他们向我们提供了一些最低限度的信息,有些句子很难理解,因为他们用英语交流有困难。

    获取数据的顺序如下

    1. 扫描信标
    2. 找到信标后,连接到它
    3. 启用通知
    4. 设置通知间隔
    5. 获取电压和温度读数。

    我已经能够很快地完成前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次写入。

    1 回复  |  直到 8 年前
        1
  •  2
  •   Thern    8 年前

    即使经过长时间的讨论,我也不能完全确定,但似乎通知的四个字节用于电压和温度,因为温度很可能来自电压。

    从这些值来看,这四个字节似乎代表浮点数中的电压(如果忽略10^-38这一荒谬的因素,因为只使用了4个字节而不是8个字节)。

    由于温度T通常来自电阻率测量,其中电阻率R与电压U成比例(如果电流恒定),因此原则上可以根据电压U计算温度T。

    问题是T(R)是相对线性的,但不是完全线性的(与假定为U=RI的U(R)相反)。因此,您可能需要绘制T(U)的值,以找出它们使用的曲线。

    更让人困惑的是,当我只使用第三个字节的前五位和第四个字节的八位时,得到了最好的结果。我不知道为什么会出现这种情况,这可能会带来一些麻烦。

    最好的选择是询问他们正在使用的函数T(U)。如果他们能够并且将为你提供。。。

    推荐文章