米家電子溫濕度計(jì)Pro 數(shù)據(jù)讀?。ㄒ唬?/h1>
故事背景
最近在網(wǎng)上發(fā)現(xiàn)了這款高顏值的小鐘,就忍不住剁手了。幾十元的價(jià)格,還是相當(dāng)劃算的。體積小巧、溫度計(jì)、濕度計(jì)、水墨屏、可藍(lán)牙連接米家智能……(小米,你看我這能申報(bào)廣告費(fèi)不,比如給我免單),產(chǎn)品圖如下:

項(xiàng)目簡(jiǎn)介
現(xiàn)在進(jìn)入主題。在某次連接這款溫濕度計(jì)調(diào)時(shí)間的時(shí)候,突然發(fā)現(xiàn)這款溫濕度計(jì)(后面簡(jiǎn)稱小米Pro)可以自動(dòng)記錄過(guò)去半年的溫濕度,這豈不是小型氣象站。由于只有這款米家設(shè)備,不想使用米家APP,而且為了后續(xù)的數(shù)據(jù)處理,必須支持把原始數(shù)據(jù)導(dǎo)出。這就開(kāi)始了一系列的折騰之旅……
技術(shù)背景
看了網(wǎng)絡(luò)上眾多大佬的文章,做出如下總結(jié):1. 小米Pro的藍(lán)牙是可以直接連接的 2.連接后可以直接讀取小米Pro的數(shù)據(jù),沒(méi)有加密。
就此前提我們的目標(biāo)是可實(shí)現(xiàn)的,我把總的過(guò)程分為兩個(gè)步驟,數(shù)據(jù)獲取和數(shù)據(jù)處理。
數(shù)據(jù)獲取
(Tip:后來(lái)找到了window通過(guò)Python讀取藍(lán)牙數(shù)據(jù)的方法,數(shù)據(jù)獲取就變得十分簡(jiǎn)單,直接一鍵運(yùn)行,詳情見(jiàn)我的第二個(gè)帖子。由于這篇里寫了許多關(guān)于小米Pro記錄數(shù)據(jù)格式的內(nèi)容,這個(gè)段落我就不更改了)
本以為藍(lán)牙數(shù)據(jù)獲取十分簡(jiǎn)單,但是我錯(cuò)了。我在Windows平臺(tái)上嘗試用Python讀取小米Pro的數(shù)據(jù),但是沒(méi)有成功。通過(guò)Windows端的包只實(shí)現(xiàn)了藍(lán)牙的掃描和藍(lán)牙服務(wù)的讀取,沒(méi)有實(shí)現(xiàn)數(shù)據(jù)的讀取和發(fā)送。感覺(jué)在Linux上實(shí)現(xiàn)方便很多,有許多現(xiàn)車的包。
在Windows中的應(yīng)用商店里,有一款叫?Bluetooth LE Explorer?的軟件在藍(lán)牙服務(wù)分析上還是非常好用的,在應(yīng)用里藍(lán)牙連接小米Pro后,雙擊可以直接查看藍(lán)牙所有的服務(wù)名。在里面有一個(gè)服務(wù)名ebe0cb0開(kāi)頭的服務(wù)(如下圖所示),是用來(lái)進(jìn)行和小米Pro數(shù)據(jù)交互的。數(shù)據(jù)格式的解析,在Github上已經(jīng)有大佬破解了,網(wǎng)址我會(huì)放在最后。在這里我只介紹兩個(gè),一個(gè)是當(dāng)前的溫濕度讀取,另一個(gè)是歷史數(shù)據(jù)的讀取。

當(dāng)前溫度的數(shù)據(jù)很好讀取,在這個(gè)軟件中都有直接的注釋。比如在圖中描述為Temperature and Humidity的一行就是當(dāng)前的溫濕度,讀取的值為28-08-46-B6-0A。讀取出的數(shù)據(jù)為十六進(jìn)制,所以要轉(zhuǎn)換,但在轉(zhuǎn)換前需要對(duì)數(shù)據(jù)提取和轉(zhuǎn)化才行。在頭兩組數(shù)(28-08)代表的是溫度,下一組(46)是濕度,最后兩組(B6-0A)是當(dāng)前電量。讀取的順序還必須是倒序,比如溫度讀取的數(shù)據(jù)是 28-08,正確的順序應(yīng)該是 08-28。轉(zhuǎn)成十進(jìn)制后位2088,代表著當(dāng)前溫度為20.88度。其他數(shù)據(jù)的讀法和溫度的相同。
歷史數(shù)據(jù)的讀取是通過(guò)藍(lán)牙廣播發(fā)送接收的,如上圖中有一個(gè)notify的滑塊,打開(kāi)后就會(huì)自動(dòng)接收來(lái)自小米Pro的廣播。每次連接藍(lán)牙打開(kāi)廣播后,小米Pro就會(huì)廣播發(fā)送所有的歷史紀(jì)錄。以上圖為例,歷史數(shù)據(jù)為標(biāo)注有data notify那一行。數(shù)據(jù)一共有14組,頭四組代表的數(shù)據(jù)編號(hào),接下來(lái)四組是記錄的時(shí)間,然后兩組代表最高溫度,一組濕度,兩組最低溫度,最后一組似乎沒(méi)有意義。讀法都是一組一組倒著讀,然后轉(zhuǎn)成十進(jìn)制。注意時(shí)間是通過(guò)unixtime的形式記錄的,記錄的是從1970年1月1日開(kāi)始至現(xiàn)在的秒數(shù)。由于Bluetooth LE Explorer這軟件不能儲(chǔ)存廣播的數(shù)據(jù),所有的數(shù)據(jù)都會(huì)一閃而過(guò),這就十分尷尬?;氐介_(kāi)頭,沒(méi)有在windows上找到對(duì)應(yīng)的讀取藍(lán)牙方法,那就借用了一下手機(jī),有個(gè)叫BLE調(diào)試助手的軟件,可以存儲(chǔ)小米Pro廣播的數(shù)據(jù)。有點(diǎn)繁瑣,但是沒(méi)有辦法……讀出來(lái)的數(shù)據(jù)還不能直接txt打開(kāi),需要用一個(gè)叫Replace Pioneer的電腦軟件。這真的億點(diǎn)點(diǎn)繁瑣。
數(shù)據(jù)處理
通過(guò)上面的一系列操作,終于得到了所有的歷史數(shù)據(jù),由于手機(jī)上那個(gè)軟件存儲(chǔ)的數(shù)據(jù)是16組一行,原本的是14組,所有需要在額外處理一下。但是這些操作都可以Spyder直接處理,或者M(jìn)atlab??傮w過(guò)程就是先讀取文件,然后轉(zhuǎn)換成14組每行,再讀取對(duì)應(yīng)的數(shù)據(jù)再轉(zhuǎn)化成10進(jìn)制,最后畫圖……。最后附上參考代碼:
參考:
https://github.com/JsBergbau/MiTemperature2/issues/1