蓝牙Mesh网关模块系统设计
作者: 叶何 陈国丞
摘要:随着蓝牙技术引入了Mesh组网标准,以及Bluetooth SIG逐步完善蓝牙Mesh协议规范,再结合现存的低功耗蓝牙存量市场,使得蓝牙Mesh较其他短距离无线通信更容易被推广。基于MTK7268和Nordic52840搭建了一个蓝牙Mesh网关系统,借助OpenWrt操作系统以及Nordic提供的PyACI脚本演示了系统的运行过程,通过笔者实际测试,该系统运行稳定,可以满足一般的Mesh应用,如灯和开关组成的Mesh网络。读者在该系统架构的基础上可以进一步拓展集成其他无线协议,如ZigBee、Thread等,使系统成为一个支持多协议的网关。
关键词:物联网;智能网关;BLE;蓝牙Mesh
中图分类号:TP393 文献标识码:A
文章编号:1009-3044(2022)17-0037-04
1引言
伴随5G+AIoT技术的发展,各种物联网相关产品呈爆发性增长趋势,这促进了多种无线通信技术的发展,如ZigBee、Z-Wave、Thread、Wi-Fi、BLE等,物联网产品根据不同的场景需求应用到了上述无线通信技术,这些技术在多个方面表现各异,如协议、性能、可靠性、时延、成本以及覆盖范围等。实际应用需要根据产品的服务属性和应用情景来选择使用它们中的一种或多种组合。这些技术各有所长,其中BLE广泛应用于短距离通信,由于其简单、低功耗、低成本等优势,在几乎所有的智能手机、平板电脑、个人笔记本和其他消费类电子都有用到BLE。得益于BLE的普及上,Bluetooth SIG在BLE的基础上引入了Mesh网络特性,并逐步制定了Bluetooth Mesh组网和协议标准[1]。通过Mesh组网的方法,分散部署的产品通过蓝牙Mesh拓扑网状技术实现多对多(Many-to-Many)通信,通信数据借助中继节点转发,解决了端对端(End-to-End)通信距离不足的问题,突破了单个BLE低功耗蓝牙节点无线电覆盖范围短的壁垒[2-3]。
蓝牙Mesh在BLE低功耗蓝牙的基础上进一步拓展了应用空间,最典型的变化是将点对点星状网络升级为多对多的Mesh拓扑网络,使得网络设备容载量、鲁棒性以及通信距离得到极大的提升,点状星形网络依赖中心节点,设备只能与中心节点直接通信,设备彼此之间无法直接通信,Mesh网络则打破了此限制,设备间可以直接通信或通过中继节点通信,因此Mesh网络可以突破单个节点无线电覆盖范围的限制,消息通过中继节点转发后让网络覆盖范围得到极大的延伸。
2蓝牙Mesh网络
2017年7月,Bluetooth SIG(蓝牙技术联盟)正式宣布蓝牙技术开始支持Mesh网状网络。在Bluetooth Mesh网络中,理论上最大支持32767个节点和127跳(Hop),节点之间没有连接的概念,消息的收发主要通过BLE广播和扫描实现,网络消息可以被相邻节点中继,因此通过一个节点就可以控制和管理整个Mesh网络。蓝牙Mesh采用管理型网络泛洪的方式控制信息的传输,相较于ZigBee用的路由方式更加简单,不需要创建和维护路由表、邻居表等路径信息,Mesh消息通过广播的方式经由多条路径到达目标节点,可有效避免因单点故障带来的通信不可靠问题[4]。蓝牙Mesh节点有中继、代理、好友和低功耗四种基本特性,同一个节点可使能其中的一种或多种特性,如图1所示[5]。中继节点主要将收到的消息再次转发传输出去;代理节点(Proxy)可以和手机等智能设备建立GATT连接,同时可以接收Mesh网络的消息,因此该类节点是普通BLE设备和Mesh网络的通信桥梁;低功耗节点主要应用于电池供电类设备,它们需要和好友节点配合使用,好友节点替低功耗节点缓存消息,低功耗节点为节省电能,大部分时间都关闭了射频功能,其自身通过周期性唤醒的方式向好友节点请求网络给自己的消息。为实现远程操控和配置管理,Mesh网络一般有一个管理配置节点(Provisioner),它可以创建网络并管理网络中的其他节点,这个节点往往集成在蓝牙Mesh网关,Mesh网关可以通过多种方式访问互联网,从而实现Mesh网络数据上云并接受云端的控制。
3系统架构
本系统采用Nordic52840运行Mesh协议栈,其具备1MB Flash和256kB RAM,充当Mesh网络的启动配置设备(Provisioner),Provisioner通过UART接口与外部控制器交互,完整的网关功能需搭配Nordic官方提供的PyACI(Python Application Control Interface)脚本使用。主控制采用MTK7628芯片,运行OpenWrt操作系统,系统的整体功能框图如2所示。
4软件设计
网关主控制器MTK7628运行OpenWrt操作系统,配置为Station模式通过Wi-Fi连接外部AP访问互联网,网关的主体业务逻辑运行在MTK7628上,如子设备管理、协议转换和本地场景等。网关业务架构如图3所示,gateway_proxy为网关进程,该进程下包含了六个子线程,各线程单元处理自身相应的业务功能,其分工如表1所示:
4.1协议结构
蓝牙通信主要涉及两部分协议,Mesh协议和串口协议,以下内容分别对其进行一个简要介绍。
1)Mesh协议
Mesh通信数据包本质上属于BLE广播包,如图4所示,BLE广播包含31个字节,广播包有效数据部分由若干个广播数据单元(AD Structure)构成,一个广播单元分为长度Len、类型Type(AD Type)和数据Data(AD Data)三部分。广播数据中的AD Type标示广播段的含义(如设备名称、UUID等),SIG联盟统一规范了该字段的具体意义。当前有三种类型用于Mesh数据包,分别为0x29(PB-ADV)、0x2A(Mesh Message)和0x2B(Mesh Beacon)[6],因此Mesh网络的Network PDU部分最大占据29个字节。
2)串口协议
Provisioner通过串口Uart与主控MTK7628交互,图5定义了串口协议基本格式 length-opcode-payload,主要分三部分:指令长度、操作码和数据包内容[7],其功能如表2所述。主控MCU和Provisioner之间的所有数据交互全部封装成上述格式,其中数据域payload 主要分两类:Command和Event。Mesh协议栈部分主要运行在Provisioner,主控MCU如果需要操作Mesh网络,可以通过下发相应的Command给Provisioner;协议栈或网络有事件发生,Provisioner通过Event上报给主控。
4.2 子节点配网
蓝牙Mesh设备配网过程又称启动配置(Provisioning),新设备New device需要通过启动配置加入Mesh网络,从而成为Mesh网络中的节点。新设备的启动配置过程通过五个步骤完成[8]:
1)待配网设备发送Beacon信号(Beaconing);
2)启动配置设备(Provisioner)发出配网邀请(Invitation);
3)交换公共密钥(Exchanging public keys);
4)设备相互认证(Authentication);
5)分发启动配置数据(Distribution of Provisioning data)。
图6为设备配网过程示意图,启动配置过程总共包含了10种类型的Provisioning PDU,如表3所示,实际配置过程中使用到的数据包类型根据不同的场景有所差异。
首先,待配网设备New Device会主动广播Unprovisioned Device Beacon信号,启动配置端Provisioner向待配网设备发出邀请(Invitation),在此过程中,如果周围有多个待配网设备,用户可以通过手机、平板或网关的UI界面选择或指定特定设备进行配置。新设备收到Provisioner的邀请后,回应自身具备的能力(Capabilities),Provisioner会根据新设备的能力决定后续采取哪些动作完成剩余阶段的一系列操作,如公钥交互方式、认证方法等。为方便阐述,本文采用No OOB(Out-Of-Band)的方式交换Public Key,Provisioner通过Provisioning Start告诉新设备不使用OOB方式的公钥,实际的Public Key由New device和Provisioner各自生成,再通过Provisioning Public Key发送给对方,双方获得对端设备公钥后进入到认证阶段。在认证环节中,双方各自产生一个随机数,在将到现阶段彼此交互过的所有PDU连同刚生成的随机数进行加密后的哈希值通过Provisioning Confirmation发给对端,接下来Provisioner通过Provisioning Random将刚产生的随机数发给New Device,New Device使用此随机数连同此前已交互的PDU加密计算哈希值,在与Provisioner发送过来的哈希值进行对比,确认无误后,New Device以同样的方式将其产生的随机数发送给Provisioner,Provisioner确认无误后则双方完成对彼此的认证,认证通过后,Provisioner通过Provisioning Data分发启动配置数据。New Device一旦成功获得配置数据(Composition data)则正式成为Mesh网络的节点Node,并通过Provisioning complete告诉Provisioner完成配网过程。上述任何环节中,如果New Device出错或等待数据包超时,则可以通过Provisioning failed结束配网过程,如果New Device配网失败,它应该清除已接收到的所有数据,配网交互过程如果被中断,Provisioner必须从头开始Provisioning新设备。新设备的配网流程如图7所示。
5 实验操作
为方便测试,我们可以先在电脑端将Provisioner基本功能调试好。首先搭建Python开发环境,准备好实验所需工具。开发版预留有Uart转USB接口,将Provisioner连接到电脑后可以通过串口助手和其进行交互,Nordic的串口协议提供了完备的协议栈操作接口,我们可以根据应用具体功能需求进行调用。
5.1 PyACI操作
本实验使用多块Nordic官方开发板nrf52840-DK,其中一块充当Provisioner,其余的充当Mesh节点, Nordic提供了PyACI(Python Application Control Interface)的方式和Provisioner进行交互,打开Powershell窗口,执行interactive_pyaci.py脚本,此脚本主要用于操作Mesh模组,通过调用SDK中的内置API函数实现网络相关操作。通过以下实验步骤可以实现将一个新设备配置到Mesh网络,新设备进入网络后将取得Mesh网络的Network Key和App Key,此时用户可以对设备支持的Model进行控制。
#打开Provisioner所在的端口
1)python.exe .\interactive_pyaci.py -d COM16 -l 5
#选择数据库文件
2) db = MeshDB("database/example_database.json")
#创建Provisioner实例
3)p = Provisioner(device, db)
#扫描待配网的新设备