解密蓝牙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和带宽 的过
  • unity实现简单自动寻路

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

    1 使用telnet 登陆设备 system view snmp agent snmp agent community read public snmp agent sys infoversion all dis cur save 保存 Y
  • 运维工具

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

    本文转载自 Eren https www erenship com posts 63c7 html 蓝牙技术联盟官方网址 https www bluetooth com zh cn 蓝牙技术联盟公众号 BluetoothSIG 蓝牙技术联盟
  • 使用Arduino开发ESP32(22):蓝牙作为客户端使用

    文章目录 目的 基础准备 搜索蓝牙设备 搜索设备 信息查询 连接与交互 总结 目的 ESP32的蓝牙除了作为服务器 从设备 使用还可以作为客户端 主机 使用 这篇文章将对相关内容做个简单说明 基础准备 这篇文章中测试需要先准备一个蓝牙服务器
  • 解密蓝牙mesh系列

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

    一 前言 官网资料介绍建议采用DMA传输 串口数据的接收是放到了fifo中 但是串口发送也是采用的DMA 问题在于串口发送并没有建立缓冲器 而是判断当前DMA是否忙 如果忙数据直接丢弃 这样做显然不合理 如果发送时DMA忙应该将数据放到缓冲
  • 【Threejs效果:挖空几何体】ThreeBSP实现墙体挖洞

    1 效果如下 2 代码如下 基本思路 1 创建两个mesh 一个墙体 一个窗户 2 然后取墙体和窗户的差集 将差集转换成几何体 3 根据几何体新建mesh 并贴纹理 依赖库有三个 import as THREE from three imp
  • 探索第三方 API 服务的身份验证方法:优点和缺点

    探索第三方 API 服务的身份验证方法 优点和缺点 赛斯 法特的相片 赛斯法特 2023 年 3 月 18 日 4分钟阅读 嗨 大家好 我们中的大多数人已经使用多个第三方 API 服务来实现您的业务逻辑 是的 他们中的大多数都有不同的身份验
  • 蓝牙ble tips3-MAC地址

    和计算机网络IP地址类似 BLE也会有属于自己的一个地址 BLE设备地址 蓝牙地址 也称作 Bluetooth MAC Media Access Control 地址 是一个48位的唯一硬件标识符 用于在蓝牙设备之间建立连接和通信 它由全球
  • 在javafx中将纹理应用于网格

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

    用于确定点是否位于 3D 网格内部的快速算法是什么 为简单起见 您可以假设网格都是三角形并且没有孔 到目前为止我所知道的是 确定光线是否穿过网格的一种流行方法是计算光线 三角形相交的数量 它必须很快 因为我正在使用它进行触觉医学模拟 所以我
  • 三.js。应用 EdgesHelper 后更改网格位置

    我尝试在应用 EdgesHelper 后旋转或更改网格的位置 但它不起作用 网格保持在同一位置 没有 EdgesHelper 它工作正常 我究竟做错了什么 var mesh new THREE Mesh geometry material
  • Three.js 加载已三角化的网格是否比使用四边形的网格性能更高?

    我读过 Three js 对所有网格面进行三角剖分 这是正确的吗 然后我意识到我使用的大多数 gltf 模型都有四面体 在 Blender 中对面进行三角测量非常容易 所以我很好奇对面进行预先三角测量是否会导致网格加载更快 提前致谢 如果您
  • 如何计算具有三角形面的网格的质心?

    我想根据以下描述计算网格的新质心 但我不想使用 Blender 的内置函数来计算质心 如所解释的here https blender stackexchange com questions 14294 how to recenter an
  • MATLAB:在子图中绘制/保存网格函数的 X-Y 视图

    正如标题所示 我试图将网格函数的 2 变量切片 例如 作为 jpg 保存为子图 我想使用 m 文件来执行此操作 因为我有很多要生成的图 我已经弄清楚如何在他们自己的图形上绘制视图 但我无法让它们正确地绘制为图形中的子图 为了说明我的意思 以
  • 我想用Python从点云生成网格

    我有来自人体不同部位的点云 比如眼睛 我想做一个网格 我尝试使用 Mayavi 和 Delaunay 但没有得到好的网格 云的点完全混乱 我的点云位于 npz 文件中 使用 Mayavi 然后我想将模型保存在 obj 或 stl 文件中 但
  • 如何从kinect fracetrack获取网格?

    如何获取 kinect 面部追踪网格 这是网格 https i stack imgur com aPtJt jpg https i stack imgur com aPtJt jpg 我尝试了多种方法 但无法使其发挥作用 e g http
  • 在 Python 中创建二维非矩形形状的三角形网格

    假设我有一组点定义二维平面中非矩形形状的周长 我需要一个函数来创建三角形网格划分 在其中可以修改三角形单元的数量并返回每个单元的 x y 坐标 谢谢 你可能应该看看 dmsh https github com nschloe dmsh py

随机推荐