python 解析 mqtt 回傳回來的 bytes

MQTT 算是目前比較主流的 iot 通訊方式了,現在很多 iot 的設備都有支援,但是丟出來的訊號不會像一般的 Web API 一樣給你一個漂漂亮亮的 JSON 裡面包含 key value 讓你方便解析。而是回傳給你一堆 bytes 

這邊我們就先假設我們已經成功拿到 payload 了


def on_message(client, userdata, msg):
    payload = str(msg.payload)


這時候我們如果 print(payload) 會出現類似這樣的東西:
b'\x01\x03\x06\x00\x12\x00\x19\x00;\tb'

表示說你拿到的果然是一堆被封裝的 bytes 通常廠商會附帶一張解碼表告訴你每個位元的使用方式,但是我們要先把這些 bytes 解開才能使用。以 python3 為例:

s = []
for x in list(msg.payload):
    s.append(hex(x)[2:].zfill(2))

我的作法會先把剛剛的 msg.payload 轉成 list 格式,這樣方便後續處理,這個地方要注意一下就是先不要急著把 msg.payload 轉 str 一開始我們轉 str 單純是為了方便印出,如果我們這個時候轉 str 他就不是用 byte 的方式轉摟。在丟入 s 這個 list 之前我們要將 byte 轉成 hex 。

我們看到 [2:] 這個是說要把前面兩碼丟掉 也就是去除 \x

zfill(2) 則是限制字串長度,被 hex 轉換過已經是 str 摟。



這時候你可以先 print(s) 你就會發現已經被整理如下:

b'\x01\x03\x06\x00\x12\x00\x19\x00;\tb'
['01', '03', '06', '00', '12', '00', '19', '00', '3b', '09', '62']


我們可以對照一下設備商給我們的文件去對應解析,以這次的訊號來說,是這麼表示的

['01', '03', '06', '00', '12', '00', '19', '00', '3b', '09', '62']

function_name

N

P

K

當我們發現標示是這樣一組一組的時候就要用 str 連接例如我們要抓取藍色組的值

print("N="+str(int(s[3]+s[4],16)))

先將 s[3]+s[4] 連接字串 再利用 16進位轉換就可以得到我們要的值

0012 16進位轉10進位是 18 

恭喜老爺賀喜夫人我們終於得到答案摟!


留言