解密蓝牙mesh系列

2023-11-13

转载自 蓝牙技术联盟 

蓝牙mesh网络基本概念

本周跟大家分享解密蓝牙mesh系列第四篇,(点这里查看第一篇第二篇第三篇文章)同时也是蓝牙mesh网络基本概念的第二部分。

借助蓝牙mesh,您将能够创建大型网络并支持成千上万的设备之间进行安全、可靠的通信。在“蓝牙mesh网络基础概念”第一篇中,我们探讨了蓝牙mesh网络的一些基本概念,包括节点(node)、元素(element)、模型(model)和状态(state)。在本文中,我们将探讨寻址、消息、发布、订阅和列表,并详细介绍这些核心概念如何相互交织并构成蓝牙mesh网络

蓝牙mesh架构

蓝牙mesh运行于低功耗蓝牙协议栈的顶部。下方的图1概述了蓝牙mesh协议栈,并定义了每层的功能。(关于每层mesh协议栈的定义,详见第二篇)

图 1 – 蓝牙mesh架构

正如我们在第一篇中所讨论的,节点(如照明装置、温控设备、制造设备和电动门)是蓝牙mesh网络中能够发送、接收或中继消息的设备。消息(message)用于在节点之间传输数据,地址(address)用于定义消息源(source)地址和目的(destination)地址。

地址(Address)

地址有四种类型,其中的三类用于消息的传送:单播(unicast)、虚拟(virtual)和群组(group)地址。第四种被称为未分配(unassigned)地址。地址长度为16位,并按下述定义进行编码(图2)。

图2 - mesh地址编码

   未分配地址(Unassigned Address)

未经配置的元素或未被指定地址的元素拥有的就是未分配地址。鉴于这些元素没有唯一的地址,它们不会用于消息的传送。

   单播地址(Unicast Address)

在“启动配置”(provisioning)期间,启动配置设备(provisioner)会在网络节点的生命周期内为节点中的每个元素分配一个单播地址。单播地址可能出现在消息的源地址字段或目的地址字段中。发送到单播地址的消息只能由一个元素进行处理。

   虚拟地址(Virtual Address)

虚拟地址是与特定的UUID标签相关联的一组元素;这些地址可能会被发布或订阅。UUID标签是与多个来自一个或多个节点的元素相关联的128位值。

对于虚拟地址,15和14位分别设置为1和0(图2);13 – 0位被设置为散列值(hash value)(提供16,384个散列值)。散列(hash)来自于Label UUID。使用订阅元素(subscribing element)来检查完整的128位UUID是十分低效的,特别当UUID跨越多个消息段时更为低效。散列值提供了一种更为有效的方式来确定哪些消息被发送至哪些元素。

   群组地址(Group Address)

群组地址是蓝牙mesh网络中的另一种多播地址(multicast address),它通常代表一个或多个节点中的多个元素,包含两种类型:

  • 动态分配的地址(Dynamically Assigned) -> 0xC000-0xFEFF

  • 固定地址(Fixed Address) –  由蓝牙技术联盟分配,分为五段:

    • 保留供将来使用 (RFU) –> 0xFF00-0xFFFB

    • All-proxies -> 0xFFFC

    • -  发送到启用friend功能的所有节点

      -  发送到启用中继(relay)功能的所有节点

       发送到所有节点

      • 发送到启用代理(proxy)功能的所有节点

      • All-friends -> 0xFFFD

      • All-relays -> 0xFFFE

      • All-nodes -> 0xFFFF

      • 发送到固定节点的所有消息都由节点的主元素(primary element)

        进行处理

消息(Message)

蓝牙mesh网络通过消息进行通信。消息可以分为控制消息和接入消息。

  • 控制消息(Control Message) - 与蓝牙mesh网络操作有关的消息,例如心跳(heartbeat)和friend的请求消息。

  • 接入消息(Access Message) - 该类消息允许客户端模型检索或设置服务器模型中的状态值,或被服务器用于报告状态值。

模型可实施并定义节点的功能。元素是节点内唯一可被寻址的实体(节点中可包含一个或多个模型),并由状态(state)定义元素的状况变化。对于每个状态,都有一组服务器模型支持的消息。例如请求状态值或请求改变状态的客户端模型、以及发送状态或状态改变相关消息的服务器模型。

