当前位置: 首页 > 科技观察

工业物联网核心技术——MQTT(二)

时间:2023-03-16 19:55:33 科技观察

接上一篇《工业物联网核心技术——MQTT(一)》3.MQTT的安全性由于MQTT运行在TCP层,以明文传输,这相当于HTTP的明文传输,使用Wireshark可以完整看到MQTT发送的所有消息,消息说明一目了然,如图1所示。图1Wireshark抓取MQTT数据包,可能会带来以下风险:设备可能被盗;客户端和服务器的静态数据可以访问(可以修改);协议行为可能有副作用;通信可能会被拦截、修改、重定向或披露;错误控制数据包注入。MQTT作为一种传输协议,只专注于消息传输,开发者有责任提供相应的安全功能。安全功能可以从三个层次考虑——应用层、传输层、网络层。应用层:在应用层,MQTT提供了客户端标识符(ClientIdentifier)、用户名和密码,可以对应用层的设备进行认证。传输层:与HTTPS类似,MQTT是基于TCP连接的,还可以加一层TLS。在传输层使用TLS加密是保证安全和防止中间人攻击的好方法。客户端证书不仅可以作为设备的身份证明,还可以用来验证设备。网络层:有条件的可以通过专线连接设备和MQTT代理,提高网络传输的安全性。1.认证MQTT支持两级认证:应用层:MQTT支持客户端ID、用户名和密码认证;传输层:传输层可以使用TLS。除了加密通信,X509证书还可用于对设备进行身份验证。2.ClientIDMQTT客户端最多可以发送65535个字符作为客户端ID(ClientIdentifier)。一般来说,可以使用嵌入式芯片的MAC地址或芯片序列号。虽然使用客户端ID进行身份验证可能不可靠,但在某些封闭环境中可能就足够了。3.用户名和密码MQTT协议支持通过CONNECT消息的用户名和密码字段发送用户名和密码。用户名和密码的认证使用起来非常方便,但是由于是明文传输,使用抓包工具很容易获取到。一般来说,使用客户ID、用户名和密码就足够了。比如支持MQTT协议连接的OneNET云平台就是使用这三个字段作为鉴权。如果您觉得不够安全,您还可以在传输层进行身份验证。4、传输层认证传输层认证如下:TLS握手成功后,MQTT代理可以继续发送客户端的X509证书对设备进行认证,如果设备不合法,则可以连接被终止。使用X509认证的好处是可以在传输层验证设备的合法性,可以在发送CONNECT报文之前阻断非法设备的连接,从而节省后续不必要的资源浪费。而且,MQTT协议在使用TLS运行时,除了提供身份认证外,还可以保证消息的完整性和机密性。5.选择用户数据格式。MQTT协议只是实现了消息传输的格式,并没有限制用户协议遵循某种风格。因此,我们需要在MQTT协议之上定义一套自己的通信协议。例如,如果发布者向设备发布开放消息,则设备可以回复消息并携带返回码。消息格式是否使用二进制、字符串或JSON格式?以下是简单的选型参考。6.十六进制/二进制MQTT本来就是基于二进制实现的,所以用户协议使用二进制实现是一个不错的选择。虽然失去了直观的可读性,但是可以保持流量很小。其实十六进制对于单片机开发者来说并不陌生,因为单片机寄存器是按位操作的,芯片之间的通信也是使用十六进制/二进制。对于没有单片机开发经验的工程师来说,十六进制/二进制可能太原始了。让我们继续看看是否有其他选择。7.字符串对于单片机开发者来说,字符串也是一种选择。例如,通过串口传输的AT命令就是基于字符串通信的。使用字符串方便人们阅读,但对于高级语言开发者来说,键值对(Key-Value)更为流行。四、MQTT好搭档1.JSONJSON中文全称是JavaScript对象标记语言,在这种语言中,一切皆对象。因此,任何支持的类型都可以用JSON来表示,例如字符串、数字、对象、数组等。它的语法规则是:对象表示为键值对;数据以逗号分隔;大括号包含对象;方括号包含数组。JSON层次结构简洁明了,易读易写,易于机器解析生成,有效提高网络传输效率。对于单片机开发者来说,主流的单片机软件开发工具Keil都提供了JSON库,可以用于STC、STM32等单片机开发,所以在单片机上解析JSON不需要自己写JSON解析器或者移植。.如果懒得用JSON库生成或解析,也可以直接使用C语言中的sprintf生成JSON字符串,如:sprintf(buf,"{"String":"%s","Value":%d}","HelloWorld!",12345);这样就可以生成一个{"String":"HelloWorld!","Value":12345}的JSON字符串。2、XMLMQTT协议只负责通信部分。用户协议可以自己选择,当然也可以选择复杂冗长的XML格式。但是既然要选择MQTT+XML,为什么不考虑改用XMPP呢?3.总结综上所述,MQTT+JSON协议具有简洁明了,易于阅读、解析和生成等优点,同时也考虑了服务端开发者和设备端开发者的开发成本。五、MQTT相关的云平台和工具1.支持MQTT的云平台目前,百度、阿里、腾讯的云平台逐渐具备物联网开发套件:腾讯QQ物联网平台正在内测,阿里云物联网套件正在开发中公测其中,两者都需要申请试用,百度云物联网套件已经支持MQTT,可以免费试用一段时间。除了BAT这三大玩家之外,这里还有一些其他支持MQTT的物联网云平台。OneNET云平台:OneNET是中国移动打造的PaaS物联网开放平台。该平台可以帮助开发者轻松实现设备接入和设备连接,快速完成产品开发和部署,为智能硬件和智能家居产品提供完整的物联网解决方案。OneNET云平台已于2014年10月正式上线。CloudBus:CloudBus是一个跨平台的双向实时通信系统,为物联网、App和Web提供实时通信服务。云吧基于MQTT,支持Socket.IO协议,支持RESTfulAPI。2、MQTT服务器如果不想使用云平台,只是单纯玩MQTT,或者只是想监控内网的设备,可以在本地部署一个MQTT服务器。下面介绍几种MQTT服务器:Apache-Apollo:基于ActiveMQ开发的代理服务器,可以支持STOMP、AMQP、MQTT、Openwire、SSL、WebSockets等多种协议,Apollo提供后台管理页面,方便开发操作员管理和调试。EMQ:EMQ2.0,基于Erlang/OTP语言平台开发,支持大规模连接和分布式集群,是一个开源的发布-订阅模式的MQTT消息服务器。HiveMQ:企业级MQTT代理,主要用于企业和新兴的机器对机器M2M通信和内部传输,满足可扩展性、易管理性和安全性等特点,提供免费个人版。HiveMQ提供了一个开源的插件开发包。Mosquitto:一个开源的消息代理软件,实现了消息推送协议MQTTv3.1,提供了一种支持发布/订阅的轻量级消息推送模式。3、MQTT调试工具了解各大平台的MQTT,同时可以在内网部署一个MQTT服务器。那没有调试工具怎么行呢?你想用你最喜欢的语言写一篇吗?当然不是。MQTT调试工具可以考虑使用HiveMQ的MQTT客户端——HiveMQWebsocketsClient,它是一个基于WebSocket的浏览器MQTT客户端,支持主题订阅和发布。4.MQTT等协议目前各大平台都开始支持MQTT协议。与其他协议相比,MQTT有哪些优势?IoT设备可以使用其他协议吗?以下是MQTT与其他协议的对比,供大家参考。5、MQTT与TCPSocket虽然MQTT运行在TCP层之上,但两者之间似乎没有可比性,但我觉得还是有必要描述一下,因为大部分从事硬件或者嵌入式开发的工程师都是直接与它通信在TCP层。从事嵌入式开发的人都应该知道LwIP。LwIP是用于嵌入式系统的开源TCP/IP协议栈。LwIP在确保嵌入式产品具有完整的TCP/IP功能的同时,还能确保协议栈消耗有限的处理器资源,其运行一般只需要几十KB的RAM和40KB左右的ROM。也就是说,只要嵌入式产品使用了LwIP,支持TCP/IP协议栈,就可以使用MQTT协议。由于TCP协议存在粘包和分包的问题,??所以在传输数据时需要自定义协议。如果传输的数据报超过MSS(消息段长度),则必须为协议定义一个消息长度字段,以保证接收端能够通过缓冲区。完整地接收消息。一个简单的协议定义:消息头+消息长度+消息正文。当然,在使用MQTT协议时不需要考虑这个问题。这些MQTT已被处理。MQTT一次最多可以发送256MB的数据,没有考虑粘包和分包的问题。总之,TCP和MQTT本身并不矛盾,只是基于Socket的开发需要处理的东西比较多,而且大部分嵌入式开发模块本身也只是提供Socket接口,供厂商自定义协议。6.MQTT和HTTPHTTP的最初目的是提供一种发布和接收HTML页面的方式,主要针对Web。HTTP是典型的C/S通信方式:请求从客户端发出,服务器端只能被动接收。一个连接只能发送一次请求,得到响应后会断开连接。该协议最初是为了适用于网页浏览器的上网浏览场景而设计的,目前广泛应用于PC、手机、Pad等终端。由于这样的通信特性,HTTP技术很难在物联网设备中实现对设备的反向控制,但也不是不可以实现。我们来看一个Web端的例子。目前,微博等SNS网站上存在大量用户发布的内容。当发布者发布消息,数据传输到服务器进行更新时,需要尽可能将内容实时更新给关注者。网站基于HTTP协议。如果使用HTTP协议检测服务器端是否有内容更新,则客户端必须频繁向服务器端请求确认。要在浏览器中实现这种效果,可以使用Comet技术。Comet是一种基于HTTP长连接的“服务器推送”技术。主要有两种实现模型:基于AJAX的long-polling和基于iframe的以及htmlfile的streaming方式。这两种技术模型在此不再详细展开,感兴趣的读者可以查阅相关资料。如果要实现设备的反向控制,可能需要用到前述的Comet技术。由于需要不断向服务器请求,通信开销会非常大,而且HTTP报文的头部冗长在节省流量方面没有优势。当然,如果你只是简单的让设备定时上报数据而不去控制它,也可以使用HTTP协议。7.MQTT和XMPP最有可能与MQTT竞争的是XMPP协议。XMPP(ExtensibleMessagingandPresentationProtocol)是一种用于实时通信的开放技术,它使用可扩展标记语言(XML)作为交换信息的基本格式。它的优点是协议成熟、功能强大、可扩展性强。目前主要用于很多聊天系统。在消息推送领域,MQTT和XMPP相互竞争。MQTT和XMPP的特点如下:XMPP协议基于重XML,消息量大,交互繁琐;而MQTT协议的固定头只有两个字节,消息体积小,易于编解码;XMPP是基于JID的点对点消息传输;MQTT协议基于主题(Topic)发布订阅模式,消息路由更灵活;XMPP协议使用XML来承载消息,二进制必须经过Base64编码或其他方式处理;MQTT协议没有定义消息的内容格式,可以携带JSON,针对二进制等不同类型的消息,开发者可以有针对性的定义消息格式;MQTT协议支持消息收发确认和QoS保证,具有更好的消息可靠性保证;而XMPP主协议没有定义类似的机制;嵌入式中的C语言多用于设备开发,C语言解析XML的难度很大。MQTT基于二进制实现,没有定义消息的内容格式,嵌入式C语言开发者可以很好的考虑;而XMPP是基于XML的,开发者需要配合协议格式,不能灵活开发。综上所述,在嵌入式设备中,由于需要一种对设备开发人员和服务器开发人员都友好的智能简洁协议,MQTT比XMPP更具优势。8、MQTT和CoAPCoAP也是一个可以和MQTT竞争的协议。它模仿了HTTP的REST模型。服务器以URI的形式创建资源,客户端可以通过GET、PUT、POST、DELETE访问这些资源。协议风格也与HTTP非常相似。例如,如果一个设备有温度数据,那么temperature可以描述为:CoAP://:/sensors/temperature其中是设备的IP,是端口。但是,如果使用CoAP,物联网的背景情况可能会变得复杂。例如,MQTT可以实现最简单的物联网架构:设备+MQTT服务器+APP,移动端或者网页端可以直接从MQTT服务器订阅想要的主题。但是CoAP可能需要这样的架构:CoAP+Web+DataBase+App。CoAP必须通过DataBase才能传递给第三方。至于CoAP和MQTT的优缺点,这里没有定论。但就目前而言,CoAP数据仍然略少。而且,除了应用于物联网领域,MQTT还可以在手机消息推送、在线聊天等领域有所作为。9.总结经过以上对比,我们可以得出以下结论:基于异步发布/订阅的MQTT解耦了消息的发布者和订阅者,基于二进制的实现节省了存储空间和流量,MQTT有更好的消息处理机制可以替代一些应用场景TCP套接字。与HTTP、XMPP相比,MQTT可以选择用户数据格式,分析复杂度低。同时,MQTT还可以应用于手机推送等领域。手机作为连接人与人的入口,恰恰建立了人与物之间的连接,可谓一箭双雕。当然,其他协议也可以作为辅助存在。HTTP可以服务于只需要定期上传数据的设备,而CoAP则更适用于非常有限的移动通信网络。表3直观地展示了上述几种协议的优缺点。