該文檔概述了我經歷的過程來逆轉我的Cobra IRAD 900雷達檢測器的藍牙協議。我的最初目標是通過藍牙與設備的Raspberry Pi 3接口進行處理,以處理警報,而無需使用iOS/Android應用程序,最終將其用作與我的Raspberry Pi“ Carputer”的不錯的接口。
重要的是要注意,我在藍牙協議上沒有最初的經驗,但總體而言,這是一種非常有趣的學習經驗。
當我第一次開始這個項目時,我不知道從哪裡開始,但是從Google開始。我知道如何嗅探常規的網絡流量,但是藍牙對我來說是一個黑匣子。通過一些快速搜索,我找到了畢色的庫以及有關通過RFCOMM進行交流的示例。我還發現了一些不錯的資源,包括Travis Goodspeed的一篇有趣的博客文章。
但是,對這個主題的指導很少,我還花了很多時間在這樣的資源上,認為藍牙LE是我想要的。
與我的舊越獄iPhone 5一起玩,我能夠使用BTServer記錄我iPhone發送和接收的藍牙流量。日誌文件被多個藍牙設備所包圍,儘管這不是問題,但日誌文件迅速增長。值得慶幸的是,日誌被輸出為.pklg文件,從而輕鬆地過濾Wireshark中的相關數據包。
使用數據包濾波器bluetooth.src == B8:92:1D:00:3F:61 ,我可以看到iOS應用程序發送給雷達檢測器的原始數據包。我對手機和雷達檢測器之間的通信進行了一些示例錄音,其中一些帶有警報,有些則沒有。
藍牙數據通過RFCOMM協議傳輸。當設備首次連接時,他們來回發送一些信息,可能只是同步設置(稍後再詳細介紹)。之後,兩個設備彼此之間遵循可預測的模式。雷達檢測器將以常規的1/2秒間隔通過藍牙發送RFCOMM數據包。有了一段時間和耐心,我能夠解讀從雷達檢測器發送到iPhone的有效載荷結構。
有效載荷結構:雷達檢測器→iPhone
| 物品 | 價值(十六進制) | 尺寸 |
|---|---|---|
| 前言 | 55 | 1字節 |
| 有效載荷大小 | xx xx | 2個字節 |
| 行動 | xx | 1字節 |
| 預訂的 | 00 | 1字節 |
| seq | xx | 1字節 |
| 預訂的 | xx xx xx xx xx xx | 6個字節 |
| 警報 | xx | 1字節 |
| 警報類型 | xx | 1字節 |
| ... | ... | ... |
隨著雷達檢測器的運行,它將以上述格式發送數據包。儘管計算機網絡不是我的專業知識領域,但我會盡力解釋。
發送的序列字節始終以值0x55發送。這說明這是從設備開始新的有效載荷消息的開始,而不是從以前的數據包中繼續。之後是一個2字節值,其中包含消息的其餘部分的大小(前3個字節之後的所有內容)。操作值指定數據包發送的信息類型。
SEQ編號是事物開始變得有趣的地方。如果您參加了網絡上的課程,或者對TCP有所了解,那麼您可能已經知道它的用途。雷達檢測器將向iPhone發送1個字節值,iOS應用程序必須以相同值的ACK響應。否則,雷達探測器將意識到某些事情是錯誤的並斷開了自己的連接。
Alert字節指定是否正在觸發警報。如果是這樣,它是一個值0x41的集合,並且使用以下字節來指定正在發送警報的類型。由於我沒有實際的雷達槍,所以我找不到太多關於這些值的信息。不過,一個使用Arduino的人用Arduino製作了LiDAR槍模擬器。這在分析數據包方面有很大幫助。
為了使iOS應用程序維護與設備的連接,它需要以正確格式發送響應。值得慶幸的是,對雷達檢測器的響應要簡單得多,只有9個字節。
響應: iPhone→雷達檢測器
| 物品 | 價值(十六進制) | 尺寸 |
|---|---|---|
| 前言 | 55 | 1字節 |
| 有效載荷大小 | xx xx | 2個字節 |
| 行動 | 02 | 1字節 |
| 預訂的 | 00 | 1字節 |
| ACK | xx | 1字節 |
| 預訂的 | 00 42 | 2個字節 |
| 櫃檯 | xx | 1字節 |
如前所述,ACK值必須與先前接收到的SEQ值相同,否則將斷開連接。這很容易。其他一些協議可能具有不太明顯的客戶端檢查方法;值得慶幸的是,情況並非如此。有趣的是,還有另一個使用的counter變量。我從來沒有真正弄清楚字節的目的,但是每個響應對設備的響應都會減少1個。這兩個值都很容易將編碼編寫成Python腳本,並且根本沒有進行太多的工作。
正如我之前提到的,當iOS應用首先連接到雷達檢測器時,某些設置和數據來回同步。弄清楚並分解這些數據包並不是我的優先事項,我不想花太多時間在此上。我以XML文件(data.xml)導出了Wireshark中的整個數據包日誌,然後使用python腳本(parsedata.py)來處理和存儲信息以備後用。
加載後,Radar.py將在PacketData.dat文件中打開預處理的數據。然後,它通過藍牙掃描雷達檢測器並嘗試連接到它。連接後,雷達檢測器將向連接的設備發送一些數據包。值得慶幸的是,它們每次都是相同的精確數據包。 Python腳本將瀏覽來自PacketData.dat文件的數據,以獲取收到的數據包。一旦主要的Python腳本找到了一個機械包,它就會向雷達檢測器發送相應的先前錄製響應。
令人驚訝的是,它的效果很好。不過,我想如果我更改了iOS應用程序中的任何設置,我需要更新數據文件。這不是太多的問題,因為我只需要一次配置該設備,並且可能再也不會使用該應用了。
鑑於我發現的所有信息,我能夠編寫一個模擬iPhone連接的Python腳本。如果在記錄的響應的數據庫中找不到數據包,它將構造一個響應數據包,上面i先前詳細介紹了結構。
回顧過去,這是一個非常有趣的項目,做一些我從未真正擁有過經驗的事情。作為計算機科學專業的專業,一旦使用硬件或多或少是異常的事情,這很有趣。
Brandon Asuncion // [email protected]
任何評論/反饋都將不勝感激!