[英]Enconding temperature for exchange over bluetooth
我正在嘗試了解如何對一些數據進行編碼以通過 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)])
但它不起作用(當試圖從我的手機讀取溫度時,無法解析/轉換數據)。
你能解釋一下發送數據的格式嗎?
如測試所示,在 Python 中進行轉換的直接方法是使用to_bytes
和from_bytes
功能
使用您的數據,字節將指向 int 方向:
>>> int.from_bytes([208, 7], byteorder='little', signed=True)
2000
從整數到字節:
>>> int(2000).to_bytes(2, byteorder='little', signed=True)
b'\xd0\x07'
或者從讀取到字節:
>>> int(20.00*100).to_bytes(2, byteorder='little', signed=True)
b'\xd0\x07'
藍牙數據應該是小端格式的列表或字節數組。 列表中的每個 integer 都需要代表一個八位字節。
從你鏈接到的來源我可以看到特征 UUID 是0x2A6E
:
uuid_temp = UUID("0x2A6E") # Temperature characteristic
這是官方 UUID,因此在https://www.bluetooth.com/specifications/assigned-numbers/的“16 位 UUID 數字文檔”中進行了描述
Bluetooth SIG 網站上的GATT 規范補充文檔中有更詳細的解釋:“2:值和表示值”部分。 在該文檔中,它還解釋了如何以這種方式表示溫度:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.