您好,登錄后才能下訂單哦!
如何攻克小米手環(huán)2并基于Linux控制它,針對這個問題,這篇文章詳細介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
這個故事源于我在Facebook一個帖子,帖子中討論了運動健身追蹤器都缺乏API接口的問題,還有為啥不用它幫助數(shù)據(jù)專家為做一個炫酷的東西。
帖子發(fā)出之后,我的好基友Volodymyr Shymanskyy就響應(yīng)來幫助我,并在github上找了Leo Soares項目,為我的健身追蹤器小米手環(huán)2找了一些代碼。他嘗試運行它,但是連接出現(xiàn)了一些鏈接問題,所以他花了幾個小時修復(fù)了他。之后,他提交了個commit,并給了我鏈接。
那滿足了我的初步需求,已經(jīng)相當(dāng)OK了。那代碼可以連接到手環(huán),發(fā)布通知,并獲取一次拍攝心臟測量。但這對我來說還有點不夠,因為我想從傳感器獲得實時原始數(shù)據(jù),以便在我的數(shù)據(jù)科學(xué)實驗中使用(想要做一個健身運動預(yù)測器)。
在此之前,我沒有任何使用藍牙設(shè)備的經(jīng)驗,所以首先我試著了解了所有這些東西是如何組織和工作的。事實證明,也沒啥難得。
每個藍牙設(shè)備都會啟動幾個的服務(wù),每個服務(wù)都有特征,并且一些特征具有描述符(如果特征有多個參數(shù)或工作類型(閱讀|通知))。某些特性只有讀/寫訪問權(quán)限,比如當(dāng)前時間,電池狀態(tài)或修訂信息。其中一些更復(fù)雜并且通過請求/通知循環(huán)工作,例如實時心率監(jiān)視器和授權(quán)?;旧?,你需要知道這一切的,才能開始使用它。
您還需要兩個應(yīng)用程序來幫助調(diào)試藍牙設(shè)備:Wireshark和BLE debugger。你還需要需要訪問安卓手機開發(fā)者選項(對不起,對于iOS家伙我還不知道如何做到這點)。
首先,您需要從手機應(yīng)用程序中取消小米手環(huán)2的配對。
現(xiàn)在讓我們看看手環(huán)有什么服務(wù)和特征。讓我們打開BLE debugger,開始掃描,你會看到類似這樣的東西:
將設(shè)備的MAC地址保存下,后續(xù)操作會用到它。
現(xiàn)在讓我們連接它,看看它跑了什么服務(wù)和特征。
以上兩個簡單的操作中,我們已經(jīng)獲得了一些有用的設(shè)備信息。
另一種方法是使用控制臺工具hcitool和gatttool。
sudo hcitool lescan
連接并獲取服務(wù)和描述符:
sudo gatttool -b YOUR_MAC -I -t random > connect > primary > char-desc
在某些情況下,BLE??赡軙霈F(xiàn)故障,您可以打開/關(guān)閉藍牙或運行以下命令:
sudo hciconfig hci0 reset
為了我們的手機<->基帶通信中嗅探數(shù)據(jù),我們需要啟用藍牙在開發(fā)設(shè)置記錄日志。要做到這一點,您需要先打開安卓手機上的開發(fā)人員設(shè)置。
在Android 4.1及更低版本上,開發(fā)者選項屏幕默認(rèn)可用。在Android 4.2及更高版本中,您必須按如下所示啟用此屏幕:
1.打開手機設(shè)置。
2.(僅適用于Android 8.0或更高版本)選擇系統(tǒng)。
3.滾動到底部并選擇關(guān)于手機。
4.滾動到底部并點擊Build number 7次。
5.返回到上一屏幕以查找底部附近的開發(fā)人員選項。
現(xiàn)在打開開發(fā)設(shè)置并找到“啟用BleutoothHCI snoop log”并啟用它。這樣,所有藍牙通信都會被被記錄。然后你需要找到名為btsnoop_hci.log的文件(在我手機中(Android 7.0)它位于/mtklog/btlog/btsnoop_hci.log)
現(xiàn)在我們還要要執(zhí)行一下步驟來獲取有關(guān)認(rèn)證(配對)如何工作的一些信息。
1.打開藍牙和HCI日志。
2.將您的設(shè)備與小米安卓程序配對。
3.關(guān)閉藍牙。
4. 下載btsnoop_hci.log到你的電腦。
5.用Wireshark打開它。
6.找到第一個處理0x0055的ATT協(xié)議請求
你會看到如圖的界面:
這是驗證步驟:
配對設(shè)備
主要服務(wù)UUID
0000fee1-0000–1000–8000–00805f9b34fb
認(rèn)證特征 (Char) UUID
00000009–0000–3512–2118–0009af100700
通知描述符 (Des) 處理
0x2902 (所有的過程都一樣)
1.通過向Des發(fā)送2個字節(jié)請求 \x01\x00來設(shè)置auth通知(以獲得響應(yīng))。
2.用命令將16字節(jié)的加密密鑰發(fā)送給Char,并附加2字節(jié)\x01\x00 + KEY。
3.通過發(fā)送2個字節(jié)\x02\x00到Char來向設(shè)備請求帶有命令的隨機密鑰。
4.從設(shè)備響應(yīng)中獲取隨機密鑰(最后的16個字節(jié))。
5.使用我們的16字節(jié)密鑰,用AES/ECB/ NoPadding(來自Crypto.Cipher import AES)對此隨機數(shù)進行加密,并將其發(fā)送回Char(\x03\x00+編碼數(shù)據(jù))
1.通過發(fā)送2個字節(jié)\x02 \x00到Char來向設(shè)備請求帶有命令的隨機密鑰。
2.從設(shè)備響應(yīng)中獲取隨機密鑰(最后16個字節(jié))。
3.使用我們的16字節(jié)密鑰和使用AES / ECB / NoPadding(來自Crypto.Cipher import AES)對此隨機數(shù)進行加密,并將其發(fā)送回Char(\ x03 \ x00 +編碼數(shù)據(jù))
這在認(rèn)證過程中稍微復(fù)雜一些,因為我沒有看到在這個過程中犯了一個錯誤:)并且因為這個心率監(jiān)視器在15秒后關(guān)閉。
硬件服務(wù)(HRDW)UUID
0000fee0-0000-1000-8000-00805f9b34fb
心臟監(jiān)護儀服務(wù)(HMS)UUID
0000180d-0000-1000-8000-00805f9b34fb
心率測量特征(HRM)UUID
00002a37-0000-1000-8000-00805f9b34fb
心臟監(jiān)護儀控制特性(HMC)UUID
00002a39-0000-1000-8000-00805f9b34fb
傳感器特性(SENS)UUID
00000001-0000-3512-2118-0009af100700
通知描述符(DES)句柄
0x2902(所有過程都一樣)
1.關(guān)閉當(dāng)前監(jiān)聽的測量。
2. 通過向HMC發(fā)送請求\x15\x02\x00進行一次性測量。
3. 通過向HMC發(fā)送請求\x15\x01\x00進行連續(xù)測量。
4.通過向SENS發(fā)送命令到\x01\x03\x19來啟用陀螺儀和心臟原始數(shù)據(jù)
5.通過向HRM寫入DES \x01\ x00啟用通知
6.通過向HMC發(fā)送請求\x15\x01\x01來啟動連續(xù)的心臟測量
7.發(fā)送命令到SENS \x02(不知道為什么需要這指令)
8.然后,在每12秒收到一次通知時,需要將\x16 ping發(fā)送到HCM
這是最枯燥部分,因為基本上你需要找出如何解包來自設(shè)備的打包數(shù)據(jù)。
它的一部分可以從日志中解析出來,有些不能。
這是當(dāng)前時間的設(shè)備的響應(yīng)
找到合適的數(shù)據(jù)包和編碼可能需要一些時間。就我的例子而言,我需要找到相鄰的數(shù)據(jù)包中相似的字節(jié)出現(xiàn)次數(shù),有些重復(fù)的數(shù)據(jù)包。
Raw heart: 02102d8c348c448c458c3d8c428c488c 16
Raw heart: 0218468c418c3d8c468c3f8c398c418c 16
Realtime heart: 93
Raw heart: 0220408c448c3f8c428c498c3c8c3d8c 16
Raw heart: 02283d8c398c488c3e8c468c488c328c 16
Realtime heart: 99
Raw heart: 0230438c408c378c3a8c318c458c388c 16
Realtime heart: 102
Raw heart: 02404f8c408c458c428c4d8c558c4d8c 16
Raw heart: 02483e8c3b8c3f8c348c398c318c428c 16
Realtime heart: 98
Raw heart: 02504c8c428c5e8c4f8c588c498c558c 16
Raw heart: 0258478c458c3c8c4e8c3f8c468c4d8c 16
Realtime heart: 100
Raw heart: 0260518c4d8c4f8c4b8c4f8c528c458c 16
Raw heart: 0268408c3f8c538c4d8c408c548c598c 16
Realtime heart: 102
Raw heart: 0278418c508c4e8c548c588c468c498c 16
Raw heart: 0280368c328c2e8c3c8c338c308c3f8c 16
Realtime heart: 101
從中我們可以看到清晰的數(shù)據(jù),重復(fù)368c 328c 2e8c 3c8c 338c 308c 3f8c,數(shù)據(jù)包長度為16字節(jié)。因此,如果我們用2個字節(jié)的無符號短數(shù)據(jù)解壓縮,那么我們可以得到7個心臟傳感器的原始測量結(jié)果。我們也看到第二個字節(jié)只是迭代,我認(rèn)為它只是測量之間的時間差異(我指的是響應(yīng)的時間差)
Raw gyro: 01de49ffd9ff3c004cffd8ff3b004dffdcff4400Raw gyro: 01df4cffd6ff44004dffd8ff40004cffd1ff4700 Raw gyro: 02e1103231323d3274328e329632af32c732cf32 Raw gyro: 01e34fffd7ff56004bffc7ff590049ffccff4c00 Raw gyro: 01e443ffccff43004effcdff40005bffd4ff4c00 Raw gyro: 01e558ffc9ff5f005effbfff66005fffb0ff5900 Raw gyro: 01e64cffacff60005cffa7ff410066ffc9ff4600 Raw gyro: 01e760ffdcff4b0051ffe4ff4f0034ffdeff5300 Raw gyro: 02e903365c36813663361036543688374139fe3a Raw gyro: 01eb4bffc3ff50004fffc1ff430047ffbbff4100 Raw gyro: 01ec3effb2ff3c0050ffbfff560047ffccff7300 Raw gyro: 01ed4fffe0ff78005cffebff8e0056fff6ff8300 Raw gyro: 01ee7efffbffa1008bff0f00bc00b1ff1900b800 Raw gyro: 01ef9bff0c00d10095fff3ffd600b7ff0800df00 Raw gyro: 02f12445314600479e473348aa481c499749244a Raw gyro: 01f3c3ff1600fe00beff1800f200a6ff0800e700 Raw gyro: 01f4a9fff8ffd300a7fff3ffd700a9fff1ffdf00 Raw gyro: 01f5b1fff8ffe800b4fff1fff700acfffcffef00 Raw gyro: 01f67ffff7ffc0006bfff4ffb00078ffe9ffb600 Raw gyro: 01f786ffecffc0006ffff0ffbc0060fff1ffc000 Raw gyro: 02f9ca4cbb4c784c964ca84c784c854c444c1b4c Raw gyro: 01fb7cff0f00bb007eff2700ae0083ff30009800 Raw gyro: 01fc79ff1800b00076ff0f00bc0068ff0900d900 Raw gyro: 01fd78ff07000c01f6fffbff19011c000b00f600 Raw gyro: 01fe4b001100d30054000700c3004300efffeb00 Raw gyro: 01ff1f00d0ff1701fbffe8ff1b01e3ffffff1101 Raw gyro: 0201214b014bec4ad04aba4acb4abe4aba4abd4a Raw gyro: 0103efffecfffc00e3fff3fff300defff3fffc00 Raw gyro: 0104e3fff0fff400e6ffefff0301dbffe9ff0c01 Raw gyro: 0105e3fff0ff0301e6ffe6fffc00dcffecfffc00 Raw gyro: 0106dffff0fff700dbffeefff600d6fff0fff400 Raw gyro: 0107dfffecffff00e1fff0ff0301defff3fffc00
至于陀螺儀,就有點困難。但是我的想法是它應(yīng)該與心臟數(shù)據(jù)類似的方式打包,但在這種情況下,我們對每個應(yīng)該簽名的陀螺儀軸進行3次測量,數(shù)據(jù)包長度為20個字節(jié)。因此,12 x,y,z測量不會覆蓋所有包,但3將會保留前2個字節(jié)(與之前的包相同)。所以我這樣試了,過不然工作是正常的。
關(guān)于如何攻克小米手環(huán)2并基于Linux控制它問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。