热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

mesh工作原理

MESH原理讲解1mesh的基础知识1.1什么是meshSIGMESH目前采用的是基于flooding(泛洪)协议的MESH网络技术。Mesh网络由MobilePhone、Node

MESH原理讲解
《mesh工作原理》

1 mesh的基础知识
1.1什么是mesh
SIG MESH目前采用的是基于flooding (泛洪) 协议的MESH网络技术。
Mesh网络由Mobile Phone、Node组成,其中Mobile是智能手机,作为Mesh网络的控制端。
Node是网络中的节点设备。BLE Mesh网络是采用广播的方式实现的,基本步骤是:
a.由手机端发出控制或读取类型的数据给节点A
b.由节点A广播消息出去;
c.当节点B收到节点A的消息后,再把节点A的消息广播出去;
d.以此类推,利用感染的方式,一传十,十传百,让所有在无线范围内的装置都收到此消息。
MESH还会对网络中的数据进行特殊的加密,防止通过监听和中间人攻击等手段窃取网络数据。

《mesh工作原理》

1.2 Mesh的协议栈

《mesh工作原理》

mesh协议栈分为7层,分别为模型层(model)、基础模型层(foundation model)、访问层(access)、上层传输层(upper transport)、底层传输层(lower transport)、网络层(network)、承接层(bearer),Mesh协议是基于BLE协议栈为底层而建立起来的协议栈。
1.2.1各层概念-作用
下面我们来讲解各层在mesh设备运行时的作用

a.模型层
模型层定义了用于标准化典型用户场景操作的模型,模型规格 中定义的行为、消息、状态、状态绑定等的实现,并在蓝牙Mesh模型规范 [11] 或其他更高层规格中定义。较高层模型规格的例子包括照明和传感器模型。
b.基础模型层
基础模型层定义了访问层的状态、信息以及配置和管理网状网络所需的模型,配置和管理网状网络所需的模型主要是下面4个:
1.Configuration Server model
2.Configuration Client model
3.Health Server model
4.Health Client model

c.访问层
访问层负责定义应用如何利用上层传输层,包括:
定义应用数据的格式
定义并控制在上层传输层执行的加密和解密过程
在将数据上传到更高的层之前,对来自上层传输层的数据 进行验证,判断其是否适 用于该网络和应用
d.上层传输层
从访问层接收访问层载荷包并使用app key对其进行加密和验证,然后将这些信息发送到对端设备的上层传输层,而对端设备的上层传输层会用相同的app key去验证接收到的信息的合法性
内部生成的上层传输层控制消息(friendship),同样的将这个信息传送到对端设备的上层传输层;然而,控制信息则仅在网络层被加密与验证(net key);
e.底层传输层
底层传输层从上层输层接收上层传输PDU,然后将这个信息发送到对端设备的底层传输层,关于对端的概念,比如A-》B,那么就A而言,B就是A的对端设备。
底层传输层主要负责对上层传输层PDU进行分组后传输给对端的底层传输层,对端底层传输层再对分组的PDU进行重组

f.网络层
定义了底层传输层PDU的网络PDU格式,意思就是底层传输PDU被合并并组装成网络PDU,然后再被转送到承载层进行广播
网络层同时负责消息的二次加密解密(net key),网络层PDU数据要进入底层传输层时会用net-key进行解密,同理,底层传输层PDU数据要进入网络层,需要net-key对数据进行加密。

g.承载层
有两种承载方式:PB-ADV与PB-GATT
PB-ADV承载利用BLE的GAP广播和扫描来传送和接收网络PDU
PB-GATT承载让不支持mesh协议栈的设备通过GATT层与mesh网络的节点间接地进行通信(代理)

1.2.2 基本概念
(1)元素和模型
元素包含定义一个节点功能的实例,每个节点都可以包括一个或者多个元素,且至少存在一个叫首要元素的元素,就类似于一个BLE设备可以包括一个或者多个profile一样。
举个例子,一个调光的灯泡通常会有一个元素,这个元素就会向外公开其具备的一个或者多个功能,例如通用开关和亮度控制功能。在这个例子中,Light Lightness Server Model就用于实现开/关和亮度等级控制功能。
另外一个例子就是调光灯泡还包含有一个占用传感器,此时这个节点将会有两个Element(元素):
1.用于灯泡的控制
2.用于传感器的控制
首要元素用于灯泡控制,第二个元素用于传感器的控制。
节点中的每个元素都有一个唯一的地址,称为单播地址。这允许每个元素独立于同一节点内的其他元素进行寻址,也就是说可以通过单播地址找到节点的各个元素

Model一个模型定义了特定功能的实现及交互流程,相当于ble profile。

下面框图解释说明了元素与模型的关系,可以看出,元素包含了模型。模型包含了它的ID、状态、订阅的地址及应用所需数据。
《mesh工作原理》

(2)地址
消息必须从一个地址发送给另一地址的节点,蓝牙mesh定义了三种类型的地址:
1、单播地址:单播地址仅可识别单一元素,在启动配置过程中,单播地址会被分配给设备
2、多播地址:多播地址地址可以由蓝牙技术联盟定义,也可以动态分配,它可以表示一个或多个元素的。目前已经定义了4组蓝牙技术联盟多播地址,分别是All-proxy、All-friends、Al-relay和All-nodes
3、虚拟地址是可以分配给一个或多个节点的一个或多个元素的地址,它采用128位UUID值的形式,任何元素都可以与之相关联,它基本上相当于一个标签

(3)发布和订阅
《mesh工作原理》

1、发送消息的行为称为发布,通常消息被发送到多播或虚拟地址。节点可以订阅特定地址接收发布的消息

2、在上面的图中,我们可以看到节点“1号开关”发布至多播地址“厨房”,而1号电灯、2号电灯和3号电灯节点均订阅了厨房的多播地址,因此可接收并处理发布到该地址的消息。换句话说,可以使用1号开关开启或关闭1号电灯、2号电灯和3号电灯,而2号开关发布到多播地址“餐厅”,此时只有3号电灯节点订阅了这一地址,因此它是2号开关控制的唯一一盏电灯。请注意,这一例子也说明了节点可以订阅一个以上不同地址的消息——既强大又灵活

2:mesh的组网配置过程
启动配置是设备加入mesh网络并成为节点的过程,它会生成各种安全密钥,并且本身也是是一个安全的过程。可使用平板电脑等设备上的应用进行配置,用于配置设备入网的设备称为启动配置设备(Provisioner)。进行配置有以下几个步骤:
《mesh工作原理》

1、Beacon广播
为支持各种不同的蓝牙mesh功能,引入了全新的GAP广播类型<>广播类型。未经配置的设备会通过使用广播<>广播类型的封包来说明它的存在。用户可以以这种方式启动设备广播,例如同时按下几个按钮、或长按某个按钮

2、邀请
启动配置设备将以启动配置邀请PDU(Provisioning InvitePDU)向设备发送邀请。Beacon设备会作出响应,在Provisioning Capabilities PDU中响应自身的信息。

3、交换公共密钥
启动配置设备和要进行配置的设备可以直接或者通过带外(OOB)方式交换他们的公共密钥,这些密钥可以是静态或暂时的。

4、认证
在认证步骤期间,要进行启动配置的设备会通过一定的形式给用户输出一个随机的数字。例如,它可能会闪烁LED灯数次,用户将设备输出的数字输入到启动配置设备中,两台设备之间进行这一随机数的加密交换,以完成两个设备彼此之间的认证。

5、启动配置数据的分配
认证成功完成后,会通过两台设备的私有密钥和交换的对称公共密钥生成会话密钥。会话密钥随后用于保护完成配置过程所需数据的后续分发,包括称为网络密钥(Netkey)的安全密钥。启动配置设备配置完成后,会为配置的设备分配网络密钥Netkey,这是一项mesh安全性参数,也称为IV索引和单播地址,现在的设备被称为节点。

2.1 入网认证的具体流程
入网方式有两种,一种是PB-ADV,一种是PB-GATT,虽入网方式不同,但入网的配置过程是一致的。
由于我们的需求应用是PB-GATT,所以用该方式作为举例
a.连接
provisioner与设备直接建立BLE连接进行配置入网
b.交换公钥

Provisioner与设备进行交换公钥,交换后对数据进行ECDH加密

《mesh工作原理》

c.认证
《mesh工作原理》

加密后生成认证值,再次交换,检测认证值,完成认证

d.配置参数

认证完成后开始配置参数,如net-key,netkey-index,key refresh flag,IV Update Flag,IV_index与主元素的unicast addr
最后设备回复complete,此时入网配置完成

《mesh工作原理》

2.2 mesh工作流程与数据包
入网成功完成后,mesh设备之间,他们的通信方式是广播和接收,是没有绑定连接的。
Mesh网络中包含4个角色:代理(proxy)、中继(relay)、友(friend)、低功耗(LPN)

代理
《mesh工作原理》

代理的作用是与不支持mesh协议栈的设备,以GATT的方式进行连接通信,使得设备可与网络进行通信,图为代理节点的工作流程,代理设备B与不支持PB-ADV的设备A进行连接通信后,设备A就可通过代理B间接与节点C、D、E进行控制状态和读取消息

