作為基于藍牙協議的開發者,少不了各種需要抓包分析藍牙報文的應用場景;而專業的藍牙抓包器非常昂貴,可能會讓初學者望而卻步。本文結合實際的工程場景,安利一款簡單好用且高性價比的藍牙抓包器,基本可以滿足日常的抓包分析,希望對大家有所幫助。
1 寫在前面
作為一個基于藍牙協議的開發者,少不了各種需要抓包分析藍牙報文的應用場景;這就好比分析電路少不了萬用表,分析串行通訊協議少不了示波器/邏輯分析儀,分析網絡通訊少不了網絡抓包。
作為BLE藍牙的入門級開發者,前期對藍牙的很多特性都不能很好的把握,所以能多抓抓實際的通訊報文來分析分析,一定能夠加快對藍牙通訊協議的理解。
無奈,市面上真正專業級別的藍牙抓包器還是比較昂貴的,一般只有藍牙芯片開發公司或者相關的實驗室會配備這樣的儀器,而對于普通的開發者,更多的是希望能有一塊使用比較簡單,并且性價比能夠被開發者接受的抓包器。
下文將會結合我自己的工程實例,給大家安利一塊藍牙抓包器;雖然前期使用的過程中,也遇到各種各樣的坑,慢慢在使用過程中 自己動手優化,慢慢打造成適合自己使用的小工具,目前也能滿足自己的開發需求,所以推薦給大家。
2 工具簡介
本文要介紹的這個工具是:NRF52832模塊 USB Dongle 支持BLE 5.0藍牙Sniffer抓包協議分析
![image-20220629181513676](https://file.elecfans.com//web2/M00/58/7E/poYBAGLkqVyAPTKXAAPiDIu1OyA147.png)
這款抓包器的底層使用的是 Nordic 的藍牙芯片 nRF52832,這款藍牙芯片可以支持到 BLE5.0 下 1Mbps 速率的報文,同時可向下兼容BLE4.2 。
帶外殼的成品長這樣,價格稍貴一點點:
![image-20220630131314034](https://file.elecfans.com//web2/M00/59/1C/pYYBAGLkqV6AcihQAAKOyuzIViI636.png)
不帶外殼的成品長這樣,經濟一些(沒錯,我選的就是這個):
![image-20220630131354417](https://file.elecfans.com//web2/M00/58/7E/poYBAGLkqWGAKuNhAAbRPIIl2Mw598.png)
當然,如果你有二次開發的能力,這個抓包器還預留了二次開發接口,你可以編譯你自己的固件進行燒錄使用:
![image-20220630131153618](https://file.elecfans.com//web2/M00/59/1C/pYYBAGLkqWKANOCGAAHGMwZSyU8489.png)
3 使用指南
要想成功使用上它,需要搭建一個環境,不過還是比較簡單的,基本參考文檔就可以完成的。
3.1 下載相關資料
Wireshark下載地址: 點這里
Python環境下載地址: 點這里
taobao下單后直接聯系售后,他會發給你一堆資料,如下:
![image-20220630132014661](https://file.elecfans.com//web2/M00/58/7E/poYBAGLkqWOAByZ-AABaDRmsi-M448.png)
3.2 配置安裝相關環境
![image-20220630131724543](https://file.elecfans.com//web2/M00/59/1C/pYYBAGLkqWWAbReoAAaUsXLoI2Y174.png)
最重要的就是最后這個PDF指引文檔 《低功耗藍牙 5.0 Sniffer 抓包工具 RF-DG-32B User Guide 1263534592RF-DG-32B 使用說明_201127.pdf》,參考它基本就可以完成整個環境的搭建安裝。
3.3 使用步驟
![image-20220630132453385](https://file.elecfans.com//web2/M00/58/7E/poYBAGLkqWmACLpoAAOt0bu1Cag890.png)
![image-20220630132512015](https://file.elecfans.com//web2/M00/58/7E/poYBAGLkqWqAT4IpAAZT_yCmZiM166.png)
![image-20220630132621191](https://file.elecfans.com//web2/M00/59/1C/pYYBAGLkqWyAIv5AAAWr_1Jz9-4920.png)
![image-20220630132656854](https://file.elecfans.com//web2/M00/59/1C/pYYBAGLkqW2AVZx_AAHCoKN5g3U252.png)
![image-20220630132714081](https://file.elecfans.com//web2/M00/58/7E/poYBAGLkqW-AWnIUAAbltH5MuOc300.png)
![image-20220630132736095](https://file.elecfans.com//web2/M00/59/1C/pYYBAGLkqXGALVSGAAdJSLVE_hE979.png)
![image-20220630132759740](https://file.elecfans.com//web2/M00/59/1C/pYYBAGLkqXSAUYnAAAa2sRgKB1c864.png)
3.4 動手抓一抓現場報文
配合一些手機端的BLE調試APP,就可以抓到手機側與終端側交互的報文了,下面來一段實戰操作。
3.4.1 開啟抓包監聽
按照上面的步驟,有過wireshark操作經驗的開發者很快就可以上手,注意一定要把這個勾選上:
![image-20220630134055548](https://file.elecfans.com//web2/M00/58/7E/poYBAGLkqXWAJHDSAADVPAoWG28462.png)
然后在這里選上你要監聽(抓取)BLE終端的MAC地址:
![image-20220630134156107](https://file.elecfans.com//web2/M00/59/1C/pYYBAGLkqXaATk9XAABYGBtjrwY360.png)
3.4.2 廣播包
如果BLE設備正常廣播中,那么在數據區就可以看到廣播包、廣播掃描請求包、廣播掃描回應包都會被抓取到:
![image-20220630134508066](https://file.elecfans.com//web2/M00/58/7E/poYBAGLkqXeAF3ysAAD0rnOeAIY416.png)
![image-20220630134618939](https://file.elecfans.com//web2/M00/59/1C/pYYBAGLkqXqANNpqAAC2r6jdaHA870.png)
![image-20220630134730630](https://file.elecfans.com//web2/M00/59/1C/pYYBAGLkqXuAfvH1AADYCyuPTZk845.png)
3.4.3 交互數據包
一般BLE有五種數據交互方式,如下所示:
![image-20220630140152707](https://file.elecfans.com//web2/M00/58/7E/poYBAGLkqXyAf1WiAADElQB-yCA751.png)
下面以 notify 的交互報文做演示:
手機APP發往BLE終端:
![image-20220630140648041](https://file.elecfans.com//web2/M00/59/1C/pYYBAGLkqX2AL-ihAADNaEngIAc225.png)
BLE終端回復手機APP:
![image-20220630140817151](https://file.elecfans.com//web2/M00/58/7E/poYBAGLkqX6AElzoAAEzT6EgUMI748.png)
3.4.4 其他報文
還有一些其他類型的BLE報文,這個需要對BLE協議有些了解才能明白:
![image-20220630135353473](https://file.elecfans.com//web2/M00/58/7E/poYBAGLkqX-AE4QWAADT341maZA033.png)
![image-20220630135241430](https://file.elecfans.com//web2/M00/59/1C/pYYBAGLkqYGADPSFAACW054yg1A356.png)
![image-20220630135224343](https://file.elecfans.com//web2/M00/58/7E/poYBAGLkqYKAYoGGAAC1MqNFmEA334.png)
![image-20220630140541704](https://file.elecfans.com//web2/M00/59/1C/pYYBAGLkqYSATINaAACLAu2n-40251.png)
![image-20220630140931190](https://file.elecfans.com//web2/M00/58/7E/poYBAGLkqYSAMbp0AABsmPyGxvo824.png)
4 動手改造
4.1 發現痛點
在上面的使用步驟中,大家也可以會發現,在決定要抓取 哪個 BLE終端的報文時,需要在wireshark的插件中的 Device 下拉框中選中對應設備的 MAC,而這恰恰就是最難的,也是最頭疼的,最最主要的原因是,它沒有輸入搜索篩選框,只能勾選,而且這些MAC地址還是沒有經過排序的,來,感受一下:
![find-mac](https://file.elecfans.com//web2/M00/58/7E/poYBAGLkqYmAXzvzABEbwjQ_kDk812.gif)
怎么樣,眼睛花了嗎?你的MAC地址,找到了嗎?
如果沒有,那重新再找一遍吧!!!
每次使用這個,我吐槽一次,太不任性化了,你搞個 輸入搜索框 會死啊???
4.2 改造優化
說到改造,我也想直接加個 輸入搜索框 完事,但我一個搞嵌入式的,搞不了這些上層UI啊,無奈,放棄了!
后來,通過觀察和摸索,我發現整個wireshark的插件在執行相關抓包操作的時候都是調用到Python方法,在安裝環境的時候我們有裝Python3,而且把相關的wireshark擴展包放到了指定的擴展包目錄,打開一看,里面全是一些腳本和Python文件。
于是,我開始想,既然這個插件找到這些 Device 列表都是通過Python接口返回的,那么我們可不可以,在返回這個Device列表的時候,加些規則限制,比如 只把我需要的MAC地址的設備呈現出來 ?
于是開始去分析它的擴展包的工程代碼,如下所示:
![image-20220630150526288](https://file.elecfans.com//web2/M00/59/1C/pYYBAGLkqYuAGqUyAAKtfdO4lBM764.png)
還真被我找到了一個 設備添加 相關的方法,如上圖所示。
里面的設備信息,跟我們在那個設備選擇框看到的信息基本一致:設備名 + 信號強度 + MAC地址 + public/random
![image-20220630150708304](https://file.elecfans.com//web2/M00/58/7E/poYBAGLkqYyAAzZ1AAAbDcfhvlc705.png)
順著這條線索,我找到了它的代碼邏輯:
首先是 nrfsnifferble.py 初始化的時候進行 DEVICEADDED 消息的訂閱,當收到這個消息的時候,執行 deviceadded 回調;看處理,應該是這個 device_added就會把設備的相應信息內容更新到插件的選擇框里面。
![image-20220630151603091](https://file.elecfans.com//web2/M00/59/1C/pYYBAGLkqY2ARcrHAAFLiVCz4PY364.png)
然后再跟蹤一下,發出 DEVICE_ADDED 這個消息是在 Device.py 里面
![image-20220630151514449](https://file.elecfans.com//web2/M00/58/7E/poYBAGLkqY6APPoaAAFXX6r6sLQ287.png)
所以接下來的改造思路就很清晰了,我只需要在append接口里面動手腳攔截就好了。
根據上下文,可以知道device參數包含了設備的MAC地址信息,那么只需要把這個MAC地址信息轉換一下,然后跟我要監聽的設備的MAC地址進行比較過濾,就能到到我的預想目的了。
就像這樣,新增一個 check 函數,不符合我要求的設備,我就直接返回退出:
-
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設備的時候(別的MAC地址),不需要再次改python代碼,那么我需要其他的地方配置一下我需要監聽的MAC地址,于是我想到了在 桌面建立一個文本文件,然后把你要過濾的MAC地址填里面,腳本啟動的時候把這個過濾的MAC地址讀上來,存起來,以備后續做過濾比較。
于是就有了這個一段代碼:
-
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文件的內容是:DC234E864004 字符串格式。
這么一頓操作之后,抓包插件一起來后,我們去設備篩選框里面,就只能看到我要的設備,再也不用增大個眼睛去一個個找了。
真是倍兒爽 ... ...
要想恢復原來那種 看到所有設備 的模式,也很簡單,把桌面那個記錄過濾MAC地址的文件刪除即可,無縫銜接。
還有個有趣的事是,在debug的過程中,把這些代碼的log機制也摸通了,下次有空都可以更精細地研究他們的實現代碼了,哈哈哈。
4.3 效果展示
最后,我們來體驗一下改造后的效果,簡直不要太清爽:
![new-find-mac](https://file.elecfans.com//web2/M00/58/7E/poYBAGLkqZaAHwkWACO0rCVLpXE849.gif)
媽媽再也不用擔心我的眼睛了 @_@
5 經驗總結
- 藍牙抓包能了解一些通訊協議細節的地方,有助于排查一些報文通訊問題;
- 工欲善其事,必先利其器,發現工具的缺點,自己動手優化改善,小有成就;
- 該工具借助wireshark的插件完成對報文的解析,對開發者還是很友好的,使用過wireshark的人基本就能夠無障礙使用它;
- 改造工具的同時,增強了自己摸索未知技術領域的能力和技巧,也順帶學習了一些基礎的python知識;后面學以致用;
- 科技(工具)的進步,源于有人想要 偷懶;
- 抓包器購買鏈接:非廣告,感興趣的可以一看;
- 改造后的完整python腳本,有興趣的可以聯系我獲取。
6 更多分享
架構師李肯
架構師李肯(全網同名),一個專注于嵌入式IoT領域的架構師。有著近10年的嵌入式一線開發經驗,深耕IoT領域多年,熟知IoT領域的業務發展,深度掌握IoT領域的相關技術棧,包括但不限于主流RTOS內核的實現及其移植、硬件驅動移植開發、網絡通訊協議開發、編譯構建原理及其實現、底層匯編及編譯原理、編譯優化及代碼重構、主流IoT云平臺的對接、嵌入式IoT系統的架構設計等等。擁有多項IoT領域的發明專利,熱衷于技術分享,有多年撰寫技術博客的經驗積累,連續多月獲得RT-Thread官方技術社區原創技術博文優秀獎,榮獲CSDN博客專家、CSDN物聯網領域優質創作者、2021年度CSDN&RT-Thread技術社區之星、2022年RT-Thread全球技術大會講師、RT-Thread官方嵌入式開源社區認證專家、RT-Thread 2021年度論壇之星TOP4、華為云云享專家(嵌入式物聯網架構設計師)等榮譽。堅信【知識改變命運,技術改變世界】!
歡迎關注我的gitee倉庫01workstation ,日常分享一些開發筆記和項目實戰,歡迎指正問題。
同時也非常歡迎關注我的CSDN主頁和專欄:
【CSDN主頁-架構師李肯】
【RT-Thread主頁-架構師李肯】
【GCC專欄】
【信息安全專欄】
【RT-Thread開發筆記】
【freeRTOS開發筆記】
有問題的話,可以跟我討論,知無不答,謝謝大家。
審核編輯:湯梓紅
-
藍牙
+關注
關注
114文章
5872瀏覽量
171248 -
BLE
+關注
關注
12文章
670瀏覽量
59603 -
RT-Thread
+關注
關注
31文章
1305瀏覽量
40402
發布評論請先 登錄
相關推薦
STM32WB55在RT-Thread系統上移植官方藍牙BLE功能
![STM32WB55在<b class='flag-5'>RT-Thread</b>系統上移植官方<b class='flag-5'>藍牙</b><b class='flag-5'>BLE</b>功能](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
RT-Thread 應用筆記 - RTC Alarm 組件的使用
![<b class='flag-5'>RT-Thread</b> 應用<b class='flag-5'>筆記</b> - RTC Alarm 組件的使用](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
RT-Thread 內核學習筆記 - 理解defunct僵尸線程
![<b class='flag-5'>RT-Thread</b> 內核<b class='flag-5'>學習</b><b class='flag-5'>筆記</b> - 理解defunct僵尸線程](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
RT-Thread 內核學習筆記 - 設備模型rt_device的理解
![<b class='flag-5'>RT-Thread</b> 內核<b class='flag-5'>學習</b><b class='flag-5'>筆記</b> - 設備模型<b class='flag-5'>rt</b>_device的理解](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
RT-Thread 內核學習筆記 - 內核對象鏈表結構深入理解
![<b class='flag-5'>RT-Thread</b> 內核<b class='flag-5'>學習</b><b class='flag-5'>筆記</b> - 內核對象鏈表結構深入理解](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
RT-Thread 內核學習筆記 - 內核對象初始化鏈表組織方式
![<b class='flag-5'>RT-Thread</b> 內核<b class='flag-5'>學習</b><b class='flag-5'>筆記</b> - 內核對象初始化鏈表組織方式](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
RT-Thread學習筆記 RT-Thread的架構概述
![<b class='flag-5'>RT-Thread</b><b class='flag-5'>學習</b><b class='flag-5'>筆記</b> <b class='flag-5'>RT-Thread</b>的架構概述](https://file.elecfans.com/web2/M00/52/31/pYYBAGLKk5WAA__jAADjdAdXhIs410.jpg)
評論