敞开生长之旅!这是我参加「日新计划 2 月更文应战」的第 1 天,点击查看活动概况

作者简介

架构师李肯(全网同名) ,一个专心于嵌入式IoT范畴的架构师。有着近10年的嵌入式一线开发经历,深耕IoT范畴多年,熟知IoT范畴的事务开展,深度把握IoT范畴的相关技能栈,包括但不限于干流RTOS内核的完成及其移植、硬件驱动移植开发、网络通讯协议开发、编译构建原理及其完成、底层汇编及编译原理、编译优化及代码重构、干流IoT云渠道的对接、嵌入式IoT系统的架构设计等等。具有多项IoT范畴的发明专利,热衷于技能分享,有多年编撰技能博客的经历堆集,接连多月获得RT-Thread官方技能社区原创技能博文优秀奖,荣获CSDN博客专家、CSDN物联网范畴优质创作者、2022年度RT-Thread社区官方布道者、2021年度CSDN&RT-Thread技能社区之星、2022年RT-Thread全球技能大会讲师、RT-Thread官方嵌入式开源社区认证专家、RT-Thread 2021年度论坛之星TOP4、华为如此享专家(嵌入式物联网架构设计师)等荣誉。坚信【常识改变命运,技能改变国际】!


【BLE蓝牙学习开发笔记】安利一款简略好用且高性价比的BLE蓝牙抓包器

作为根据蓝牙协议的开发者,少不了各种需求抓包剖析蓝牙报文的应用场景;而专业的蓝牙抓包器十分贵重,可能会让初学者望而生畏。本文结合实际的工程场景,安利一款简略好用且高性价比的蓝牙抓包器,根本能够满意日常的抓包剖析,期望对咱们有所帮助。


【BLE蓝牙学习开发笔记】安利一款简单好用且高性价比的BLE蓝牙抓包器


1 写在前面

作为一个根据蓝牙协议的开发者,少不了各种需求抓包剖析蓝牙报文的应用场景;这就比如剖析电路少不了万用表,剖析串行通讯协议少不了示波器/逻辑剖析仪,剖析网络通讯少不了网络抓包。

作为BLE蓝牙的入门级开发者,前期对蓝牙的很多特性都不能很好的把握,所以能多抓抓实际的通讯报文来剖析剖析,必定能够加速对蓝牙通讯协议的了解。

无法,市面上真实专业级其他蓝牙抓包器仍是比较贵重的,一般只有蓝牙芯片开发公司或者相关的实验室会配备这样的仪器,而关于普通的开发者,更多的是期望能有一块运用比较简略,并且性价比能够被开发者接受的抓包器。

下文将会结合我自己的工程实例,给咱们安利一块蓝牙抓包器;虽然前期运用的过程中,也遇到各种各样的坑,慢慢在运用过程中 自己着手优化,慢慢打造成合适自己运用的小东西,目前也能满意自己的开发需求,所以推荐给咱们。

2 东西简介

本文要介绍的这个东西是:NRF52832模块 USB Dongle 支撑BLE 5.0蓝牙Sniffer抓包协议剖析

【BLE蓝牙学习开发笔记】安利一款简单好用且高性价比的BLE蓝牙抓包器

这款抓包器的底层运用的是 Nordic 的蓝牙芯片 nRF52832,这款蓝牙芯片能够支撑到 BLE5.01Mbps 速率的报文,同时可向下兼容BLE4.2

带外壳的制品长这样,价格稍贵一点点:

【BLE蓝牙学习开发笔记】安利一款简单好用且高性价比的BLE蓝牙抓包器

不带外壳的制品长这样,经济一些(没错,我选的便是这个):

【BLE蓝牙学习开发笔记】安利一款简单好用且高性价比的BLE蓝牙抓包器

当然,假如你有二次开发的能力,这个抓包器还预留了二次开发接口,你能够编译你自己的固件进行烧录运用:

【BLE蓝牙学习开发笔记】安利一款简单好用且高性价比的BLE蓝牙抓包器

3 运用指南

要想成功运用上它,需求建立一个环境,不过仍是比较简略的,根本参阅文档就能够完成的。

3.1 下载相关材料

Wireshark下载地址: 点这里

Python环境下载地址: 点这里

taobao下单后直接联络售后,他会发给你一堆材料,如下:

【BLE蓝牙学习开发笔记】安利一款简单好用且高性价比的BLE蓝牙抓包器

3.2 配置装置相关环境

【BLE蓝牙学习开发笔记】安利一款简单好用且高性价比的BLE蓝牙抓包器

最重要的便是最后这个PDF指引文档 《低功耗蓝牙 5.0 Sniffer 抓包东西 RF-DG-32B User Guide 1263534592RF-DG-32B 运用说明_201127.pdf》,参阅它根本就能够完成整个环境的建立装置。

3.3 运用过程

【BLE蓝牙学习开发笔记】安利一款简单好用且高性价比的BLE蓝牙抓包器

image-20220630132512015

【BLE蓝牙学习开发笔记】安利一款简单好用且高性价比的BLE蓝牙抓包器

【BLE蓝牙学习开发笔记】安利一款简单好用且高性价比的BLE蓝牙抓包器

【BLE蓝牙学习开发笔记】安利一款简单好用且高性价比的BLE蓝牙抓包器

【BLE蓝牙学习开发笔记】安利一款简单好用且高性价比的BLE蓝牙抓包器

【BLE蓝牙学习开发笔记】安利一款简单好用且高性价比的BLE蓝牙抓包器

