作為基于藍(lán)牙協(xié)議的開發(fā)者,少不了各種需要抓包分析藍(lán)牙報文的應(yīng)用場景;而專業(yè)的藍(lán)牙抓包器非常昂貴,可能會讓初學(xué)者望而卻步。本文結(jié)合實際的工程場景,安利一款簡單好用且高性價比的藍(lán)牙抓包器,基本可以滿足日常的抓包分析,希望對大家有所幫助。
1 寫在前面
作為一個基于藍(lán)牙協(xié)議的開發(fā)者,少不了各種需要抓包分析藍(lán)牙報文的應(yīng)用場景;這就好比分析電路少不了萬用表,分析串行通訊協(xié)議少不了示波器/邏輯分析儀,分析網(wǎng)絡(luò)通訊少不了網(wǎng)絡(luò)抓包。
作為BLE藍(lán)牙的入門級開發(fā)者,前期對藍(lán)牙的很多特性都不能很好的把握,所以能多抓抓實際的通訊報文來分析分析,一定能夠加快對藍(lán)牙通訊協(xié)議的理解。
無奈,市面上真正專業(yè)級別的藍(lán)牙抓包器還是比較昂貴的,一般只有藍(lán)牙芯片開發(fā)公司或者相關(guān)的實驗室會配備這樣的儀器,而對于普通的開發(fā)者,更多的是希望能有一塊使用比較簡單,并且性價比能夠被開發(fā)者接受的抓包器。
下文將會結(jié)合我自己的工程實例,給大家安利一塊藍(lán)牙抓包器;雖然前期使用的過程中,也遇到各種各樣的坑,慢慢在使用過程中 自己動手優(yōu)化,慢慢打造成適合自己使用的小工具,目前也能滿足自己的開發(fā)需求,所以推薦給大家。
2 工具簡介
本文要介紹的這個工具是:NRF52832模塊 USB Dongle 支持BLE 5.0藍(lán)牙Sniffer抓包協(xié)議分析
這款抓包器的底層使用的是 Nordic 的藍(lán)牙芯片 nRF52832,這款藍(lán)牙芯片可以支持到 BLE5.0 下 1Mbps 速率的報文,同時可向下兼容BLE4.2 。
帶外殼的成品長這樣,價格稍貴一點點:
不帶外殼的成品長這樣,經(jīng)濟(jì)一些(沒錯,我選的就是這個):
當(dāng)然,如果你有二次開發(fā)的能力,這個抓包器還預(yù)留了二次開發(fā)接口,你可以編譯你自己的固件進(jìn)行燒錄使用:
3 使用指南
要想成功使用上它,需要搭建一個環(huán)境,不過還是比較簡單的,基本參考文檔就可以完成的。
3.1 下載相關(guān)資料
Wireshark下載地址: 點這里
Python環(huán)境下載地址: 點這里
taobao下單后直接聯(lián)系售后,他會發(fā)給你一堆資料,如下:
3.2 配置安裝相關(guān)環(huán)境
最重要的就是最后這個PDF指引文檔 《低功耗藍(lán)牙 5.0 Sniffer 抓包工具 RF-DG-32B User Guide 1263534592RF-DG-32B 使用說明_201127.pdf》,參考它基本就可以完成整個環(huán)境的搭建安裝。
3.3 使用步驟
3.4 動手抓一抓現(xiàn)場報文
配合一些手機(jī)端的BLE調(diào)試APP,就可以抓到手機(jī)側(cè)與終端側(cè)交互的報文了,下面來一段實戰(zhàn)操作。
3.4.1 開啟抓包監(jiān)聽
按照上面的步驟,有過wireshark操作經(jīng)驗的開發(fā)者很快就可以上手,注意一定要把這個勾選上:
然后在這里選上你要監(jiān)聽(抓取)BLE終端的MAC地址:
3.4.2 廣播包
如果BLE設(shè)備正常廣播中,那么在數(shù)據(jù)區(qū)就可以看到廣播包、廣播掃描請求包、廣播掃描回應(yīng)包都會被抓取到:
3.4.3 交互數(shù)據(jù)包
一般BLE有五種數(shù)據(jù)交互方式,如下所示:
下面以 notify 的交互報文做演示:
手機(jī)APP發(fā)往BLE終端:
BLE終端回復(fù)手機(jī)APP:
3.4.4 其他報文
還有一些其他類型的BLE報文,這個需要對BLE協(xié)議有些了解才能明白:
4 動手改造
4.1 發(fā)現(xiàn)痛點
在上面的使用步驟中,大家也可以會發(fā)現(xiàn),在決定要抓取 哪個 BLE終端的報文時,需要在wireshark的插件中的 Device 下拉框中選中對應(yīng)設(shè)備的 MAC,而這恰恰就是最難的,也是最頭疼的,最最主要的原因是,它沒有輸入搜索篩選框,只能勾選,而且這些MAC地址還是沒有經(jīng)過排序的,來,感受一下:
怎么樣,眼睛花了嗎?你的MAC地址,找到了嗎?
如果沒有,那重新再找一遍吧!??!
每次使用這個,我吐槽一次,太不任性化了,你搞個 輸入搜索框 會死?????
4.2 改造優(yōu)化
說到改造,我也想直接加個 輸入搜索框 完事,但我一個搞嵌入式的,搞不了這些上層UI啊,無奈,放棄了!
后來,通過觀察和摸索,我發(fā)現(xiàn)整個wireshark的插件在執(zhí)行相關(guān)抓包操作的時候都是調(diào)用到Python方法,在安裝環(huán)境的時候我們有裝Python3,而且把相關(guān)的wireshark擴(kuò)展包放到了指定的擴(kuò)展包目錄,打開一看,里面全是一些腳本和Python文件。
于是,我開始想,既然這個插件找到這些 Device 列表都是通過Python接口返回的,那么我們可不可以,在返回這個Device列表的時候,加些規(guī)則限制,比如 只把我需要的MAC地址的設(shè)備呈現(xiàn)出來 ?
于是開始去分析它的擴(kuò)展包的工程代碼,如下所示:
還真被我找到了一個 設(shè)備添加 相關(guān)的方法,如上圖所示。
里面的設(shè)備信息,跟我們在那個設(shè)備選擇框看到的信息基本一致:設(shè)備名 + 信號強(qiáng)度 + MAC地址 + public/random
順著這條線索,我找到了它的代碼邏輯:
首先是 nrfsnifferble.py 初始化的時候進(jìn)行 DEVICEADDED 消息的訂閱,當(dāng)收到這個消息的時候,執(zhí)行 deviceadded 回調(diào);看處理,應(yīng)該是這個 device_added就會把設(shè)備的相應(yīng)信息內(nèi)容更新到插件的選擇框里面。
然后再跟蹤一下,發(fā)出 DEVICE_ADDED 這個消息是在 Device.py 里面
所以接下來的改造思路就很清晰了,我只需要在append接口里面動手腳攔截就好了。
根據(jù)上下文,可以知道device參數(shù)包含了設(shè)備的MAC地址信息,那么只需要把這個MAC地址信息轉(zhuǎn)換一下,然后跟我要監(jiān)聽的設(shè)備的MAC地址進(jìn)行比較過濾,就能到到我的預(yù)想目的了。
就像這樣,新增一個 check 函數(shù),不符合我要求的設(shè)備,我就直接返回退出:
-
def append(self, device):
-
address = device.address
-
if not self.device_append_check(address):
-
return
-
self.devices.append(device)
-
self.notify("DEVICE_ADDED", device)
為了保證我再抓取其他BLE設(shè)備的時候(別的MAC地址),不需要再次改python代碼,那么我需要其他的地方配置一下我需要監(jiān)聽的MAC地址,于是我想到了在 桌面建立一個文本文件,然后把你要過濾的MAC地址填里面,腳本啟動的時候把這個過濾的MAC地址讀上來,存起來,以備后續(xù)做過濾比較。
于是就有了這個一段代碼:
-
def device_append_check(self, address):
-
global desktop_ble_mac_file
-
if not os.path.exists(desktop_ble_mac_file):
-
return True
-
str_device_address = self.string_address(address)
-
str_device_address = str_device_address[0:17]
-
with open(desktop_ble_mac_file, 'r') as f:
-
mac=f.read().strip().lower()
-
filter_device_address = mac[0:2] + ':' + mac[2:4] + ':' + mac[4:6] + ':'
-
filter_device_address += mac[6:8] + ':' + mac[8:10] + ':' + mac[10:12]
-
#logging.info(str_device_address)
-
#logging.info(filter_device_address)
-
if str_device_address == filter_device_address:
-
logging.info('----append(follow) filter device address(MAC): ' + str_device_address)
-
return True
-
else:
-
return False
MAC文件的內(nèi)容是:DC234E864004 字符串格式。
這么一頓操作之后,抓包插件一起來后,我們?nèi)ピO(shè)備篩選框里面,就只能看到我要的設(shè)備,再也不用增大個眼睛去一個個找了。
真是倍兒爽 ... ...
要想恢復(fù)原來那種 看到所有設(shè)備 的模式,也很簡單,把桌面那個記錄過濾MAC地址的文件刪除即可,無縫銜接。
還有個有趣的事是,在debug的過程中,把這些代碼的log機(jī)制也摸通了,下次有空都可以更精細(xì)地研究他們的實現(xiàn)代碼了,哈哈哈。
4.3 效果展示
最后,我們來體驗一下改造后的效果,簡直不要太清爽:
媽媽再也不用擔(dān)心我的眼睛了 @_@
5 經(jīng)驗總結(jié)
- 藍(lán)牙抓包能了解一些通訊協(xié)議細(xì)節(jié)的地方,有助于排查一些報文通訊問題;
- 工欲善其事,必先利其器,發(fā)現(xiàn)工具的缺點,自己動手優(yōu)化改善,小有成就;
- 該工具借助wireshark的插件完成對報文的解析,對開發(fā)者還是很友好的,使用過wireshark的人基本就能夠無障礙使用它;
- 改造工具的同時,增強(qiáng)了自己摸索未知技術(shù)領(lǐng)域的能力和技巧,也順帶學(xué)習(xí)了一些基礎(chǔ)的python知識;后面學(xué)以致用;
- 科技(工具)的進(jìn)步,源于有人想要 偷懶;
- 抓包器購買鏈接:非廣告,感興趣的可以一看;
- 改造后的完整python腳本,有興趣的可以聯(lián)系我獲取。
6 更多分享
架構(gòu)師李肯
架構(gòu)師李肯(全網(wǎng)同名),一個專注于嵌入式IoT領(lǐng)域的架構(gòu)師。有著近10年的嵌入式一線開發(fā)經(jīng)驗,深耕IoT領(lǐng)域多年,熟知IoT領(lǐng)域的業(yè)務(wù)發(fā)展,深度掌握IoT領(lǐng)域的相關(guān)技術(shù)棧,包括但不限于主流RTOS內(nèi)核的實現(xiàn)及其移植、硬件驅(qū)動移植開發(fā)、網(wǎng)絡(luò)通訊協(xié)議開發(fā)、編譯構(gòu)建原理及其實現(xiàn)、底層匯編及編譯原理、編譯優(yōu)化及代碼重構(gòu)、主流IoT云平臺的對接、嵌入式IoT系統(tǒng)的架構(gòu)設(shè)計等等。擁有多項IoT領(lǐng)域的發(fā)明專利,熱衷于技術(shù)分享,有多年撰寫技術(shù)博客的經(jīng)驗積累,連續(xù)多月獲得RT-Thread官方技術(shù)社區(qū)原創(chuàng)技術(shù)博文優(yōu)秀獎,榮獲CSDN博客專家、CSDN物聯(lián)網(wǎng)領(lǐng)域優(yōu)質(zhì)創(chuàng)作者、2021年度CSDN&RT-Thread技術(shù)社區(qū)之星、2022年RT-Thread全球技術(shù)大會講師、RT-Thread官方嵌入式開源社區(qū)認(rèn)證專家、RT-Thread 2021年度論壇之星TOP4、華為云云享專家(嵌入式物聯(lián)網(wǎng)架構(gòu)設(shè)計師)等榮譽(yù)。堅信【知識改變命運(yùn),技術(shù)改變世界】!
歡迎關(guān)注我的gitee倉庫01workstation ,日常分享一些開發(fā)筆記和項目實戰(zhàn),歡迎指正問題。
同時也非常歡迎關(guān)注我的CSDN主頁和專欄:
【CSDN主頁-架構(gòu)師李肯】
【RT-Thread主頁-架構(gòu)師李肯】
【GCC專欄】
【信息安全專欄】
【RT-Thread開發(fā)筆記】
【freeRTOS開發(fā)筆記】
有問題的話,可以跟我討論,知無不答,謝謝大家。
審核編輯:湯梓紅
-
藍(lán)牙
+關(guān)注
關(guān)注
114文章
5823瀏覽量
170353 -
BLE
+關(guān)注
關(guān)注
12文章
660瀏覽量
59413 -
RT-Thread
+關(guān)注
關(guān)注
31文章
1289瀏覽量
40140
發(fā)布評論請先 登錄
相關(guān)推薦
評論