如何解决通过蓝牙进行温度交换的温度
我正在尝试了解如何对一些数据进行编码以便通过BLE(蓝牙低功耗)进行传输。 具体来说,我对这一行很感兴趣:
来自摘要:
temp = Temp.read()
temp = temp * 100
char_temp.write(bytearray([temp & 0xFF,temp >> 8]))
在我们什至进入为什么部分之前,我需要了解操作方式。在此代码片段中,以摄氏度为单位从传感器读取温度作为浮点。现在说“ 20.00”。然后将其乘以100,然后得出编码部分:
2000 & 0xFF -> 208
2000 >> 8 -> 7
所以我们基本上是在发送:
>>> bytearray([208,7])
bytearray(b'\xd0\x07')
这是正确的吗?我会这么说,我用自己的设备进行了检查,这似乎是正在发送的数据,它也可以正常工作,我可以读取从BLE设备发送的温度。
我不明白的是为什么需要所有这些位操作。例如,我尝试仅发送bytearray([hex(20)])
,但不起作用(尝试从手机读取温度时,无法解析/转换数据)。
能否请您解释一下发送数据的格式?
解决方法
如tests所示,在Python中进行转换的直接方法是具有to_bytes
和from_bytes
功能
使用数据将字节指向int方向:
>>> int.from_bytes([208,7],byteorder='little',signed=True)
2000
从int到字节:
>>> int(2000).to_bytes(2,signed=True)
b'\xd0\x07'
或者从读数到字节:
>>> int(20.00*100).to_bytes(2,signed=True)
b'\xd0\x07'
蓝牙数据应为little endian格式的列表或字节数组。列表中的每个整数都必须代表一个octet。
从您链接到的源中,我可以看到特征性的UUID为0x2A6E
:
uuid_temp = UUID("0x2A6E") # Temperature characteristic
这是官方的UUID,因此在https://www.bluetooth.com/specifications/assigned-numbers/的“ 16位UUID编号文档”中进行了描述
Bluetooth SIG网站上的GATT Specification Supplement文档中有更详细的说明:“ 2:值和表示的值”部分。在该文档中,它还解释了如何以这种方式表示温度:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。