实时通信技术作为一项根本性前提,在物联网应用程序的开发工作中扮演着核心角色。想象一下,如果我们能够利用手机与家居环境内的各种小装置进行通信,那么科幻电影中的种种场景将很快变成现实。但如果整个通信过程需要数秒才能完成,那么使用体验无疑会大打折扣。
要说起实时通信技术的发展演变,我们就不能不提即时通讯方案的出现。从历史角度讲,即时通讯产品可以算是最早出现的客户友好型联网实时通信客户端。AOL IM、ICQ以及Jabber正是各类支持实时通信的即时通讯方案中的典型代表。而这一切早在上世纪九十年代就已然出现了。
时至今日,我们开始将着眼点放在开发作用于不同物联网设备之间的通信协议——不过当初构建即时通讯解决方案时积累到的经验仍然适用。目前物闻网设备所广泛使用的三大实时协议包括:XMPP、CoAP以及MQTT。有趣的是,其中的XMPP早在Jabber时代就已经作为一套开放即时通讯协议存在了。
XMPP的全称为可扩展通讯与表示协议。这项立足于XML的TCP通信协议能够以近实时方式在两个甚至更多联网功能实体之间进行结构化数据交换。XMPP当中的现成功能包括表示信息以及联系人名单维护。尽管这两项功能最初都是针对即时通讯需求设计而成,但它们在物联网应用程序当中仍然能够起到不错的效果。鉴于其出色的开放特性并以XML为基础,XMPP已经被扩展至各类公共订阅系统当中——而这也恰好适合物联网应用的实际需求。
利用XMPP作为物联网通信协议,我们能够享受到几大突出优势。首先就是XMPP的分散特性。XMPP的运作方式与电子邮件比较相似,游走于由传输代理构建而成的分布式网络当中,而非高度依赖于单一中央服务器或者代理节点(CoAP与MQTT皆属于这种情况)。与电子邮件一样,每个人都能够轻松运行属于自己的XMPP服务器,这就使得设备制造商以及API供应方能够创建并管理自己的设备网络体系。而由于大家都有能力运行自己的服务器,所以出于安全考虑,我们可以在必要时利用内置TLS加密机制将该服务器隔离在企业内网的安全验证协议之下。
遗憾的是,XMPP也存在着一些弊端。其最大的问题之一就是缺少端到端加密机制。尽管在不少场景之下,这类加密机制基本算是可有可无,但归根结底大多数物联网设备仍然需要利用加密来保障安全。端到端加密机制的缺失无疑会令物联网设备制造商陷入被动当中。
XMPP的另一个问题在于不具备服务质量(简称QoS)控制。在物联网领域,确保消息交付的重要性甚至比即时通讯领域还要高。如果大家的警报系统没能切实收到相关信息并正确触发,那么接下来的后续影响可能会非常可怕。
CoAP的全称为受限应用协议,其开发目的在于允许资源相对有限的设备利用UDP而非TCP通过互联网实现通信。开发人员可以同任意支持CoAP的设备进行交互,具体方式与采用传统REST API的设备完全一致。CoAP的主要适用场景包括低功耗传感器以及需要通过互联网加以控制的设备。
CoAP是一种简单的请求/响应协议(与REST非常相似),且遵循传统的客户端/服务器模式。客户端可以面向资源发出GET、PUT、POST以及DELETE等请求。CoAP数据包采用位字段以最大限度提升内存利用效率,且经常将字符串映射至整数以降低数据包在设备内部以及网络中传输时所占用的带宽。除了数据包体积极度小巧之外,CoAP的另一大优势在于其采用UDP;数据报文使得CoAP能够在各类基于数据包的技术之上起效——例如短信。
所有CoAP消息皆可被标记为“确认”或者“未确认”,并作为应用层级的QoS机制。尽管SSL/TLS加密无法在UDP之上实现,但CoAP使用数据传输层安全(简称DTLS)作为替代——其可以算是TLS的TCP版本。默认加密级别相当于一条3072位的RSA密钥。尽管包含这些强大的安全保障能力,CoAP仍然能够运行在内存仅为10 KB的微控制器当中。
CoAP的弊端之一在于,它属于一对一协议。尽管我们可以通过扩展方式实现组广播,但这种广播能力并非原生存在。除此之外,CoAP的另一大缺陷在于不提供公共订阅消息队列。
MQTT的全称为消息队列遥测传输,这是一种公共订阅消息收发协议。与CoAP类似,它在设计当中同样考虑到运行设备资源有限的状况。MQTT采用轻量级数据包结构设计,旨在最大程度节约内存使用量及运行功耗。联网设备以订阅方式监听托管在MQTT代理端的话题。每一次在其它设备或者服务向该话题发送数据,所有参与订阅的设备都将自动获取到这一更新信息。
MQTT的最大优势在于其公共订阅消息队列机制以及多对多广播能力。有了指向MQTT代理端的长效TCP连接的支持,以有限带宽进行消息收发变得简单而轻松。
MQTT的短板在于,其始终存在的连接限制了设备进入休眠状态的整体时长。如果相关设备在运行中多数处于休眠状态,我们不妨优先选择另一种MQTT协议——MQTT-S,其利用UDP取代原始协议中的TCP。
MQTT的另一大弊端是缺少基础协议层面的加密机制。MQTT被设计为一种轻量化协议,而内置加密的方式会给传输连接增加很大负担。虽然我们也能够在应用程序层级添加定制化安全机制,但这可能需要进行大量的调整工作。
对于每一位有意发挥物联网技术全部固有优势的开发人员来说,了解底层协议都是必不可少的一环。随着这一领域的不断升温,我们在不同设备之间建立高效通信连接时将面临更多技术难题。更重要的是,要想创建出不仅可以与设备交互、更能对其加以控制的API,实时通信的作用可谓不言而喻。当初以帮助人们实现远程通信为目标而诞生的互联网,如今开始衍生出更多更加灵活的使用方式。
作为开发人员,我们有责任探索所有值得发掘的使用方式。了解各类协议及其优缺点将帮助我们构建起出色的解决方案。不过值得强调的是,将实时通信机制添加到技术堆栈当中也将加快我们的开发流程。目前已经有多种后端即服务平台提供现成的实时通信机制。在大多数情况下,我们都能够利用Firebase、Socket.io或者Built.io构建起自己的物联网平台,而且这种方式也能为大家节省下大量开发时间。不过为了尽可能多地收集相关选项并找到最适合当下需求的技术堆栈,我们也有理由对各类现有方案进行深入了解。
原文标题:Know your real-time protocols for IoT apps