现在不能在我的智慧结束时从温度读取温度读数。这需要一个超级英雄我猜

时间:2018-03-10 08:15:53

标签: bluetooth-lowenergy l2cap

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

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

我想我已经尝试了几乎所有流行的Python BLE库,但我似乎无法从灯塔中读取温度读数。 "我认为"我能读出电压。我之所以说'#34;我认为"是因为该值似乎与最小文档中提供的值相匹配。而且当我将信标放入充电器时,我可以看到值上升 - 表明它是电压读数。由于我无法读取温度(因为文档中提到的UUID,值似乎没有变化)。我已经尝试以所有可能的方式和方法启用传感器 - 通过写01:00等我花了相当多的时间来反向工程。我运行了一个数据包嗅探器并设法捕获在信标和移动应用程序之间传输的数据(他们有一个移动应用程序)。但话又说回来,我无法弄清楚如何在信标和应用程序之间传达温度读数。让我用更小的块来打破所有东西。

硬件:可以读取电压和温度的BLE信标。温度传感器内置于信标中。信标本身来自德州仪器,但温度,电压感应部分由第三方完成。他们为我们提供了一些最小的信息,很难理解一些句子,因为他们在用英语交流时遇到了麻烦。

获取数据的顺序如下

  1. 扫描信标
  2. 找到信标后再连接到它
  3. 启用通知
  4. 设置通知间隔
  5. 获取电压和温度读数。
  6. 我能够做到前4个真正的快速,并且#34;一半" 5号,即获得电压部分。当我说真快的时候,我的意思是我当时几乎没有可用的文档。

    根据我所拥有的信息,数据驻留在这些特征/ UUID中。另请注意,UUID不是标准的128位,这在使用某些库时会引起我的问​​题。但经过一些尝试后,我使用句柄等读取/写入它们。我打印的句柄和其他内容是我使用PYGATTA Python wrapper for gatttool)读取的内容。

    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这样的数字(启用传感器?)。如果可能的话,我本可以直接提供奖励。我很少因为一个问题而陷入困境。这让我有点疯狂。我越来越接近我的智慧结束了 - 我想这是一个超级英雄的时间 - 那里的任何人? :)如果有人能说出错误,我可以提供所需的所有信息。我甚至写了一个cordova应用程序......并尝试了一些来自我的Android手机的东西。我可以连接...写入特征,读取东西等但温度准备好了,不!它只是不会让步。我得到的只是一组相同的值(我使用JSON.stringify来显示A,B和C)。我以后可以打扰字节顺序。我想这是一个较小的问题。

    信标与第三方移动应用程序之间的通信很好,它可以很好地读取温度信息。

    我一直在关注wireshark数据,我很确定在这个阶段正在传达温度数据。但是当我解码"值"时,它看起来像是电压。它提到了l2cap但我不确定如何在这里使用它来发送温度读数(如果它首先使用它)。

    更新:写到每个可写的特征。在每个可写特征上写入1,100,2,7等值。与此同时,我正在阅读每个可读特征(在循环中)并与前一组值进行比较(只是真/假)。这似乎是一种快速而简单的方法来了解是否有变化。没想把把十六进制转换为浮点数的机会。我可以稍后弄清楚字节顺序。

    从嗅探的数据(wireshark)中,我只能看到信标上发生了3次写入。

1 个答案:

答案 0 :(得分:2)

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

从值开始,这四个字节似乎代表浮点电压(如果忽略10 ^ -38的荒谬因子,因为只使用4个字节而不是8个字节)。

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

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

为了增加混淆,当仅使用第三个字节的前五位和第四个字节的八位时,我得到了最好的结果。我不知道为什么会这样,它可能会指出一些麻烦。

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