ble-mesh 学习笔记(2)-如何给mesh-node配网

2023-05-16

1、配网方式选择

  • 基于手机设备为provisioner进行进行PB-GATT 配网

       如果一个蓝牙4.0的手机需要用作Provisioner,并完成对其他节点的配网过程。则需要使用Mesh Provisioning Service服务来对其他节点配网。在手机和其他节点建立GATT连接之前,未配网mesh节点需要广播PB-GATT的广播包。

  • 基于蓝牙mesh网关设备为provisioner进行PB-ADV配网

        在蓝牙mesh网关设备和其他节点建立连接之前,未配网mesh节点需要广播PB-ADV的广播包Unprovisioned Device beacon 。

蓝牙 Mesh 规格中定义了配网协议,该协议定义了配网流程中用于在配网器和新的未经配置设备之间进行通信的标准流程以及 PDU。下图描绘了完整蓝牙 Mesh 协议栈之外的配网协议栈。

mesh 系统架构与配置协议栈

从下到上的组件如下:

配网承载层(Provisioning Bearer)

配网承载层实现了配网 PDU 在配网器和未经配置设备之间的传输。定义的两个配网承载层包括:

  • PB-ADV:指通过蓝牙广播信道进行设备配置的配网承载层。PB-ADV 承载层用于发送通用配网 (Generic Provisioning) PDU。支持 PB-ADV 的设备应尽可能执行占空比接近 100% 的被动扫描,以避免遗漏任何发送来的通用配网 PDU。

  • PB-GATT:指使用来自代理协议的蓝牙 Mesh 代理(proxy)PDU 来进行设备配置的配网承载层。代理协议能使节点通过面向连接的低功耗蓝牙(Bluetooth Low Energy)承载层来收发网络 PDU、mesh Beacon、代理配置消息和配网 PDU。PB-GATT 在 GATT 操作中包含了配网 PDU,涉及 GATT 配网服务,同时能在配网器不支持 PB-ADV 时供其使用。

2、provisioner与mesh建立链接

provisioner扫描未配网设备。当收到一个未配网设备发出的beacon时,provisioner将于设备建立一个链路,通过设备UUID做标识。

链路建立开始于provisioner发送一个LinkOpen消息。LinkOpen消息中包含了设备UUID。对于广播方式的配网,PB-ADV PDU中包含了LinkID字段。

除非已经被配网(设备已经接受到一个Provisioning Invite PDU),设备在收到LinkOpen消息时应该接受并且使用相同的LinkID回复一个LinkACK消息。

链路建立后,可以通过发送LinkClose消息在任何时间关闭链路。链路的任何一侧都可以发送LinkClose消息。

 

3、配网流程(Provisioning Process)

配网流程包括五个阶段:

  1. 发送 Beacon 信号:如果未经配置的设备支持 PB-ADV承载层,则其作为未经配置设备 Beacon 进行广播;如果使用的是 PB-GATT 承载层,则发送可连接的广播数据包。这就向配网器(Provisioner)表明未经配置的设备已做好准备,可进入配网流程。
  2. 邀请:配网器(Provisioner)邀请未经配置的设备发送自身配置功能信息。
  3. 交换公共密钥:在此阶段,根据未经配置设备的功能,配网器(Provisioner)选择合适的验证方法,并通知未经配置设备将要采取的方式。之后,配网器和未经配置设备会创建一个椭圆曲线公私密钥对并交换公钥。然后,每台设备使用自己的私钥和对等设备的公钥来计算对称密钥,即 ECDHSecret。该密钥用于验证对端设备的身份。
  4. 认证:在此步骤中,配网器使用所选的验证方法,对未经配置设备进行验证。
  5. 配置数据分发:认证步骤完成之后,就可以确保在配网器(Provisioner)和未经配置设备之间建立的承载层的安全,然后就进入配网(Provisioning)过程中最重要的一步:导出并分发配置数据(provisioning data)。

3.1 发送Beacon信号

Beacon 是低功耗蓝牙的传统应用场景。想象一下,一个 GAP 外设(如智能手表或活动跟踪器)希望与 GAP 中央设备(如智能手机或平板电脑)连接。 GAP 外设切换到广播状态并开始发送其广播数据包。GAP 中央设备扫描广播数据包以发现其它设备并接收相关基本信息。蓝牙 Mesh 配置使用的也是相同的广播机制。

如果未经配置的设备支持 PB-ADV 承载层,则其作为未经配置设备 Beacon 进行广播。这涉及指定的数据包格式,且未经配置设备通过此方式来使自身被配网器 (Provisioner) 发现,之后进过双方通过mesh message进行传输。

当未经配置设备使用 PB-GATT 承载层时,一项称为“Mesh 配置服务”的 GATT 服务会支持整个配网流程,同时支持与配网器的交互。在发送 Beacon 信号阶段,未经配置设备会发送包括 mesh 配置服务 UUID 的广播数据包,它会被配网器通过标准的低功耗蓝牙扫描程序发现。

建立LE Link之后,双方默认就有了GATT connection。这时Provisioning Client需要查询Provisioning Server的Mesh Provisioning Service,并找到下面两个Characteristic:

  1. Mesh Provisioning Data In,用于Client->Server的数据传输,使用GATT的“Write command”;
  2. Mesh Provisioning Data Out,用于Server->Client的数据传输,使用GATT的“Notification”,需要配置它的CCCD(Client Characteristic Configuration Descriptor)来使能notify;

找到这两个Characteristic,经Proxy protocol封装的Provisioning PDU便可经由它们传输。

3.2 邀请

在发送 Beacon 信号之后,配网器和未经配置设备会建立 PB-ADV 或 PB-GATT 配网承载层(provisioning bearer)。然后,配网器发送一个配置邀请 PDU,设备通过配置能力 PDU 对其作出响应。

配置邀请 PDU 包括 Attention Duration 字段,其指示了未经配置设备的主要元素应采用某种视觉指示方式,并在多长的时间内吸引用户的注意力。

配置能力 PDU 包括:

  • 设备支持的元素数量;
  • 支持的一组安全算法;
  • 使用带外(OOB)技术实现的公共密钥可用性;
  • 该设备向用户输出值的能力;
  • 该设备允许用户输入值的能力。

配置邀请

上图中的流程图让人联想到低功耗蓝牙中的配对过程。低功耗蓝牙配对采用的配对特性交换类似于蓝牙 Mesh 配置程序中的配置邀请阶段。在配置邀请阶段,目的是向配网器(Provisioner) 提供有关未经配置设备功能的信息。有了这些信息,配网器就能决定下一步该如何进行。

3.3 交换公共密钥

信息加密涉及两项基本技术:对称加密(也称为密钥加密)和非对称加密(也称为公钥加密)。

  • 对称加密采用相同的密钥进行加密和解密。只要发送设备和接收设备都知道密钥,就能够解密所有使用此密钥加密的信息。然而,很难安全地通过链路交换密钥并防止其落入坏人之手。
  • 非对称加密使用两个相关的密钥(即一个密钥对)来解决上述问题:公钥和私钥。公钥免费提供给任何可能想向您发送消息的人。私钥则为保密,只有你自己知道。使用公钥加密的任何消息(文本、二进制文件或对称密钥)只能通过应用相同的算法、且仅能使用与之匹配的私钥进行解密。这意味着您不必对通过链接传递公钥的过程有任何担忧,因为它们仅用于加密而非解密。然而,非对称加密比对称加密慢一些,且需要更高的处理能力来进行消息内容的加密和解密。

在蓝牙 Mesh 用例中,大多数设备基于嵌入式芯片组或模块,因此无法使用计算成本昂贵的非对称加密技术来对每个消息进行加密/解密。对称加密更适合于不具备非对称加密所需处理能力的设备,但如何安全地交换并使用密钥仍然是一大问题。蓝牙mesh采用了非对称和对称加密结合的方式来解决这一问题。

  • 对称加密:在蓝牙 Mesh 网络中传输的每个消息都使用 AES-128 密码加密。 AES-128 算法是常用的对称加密/解密引擎,常用于嵌入式平台。
  • 非对称加密:椭圆曲线 Diffie-Hellman(ECDH)是一种匿名密钥协商协议,允许具有椭圆曲线公私密钥对的双方在非安全信道上建立共享保密信息。ECDH 在蓝牙 Mesh 配置中的目的是在配网器和未经配置设备之间创建安全链路。它使用公钥和私钥来分发对称性密钥,两台设备随后可将其用于后续消息的加密和解密。

在交换公钥阶段,有两种交换 ECDH 公钥的可能方式。它们可以通过蓝牙链路、或 OOB 隧道进行交换。在配置邀请阶段,未经配置的设备已经报告了是否支持通过 OOB 隧道发送自身公钥。如果是,则配置设备可继续使用它,并通过发送配置开始 PDU 来通知未经配置的设备。

如果未经配置设备的公钥可通过 OOB 隧道获得,则临时公钥从配网器发送到设备,并采用合适的 OOB 技术(例如二维码),从未经配置的设备中读取静态公钥,如图所示。

未经配置设备采用OOB方式进行的公钥交换

否则,双方的公钥都会经由下图中所示的蓝牙链路进行交换。

未经配置设备的公钥未知时的公钥交换

ECDHSecret = P-256 (私钥,对等公钥)

在该等式中,P-256 即 FIPS 186-3 中定义的 FIPS-P256 曲线。

3.4 认证

在此步骤中,配网器使用所选的验证方法,对未经配置设备进行验证。有三种可用的验证方法(OOB, Out-Of-Band):输出 OOB(Output OOB)、输入 OOB(Input OOB)、以及静态 OOB(Static OOB)或无 OOB(No OOB)。

输出带外(Output OOB)

若选择的是输出带外(Output OOB)验证方法,则未经配置设备会选择一个随机数,并通过与其功能兼容的方式输出该数字。例如,如果未经配置设备是一个灯泡,则它能够闪烁指定的次数。如果设备具有 LCD 屏幕,则可以将随机数显示为多位数值。配网器(Provisioner)的用户需要输入观察到的数字,来验证未经配置的设备。输出带外验证方法的工作流程如下图所示。

通过输出OOB进行验证

输入随机数后,配网器(Provisioner)生成并检查确认值。无论采用哪种验证方式,整个验证步骤中的检查确认值(check confirmation value)计算方式都是相同的。

输入带外(Input OOB)

输入带外(Input OOB)验证方法与输出带外(Output OOB)方法类似,但设备的角色相反。配网器(Provisioner)生成并显示随机数,然后提示用户采取适当的操作,将随机数输入未经配置的设备。以照明开关为例,用户可以在一定时间内数次按下按钮,以这种形式输入随机数。

与输出带外验证(Output OOB)相比,输入带外(Input OOB)方法需要发送一个附加的配置协议 PDU。在完成认证操作之后,未经配置的设备向配网器发送一个配置输入完成 PDU(Provisioning Input Complete PDU),通知其随机数已输入完成。随后进入到执行检查确认值操作的步骤。

通过输入OOB进行验证

静态带外(Static OOB) 或无带外(No OOB)

在输入带外或输出带外都不可用的情况下,配网器(Provisioner)和未经配置的设备可采用静态带外(Static OOB)验证或无带外(No OOB)验证:采用静态 OOB 信息;或静态 OOB 信息不可用,直接以数值 0 代替。在此情况下,配网器和未经配置的设备各自生成一个随机数,然后进行检查确认值操作。

检查确认值(Check Confirmation Value)

无论采用何种验证方法,都会进行确认值生成和检查。根据蓝牙 Mesh 规格,配网器(Provisioner) 和未经配置设备应分别计算确认值。这两个值被称为 ConfirmationProvisioner 和 ConfirmationDevice。

确认值检查(Confirmation Value Check)

当确认值生成之后,两台设备就会进行交换,并且都会检查接收值的完整性。图4表示确认值检查的过程。

确认过程的开始就是配网器(Provisioner)将其随机数 RandomProvisioner 发送到未经配置的设备。未经配置设备使用它来重新计算确认值,并与之前接收的确认值进行比较,进行验证。

确认值检查

  • 如果由未经配置设备计算所得的确认值与接收到的 ConfirmationProvisioner 不匹配,则配网(Provisioning)过程将被中止。
  • 如果由未经配置设备计算所得的确认值与接收到的 ConfirmationProvisioner 匹配,则未经配置设备将其 RandomDevice 值发送给配网器。

然后,配网器(Provisioner) 使用相同的过程来重新计算确认值,并通过比较计算所得值与先前接收值来进行验证。

  • 如果由配网器(Provisioner) 计算所得的确认值与接收到的 ConfirmationDevice 不匹配,则配网(Provisioning)流程将被中止。
  • 如果由配网器(Provisioner) 计算所得的确认值与接收到的 ConfirmationDevice 匹配,则表示验证成功。后续只要配网器(Provisioner)和未经配置设备完成配网流程的第五步:配置数据分发,则未经配置设备就能成为蓝牙 Mesh 网络中的节点(node)。

3.5 配置数据分发

认证步骤完成之后,就可以确保在配网器(Provisioner)和未经配置设备之间建立的承载层的安全,然后就进入配网(Provisioning)过程中最重要的一步:导出并分发配置数据(provisioning data)。配网器(Provisioner) 负责生成配置数据,配置数据由多个数据项组成,包括一个称为网络密钥 (NetKey) 的安全密钥。下表列出了配置数据字段。

字段大小(字节)注释
网络密钥16简称 NetKey。NetKey 确保网络层(network layer)通信的安全,并在网络中所有节点(node)之间共享。是否拥有给定的 NetKey 定义了给定蓝牙 Mesh 网络或子网的成员资格。为设备赋予网络的 NetKey 是配网(Provisioning)流程的主要结果之一。
配网器(Provisioner) 在对要添加到网络中的首台设备进行配置时创建 NetKey。
设备密钥16简称 DevKey,只有配网器(Provisioner)和被配置的设备拥有的唯一安全密钥 。
密钥索引2由于 NetKey 太长,无法在单段消息中传输。为使消息传递尽可能高效,会向密钥分配一个全球唯一的12位索引值,称为密钥索引,用作密钥的短标识符。消息中包括密钥索引值,它可能以配置客户端(Configuration Clients)维护的密钥列表为参考。
标志1标志位掩码 - 指示关联密钥的状态。
IV 索引4IV(初始化向量)索引是一个32位的值,被网络中的所有节点 (node)共享。其目的是在计算消息随机值时提供熵(随机性)。
单播地址2新节点中主要元素的单播地址(Unicast Address)。

至此,配网流程完成。两台对等设备都已知晓新的设备密钥(DevKey)和全网的网络密钥(NetKey),这就意味着我们的新设备已成为蓝牙 Mesh 网络中的节点(node)和成员。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ble-mesh 学习笔记(2)-如何给mesh-node配网 的相关文章

随机推荐

  • OpenBTS for bladeRF代码修改

    首先从https github com Nuand dev 上 git clone 下来下载打包的文件 xff0c 接着到本地dev目录下执行 clone sh下载OpenBTS以及它的其他依赖的安装包 这里在openbts文件夹Trasc
  • 通信协议/通讯协议 有哪些?包含哪些分类?

    通讯和通信的区别 xff1f 1 通信 与 通讯 傻傻分得清 传统意义上的 通讯 主要指电话 电报 电传 通讯的 讯 指消息 xff08 Message xff09 媒体讯息通过通讯网络从一端传递到另外一端 媒体讯息的内容主要是话音 文字
  • 增强现实入门实战,使用ArUco标记实现增强现实

    点击上方 AI算法修炼营 xff0c 选择加星标或 置顶 标题以下 xff0c 全是干货 在本文中 xff0c 我们将介绍ArUco标记以及如何使用OpenCV将其用于简单的增强现实任务 xff0c 具体形式如下图的视频所示 一 什么是Ar
  • 停车位检测新数据集、新方法,精准又快速(含视频解读)

    点击上方 AI算法修炼营 xff0c 选择 星标 公众号 精选作品 xff0c 第一时间送达 本文是一篇关于停车位检测的文章 xff0c 文章的视频有详细解读 xff0c 文章的创新点就是在圆形描述器来回归定点坐标 地址 xff1a htt
  • available()方法的使用总结

    先看看API的说明 xff1a public int available throws IOException 返回此输入流下一个方法调用可以不受阻塞地从此输入流读取 xff08 或跳过 xff09 的估计字节数 下一个调用可能是同一个线程
  • simpleBGC32-软件代码开源

    simpleBGC32官方只提供了硬件开源 xff0c 导致市场上有大量的v1 3版的硬件电路板用于飞机云台 xff0c 通过烧录官方给的hex文件实现基本功能 但是由于针对simpleBGC32的软件代码没有开源 xff0c 所以很多需要
  • Gazebo环境下VIO SLAM系统实现

    Gazebo环境下VIO SLAM系统实现 Gazebo环境下VIO SLAM系统实现简介0 准备工作1 搭建gazebo环境1 1 相机1 2 IMU 2 VINS MONO2 1 安装及make2 2 参数修改2 3 外参标定2 3 1
  • 滤波学习理解----EKF(一)

    最近回到slam方向了 xff0c 所以有时间整理一下最近的收获 最复杂也是最简单的模块 滤波 引入 那么滤波是什么呢 xff1f 滤波就是由于观测observation xff08 OB xff09 天生具备的误差和噪声 当有多个信号源观
  • 在VMware里装Kali Linux选graphical install后黑屏解决方案

    我用的是VMware 16 xff0c 装Kali Linux 2020 xff0c 选graphical install后黑屏 其实不管选哪个都黑屏 一开始按照网上的netsh winsock reset xff0c 虚拟打印机 xff0
  • USB移动存储设备上安装Kali Linux(独立系统 非Live 非虚拟机)Standalone Kali Linux + grub2 + luks加密

    前言 本文分享的是在USB移动设备上安装Kali Linux独立系统 非Live版 xff01 非虚拟机版 xff01 非Live版 xff01 非虚拟机版 xff01 非Live版 xff01 非虚拟机版 xff01 这里的USB设备包括
  • 简单git多人协同

    git网上的资料非常多 xff0c 本文只希望能提供一个简单直观的使用教程 xff0c 可能不严谨 如果本文有任何问题 xff0c 请及时指正 git简介 本章介绍git的基本概念 xff0c 了解git就可以跳过 什么是git xff1f
  • Arch 安装 Visual Studio Code(支持Wayland)

    文章目录 安装vscode在Wayland下模糊的解决方法在Wayland下无法使用输入法的解决方法 安装vscode 虽然官网下载一般是首先 xff0c 但是比较复杂 xff0c 所以推荐使用AUR xff1a yay S visual
  • 安装并使用NoMachine

    1 进入NoMachine官网下载NoMachine安装包 2 安装NoMachine xff0c 一路到底 xff0c 不需更改其他设置 xff08 安装目录随意 xff09 3 下载IP扫描工具 xff1a Advanced IP Sc
  • Wayland环境下通过xwayland支持docker图形界面

    写在前面 在之前的文章里已经讲解了怎么直接在docker中使用wayland支持图形界面 xff08 docker内外都使用wayland xff09 xff0c 文章链接 xff1a 使用Docker安装ROS2 ros humble 并
  • ZigBee生产测试项说明

  • C#窗体缩放时窗体上控件同缩放比例变化

    1 定义2个全局float 变量X Y xff0c 用来记录窗体默认窗口时的宽度和高度 float X 默认窗口的宽度 float Y 默认窗口的高度 2 窗体Load的时候将窗体的宽度 高度赋值给X Y private void Form
  • C# winform存储配置文件之App.config文件读写

    有时候一些用户的配置需要写入在本地 xff0c 不能每次程序启动都让用户重新设置一下吧 下面先说基本用法 xff1a 1 创建winform项目之后自动会生成App config文件 xff0c 如果默认没有 就对项目右键 新建项 APP配
  • C# 解决串口接收数据不完整处理方法

    使用缓存机制完成 首先通过定义一个成员变量List lt byte gt buffer 61 new List lt byte gt 4096 用来存放所有的数据 xff0c 在接收函数里 xff0c 通过buffer AddRange 方
  • ble-mesh笔记整理(1) ble-mesh通信理解

    最近有时间将之前整理的 xff0c 关于蓝牙mesh开发学习过程的一些笔记 xff0c 以及一些对mesh协议文档理解的翻译文档 xff0c 发布出来给大家一起学习和参考 xff0c 主要是一个学习的过程参考 蓝牙Mesh通过网状网的组网结
  • ble-mesh 学习笔记(2)-如何给mesh-node配网

    1 配网方式选择 基于手机设备为provisioner进行进行PB GATT 配网 如果一个蓝牙4 0的手机需要用作Provisioner xff0c 并完成对其他节点的配网过程 则需要使用Mesh Provisioning Service