消息可被操作码(opcode)识别,并具有相关参数。操作码可识别消息的操作。示例包括:

  • Generic OnOff Get – 用于为通用模型识别OnOff状态Generic

    • OnOff Get不具有参数

  • Generic OnOff Set – 用于设置通用模型的OnOff状态

    • 参数:

      • OnOff – 目标值(开或关)

      • TID – 事务标识符(Transaction Identifier)– 消息是新的还

        是转发的

      • 转换时间(Transition Time)– 元素从一种状态转换到另一种

        状态所需时长

      • 延迟(Delay)– 消息执行延迟

接入消息分为两类:经确认的(acknowledged)和未经确认的(unacknowledged)。经确认的消息被发送至每个接收元素,并经其确认。响应通常为状态消息。对于未经确认的消息则不作出响应。例如蓝牙mesh网络的状态消息就是一种未经确认的消息。

消息安全

所有蓝牙mesh网络消息的安全保障都来自网络密钥(NetKey)和应用密钥(AppKey)对消息的加密和验证。NetKey用于网络层通信。假设蓝牙mesh网络没有子网,则该mesh网络内的所有通信都使用相同的网络密钥。

AppKey用于应用程序的数据。网络中的一些节点具有特定应用,并且根据应用的需要对一些潜在敏感数据的访问进行限制。这些节点具有特定的AppKey,并与特定应用相关联。会使用不同AppKey的领域通常包括安全(楼宇门禁、机房门禁和CEO办公室门禁)、照明(制造厂房、外部楼宇照明和人行道)和HVAC系统。

中继节点(relay node)(如灯泡或墙壁开关)通常具有有效的NetKey,能够在网络内中继敏感性消息。然而,这些节点无法访问各种限制区域(如楼宇控制或HVAC系统)的特定AppKey,,亦无法解密应用程序的数据。

消息交换

蓝牙mesh网络使用发布/订阅 (publish/subscribe) 模型来进行消息传输。生成消息的节点会发布消息。需要接收消息的节点会订阅它们所需的地址。消息可被发布至单播、群组或虚拟地址。

消息可以作为对其他消息的回复而发送,也可以作为非请求消息(unsolicited messages)被发送。当模型发送回复消息时,使用消息始发处的源地址作为目标地址。发送非请求消息时,模型将使用模型的发布地址作为目标地址。节点中的每个模型都有一个发布地址。

接收消息时,节点内模型(节点中可能存在多个模型)中的每个实例均可通过订阅方式从一个或多个群组或虚拟地址接收消息。

订阅消息的模型使用模型的订阅列表来定义用于接收消息的有效地址。当模型接收到消息时,模型将检查其订阅列表。当订阅列表上的地址设置为模型的元素单播地址或属于该节点的固定群组地址时,则视为一个匹配(match)。图3表示了接入消息的有效源地址和目标地址。

图 3 – 接入消息的有效源地址和目标地址

蓝牙mesh实体发布各种节点的状态时,无论其与发送数据的节点位置距离远近,整个蓝牙mesh网络中的系统均可订阅该数据。这就实现了网络一端的设备可通过低功耗无线消息与设施中的其他的管理者进行对话,而不受距离限制。

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

解密蓝牙mesh系列 的相关文章

  • 蓝牙解析(part7):BLE的连接

    转自Wowo大神的http www wowotech net bluetooth ble connection html 1 前言 了解蓝牙的人都知道 在经典蓝牙中 保持连接 Connection 是一个相当消耗资源 power和带宽 的过
  • 完整、详细的MySQL规范

    一份非常完整 详细的MySQL规范 https mp weixin qq com s eCOn8JOPqExM6XOdv16krg 一 数据库命令规范 所有数据库对象名称必须使用小写字母并用下划线分割 所有数据库对象名称禁止使用mysql保
  • BLE蓝牙协议 — BLE连接建立过程梳理(一)

    文章出处 枫之星雨 转载文章 如有不妥 通知后我会立即删除 连接建立 应付比广播更为复杂的数据传输 或者要在设备之间实现可靠的数据交付 这些都要依赖于连接 连接使用数据信道在两个设备之间可靠地发送信息 它采取了自适应跳频增强鲁棒性 同时使用
  • unity实现简单自动寻路

    unity实现简单自动寻路 1 打开unity创建一个简单的场景 如下图 2 除了场景中的两个对象将所创建的地形设置为静态 3 给主角添加Nav mesh Agent 组件 4 烘焙地图 简单来说就是烘焙自动行走的路径 要注意蓝色区域为烘焙
  • 运维工具

    环境部署 部署软件 如Apache Nginx tomcat JDK PHP MySQL等等 还需要测试吧 那就还需要部署一套测试环境 有些时候 开发环境也是需要运维来部署的 排错和调优 运维的事 尽快定位问题 解决问题才是王道 定位问题
  • 【转载】浅谈蓝牙 Mesh 组网技术

    本文转载自 Eren https www erenship com posts 63c7 html 蓝牙技术联盟官方网址 https www bluetooth com zh cn 蓝牙技术联盟公众号 BluetoothSIG 蓝牙技术联盟
  • 解密蓝牙mesh系列

    转载自 蓝牙技术联盟 蓝牙mesh网络 友谊篇 低功耗蓝牙 Bluetooth Low Energy 是全球最具节能性的短距离无线通信技术之一 其低功耗的特性广受开发者和消费者赞誉 随着蓝牙mesh网络的推出 开发者可能想知道蓝牙mesh网
  • 38个MySQL数据库的小技巧

    1 如何快速掌握MySQL 培养兴趣 兴趣是最好的老师 不论学习什么知识 兴趣都可以极大地提高学习效率 当然学习MySQL 5 6也不例外 夯实基础 计算机领域的技术非常强调基础 刚开始学习可能还认识不到这一点 随着技术应用的深 入 只有有
  • 显示线框和纯色

    是否可以在同一对象上显示对象的线框及其面的纯色 我找到了一种使用对象克隆并分配不同材质的方法 例如 var geometry new THREE PlaneGeometry plane width plane height width 1
  • 污染玫瑰图网格

    我正在尝试创建一个污染玫瑰图 如链接中所述绘制 Windrose 制作浓度设置为颜色的污染玫瑰 回复中的示例有效 但是当我使用我的数据时 它给出了一个奇怪的图 有什么建议我哪里出错了吗 谢谢 import matplotlib pyplot
  • 在javafx中将纹理应用于网格

    我在使用 JavaFX 和 FXyz 0 1 1 将纹理应用到网格时遇到问题 I found 这个问题即使有详细的答案也无法弄清楚 我从头开始 准确地复制答案中的代码 场景是黑色的 没有可见的二十面体 我使用的是 Java 8 提供的图像是
  • Matplotlib 类似于 matlab trisurf

    长话短说 我想用 python 绘制一个通用的 3D 三角形网格 Matplotlib 似乎是理想的候选者 但我会选择任何可以实现我将要描述的功能的 3D 渲染 假设我有一个由 X Y 和 Z 定义的三角形网格 点云的 3D 坐标 每个长度
  • 我可以从网格生成点云吗? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在尝试从网格生成点云数据 例如 Maya 的 obj 文件 但是 我只能在互联网上找到相反的情况
  • 无论旋转如何,跟踪增强面 (ARCore) 的面网格顶点

    我正在尝试跟踪面部表情 例如扬眉 微笑 眨眼等 在 ARKit 中 我可以使用 blendShapes https developer apple com documentation arkit arfaceanchor 2928251 b
  • ImageJ - 如何导入和显示网格?

    如何在 ImageJ 上打开并显示网格 使用 obj stl 或 dxf 格式 我尝试通过 file open 打开文件 但使用3DViewer http rsbweb nih gov ij plugins 3d viewer or the
  • LibGDX 网格高度图法线和灯光

    我正在尝试让网格法线和灯光在 LibGDX 项目中工作 我已经有了从高度图纹理像素生成的纹理网格 问题是我无法正确点亮法线 另外 我不能 100 确定我在 TerrainChunk 类中正确设置了法线顶点 这是主类代码 package co
  • 为什么从搅拌机导出到 Unity 时我的 (FBX) 网格体有孔?

    我现在正在学习雕刻我的角色 当我将 FBX 文件从 Blender 导出到 Unity 时 网格物体的脸上有一个巨大的洞 我该如何预防 解决这个问题 它在 mixamo 中工作得很好 在此输入图像描述 https i stack imgur
  • THREE.JS 加载 STL 网格数组

    因此 我有一个数据库 其中包含文件引用列以及对其所需的子 STL 文件的任何引用 我可以将一两个模型加载到 THREE js 查看器中 因此所有这些都可以正常工作 但是当我加载四个左右的数组时 事情开始变得毛茸茸的 分配的网格 ID 开始变
  • 用顶点之间的渐变填充 matplotlib 多边形

    我正在使用 matplotlib 的 Poly3DCollection 绘制多边形 三角形 的集合 三角形位于具有与其关联的颜色的顶点之间 我目前正在用通过平均三个顶点的颜色确定的纯色填充每个三角形 绘制三角形以形成 3D 表面网格 I w
  • 如何将网格转换为VTK格式?

    我有一个自己格式的网格 我想将其导出到 vtk 文件 我该怎么做呢 原始网格的格式如下 伪代码 class Mesh List

随机推荐