3.4 着手抓一抓现场报文

合作一些手机端的BLE调试APP,就能够抓到手机侧与终端侧交互的报文了,下面来一段实战操作。

3.4.1 敞开抓包监听

依照上面的过程,有过wireshark操作经历的开发者很快就能够上手,注意必定要把这个勾选上:

【BLE蓝牙学习开发笔记】安利一款简单好用且高性价比的BLE蓝牙抓包器

然后在这里选上你要监听(抓取)BLE终端的MAC地址:

【BLE蓝牙学习开发笔记】安利一款简单好用且高性价比的BLE蓝牙抓包器

3.4.2 播送包

假如BLE设备正常播送中,那么在数据区就能够看到播送包、播送扫描恳求包、播送扫描回应包都会被抓取到:

【BLE蓝牙学习开发笔记】安利一款简单好用且高性价比的BLE蓝牙抓包器

【BLE蓝牙学习开发笔记】安利一款简单好用且高性价比的BLE蓝牙抓包器

【BLE蓝牙学习开发笔记】安利一款简单好用且高性价比的BLE蓝牙抓包器

3.4.3 交互数据包

一般BLE有五种数据交互方式,如下所示:

【BLE蓝牙学习开发笔记】安利一款简单好用且高性价比的BLE蓝牙抓包器

下面以 notify 的交互报文做演示:

手机APP发往BLE终端

【BLE蓝牙学习开发笔记】安利一款简单好用且高性价比的BLE蓝牙抓包器

BLE终端回复手机APP

【BLE蓝牙学习开发笔记】安利一款简单好用且高性价比的BLE蓝牙抓包器

3.4.4 其他报文

还有一些其他类型的BLE报文,这个需求对BLE协议有些了解才能理解:

【BLE蓝牙学习开发笔记】安利一款简单好用且高性价比的BLE蓝牙抓包器

【BLE蓝牙学习开发笔记】安利一款简单好用且高性价比的BLE蓝牙抓包器

【BLE蓝牙学习开发笔记】安利一款简单好用且高性价比的BLE蓝牙抓包器

【BLE蓝牙学习开发笔记】安利一款简单好用且高性价比的BLE蓝牙抓包器

【BLE蓝牙学习开发笔记】安利一款简单好用且高性价比的BLE蓝牙抓包器

4 着手改造

4.1 发现痛点

在上面的运用过程中,咱们也能够会发现,在决定要抓取 哪个 BLE终端的报文时,需求在wireshark的插件中的 Device 下拉框中选中对应设备的 MAC,而这恰恰便是最难的,也是最头疼的,最最主要的原因是,它没有输入查找筛选框,只能勾选,并且这些MAC地址仍是没有经过排序的,来,感受一下:

【BLE蓝牙学习开发笔记】安利一款简单好用且高性价比的BLE蓝牙抓包器

怎么样,眼睛花了吗你的MAC地址,找到了吗

假如没有,那重新再找一遍吧!!!

每次运用这个,我吐槽一次,太不任性化了,你搞个 输入查找框 会死啊???

4.2 改造优化

提到改造,我也想直接加个 输入查找框 完事,但我一个搞嵌入式的,搞不了这些上层UI啊,无法,抛弃了!

后来,经过观察和探索,我发现整个wireshark的插件在执行相关抓包操作的时分都是调用到Python办法,在装置环境的时分咱们有装Python3,并且把相关的wireshark扩展包放到了指定的扩展包目录,翻开一看,里边全是一些脚本和Python文件。

所以,我开始想,既然这个插件找到这些 Device 列表都是经过Python接口回来的,那么咱们可不能够,在回来这个Device列表的时分,加些规矩约束,比如 只把我需求的MAC地址的设备呈现出来

所以开始去剖析它的扩展包的工程代码,如下所示:

【BLE蓝牙学习开发笔记】安利一款简单好用且高性价比的BLE蓝牙抓包器

还真被我找到了一个 设备增加 相关的办法,如上图所示。

里边的设备信息,跟咱们在那个设备挑选框看到的信息根本一致:设备名 + 信号强度 + MAC地址 + public/random

【BLE蓝牙学习开发笔记】安利一款简单好用且高性价比的BLE蓝牙抓包器

顺着这条线索,我找到了它的代码逻辑:

首先是 nrf_sniffer_ble.py 初始化的时分进行 DEVICE_ADDED 音讯的订阅,当收到这个音讯的时分,执行 device_added 回调;看处理,应该是这个 device_added就会把设备的相应信息内容更新到插件的挑选框里边。

【BLE蓝牙学习开发笔记】安利一款简单好用且高性价比的BLE蓝牙抓包器

然后再跟踪一下,发出 DEVICE_ADDED 这个音讯是在 Device.py 里边

【BLE蓝牙学习开发笔记】安利一款简单好用且高性价比的BLE蓝牙抓包器

所以接下来的改造思路就很明晰了,我只需求在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 作用展现

最后,咱们来体会一下改造后的作用,几乎不要太清新:

【BLE蓝牙学习开发笔记】安利一款简单好用且高性价比的BLE蓝牙抓包器

妈妈再也不必担心我的眼睛了 @_@

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主页-架构师李肯】

【C/C++语言编程专栏】

【GCC专栏】

【信息安全专栏】

【RT-Thread开发笔记】

【freeRTOS开发笔记】

有问题的话,能够跟我讨论,知无不答,谢谢咱们。