簡體   English   中英

通過藍牙進行交換的環境溫度

[英]Enconding temperature for exchange over bluetooth

我正在嘗試了解如何對一些數據進行編碼以通過 BLE(低功耗藍牙)進行傳輸。 具體來說,我對這一行感興趣:

https://github.com/micropython/micropython/blob/05f95682e7ddfb08c317e83826df9a1d636676f3/ports/nrf/examples/ubluepy_temp.py#L68

來自片段:

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_bytesfrom_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM