基于nRF52840 Dongle配合Wireshark对Mesh网络抓包并解析(Nordic)

Mesh网络抓包解析

    • 准备
    • 说明
    • 配置
    • 过滤
    • 解密
    • 分析

准备

1)nRF52840 Dongle
2)Mesh节点
3)手机作为配网器(苹果手机安装nRF Mesh APP)

说明

1)节点使用的例程目录:nrf5sdkformeshv500src\examples\light_switch\client
2)抓包使用的软件:Wireshark
3)抓包方法:使用Nordic的nRF52840 Dongle配合Wireshark对蓝牙设备抓包(BLE)

配置

先打开Wireshark,这时候能收到节点的未配网设备信标,在Device一栏选择自己的节点,避免抓到无效的数据。
在这里插入图片描述
在Debug模式下可以通过MCU寄存器看到设备地址,对应例程advertiser.c中的advertiser_address_default_get()函数:
在这里插入图片描述在这里插入图片描述
然后通过set_gap_addr_type()函数修改之后就是实际的设备地址。

nRF Mesh APP的Settings中先使用Forget Network复位Mesh网络,然后在Applications Keys中生成自己需要数量的Appkey。
在这里插入图片描述
配置手机(既是节点,也是配网器)主元素的通用开关服务器模型订阅和发布地址如下:
在这里插入图片描述
通过手机(配网器)配置使未配网设备成为Mesh节点,配置其第二个元素通用开关客户端模型订阅和发布地址如下:
在这里插入图片描述
配置完成后如下:
在这里插入图片描述
另外说一下,只要不使用Forget Network复位Mesh网络,那么新配置的节点单播地址自动往上增加。这个时候通过按下按键发送Mesh消息,可以在Wireshark中抓到包:
在这里插入图片描述
可以看到网络层PDU因为经过加密和混淆处理,是看不到具体的数据的。
网络层PDU字段定义:
在这里插入图片描述
网络层PDU格式:
在这里插入图片描述
所以在抓到的包里面可以看到网络层PDU由IVI,NID,Obfuscated,Encrypted data和NetMIC组成。

过滤

通过Wireshark抓到的包比较多,输入(pbadv)||(provisioning)||(btmesh)||(beacon)可以对数据进行过滤。
在这里插入图片描述

解密

在抓到的Mesh包右键→协议首选项→Bluetooth Mesh→Mesh Keys,然后输入当前使用的NetKey和AppKey。
在这里插入图片描述
在这里插入图片描述
NetKey和AppKey可以通过App的Settings中获取:
在这里插入图片描述
同样也可以输入设备密钥DevKey,SRC Address输入的是设备的单播地址。
在这里插入图片描述
DevKey和SRC Address可以通过App的Network中选择对应节点获取:
在这里插入图片描述

分析

经过上面的处理,就可以对Mesh消息进行分析。
在这里插入图片描述
以上面这条消息为例,可以看到消息的序列号是20,源地址是4,目的地址是1,节点的单播地址是0x0003,所以它第二个元素的单播地址就是0x0004,手机(配网器)的单播地址是0x0001,所以其主元素的单播地址就是0x0001,这样就知道这条Mesh消息的流向。
在这里插入图片描述
访问层的操作码是0x8202,参数是0009010a。其中操作码为Generic OnOff Set,这个是SIG官方定义的:
在这里插入图片描述
通用开关模型的字段定义:
在这里插入图片描述
那么这条消息的意思就是开关状态设置为关,事务ID为0x09,渐变时间是0x01,延迟是0x0a。

TID:可以在应用层判断消息是否重复,每传输一次消息,TID的值就会增加1。在例程中的按键事件处理函数button_event_handler()中可以看到:
在这里插入图片描述
至于Transition Time和Delay参数,如果Transition Time参数存在,那么Delay参数也应该存在,如果Transition Time参数不存在,那么Delay参数也不应该存在。
渐变时间表示一个设备从一个状态转换为另一个状态的时间,长度1字节,低6位表示渐变时间的具体数值,高2位表示渐变时间的步长,字段定义如下:
在这里插入图片描述
在这里插入图片描述
其中渐变时间的具体数值,取值范围0x00至0x3E,定义如下:
在这里插入图片描述
渐变时间的步长定义如下:
在这里插入图片描述
根据抓到的包中值0x01,则步长为100ms,数值为0x01,结果为100ms;而延迟时间默认的步长是5ms,抓到的包中值0x0a,那么延迟时间就是50ms,和例程中定义的一致。
在这里插入图片描述
由于二进制状态不支持渐变,当转换为0x01 (On)时,转换开始时立即改变Generic OnOff状态,当转换为0x00 (Off)时,渐变时间结束时改变状态。我的理解就是可以通过渐变时间来控制灯延时熄灭,当关灯时,灯状态改变的时间比开灯时状态改变的时间多出来一个渐变时间。
当转换为0x01 (On)时:
在这里插入图片描述
当转换为0x00 (Off)时:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/99174.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

贷款公司如何精准获客,大数据获客

近年来,贷款中介机构在金融服务领域发挥着越来越重要的作用。随着时代的发展,贷款中介机构不仅是贷款服务的提供者,也是能够帮助客户更准确获取客户的服务提供者。 为此,贷款中介机构应把握以下几个方面。 首先,贷款…

nginx-基于range做断点续传

nginx默认开启了range断点续传,只要再请求时载请求头上添加header,range,nginx就可以根据range范围返回相应的字节。

keepalived 主备都存在vip, keepalived主备跨网段配置;keepalived主备服务器不在同一个网段怎么配置

keepalived 主备都有vip问题;主备服务器不在同一个网段怎么配置 主机:128.192.10.10 备机:128.192.11.11 备机:128.192.22.22 # keepalived的配置文件增加如下配置即可实现 # 主机:128.192.10.10 vrrp_instance VI_1 {…

React笔记(一)初识React

一、React概述 1、什么是react react的官网:React 用于构建用户界面的 JavaScript 库,它也是一个渐进式的用于构建用户界面的javascript框架 2、主要特征 声明式:使用原生JS编写的页面存在着开发效率低下、性能较差的情况,使用react大家就…

OB Cloud助力泡泡玛特打造新一代分布式抽盒机系统

作为中国潮玩行业的领先者,泡泡玛特凭借 MOLLY、DIMOO、SKULLPANDA 等爆款 IP,以及线上线下全渠道营销收获了千万年轻人的喜爱,会员数达到 2600 多万。2022 年,泡泡玛特实现 46.2 亿元营收,其中线上渠道营收占比 41.8%…

【【萌新的STM32的学习--非正点原子视频的中断设计思路】】

萌新的STM32学习–非正点原子视频的中断设计思路 我们分析而言 我们对于PA0 的设计就从此而来 对于边沿触发的选择我们已经有所了解了 我们下拉,但是当我们摁下开关的时候 从0到1 导通了 所以这个是下拉 上升沿触发 而对于KEY0 我们摁下是使得电路从原来悬空高阻态…

自学Python01-创建文件写入内容

此处省去安装和前言,需要两个东西 一个去下载安装python官方库 Welcome to Python.org 一个是编译器pycharm PyCharm 安装教程(Windows) | 菜鸟教程 PyCharm: the Python IDE for Professional Developers by JetBrains 第一节 练习print…

海域可视化监管:浅析海域动态远程视频智能监管平台的构建方案

一、方案背景 随着科技的不断进步,智慧海域管理平台已经成为海洋领域监管的一种重要工具。相比传统的视频监控方式,智慧海域管理平台通过建设近岸海域视频监控网、海洋环境监测网和海上目标探测网络等,可实现海洋管理的数字化转型。 传统的…

《人生苦短——我学Python》条件判断->双向选择(if--else)

今天我们来学习双向选择判断。顾名思义,双向就是两种选择选其一,即if----else。如果If的条件不成立,则执行else下的语句,否则执行if下面的语句。显然,它们是互斥的!下面就让我们来详细看看吧! 文…

springboot自定义表格(动态合并单元格)

一、需求展示&#xff08;一个订单多个商品&#xff0c;商品数量不限订单行合并&#xff09; 二、技术选型&#xff08;jxls自定义模板&#xff09; <!-- 版本具体看官网Release&#xff0c;这里我们使用 2.13.0 --><dependency><groupId>org.jxls</group…

【数学建模竞赛】数据预处理知识总结1——数据清洗

数据预处理是什么 在数学建模赛题中&#xff0c;官方给所有参赛选手的数据可能受到主观或客观条件的影响有一定的问题&#xff0c;如果不进行数据的处理而直接使用的话可能对最终的结果造成一定的影响&#xff0c;因此为了保证数据的真实性和建模结果的可靠性&#xff0c;需要…

day 47 | ● 392.判断子序列 ● 115.不同的子序列

392.判断子序列 如果用dp判断true or false无法满足&#xff0c;所以dp用来表示以下标i-1为结尾的字符串s&#xff0c;和以下标j-1为结尾的字符串t&#xff0c;相同子序列的长度 func isSubsequence(s string, t string) bool {dp : make([][]int, len(s) 1)for i : 0; i &…