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

蓝牙Mesh学习总结一(蓝牙Mesh介绍)

1.Mesh简介BlutoothLowEnergyMesh是基于低功耗蓝牙技术(BLE)的网状网络解决方案。目前使用的是泛洪网状网络(flooding-basedmeshnetwo

1.Mesh简介

       Blutooth Low Energy Mesh 是基于低功耗蓝牙技术(BLE)的网状网络解决方案。目前使用的是泛洪网状网络(flooding-based mesh network)。

        BLE的通信信道有adversing信道(37、38、39)和data信道(0-37).详细见下图。

        Mesh主要工作在advertising信道上通过scan和advertising进行接受和发送。而data信道主要为了兼容不支持advertising设备,可以通过LE link方式进行通信。通俗一点说就是mesh的网络通信通过广播和扫描来进行收发。广播发送,扫描接受。因为Mesh是网状网络结构,所以中间节点在收到信息后进行判断,如果不是自己需要的则进行转发,从而可以使信息快速、大面积的向外传播。这就是泛洪。而通过广播来进行数据收发,所以Mesh节点使用的通信信道就是广播信道。而有一些不支持广播通信的设备,就需要使用数据信道,通过Proxy(代理)节点,接入到mesh网络中。


1.1Device UUID

        每个设备出厂时被分配一个唯一的16字节UUID,称作Device UUID,用于唯一标识一个Mesh设备,不用依赖蓝牙地址来标识设备。在建立pb-adv link时,需要Device UUID字段来标识device。然后,当mesh device获取mesh地址后,即可用mesh address来唯一标识device。


1.2Mesh地址

        除了建立le link,mesh通信并不依赖蓝牙地址,即节点的蓝牙地址可以一样,或者随机变化。mesh定义了一套长度为2字节的mesh地址,分为unassigned address、unicast address、virtual address和group address,地址范围如下图。

         mesh地址并不是出厂时设置的,而是由用户自己统一管理和分配的。用户在配置设备入网时,通过provisioning流程给设备分配地址provisioner需要确保给每个设备分配的地址是不重复的mesh设备可能不止一个mesh地址,设备内每个element会被分配一个地址,且地址是连续的。多地址被设计用于区分mesh设备上重复的功能模块model


1.3应用模型

         BLE是master连接slave的一对一通信,而mesh网络是多对多通信。因而,mesh网络存在一个天然特性,就是节点之间并不知道其他节点的存在。此时,需要一个第三方,通常是Provisioner,来扮演月老的角色,将节点之间联系起来。例如一个通用的开关,出厂后不知道自己要控制哪盏或者哪些灯,需要provisioner通过configuration配置开关发布publish消息(设置目的地址为单播、组播、广播地址)。如果是组播,则需同事配置相应的灯泡订阅subscribe消息(设置分组,即增加组播地址到订阅表)。然后,开关就可以控制这一盏灯、一组灯或者所有灯。

        Mesh将典型应用场景的操作进行了标准化,每个Mesh设备上的应用是以model为单位进行组织的。model定义了一个model id、一套opcode和一组状态,规定发送和接收哪些消息,分别操作哪些状态。Model和BLE的GATT service是类似的,都用于定义一个特定的应用场景。

        为了支持多个相同的model,定义了element的概念,每个element会单独分配一个element address,且地址是连续的。第一个element(primary element)的element address是在provisioning过程中分配的node address,其他element的地址顺序往后排。例如一个Mesh设备上有两盏完全一样的且可以独立控制的灯,开关设备去控制这个灯设备,需要区分控制哪盏灯。让这两盏灯对应的两个medel分开放在两个element中,这样每盏灯分别有一个mesh address,就可以通过mesh address将两盏灯区分开来了,进行单独控制。当然,两盏灯的model也可以订阅同一个组地址,实现同时控制。这样即能独立控制,也能同时控制。

        设备上element、model组成情况通过composition data page 0表达,provisioner可以通过获取设备的composition data page 0来辨识设备支持的应用。


1.4安全性

        mesh中有很多保护网路安全和隐私的设计,能够抵挡被动监听、中间人攻击、重放攻击、垃圾桶攻击和暴力破解等常见的攻击、

        mesh网络中所有mesh消息都会被加密和校验,防止被窃听和篡改。mesh网络中密钥分两层:Netkey和Appkey,每层最多可以有4096个密钥,通过12Bit的Index标识。AppKey必须绑定有且只能一个NetKey。应用层发送消息会依次经过AppKey和NetKey两层加密和校验,接受信息会依次经过NetKey和AppKey两层解密和校验。采用两层密钥,是为了防止relay节点窃听货篡改消息。例如节点A通过节点B转发给节点C发数据,A/B/C有相同的NetKey,A/C有相同的AppKey,而B没有该AppKey。那么A和C间的应用层通信对B来说是保密的,B只是使用NetKey在网络层帮忙转发,因为没有AppKey而不能进行窃听或者篡改应用层消息

        NetKey支持多个密钥,多密钥可以用来划分网络范围,实现设备间的隔离。Key index为0的是主网络密钥,其余的都是普通的其他子网络密钥。只有主网络中的节点才能参与IV Updata Procedure,并将IV更新信息传递到其他子网中。也就是说,只有主网络节点才能更新IV index网络参数,其他子网的节点只能被动的接收IV index更新。这样不平等的网络密钥设计的目的是约束子网络节点的数据发送频次,防止子网络节点滥用IV index更新而耗尽IV index,从而导致网络安全问题。通常大部分节点在主网络中,部分节点同时处于主网络和某个子网络,少量节点只处于某个子网络,此时这些少量节点只能在子网络内进行局部通信,从而限定这些少量节点的通信范围,例如酒店顾客只能控制自己房间内的灯。

        Device上的NetKey和AppKey是provisioner通过provision和configuration分发和管理的。provisioner是网络管理员,他管理着所有的key,即管理网络中各个device各自可以使用哪些key,而device间只有共享相同的密钥才能相互通信,例如灯和灯的开关使用相同的密钥。provision过程会分发mesh address和有且只有一个NetKey,后续通过configuration来管理,例如通过configuration增加NetKey和AppKey。

        Provision过程还会随机生成一个特殊的AppKey,称作DevKey。DevKey只有provisioner和device两者知道,不和任何其他device共享,保证了provisioner可以单独和某一个device进行秘密的一对一通信。configuration配置被限制只能使用DevKey,只有provisioner才知道device的DevKey,所有只有provisioner才可以配置device。例如,开关只能控制灯泡亮灭,而不能去配置灯泡的分组。


1.5 Provisioning

        device出厂默认是没有地址和密钥的,需要通过provisioning过程从provisioner获取device被provisioning后,就称作node。provisioning过程类似于Bt pairing中的secure connection,采用ecdh算法进行密钥协商和发布,通过authenticaion data进行身份鉴权,能够防止窃听、暴力破解和中间人攻击。

        privisioning流程可以工作在advertising信道和data信道两种信道上,分别对应pb-adv和pb-gatt两种传输层device是被强制要求支持pb-adv的,如果同时支持pb-gatt,被provisioning时可以任选一个。


1.6 Configuration

        网络参数的管理是在model层实现的,称作configuration models。可以配置的网络参数有很多,例如NeyKey和AppKey增加、删除、修改等,model的密钥绑定、消息发布、消息订阅等,节点应用结构Composition data page 0的获取,节点的默认ttl、支持的deature、网络重传次数等

        网络参数的配置被限定为只能使用DevKey,也就是说只有provisioner才能配置节点的网络参数。


1.7 Proxy(代理)

        mesh主要工作在advertising 信道上,为了兼容一些不能灵活自有的advertising的设备,mesh定义了proxy特性。基于BLE GATT profile,定义了proxy service,让这些设备利用BLE link的方式连接到支持proxy的节点上,从而接入Mesh网络


推荐阅读
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 本文介绍了Windows操作系统的版本及其特点,包括Windows 7系统的6个版本:Starter、Home Basic、Home Premium、Professional、Enterprise、Ultimate。Windows操作系统是微软公司研发的一套操作系统,具有人机操作性优异、支持的应用软件较多、对硬件支持良好等优点。Windows 7 Starter是功能最少的版本,缺乏Aero特效功能,没有64位支持,最初设计不能同时运行三个以上应用程序。 ... [详细]
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
  • 本文介绍了OpenStack的逻辑概念以及其构成简介,包括了软件开源项目、基础设施资源管理平台、三大核心组件等内容。同时还介绍了Horizon(UI模块)等相关信息。 ... [详细]
  • 本文记录了在vue cli 3.x中移除console的一些采坑经验,通过使用uglifyjs-webpack-plugin插件,在vue.config.js中进行相关配置,包括设置minimizer、UglifyJsPlugin和compress等参数,最终成功移除了console。同时,还包括了一些可能出现的报错情况和解决方法。 ... [详细]
  • GreenDAO快速入门
    前言之前在自己做项目的时候,用到了GreenDAO数据库,其实对于数据库辅助工具库从OrmLite,到litePal再到GreenDAO,总是在不停的切换,但是没有真正去了解他们的 ... [详细]
  • 超级简单加解密工具的方案和功能
    本文介绍了一个超级简单的加解密工具的方案和功能。该工具可以读取文件头,并根据特定长度进行加密,加密后将加密部分写入源文件。同时,该工具也支持解密操作。加密和解密过程是可逆的。本文还提到了一些相关的功能和使用方法,并给出了Python代码示例。 ... [详细]
  • 2021最新总结网易/腾讯/CVTE/字节面经分享(附答案解析)
    本文分享作者在2021年面试网易、腾讯、CVTE和字节等大型互联网企业的经历和问题,包括稳定性设计、数据库优化、分布式锁的设计等内容。同时提供了大厂最新面试真题笔记,并附带答案解析。 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了源码分析--ConcurrentHashMap与HashTable(JDK1.8)相关的知识,希望对你有一定的参考价值。  Concu ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • macOS Big Sur全新设计大版本更新,10+个值得关注的新功能
    本文介绍了Apple发布的新一代操作系统macOS Big Sur,该系统采用全新的界面设计,包括图标、应用界面、程序坞和菜单栏等方面的变化。新系统还增加了通知中心、桌面小组件、强化的Safari浏览器以及隐私保护等多项功能。文章指出,macOS Big Sur的设计与iPadOS越来越接近,结合了去年iPadOS对鼠标的完善等功能。 ... [详细]
author-avatar
冬瓜
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有