热门标签 | 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网络


推荐阅读
  • 如题:2017年10月分析:还记得在没有智能手机的年代大概就是12年前吧,手机上都会有WAP浏览器。当时没接触网络原理,也不 ... [详细]
  • Docker安全策略与管理
    本文探讨了Docker的安全挑战、核心安全特性及其管理策略,旨在帮助读者深入理解Docker安全机制,并提供实用的安全管理建议。 ... [详细]
  • 解决Win10 1709版本文件共享安全警告问题
    每当Windows 10发布新版本时,由于兼容性问题往往会出现各种故障。近期,一些用户在升级至1709版本后遇到了无法访问共享文件夹的问题,系统提示‘文件共享不安全,无法连接’。本文将提供多种解决方案,帮助您轻松解决这一难题。 ... [详细]
  • Maven + Spring + MyBatis + MySQL 环境搭建与实例解析
    本文详细介绍如何使用MySQL数据库进行环境搭建,包括创建数据库表并插入示例数据。随后,逐步指导如何配置Maven项目,整合Spring框架与MyBatis,实现高效的数据访问。 ... [详细]
  • 本文探讨了如何通过Service Locator模式来简化和优化在B/S架构中的服务命名访问,特别是对于需要频繁访问的服务,如JNDI和XMLNS。该模式通过缓存机制减少了重复查找的成本,并提供了对多种服务的统一访问接口。 ... [详细]
  • 本文介绍了实时流协议(RTSP)的基本概念、组成部分及其与RTCP的交互过程,详细解析了客户端请求格式、服务器响应格式、常用方法分类及协议流程,并提供了SDP格式的深入解析。 ... [详细]
  • 在Linux系统中使用EncFS实现文件夹加密
    为了保护个人隐私或敏感数据不被未经授权的访问,可以通过加密技术来增强安全性。本文介绍如何在Linux系统上使用EncFS工具创建和管理加密文件夹,以确保即使在系统登录状态下,特定文件夹中的数据也保持加密状态。 ... [详细]
  • egg实现登录鉴权(七):权限管理
    权限管理包含三部分:访问页面的权限,操作功能的权限和获取数据权限。页面权限:登录用户所属角色的可访问页面的权限功能权限:登录用户所属角色的可访问页面的操作权限数据权限:登录用户所属 ... [详细]
  • 流处理中的计数挑战与解决方案
    本文探讨了在流处理中进行计数的各种技术和挑战,并基于作者在2016年圣何塞举行的Hadoop World大会上的演讲进行了深入分析。文章不仅介绍了传统批处理和Lambda架构的局限性,还详细探讨了流处理架构的优势及其在现代大数据应用中的重要作用。 ... [详细]
  • 如何高效解决Android应用ANR问题?
    本文介绍了ANR(应用程序无响应)的基本概念、常见原因及其解决方案,并提供了实用的工具和技巧帮助开发者快速定位和解决ANR问题,提高应用的用户体验。 ... [详细]
  • 在尝试启动Java应用服务器Tomcat时,遇到了org.apache.catalina.LifecycleException异常。本文详细记录了异常的具体表现形式,并提供了有效的解决方案。 ... [详细]
  • 深入解析Dubbo:使用与源码分析
    本文详细介绍了Dubbo的使用方法和源码分析,涵盖其架构设计、核心特性和调用流程。 ... [详细]
  • GreenPlum采纳ShareNothing的架构,良好的施展了便宜PC的作用。自此IO不在是DW(datawarehouse)的瓶颈,相同网络的压力会大很多。然而GreenPlum的查问优化策略可能防止尽量少的网络替换。对于首次接触GreenPlum的人来说,必定耳目一新。 ... [详细]
  • ABP框架是ASP.NET Boilerplate的简称,它不仅是一个开源且文档丰富的应用程序框架,还提供了一套基于领域驱动设计(DDD)的最佳实践架构模型。本文将详细介绍ABP框架的特点、项目结构及其在Web API优先架构中的应用。 ... [详细]
  • 本文介绍了 Oracle SQL 中的集合运算、子查询、数据处理、表的创建与管理等内容。包括查询部门号为10和20的员工信息、使用集合运算、子查询的注意事项、数据插入与删除、表的创建与修改等。 ... [详细]
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社区 版权所有