物联网( IoT ,Internet of things )即“物物相连的互联网”,是互联网基础上的延伸和扩展的网络,将各种信息传感设备与网络结合起来而形成的一个巨大网络,实现在任何时间、任何地点,人、机、物的互联互通。
物联网的基础是将万物连接起来,他是如何连接起来的,就是通过物联网的通信和组网协议。本文将从物联网通信协议现状分析入手,讲述如何从零设计一种物联网组网协议。
1、物联网通信技术分类
物联网的通信技术有很多种,首先从大类上分为有线通信和无线通信。
1.1、有线通信
以太网(Ethernet)是一种局域网通信技术, IEEE组织的IEEE 802.3标准制定了以太网的技术标准,它规定了包括物理层的连线、电子信号和介质访问层协议的内容。
以太网使用双绞线作为传输媒介,在没有中继的情况下,最远可以覆盖200米的范围。最普及的以太网类型数据传输速率为100Mb/s,更新的标准则支持1KMb/s和10KMb/s的速率。
串口通信(Serial port)是一种非常通用的用于设备之间通信的接口,也广泛用于设备以及仪器仪表之间的通信。常见的串口有RS-232(使用 25 针或 9 针连接器)和工业电脑应用的半双工RS-485与全双工RS-422。
CAN通信,CAN是控制器局域网络(Controller Area Network, CAN)的简称,只要用在汽车控制领域,是一种现场总线,是国际上应用最广泛的现场总线之一。
1.2、无线通信
Wi-Fi,是一个基于IEEE 802.11标准的无线局域网技术。“Wi-Fi”常被写成“WiFi”或“Wifi”,但是这些写法并没有被Wi-Fi联盟认可。Wi-Fi往往是许多开发者的一个显而易见的选择,特别是考虑到无线网络的LAN内的家庭环境中普遍存在。
2G/3G/4G是指第二、三、四代移动通信系统协议,是蜂窝移动通信技术,由通讯运营商搭建网络,覆盖范围广,当前主流是4G, 且2G将退出历史舞台。
5G是指第五代移动通信系统协议。5G的性能目标是高数据速率、减少延迟、节省能源、降低成本、提高系统容量和大规模设备连接。正在高速发展之中,但当前通信费用较贵。
Bluetooth是一项短距离无线通信的技术,其核心是基于跳频扩频(Frequency- Hopping Spread Spectrum,FHSS)技术发展而来的。经常看到的BLE是指蓝牙低功耗(Bluetooth Low Energy),他是在蓝牙 4.0新增的功能。相比经典蓝牙,低功耗蓝牙拥有更快的响应速度,最短可在3毫秒内完成连接设置并开始传输数据,这样设备在需要的时候可以及时连接并传输数据。2017年,蓝牙SIG发布蓝牙mesh 1.0版本的协议规格,这是一种基于低功耗蓝牙广播包来实现的mesh网络技术。蓝牙通过蓝牙mesh这项新的协议规格正式进入物联网的领域。
Zigbee是一种低速短距离传输的无线通信协议,是一种高可靠的无线数传网络,主要特色有低速、低耗电、低成本、支持大量网上节点、支持多种网上拓扑、低复杂度、快速、可靠、安全。
LoRa与同类技术相比,提供更远的通信距离。LoRa 网关、烟感、水监测、红外探测、定位、排插等广泛应用物联网产品。
从CSDN发布《2020-2021中国开发者调查报告》中,可以看出WiFi和Bluetooth依旧占领了物联网通信方式的首要地位,分别占比为68.4%,63.1%。
2、如何从零设计一种物联网组网协议
物联网通信协议大致分为两类:一类是组网协议(或者叫接入协议),主要负责网络内设备间如何进行组网,是物联网网络通信的基础。另一类是通信协议,主要是负责网络中数据的交互和通信。
本文主要将介绍如何从零设计一种物联网组网协议。
2.1、协议选型
在设计组网协议之前,首先需要明确使用前面提到的哪种通信技术,是WIFI, Blutooth, LoRa还是ZigBee。
主要是通过网络覆盖范围,通信速率,功耗,成本等几个因素进行选择。
2.2、定义组网协议规范
选择了通信技术之后,就需要定义组网协议的规划。
笔者以在天猫精灵智能音箱上实现的基于蓝牙的极速配网协议来做说明。
由于是基于蓝牙的组网协议,并且完全使用蓝牙的双向广播包来组网信息的交互,所以主要是定义蓝牙广播包的格式和数据传输规范。
广播包格式
极速配网中所有的数据通信以蓝牙广播包的方式,蓝牙广播包格式遵循蓝牙4.0规范,使用ADV_NONCONN_IND类型广播包,由若干AD Structure组成(参见Bluetooth 4.2 Core Specification, Volume 3, Part C, Chapter 11),每一个ADStructure结构由Length、AD Type、AD Data组成。如下图所示:
advertising or Scan Response data 格式
接入阿里巴巴物联平台的蓝牙设备的广播包必须包含阿里巴巴制定的厂商自定义格式(Manufacturer Specific Data,AD Type:0xFF)。如下图所示:
Field |
Size(Octets) |
value |
Notes |
|
Flags |
length |
1 |
0x2 |
Flags length |
AD Type |
1 |
0x1 |
Flags Type |
|
Flags |
1 |
根据实际情况填写 |
bit1 必须为 1 (LE General Discoverable Mode) |
|
Manufacturer Specific Data |
Length |
1 |
根据实际长度填写 |
Manufacturer Specific Data Length |
AD Type |
1 |
固定 0xFF |
Manufacturer Specific Data Type |
|
Company ID |
2 |
固定 0x01A8 |
Company Identifiers,0x01A8为阿里巴巴公司编码 |
|
VID |
1 |
0x0D |
低四位为阿里巴巴蓝牙规范版本号, 当前版本号为D;高四位为feature flag,当前取值为0。整体取值为0x0D |
|
Payload |
可变 |
实际报文内容 |
Ali beacon通用广播包数据格式
数据传输规范
配网广播使用标准BLE广播的方式,数据传输采用单包形式,不支持分包。数据采用大端优先方式传输。
最大数据长度
不拆包的情况下,单包最大传输能力为31个字节,应用数据长度为23个字节(31-8)。
配网流程
配网采用采用对称加密的方式,通过一机一密来保证网络的安全性,三元组秘钥由天猫精灵开放平台生成,通过安全的途径由工厂烧录到每台设备上。 兼容云端标准mesh配网流程。
配网流程如下:
Unprovisioned Device Beacon的格式遵循《天猫精灵蓝牙mesh软件基础规范》中3.2.1节的规定
其中uuid[14]的bit0置为1表示该设备使用极速配网。
配网中广播包数据格式
所有数据包的payload部分都由两部分组成,1个字节的Provisioning Type,N(最大22)个字节的报文内容。
如下图所示:
Field |
Size(Octets) |
Provisioning Type |
1 |
payload data |
0~N |
配网报文的第一个字节为如下:
Name |
Type |
Description |
Provisioning Random |
0x00 |
发送配网随机数 |
Provisioning Confirmation |
0x01 |
发送鉴权数据 |
Provisioning Data |
0x02 |
下发配网参数(NetKey,Addr) |
Provisioning Complete |
0x03 |
配网成功ACK |
RFU |
0x05–0xFF |
待用 |
Provisioning Random
此阶段中配网器会生成随机数给云端并广播给待配网设备,数据格式如下:
Field |
Size(Octets) |
Notes |
Mac |
2 |
待配网设备的mac地址的后2位 |
Random A |
8 |
随机数A,用于计算Confirmation和DeviceKey |
Random B |
8 |
随机数B,用于计算Confirmation和DeviceKey |
表3.3 Provisioning Random数据格式
Random A和Random B不能一样。
Provisioning Confirmation
设备端拿到随机数之后,通过以下算法计算出AuthValueDevice,AuthValueProv和ConfirmationCloud,ConfirmationDevice,将计算出来的ConfirmationDevice值回复给天猫精灵。
数据格式如下:
Field |
Size(Octets) |
Notes |
Mac |
2 |
待设备的mac地址的后2位 |
ConfirmationDevice |
16 |
ConfirmationDevice |
表3.4 Provisioning
ConfirmationDevice = AES-CMACConfirmationKey(Random A||Random B||AuthvalueDevice)
ConfirmationCloud = AES-CMACConfirmationKey(Random B||Random A||AuthvalueProv)
AuthValueProv = SHA256(三元组ProductID,MAC,Secret,RandomB||RandomA)前16字节
AuthValueDevice = SHA256(三元组ProductID,MAC,Secret,RandomA||RandomB)前16字节
ConfirmationKey = SHA256(Random A || Random B || ”ConfirmationKey“)前16字节
Provisioning Data
配网成功,天猫精灵下发配网信息,包含Network Key,以及设备的单播地址,经过加密后下发给设备。数据格式如下
Field |
Size(Octets) |
Notes |
Mac addr |
2 |
为待配网设备mac地址最后2字节 |
Flag |
1 |
bit0:mesh "key refresh flag" bit1:mesh "IV update flag" |
Network Key |
16 |
mesh的networkkey |
IV index |
1 |
IV index的最低字节,最高位补0 |
Unicast Address |
2 |
设备被分配的单播地址 |
表3.6 Provisioning Data数据格式
加密算法如下:
Encrypted provisioning data = prov_data XOR SHA256(ConfirmationCloud||"SessionKey")前22字节
Provisioning Complete
设备在收到天猫精灵下发的Provisioning Data之后,向天猫精灵回复一个Provisioning Complete消息表示配网成功。数据格式如下:
Field |
Size(Octets) |
Notes |
MAC |
6 |
待配网设备的mac地址 |
精灵在收到该消息后,会根据《天猫精灵蓝牙mesh软件基础规范》中3.3.4节的描述进行后续mesh网络配置过程,使用的Device Key以如下算法生成
DeviceKey = SHA256(ConfirmationCloud||"DeviceKey")前16字节
Provisioning Failed
任一方发包最多持续2秒,如果在开始发包后发的3s内没有收到对方的下一条消息,则认为配网失败。设备恢复为未配网状态,精灵会播报配网失败。
2.3、实现协议
配网过程主要分为两个阶段,第一个阶段就是配网,主要是身份校验及认证,并交换必要的配网数据;第二个阶段就是配置,主要对刚加入网络的设备进行初始化的配置。
极速配网只涉及到第一阶段的配网,第二阶段配置完全共用的天猫精灵上SIG Mesh的方式。相比较于SIG Mesh配网过程中多次的Mesh封包的交互,极速配网最主要的区别是只使用两次BLE广播包的交互,完成了对待配网设备的身份校验和认证,并完成了配网数据的下发。
所以极速配网和蓝牙Mesh配网统一在找队友流程里面,所以借用了很多蓝牙Mesh原有的流程。配网过程主要分为三个步骤:
- 发现设备;
- 身份校验和认证;
- 配置;
极速配网和蓝牙Mesh配网两者只在第2步身份校验和认证上有差异,第1步,第3步是完全一样的。在第1步中根据发现设备UUID来判断是一个支持蓝牙Mesh的设备,还是极速配网的设备,然后走不同的“身份校验和认证”流程。
3、总结
本文介绍了物联网通信协议的基本知识,并通过一个实际商用的例子,介绍如何从零设计一种物联网组网协议。
希望读者通过这篇文章能在实际工作了解如何选择合适的物联网通信技术,并设计自己的组网和通信协议。
更多精品好文
如何用几行Python代码在物联网设备上实现语音AI自动识别?
透过ALSA这层迷雾剖析AliOS Things音频框架设计
物联网中也能使用区块链技术?面向IoT的区块链基础架构IoTeX