在上篇《物联网设备的网络连接---上篇》中我们介绍了物联网的网格结构及物联网组网技术
本篇,我们将带您了解物联网传输协议。
三、物联网传输协议
上节介绍的物联网组网技术,主要解决的是物理层和链路层的网络连接技术;当设备都连接到同一个物联网络以后,它们的通信必须使用统一的协议,才能进行数据交换以及协同工作。这就是物联网传输协议的职责,它们大多基于TCP/UDP协议之上,按照图1所示的协议层次,属于应用层协议。
图1 物联网网络层次结构
本节介绍主流的四种物联网传输协议:MODBUS、BACNET、MQTT以及CoAP。
MODBUS
MODBUS是一个针对工业自动化设备的应用层协议,1979年由Modicon公司(后被施耐德公司收购)开发,由于该协议免费公开发行以及简单、易用,大量厂商采用MODBUS作为设备与主机的通信协议,因而它成为事实上的工业标准。MODBUS建立在串行通讯、TCP或UDP传输协议之上。目前广泛应用于诸如电表、UPS电源、电梯、空气压缩机等工业设备。
MODBUS的基本数据格式(称为协议数据单元,Protocol Data Unit,简称PDU)是:1字节的功能码加上特定功能相关的数据,如图15所示。
图15 MODBUS-PDU数据格式
常用的功能码如表1所列。注意,对于超过1字节的数据单元,MODBUS使用大端(big-endian)字节顺序。譬如,对于16位整数,高字节在前,低字节在后。
表1 MODBUS协议常用的功能码
功能码 |
说明 |
示例 |
1 |
读一组线圈状态 |
请求:01,00,13,00,13应答:01,03,CD,6B,05 |
3 |
读一组寄存器 |
请求:03,00,6D,00,03应答:03,06,02,2B,00,00,00,64 |
5 |
写一个线圈状态 |
请求:05,00,AC,FF,00应答:05,00,AC,FF,00(原样返回) |
6 |
写单个寄存器 |
请求:06,00,6D,00,01应答:06,00,6D,00,01(原样返回) |
15 |
写一组线圈状态 |
请求:0F,00,13,00,0A,02,CD,01应答:0F,00,13,00,0A |
16 |
写多个寄存器 |
请求:10,00,01,00,02,04,00,0A,01,02应答:10,00,01,00,02 |
与具体的传输协议结合起来,在网络上传输的数据包格式如图16所示。当MODBUS在串行通讯环境中使用时,PDU前面增加一个地址码,后面加上一个16位的CRC校验字;当MODBUS在TCP/IP网络上使用时,前面加上传输标志和协议标志以及一个2字节的长度,和1字节的单元ID,就构成了应用数据帧(即ADU,Application Data Unit)。MODBUS也支持ASCII模式,在这种模式下,每个二进制字节都被转换成两个ASCII字符,因此传输数据量差不多增加一倍。
(a)MODBUS-RTU
(b)MODBUS-TCP
图16 MODBUS-ADU数据格式
MODBUS协议的特点包括:
1.MODBUS协议是标准和开放的,也是免费的,不需要许可费,也不会侵犯知识产权。
2.通信两方是主从关系。通常情况下,控制主机或数据采集方是主通信方,传感器设备是从方。典型的通信方式是:主通信方发起请求并等待响应,从设备对于收到的请求进行应答。这些请求和应答的内容由MODBUS协议来规定(如上面表1所示)。
3.MODBUS的帧格式(包括PDU和ADU)简单、紧凑,易于实现。应用软件使用起来容易,厂商实现也简单。
4.MODBUS-RTU与RS-485都是工业自动化领域中发展起来的,分别对应于应用层通信和物理层/链路层组网,在实践中往往组合起来实现工业设备的联网与通信。而MODBUS-TCP则用于在TCP(和UDP)传输网络上使用。
BACNET
BACNET(Building Automation and Control NETworks)是用于智能建筑的通信协议,也是国际标准化组织(ISO)、美国国家标准协会(ANSI)以及美国采暖、制冷与空调工程师协会(ASHRAE)定义的通信协议。主要用于暖通、照明、门禁、消防等相关的设备与系统。
BACNET有一套相对完整的协议栈定义,从应用层到物理层共有四层,但BACNET的核心在于应用层和网络层,它们是BACNET特有的。这四层协议解释如下:
1.应用层的数据格式是APDU(Application Protocol Data Unit),第一个字节的高4位定义了APDU类型,后面跟上相应的数据结构。
表2 BACNET APDU类型
首字节 |
说明(结构) |
首字节 |
示例 |
0x0X |
已确认的请求 BACnet-Confirmed-Request-PDU |
0x1X |
未确认的请求 BACnet-Unconfirmed-Request-PDU |
0x2X |
简单应答BACnet-SimpleACK-PDU |
0x3X |
复杂应答 BACnet-ComplexACK-PDU |
0x4X |
分段应答Segment ACK |
0x5X |
发生错误 (含错误类别和错误码) |
0x6X |
被拒绝 (含拒绝原因) |
0x7X |
被终止(含终止原因) |
0x8X-0xfX |
保留 |
BACNET的应用层采用了面向对象技术来封装应用层语义,当前的BACNET标准总共定义了54种对象类型
(http://www.bacnetwiki.com/wiki/index.php?title=BACnet_Objects)。
每个BACNET设备都有一个“设备对象”。每个对象都有Object_Identifier 、Object_Name、Object_Type三个属性,其他的属性随对象的不同而不同。对于应用开发而言,BACNET定义了有关这些对象的一套编程模型,包括属性和方法(服务)。关于这一编程模型,可参考
(http://www.bacnet.org/Bibliography/ES-7-96/ES-7-96.htm)。
BACNET也定义了一组服务,允许一个设备从别的设备获取信息,或者向别的设备发送命令,或者向其他一个或多个设备通知某个事件。这些服务被转化成网络上的请求和应答,从而实现网络设备之间的通信。
2.BACNET有自己的网络层,定义了NPDU(Network layer Protocol Data Unit),其格式如图17所示。BACNET支持广播传输。NPCI控制字节决定了后面出现的内容。
图17 BACNET-NPDU数据格式
3.BACNET没有定义自己的链路层和物理层,而是支持已有的物理网络和链路层协议。BACNET支持的物理网络包括ARCNET、以太网、RS-232、RS-485以及LonTalk,链路层支持PTP(针对RS-232)、MS/TP(针对RS-485),以及IEEE 802.2和LonTalk链路层协议。在实践中,由于以太网广泛普及,在UDP协议基础上来传输BACNET网络层消息是相对合理和常见的,这称为BACNET/IP。然而,相对于BACNET/Ethernet,BACNET/IP会增加每个物理网络包的数据量,但软件开发要简单很多。
BACNET作为一个拥有30多年历史的智能建筑通信协议,具有以下特点:
a.BACNET是标准协议,也是开放的,在楼宇自控设备市场上得到广泛的支持。
b.在应用层采用面向对象的技术来定义软件编程接口,对应用程序的开发比较友好,它支持模拟量输入/输出、数字量输入/输出、分组、时间计划等楼宇管理相关的功能,但是对于协议实现和协议分析显得过于复杂。
c.支持设备间双向通信及广播通信。
d.协议的开销较高,在窄带网络上容易传输超时。
MQTT
MQTT(Message Queuing Telemetry Transport)是一个轻量级的机器与机器(M2M)之间的连接协议,适合于物联网设备进行通信,它最初由IBM提出,现在已成为OASIS(结构化信息标准促进组织)标准。为了适应大量物联网设备的通信需要,MQTT没有采用传统的请求/应答模式,而是采用发布/订阅模式来传递信息,如图18所示。发布者和订阅者不直接通讯,而是通过一个物联网服务器进行消息传递,这样可以控制消息的发送逻辑和频率。
图18 MQTT的发布/订阅通信模式
实际上,在移动互联网(主要是移动终端和移动服务)上,MQTT也被用于消息推送(PUSH)服务,允许大量的智能手机接收(订阅)移动服务方的通知消息。
MQTT的消息结构非常简单,每个消息由三部分组成:固定头、可变头、载荷,如图19所示。
图19 MQTT消息格式
MQTT消息有15种类型,每个消息的第一个字节(即图19中的控制字节)的高4位决定了消息的类型,如表3所示。控制字节的低4位取决于消息的类型。接下来的剩余长度是指后面的可变头和载荷部分的总长度,用1至4个字节来表达,取决于该长度值是否超过127、16,383或2,097,151。
表3 MQTT消息的类型
MQTT控制字节的高4位 |
类型 |
MQTT控制字节的高4位 |
类型 |
0 |
保留 |
8 |
SUBSCRIBE:客户到服务器的订阅请求 |
1 |
CONNECT:客户到服务器的连接请求 |
9 |
SUBACK:服务器到客户的订阅确认 |
2 |
CONNACK:服务器给客户的连接确认 |
10 |
UNSUBSCRIBE:客户到服务器的解除订阅请求 |
3 |
PUBLISH:发布消息,客户给服务器,或服务器给客户 |
11 |
UNSUBACK:服务器到客户的解除订阅确认 |
4 |
PUBACK:发布确认 |
12 |
PINGREQ:客户到服务器的Ping请求 |
5 |
PUBREC:发布已收到 |
13 |
PINGRESP:服务器到客户的Ping应答 |
6 |
PUBREL:发布解除 |
14 |
DISCONNECT:解除连接通知,客户给服务器,或服务器给客户 |
7 |
PUBCOMP:发布已完成 |
15 |
AUTH:认证消息交换 |
有些类型的MQTT消息会在固定头后面包含可变头部分,其内容取决于具体的消息类型。比如:
PUBLISH(要求QoS>0)、PUBACK、PUBREC、PUBREL、PUBCOMP、SUBSCRIBE、SUBACK、UNSUBSCRIBE、UNSUBACK类型的消息在可变头部分都会包含一个包标识符(Packet Identifier)域,用于标识一个MQTT发布或订阅。在可变头的后面部分是一组属性(Properties),这些属性跟该消息的具体内容相关。
在MQTT消息的最后部分是载荷(Payload)部分,比如,在PUBLISH消息中,Payload部分就是应用消息本身。
有关MQTT消息的细节,可以参考MQTT规范(http://mqtt.org/documentation)。从以上的MQTT消息类型列表,我们不难看出,MQTT规范定义了客户与服务器之间建立/取消连接、发布消息、订阅消息,以及PING(测试连接有效)和认证身份的过程。
MQTT是一个应用层协议,它建立在客户与服务器之间已经有一个能提供有序的、不会丢数据的字节流传输能力的传输协议基础之上。通常情况下,底层协议是TCP,也可以是安全的传输协议TLS,但不能是UDP。
MQTT作为一个物联网协议,具有以下特点:
1.消息紧凑,协议本身的开销非常小,尽可能地降低网络流量。
2.基于TCP传输协议(或安全传输协议TLS)。
3.使用发布/订阅模式,提供一对多的通信模型,解除了消息源与目的地之间的耦合。用主题(topic)的概念来描述发布或订阅,并提供了主题过滤的能力。
4.提供了三种服务质量(QoS)语义:
“至多一次”,消息发布完全依赖于底层TCP网络。
“至少一次”,确保消息到达,但消息可能会有重复。
“恰好一次”,确保消息到达一次。
5.提供了一套Will消息机制,允许客户与服务器在跨越TCP连接的情况下保持MQTT应用消息的延续性。
6.提供了Ping机制来保持客户与服务器之间的连接。
CoAP
CoAP(Constrained Application Protocol)是IETF的CoRE工作组开发的、针对物联网设备的应用层协议,它相当于物联网设备上运行的HTTP协议,默认运行在UDP之上。它的基本消息模型是请求-应答,支持多播(multicast)模式,因此一个请求可以对应多个应答。CoAP的规范位于RFC 7252(https://tools.ietf.org/html/rfc7252)。
CoAP的消息格式如图20所示。
图20 CoAP消息格式
CoAP协议支持4种类型的消息:CON,客户向服务器发送请求,服务器必须发送应答;NON,服务器不需要发送确认;ACK,对应于CON的应答消息;RST,当收到的消息不认识或错误时,发送重置消息。
CoAP支持GET、PUT、POST和DELETE方法,类似于HTPP协议中的同名方法一样。在CoAP消息的4字节头的8位代码中标识具体的方法。
CoAP的URI方案与HTTP的一致,采用“coap:”前导符,其默认端口是udp 5683。譬如,“coap://example.com/~sensors/temp.xml”指定了一个合法的xml文件资源。
CoAP协议的特点如下:
1.协议简单,与互联网协议(特别是HTTP)的一致性较好,包括URI方案、消息中的方法语义等。
2.默认基于UDP传输协议,支持一对多传输,也可以基于TCP。
3.CoAP的安全性方案采用了DTLS(Datagram Transport Layer Security, 即UDP版本的TLS协议)。
4.CoAP是一个针对资源受限设备的基础传输协议,对于应用层语义(包括设备状态、参数等)不侵入。
除了以上介绍的物联网传输协议以外,物联网设备与服务器也可以直接利用HTTP/Rest,或者WebSocket,但这些协议对于通信双方的软硬件资源要求较高,需要完整的TCP/IP协议栈,在有些情况下并不切实可行。但利用HTTP或WebSocket的优势是,上层应用丰富,有大量的软件和工具支持。本文不再赘述。
本篇主要介绍了物联网传输协议相关知识。
下篇,我们将带您了解物联网操作系统及平台的连接设计,敬请关注。
更多iSysCore Radio好文分享,请点击阅读原文查看。
指令集TM智能科技(Instruction SetTM)成立于2018年8月,由计算机工业界领军人物潘爱民博士创立,集结了来自国内外顶尖高校或著名公司的技术及行业专家,总部及研发中心落户杭州,并在上海、重庆布局子公司以便提供更好的本地化服务。
指令集TM智能科技(Instruction SetTM) 既是一家商业公司,也承载着让世界更加互联和智慧的美好愿望。通过打造安全可控的自主智能操作系统(iSysCoreTMIntelligence Operating System),为数字化智慧转型提供智慧、安全、开放和易用的底层基础软件设施及配套解决方案,助力政企提升效率和价值。
指令集智能科技
http://www.isyscore.com