中继

中继的作用是扩大节点的传送范围。如图所示,当A设备发送单播地址时,若被中继节点B接收到,且B设备无此单播地址,此时B设备会检测数据包里的TTL是否大于1,若大于1,B设备会把此数据包再次广播出去,且TTL-1,当TTL为1时,中继会结束消息广播。

当A设备发送组播地址时,即使中继设备C订阅了这个地址,只要TTL大于1,C也会将消息中继转发出去并TTL-1,因为地址为组播地址,订阅此地址的不只1个节点。

《mesh工作原理》

友与低功耗
低功耗:低功耗节点,该节点长时间处于睡眠状态,在指定时间唤醒,唤醒期间处理所有睡眠期间的消息,处理完消息后再次进入睡眠状态。
友:友谊节点,在LPN睡眠期间,替LPN缓存消息,当LPN唤醒时,将缓存的消息发送至LPN。

1个友节点可与多个低功耗节点建立friendship。当需要改低功耗设备参数时,从发送消息节点到友节点,参数存储在友节点,低功耗设备按指定时间唤醒,向友节点发起收集参数广播,友节点接收到后发送参数广播,低功耗设备得到参数并更改状态

关于低功耗设备与友设备建立friendship与交流的过程。此过程是在上层传输层实现的。Friend request、friend poll等命令,均属于上层传输层操作码类型。

《mesh工作原理》
《mesh工作原理》

数据包格式

《mesh工作原理》

其中需要解释的是:
CTL:控制着消息的性质,有访问和控制两种性质。
TTL:为中继转发次数,转发一次TTL-1,等于1时不再转发
SRC:发射端地址
DST:目标地址(指某节点某元素的单播地址,或某组的组播地址或虚拟地址)
NetMIC:消息校验码

3:举例 realtek 灯控(代码解析)
网络配置参数

这是关于对节点特征的定义
Role:定义扮演的mesh角色,一种是device角色,一种是provisioner角色,前者是被配置设备,后者是给人配置的设备。
Relay:置一表示支持中继角色
Proxy:置一表示支持代理角色
Fn:置一表示支持friend角色
Lpn:置一表示支持低功耗角色
Prov:置一表示在系统开始后会先广播入网配置广播(PB-GATT)
Snb:置一表示状态可以被config beacon改变
Bg_scan:置一表示在系统开始后会进行扫描

灯元素与元素内各类模型(蓝牙联盟官网经典模型)
generic_on_off_server
light_lightness_server
light_ctl_server
light_ctl_temperature_server
light_hsl_server
light_hsl_hue_server
light_hsl_saturation_server


推荐阅读
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 集成电路企业在进行跨隔离网数据交换时面临着安全性问题,传统的数据交换方式存在安全性堪忧、效率低下等问题。本文以《Ftrans跨网文件安全交换系统》为例,介绍了如何通过丰富的审批流程来满足企业的合规要求,保障数据交换的安全性。 ... [详细]
  • Python实现变声器功能(萝莉音御姐音)的方法及步骤
    本文介绍了使用Python实现变声器功能(萝莉音御姐音)的方法及步骤。首先登录百度AL开发平台,选择语音合成,创建应用并填写应用信息,获取Appid、API Key和Secret Key。然后安装pythonsdk,可以通过pip install baidu-aip或python setup.py install进行安装。最后,书写代码实现变声器功能,使用AipSpeech库进行语音合成,可以设置音量等参数。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 开发笔记:计网局域网:NAT 是如何工作的?
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了计网-局域网:NAT是如何工作的?相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法
    本文介绍了解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法,包括检查location配置是否正确、pass_proxy是否需要加“/”等。同时,还介绍了修改nginx的error.log日志级别为debug,以便查看详细日志信息。 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • 本文讨论了编写可保护的代码的重要性,包括提高代码的可读性、可调试性和直观性。同时介绍了优化代码的方法,如代码格式化、解释函数和提炼函数等。还提到了一些常见的坏代码味道,如不规范的命名、重复代码、过长的函数和参数列表等。最后,介绍了如何处理数据泥团和进行函数重构,以提高代码质量和可维护性。 ... [详细]
  • 本文介绍了如何使用JSONObiect和Gson相关方法实现json数据与kotlin对象的相互转换。首先解释了JSON的概念和数据格式,然后详细介绍了相关API,包括JSONObject和Gson的使用方法。接着讲解了如何将json格式的字符串转换为kotlin对象或List,以及如何将kotlin对象转换为json字符串。最后提到了使用Map封装json对象的特殊情况。文章还对JSON和XML进行了比较,指出了JSON的优势和缺点。 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
author-avatar
jiaqi
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有