Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
蓝牙BLE
蓝牙
【BLE蓝牙学习开发笔记】安利一款简单好用且高性价比的BLE蓝牙抓包器
发布于 2022-06-30 23:10:45 浏览:2564
订阅该版
[tocm] 【BLE蓝牙学习开发笔记】安利一款简单好用且高性价比的BLE蓝牙抓包器 ---- ![image-20220630154949814](https://s2.loli.net/2022/06/30/HDuESUKoAh8dTCJ.png) ---- # 1 写在前面 作为一个基于蓝牙协议的开发者,少不了各种需要抓包分析蓝牙报文的应用场景;这就好比分析电路少不了万用表,分析串行通讯协议少不了示波器/逻辑分析仪,分析网络通讯少不了网络抓包。 作为BLE蓝牙的入门级开发者,前期对蓝牙的很多特性都不能很好的把握,所以能多抓抓实际的通讯报文来分析分析,一定能够加快对蓝牙通讯协议的理解。 无奈,市面上真正专业级别的蓝牙抓包器还是比较昂贵的,一般只有蓝牙芯片开发公司或者相关的实验室会配备这样的仪器,而对于普通的开发者,更多的是希望能有一块使用比较简单,并且性价比能够被开发者接受的抓包器。 下文将会结合我自己的工程实例,给大家安利一块蓝牙抓包器;虽然前期使用的过程中,也遇到各种各样的坑,慢慢在使用过程中 **自己动手优化**,慢慢打造成适合自己使用的小工具,目前也能满足自己的开发需求,所以推荐给大家。 # 2 工具简介 本文要介绍的这个工具是:**NRF52832模块 USB Dongle 支持BLE 5.0蓝牙Sniffer抓包协议分析** ![image-20220629181513676](https://s2.loli.net/2022/06/29/zWdfGoJeUcBVlhO.png) 这款抓包器的底层使用的是 Nordic 的蓝牙芯片 [nRF52832](https://www.nordicsemi.com/Products/nRF52832),这款蓝牙芯片可以支持到 **BLE5.0** 下 **1Mbps** 速率的报文,同时可向下兼容**BLE4.2** 。 带外壳的成品长这样,价格稍贵一点点: ![image-20220630131314034](https://s2.loli.net/2022/06/30/ebvOCA79HW16ltm.png) 不带外壳的成品长这样,经济一些(**没错,我选的就是这个**): ![image-20220630131354417](https://s2.loli.net/2022/06/30/uMUzy1r3Y6iCZ7Q.png) 当然,如果你有二次开发的能力,这个抓包器还预留了二次开发接口,你可以编译你自己的固件进行烧录使用: ![image-20220630131153618](https://s2.loli.net/2022/06/30/45BpiYaqObkRdKe.png) # 3 使用指南 要想成功使用上它,需要搭建一个环境,不过还是比较简单的,基本参考文档就可以完成的。 ## 3.1 下载相关资料 Wireshark下载地址: [点这里](https://www.wireshark.org/#download Wireshark) Python环境下载地址: [点这里](https://www.python.org/downloads/release/python-378/) taobao下单后直接联系售后,他会发给你一堆资料,如下: ![image-20220630132014661](https://s2.loli.net/2022/06/30/ZYfu1F9hB2OrWIl.png) ## 3.2 配置安装相关环境 ![image-20220630131724543](https://s2.loli.net/2022/06/30/2oHplGF8WeVvb4w.png) 最重要的就是最后这个PDF指引文档 《低功耗蓝牙 5.0 Sniffer 抓包工具 RF-DG-32B User Guide 1263534592RF-DG-32B 使用说明_201127.pdf》,参考它基本就可以完成整个环境的搭建安装。 ## 3.3 使用步骤 ![image-20220630132453385](https://s2.loli.net/2022/06/30/wTQ5vAzWYyEsmVR.png) ![image-20220630132512015](https://s2.loli.net/2022/06/30/ErWL6UVRneskMKu.png) ![image-20220630132621191](https://s2.loli.net/2022/06/30/pWGf2wB4VMcKrPn.png) ![image-20220630132656854](https://s2.loli.net/2022/06/30/raHq3G6R19BV2nw.png) ![image-20220630132714081](https://s2.loli.net/2022/06/30/eRKv2CjYiLztgbP.png) ![image-20220630132736095](https://s2.loli.net/2022/06/30/UE78A6b3n2Ys4Dj.png) ![image-20220630132759740](https://s2.loli.net/2022/06/30/zEFnxq72tZbwlfs.png) ## 3.4 动手抓一抓现场报文 配合一些手机端的BLE调试APP,就可以抓到手机侧与终端侧交互的报文了,下面来一段实战操作。 ### 3.4.1 开启抓包监听 按照上面的步骤,有过wireshark操作经验的开发者很快就可以上手,注意一定要把这个勾选上: ![image-20220630134055548](https://s2.loli.net/2022/06/30/yGEqUczuOw7RklY.png) 然后在这里选上你要监听(抓取)BLE终端的MAC地址: ![image-20220630134156107](https://s2.loli.net/2022/06/30/YwHSRTMmcPi6kyz.png) ### 3.4.2 广播包 如果BLE设备正常广播中,那么在数据区就可以看到广播包、广播扫描请求包、广播扫描回应包都会被抓取到: ![image-20220630134508066](https://s2.loli.net/2022/06/30/jirRZnMcFSe72Os.png) ![image-20220630134618939](https://s2.loli.net/2022/06/30/RMVKnXJFCATmYUc.png) ![image-20220630134730630](https://s2.loli.net/2022/06/30/GdK6FicZhyak8Vl.png) ### 3.4.3 交互数据包 一般BLE有五种数据交互方式,如下所示: ![image-20220630140152707](https://s2.loli.net/2022/06/30/nl6oR43PZqEzOmF.png) 下面以 **notify** 的交互报文做演示: **手机APP发往BLE终端**: ![image-20220630140648041](https://s2.loli.net/2022/06/30/lOY7TVdc54AJsLa.png) **BLE终端回复手机APP**: ![image-20220630140817151](https://s2.loli.net/2022/06/30/l1IjtPnSaWMXFmc.png) ### 3.4.4 其他报文 还有一些其他类型的BLE报文,这个需要对BLE协议有些了解才能明白: ![image-20220630135353473](https://s2.loli.net/2022/06/30/tjhWiPs7TceHAMF.png) ![image-20220630135241430](https://s2.loli.net/2022/06/30/AVn5wgjSpEHqJDu.png) ![image-20220630135224343](https://s2.loli.net/2022/06/30/qtc4PjE1msyaTQK.png) ![image-20220630140541704](https://s2.loli.net/2022/06/30/CRolic3pIgAqw8F.png) ![image-20220630140931190](https://s2.loli.net/2022/06/30/KMSrDTFe7OIz3Hs.png) # 4 动手改造 ## 4.1 发现痛点 在上面的使用步骤中,大家也可以会发现,在决定要抓取 **哪个** BLE终端的报文时,需要在wireshark的插件中的 **Device** 下拉框中选中对应设备的 **MAC**,而这恰恰就是最难的,也是最头疼的,最最主要的原因是,它没有输入搜索筛选框,只能勾选,而且这些MAC地址还是没有经过排序的,来,感受一下: ![find-mac](https://s2.loli.net/2022/06/30/2C1GVExN6FlPWSe.gif) 怎么样,**眼睛花了吗**?**你的MAC地址,找到了吗**? 如果没有,那重新再找一遍吧!!! 每次使用这个,我吐槽一次,太不任性化了,你搞个 **输入搜索框** 会死啊??? ## 4.2 改造优化 说到改造,我也想直接加个 **输入搜索框** 完事,但我一个搞嵌入式的,搞不了这些上层UI啊,无奈,放弃了! 后来,通过观察和摸索,我发现整个wireshark的插件在执行相关抓包操作的时候都是调用到Python方法,在安装环境的时候我们有装Python3,而且把相关的wireshark扩展包放到了指定的扩展包目录,打开一看,里面全是一些脚本和Python文件。 于是,我开始想,既然这个插件找到这些 **Device** 列表都是通过Python接口返回的,那么我们可不可以,在返回这个Device列表的时候,加些规则限制,比如 **只把我需要的MAC地址的设备呈现出来** ? 于是开始去分析它的扩展包的工程代码,如下所示: ![image-20220630150526288](https://s2.loli.net/2022/06/30/x7qzyCT3pDn4ZLS.png) 还真被我找到了一个 **设备添加** 相关的方法,如上图所示。 里面的设备信息,跟我们在那个设备选择框看到的信息基本一致:**设备名 + 信号强度 + MAC地址 + public/random** ![image-20220630150708304](https://s2.loli.net/2022/06/30/PW3vz8Rr1BitYag.png) 顺着这条线索,我找到了它的代码逻辑: 首先是 nrf_sniffer_ble.py 初始化的时候进行 **DEVICE_ADDED** 消息的订阅,当收到这个消息的时候,执行 **device_added** 回调;看处理,应该是这个 device_added就会把设备的相应信息内容更新到插件的选择框里面。 ![image-20220630151603091](https://s2.loli.net/2022/06/30/RoNGhxmJL7fgyjZ.png) 然后再跟踪一下,发出 **DEVICE_ADDED** 这个消息是在 **Device.py** 里面 ![image-20220630151514449](https://s2.loli.net/2022/06/30/xNSYJTCOEp7Zieh.png) 所以接下来的改造思路就很清晰了,我只需要在append接口里面动手脚拦截就好了。 根据上下文,可以知道device参数包含了设备的MAC地址信息,那么只需要把这个MAC地址信息转换一下,然后跟我要监听的设备的MAC地址进行比较过滤,就能到到我的预想目的了。 就像这样,新增一个 check 函数,不符合我要求的设备,我就直接返回退出: ```py 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地址读上来,存起来,以备后续做过滤比较。 于是就有了这个一段代码: ```py 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://s2.loli.net/2022/06/30/Pk5DiRKj8dNXQ2t.gif) 妈妈再也不用担心我的眼睛了 @_@ # 5 经验总结 - 蓝牙抓包能了解一些通讯协议细节的地方,有助于排查一些报文通讯问题; - **工欲善其事,必先利其器**,发现工具的缺点,自己动手优化改善,小有成就; - 该工具借助wireshark的插件完成对报文的解析,对开发者还是很友好的,使用过wireshark的人基本就能够无障碍使用它; - 改造工具的同时,增强了自己摸索未知技术领域的能力和技巧,也顺带学习了一些基础的python知识;后面学以致用; - 科技(工具)的进步,源于有人想要 **偷懒**; - [抓包器购买链接](https://item.taobao.com/item.htm?spm=a1z09.2.0.0.a7fc2e8dmNFLrX&id=583310613571&_u=tiui3p7ae35):**非广告**,感兴趣的可以一看; - 改造后的完整python脚本,有兴趣的可以联系我获取。 # 6 更多分享 > **[架构师李肯](https://recan.blog.csdn.net/?type=blog)** > > **架构师李肯**(**全网同名**),一个专注于嵌入式IoT领域的架构师。有着近10年的嵌入式一线开发经验,深耕IoT领域多年,熟知IoT领域的业务发展,深度掌握IoT领域的相关技术栈,包括但不限于主流RTOS内核的实现及其移植、硬件驱动移植开发、网络通讯协议开发、编译构建原理及其实现、底层汇编及编译原理、编译优化及代码重构、主流IoT云平台的对接、嵌入式IoT系统的架构设计等等。拥有多项IoT领域的发明专利,热衷于技术分享,有多年撰写技术博客的经验积累,连续多月获得RT-Thread官方技术社区原创技术博文优秀奖,荣获[CSDN博客专家](https://recan.blog.csdn.net/?type=blog)、[CSDN物联网领域优质创作者](http://yyds.recan-li.cn)、[2021年度CSDN&RT-Thread技术社区之星](https://blog.csdn.net/szullc/article/details/123860472)、[2022年RT-Thread全球技术大会讲师](https://club.rt-thread.org/ask/article/afa56894c113369a.html)、[RT-Thread官方嵌入式开源社区认证专家](https://club.rt-thread.org/ask/experts.html)、[RT-Thread 2021年度论坛之星TOP4](https://club.rt-thread.org/ask/article/3317.html)、[华为云云享专家(嵌入式物联网架构设计师)](https://bbs.huaweicloud.com/community/usersnew/id_1573655458316259)等荣誉。坚信【知识改变命运,技术改变世界】! > --- 欢迎关注我的[gitee仓库01workstation](https://gitee.com/recan-li/coding-01workstation) ,日常分享一些开发笔记和项目实战,欢迎指正问题。 同时也非常欢迎关注我的CSDN主页和专栏: [【CSDN主页-架构师李肯】](http://yyds.recan-li.cn) [【RT-Thread主页-架构师李肯】](https://club.rt-thread.org/u/18001) [【C/C++语言编程专栏】](https://blog.csdn.net/szullc/category_8450784.html) [【GCC专栏】](https://blog.csdn.net/szullc/category_8626555.html) [【信息安全专栏】](https://blog.csdn.net/szullc/category_8452787.html) [【RT-Thread开发笔记】](https://blog.csdn.net/szullc/category_11461616.html) [【freeRTOS开发笔记】](https://blog.csdn.net/szullc/category_11467856.html) 有问题的话,可以跟我讨论,知无不答,谢谢大家。
9
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
李肯陪你玩赚嵌入式
2022年度和2023年度RT-Thread社区优秀开源布道师,COC深圳城市开发者社区主理人,专注于嵌入式物联网的架构设计
文章
47
回答
504
被采纳
82
关注TA
发私信
相关文章
1
rt-thread配合最好的蓝牙单芯片
2
实现基于RT-Thread Nano的蓝牙三模键盘的三个小白问题
3
ymodem运行一段就停止
4
APT-Pi的factory中的蓝牙名称“APT-Pi”修改
5
有基于RT-Thread 和 AB32VG1 的蓝牙示例吗?
6
蓝牙串口无法作为msh终端的输出
7
蓝牙sdk,与art-pi的板子来回数据;类似项目使用protobuf来传输数据,求助其他方式
8
无法导入蓝牙模块bluetooth
9
导入蓝牙提示无法解析,什么原因
10
rtthread小程序“WIFI配网助手”进行蓝牙连接失败
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
at_device
ulog
C++_cpp
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
a1012112796
13
个答案
2
次被采纳
张世争
9
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
用户名由3_15位
11
个答案
1
次被采纳
本月文章贡献
程序员阿伟
7
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
3
次点赞
ThinkCode
1
篇文章
1
次点赞
Betrayer
1
篇文章
1
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部