0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

【RT-Thread学习笔记】好用高性价比的BLE蓝牙抓包器

嵌入式物联网开发 来源:嵌入式物联网开发 作者:嵌入式物联网开发 2022-07-30 11:45 次阅读

作为基于蓝牙协议的开发者,少不了各种需要抓包分析蓝牙报文的应用场景;而专业的蓝牙抓包器非常昂贵,可能会让初学者望而却步。本文结合实际的工程场景,安利一款简单好用且高性价比的蓝牙抓包器,基本可以满足日常的抓包分析,希望对大家有所帮助。

1 写在前面

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

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

无奈,市面上真正专业级别的蓝牙抓包器还是比较昂贵的,一般只有蓝牙芯片开发公司或者相关的实验室会配备这样的仪器,而对于普通的开发者,更多的是希望能有一块使用比较简单,并且性价比能够被开发者接受的抓包器。

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

2 工具简介

本文要介绍的这个工具是:NRF52832模块 USB Dongle 支持BLE 5.0蓝牙Sniffer抓包协议分析

image-20220629181513676

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

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

image-20220630131314034

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

image-20220630131354417

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

image-20220630131153618

3 使用指南

要想成功使用上它,需要搭建一个环境,不过还是比较简单的,基本参考文档就可以完成的。

3.1 下载相关资料

Wireshark下载地址: 点这里

Python环境下载地址: 点这里

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

image-20220630132014661

3.2 配置安装相关环境

image-20220630131724543

最重要的就是最后这个PDF指引文档 《低功耗蓝牙 5.0 Sniffer 抓包工具 RF-DG-32B User Guide 1263534592RF-DG-32B 使用说明_201127.pdf》,参考它基本就可以完成整个环境的搭建安装。

3.3 使用步骤

image-20220630132453385image-20220630132512015image-20220630132621191image-20220630132656854image-20220630132714081image-20220630132736095image-20220630132759740

3.4 动手抓一抓现场报文

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

3.4.1 开启抓包监听

按照上面的步骤,有过wireshark操作经验的开发者很快就可以上手,注意一定要把这个勾选上:

image-20220630134055548

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

image-20220630134156107

3.4.2 广播包

如果BLE设备正常广播中,那么在数据区就可以看到广播包、广播扫描请求包、广播扫描回应包都会被抓取到:

image-20220630134508066image-20220630134618939image-20220630134730630

3.4.3 交互数据包

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

image-20220630140152707

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

手机APP发往BLE终端

image-20220630140648041

BLE终端回复手机APP

image-20220630140817151

3.4.4 其他报文

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

image-20220630135353473image-20220630135241430image-20220630135224343image-20220630140541704image-20220630140931190

4 动手改造

4.1 发现痛点

在上面的使用步骤中,大家也可以会发现,在决定要抓取 哪个 BLE终端的报文时,需要在wireshark的插件中的 Device 下拉框中选中对应设备的 MAC,而这恰恰就是最难的,也是最头疼的,最最主要的原因是,它没有输入搜索筛选框,只能勾选,而且这些MAC地址还是没有经过排序的,来,感受一下:

find-mac

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

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

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

4.2 改造优化

说到改造,我也想直接加个 输入搜索框 完事,但我一个搞嵌入式的,搞不了这些上层UI啊,无奈,放弃了!

后来,通过观察和摸索,我发现整个wireshark的插件在执行相关抓包操作的时候都是调用到Python方法,在安装环境的时候我们有装Python3,而且把相关的wireshark扩展包放到了指定的扩展包目录,打开一看,里面全是一些脚本和Python文件。

于是,我开始想,既然这个插件找到这些 Device 列表都是通过Python接口返回的,那么我们可不可以,在返回这个Device列表的时候,加些规则限制,比如 只把我需要的MAC地址的设备呈现出来

于是开始去分析它的扩展包的工程代码,如下所示:

image-20220630150526288

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

里面的设备信息,跟我们在那个设备选择框看到的信息基本一致:设备名 + 信号强度 + MAC地址 + public/random

image-20220630150708304

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

首先是 nrfsnifferble.py 初始化的时候进行 DEVICEADDED 消息的订阅,当收到这个消息的时候,执行 deviceadded 回调;看处理,应该是这个 device_added就会把设备的相应信息内容更新到插件的选择框里面。

image-20220630151603091

然后再跟踪一下,发出 DEVICE_ADDED 这个消息是在 Device.py 里面

image-20220630151514449

所以接下来的改造思路就很清晰了,我只需要在append接口里面动手脚拦截就好了。

根据上下文,可以知道device参数包含了设备的MAC地址信息,那么只需要把这个MAC地址信息转换一下,然后跟我要监听的设备的MAC地址进行比较过滤,就能到到我的预想目的了。

就像这样,新增一个 check 函数,不符合我要求的设备,我就直接返回退出:

  1. def append(self, device):
  2. address = device.address
  3. if not self.device_append_check(address):
  4. return
  5. self.devices.append(device)
  6. self.notify("DEVICE_ADDED", device)

为了保证我再抓取其他BLE设备的时候(别的MAC地址),不需要再次改python代码,那么我需要其他的地方配置一下我需要监听的MAC地址,于是我想到了在 桌面建立一个文本文件,然后把你要过滤的MAC地址填里面,脚本启动的时候把这个过滤的MAC地址读上来,存起来,以备后续做过滤比较。

于是就有了这个一段代码:

  1. def device_append_check(self, address):
  2. global desktop_ble_mac_file
  3. if not os.path.exists(desktop_ble_mac_file):
  4. return True
  5. str_device_address = self.string_address(address)
  6. str_device_address = str_device_address[0:17]
  7. with open(desktop_ble_mac_file, 'r') as f:
  8. mac=f.read().strip().lower()
  9. filter_device_address = mac[0:2] + ':' + mac[2:4] + ':' + mac[4:6] + ':'
  10. filter_device_address += mac[6:8] + ':' + mac[8:10] + ':' + mac[10:12]
  11. #logging.info(str_device_address)
  12. #logging.info(filter_device_address)
  13. if str_device_address == filter_device_address:
  14. logging.info('----append(follow) filter device address(MAC): ' + str_device_address)
  15. return True
  16. else:
  17. return False

MAC文件的内容是:DC234E864004 字符串格式。

这么一顿操作之后,抓包插件一起来后,我们去设备筛选框里面,就只能看到我要的设备,再也不用增大个眼睛去一个个找了。

真是倍儿爽 ... ...

要想恢复原来那种 看到所有设备 的模式,也很简单,把桌面那个记录过滤MAC地址的文件删除即可,无缝衔接

还有个有趣的事是,在debug的过程中,把这些代码的log机制也摸通了,下次有空都可以更精细地研究他们的实现代码了,哈哈哈。

4.3 效果展示

最后,我们来体验一下改造后的效果,简直不要太清爽:

new-find-mac

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

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开发笔记】

有问题的话,可以跟我讨论,知无不答,谢谢大家。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 蓝牙
    +关注

    关注

    114

    文章

    5771

    浏览量

    169827
  • BLE
    BLE
    +关注

    关注

    12

    文章

    652

    浏览量

    59337
  • RT-Thread
    +关注

    关注

    31

    文章

    1273

    浏览量

    39926
收藏 人收藏

    评论

    相关推荐

    RT-Thread学习笔记】使用scons命令生成静态库

    RT-Thread学习笔记】如何使用scons 命令中buildlib的生成静态库?
    的头像 发表于 07-27 09:13 5869次阅读
    【<b class='flag-5'>RT-Thread</b><b class='flag-5'>学习</b><b class='flag-5'>笔记</b>】使用scons命令生成静态库

    RT-Thread软件定义和使用

    RT-Thread软件是运行于RT-Thread物联网操作系统平台上,面向不同应用领域的通用软件组件 。RT-Thread 同时提供了开放的软件
    的头像 发表于 05-21 11:29 1w次阅读
    <b class='flag-5'>RT-Thread</b>软件<b class='flag-5'>包</b>定义和使用

    RT-Thread Nano入门学习笔记

    RT-Thread Nano入门学习笔记
    发表于 11-26 12:36 20次下载
    <b class='flag-5'>RT-Thread</b> Nano入门<b class='flag-5'>学习</b><b class='flag-5'>笔记</b>

    STM32WB55在RT-Thread系统上移植官方蓝牙BLE功能

    STM32WB55在RT-Thread系统上移植官方蓝牙BLE功能硬件环境:(1)开发板:ST官方的stm32wb55-st-nucleo开发板软件环境:(1)开发环境:RT-Thread
    发表于 12-04 12:51 17次下载
    STM32WB55在<b class='flag-5'>RT-Thread</b>系统上移植官方<b class='flag-5'>蓝牙</b><b class='flag-5'>BLE</b>功能

    RT-Thread 应用笔记 - RTC Alarm 组件的使用

    RT-Thread 应用笔记 - 不正确使用LOG也会引发hard faultRT-Thread 应用笔记 - RTC Alarm 组件的使用RT-
    发表于 01-25 18:18 10次下载
    <b class='flag-5'>RT-Thread</b> 应用<b class='flag-5'>笔记</b> - RTC Alarm 组件的使用

    RT-Thread 内核学习笔记 - 理解defunct僵尸线程

    RT-Thread 内核学习笔记 - 内核对象rt_objectRT-Thread 内核学习笔记
    发表于 01-25 18:19 8次下载
    <b class='flag-5'>RT-Thread</b> 内核<b class='flag-5'>学习</b><b class='flag-5'>笔记</b> - 理解defunct僵尸线程

    RT-Thread 内核学习笔记 - 设备模型rt_device的理解

    RT-Thread 内核学习笔记 - 内核对象rt_objectRT-Thread 内核学习笔记
    发表于 01-25 18:19 8次下载
    <b class='flag-5'>RT-Thread</b> 内核<b class='flag-5'>学习</b><b class='flag-5'>笔记</b> - 设备模型<b class='flag-5'>rt</b>_device的理解

    RT-Thread 内核学习笔记 - 内核对象链表结构深入理解

    RT-Thread 内核学习笔记 - 内核对象rt_objectRT-Thread 内核学习笔记
    发表于 01-25 18:23 6次下载
    <b class='flag-5'>RT-Thread</b> 内核<b class='flag-5'>学习</b><b class='flag-5'>笔记</b> - 内核对象链表结构深入理解

    RT-Thread 内核学习笔记 - 内核对象初始化链表组织方式

    RT-Thread 内核学习笔记 - 内核对象rt_objectRT-Thread 内核学习笔记
    发表于 01-25 18:24 3次下载
    <b class='flag-5'>RT-Thread</b> 内核<b class='flag-5'>学习</b><b class='flag-5'>笔记</b> - 内核对象初始化链表组织方式

    RT-Thread 内核学习笔记 - 内核对象操作API

    RT-Thread 内核学习笔记 - 内核对象rt_objectRT-Thread 内核学习笔记
    发表于 01-25 18:26 7次下载
    <b class='flag-5'>RT-Thread</b> 内核<b class='flag-5'>学习</b><b class='flag-5'>笔记</b> - 内核对象操作API

    RT-Thread学习笔记 RT-Thread的架构概述

    RT-Thread 简介 作为一名 RTOS 的初学者,也许你对 RT-Thread 还比较陌生。然而,随着你的深入接触,你会逐渐发现 RT-Thread 的魅力和它相较于其他同类型 RTOS
    的头像 发表于 07-09 11:27 4485次阅读
    <b class='flag-5'>RT-Thread</b><b class='flag-5'>学习</b><b class='flag-5'>笔记</b> <b class='flag-5'>RT-Thread</b>的架构概述

    RT-Thread学习笔记】Makefile的FORCE

    RT-Thread学习笔记】十分钟学会Makefile的FORCE
    的头像 发表于 07-30 13:55 2466次阅读
    【<b class='flag-5'>RT-Thread</b><b class='flag-5'>学习</b><b class='flag-5'>笔记</b>】Makefile的FORCE

    RT-Thread学习笔记】如何抓取终端的网络报文

    RT-Thread学习笔记】如何抓取终端的网络报文?
    的头像 发表于 07-30 13:57 2748次阅读
    【<b class='flag-5'>RT-Thread</b><b class='flag-5'>学习</b><b class='flag-5'>笔记</b>】如何抓取终端的网络报文

    RT-Thread学习笔记】用memwatch排除内存泄露

    RT-Thread学习笔记】使用memwatch排除内存泄露
    的头像 发表于 07-30 14:01 2240次阅读
    【<b class='flag-5'>RT-Thread</b><b class='flag-5'>学习</b><b class='flag-5'>笔记</b>】用memwatch排除内存泄露

    基于RT-Thread Studio学习

    前期准备:从官网下载 RT-Thread Studio,弄个账号登陆,开启rt-thread学习之旅。
    的头像 发表于 05-15 11:00 3830次阅读
    基于<b class='flag-5'>RT-Thread</b> Studio<b class='flag-5'>学习</b>