天天看点

简谈MQTT和CoAP对比

MQTT是IBM开发的一个即时通讯协议,基于TCP的,号称是可以支持所有的平台。

CoAP是运行于UDP之上,采用数据报方式,并且非常小巧,最小只有4个字节。

可以说两者都是营运物联网大趋势和为了适应M2M而生的,相比于其他的通信协议也有较大的优势。

原文链接:https://www.zhihu.com/question/34767514/answer/87340564 CoAP和MQTT的协议除了考虑设备的TCP/UDP堆栈实现能力和对设备的压力之外,更加注重的考虑点是:

  1. 服务器架构和开发成本;
  2. 应用本身数据流向,流量,频率,持久的需求;
  3. 长连接还是短连接;
  4. 数据分享API的需求;

    MQTT,基于TCP的,其实就是IBM把服务器间异步通讯用的消息队列Message Queue(MQ)中间件前置到IOT接入而已。天生适合多对多(服务器对服务器,设备对服务器,设备对APP),异步,后台应用,以及即时通讯(多客户端对等)场景。不过就是约定了报文头而已,用Redis PubSub/MQ也可以构建。

如果不需要存储数据,最简单的IOT架构:Device+MQTT+APP

如果需要数据持久存储,IOT架构可以是:Device+MQTT+Web+DB(NoSQL/NewSQL/BigData/Lambda)+APP

    CoAP,基于UDP接口,参考HTTP上的REST API,适合数据采集这种多(设备)对一(服务器)场景,系统架构类似于传统Web。但是由于CoAP UDP不是面对连接的,所以方向控制需要高层构建协议。CoAP支持多播,也可以实现一对多场景,但是好像和MQTT不一样。应该是局域网内的多播?了解的兄弟请提点一下。

但总的网站架构迎来类似于传统Web:CoAP+Web+DB+APP。

所以,不足之处就是数据必须流经DB转给第三方。当然,如果Web内部有MQ,可以通过REST API暴露给第三方。变成:

CoAP + Web + DB + APP

     + Redis/MQ + REST + APP

    CoAP大体上是采用数据报方式,可以基于UDP,短消息,以及6LowPAN等传输层。而且大体上在WSN内部可以使用。不过由于CoAP也可以用于网关与云之间通讯,所以现在出现了CoAP over TCP的草案。不过,总觉得该草案受到CoAP RFC7252的约束太大。

    观察最近的BAT动向,都把MQTT作为物联网前置接入套件单列出来作为标准云服务提供。阿里云物联网套件,百度开放云物联网服务IOT,腾讯QQ物联平台,中移动OneNet开放云,Amazon IOT服务......更别提环信,野狗之类原来做IM云服务的,都将MQTT作为IM/IOT共享的接入服务了。 另外,选择采用长连接(TCP)的MQTT,还是无连接(UDP)的CoAP,与应用数据属性有关。对于是维持大量非活动长连接的开销大,还是大量UDP包对于服务器的开销大,我一直没有得到结论。

    MQTT是非常流行的设备的接入协议,包括IBM、亚马逊、微软的IoT托管服务都有支持,而CoAP在这方面几乎没有露面的机会。感觉以下几点是MQTT优于CoAP的主要原因:

  • MQTT基于TCP,在做反控设备的时候比UDP更可靠,比如CoAP走3G、4G的时候甚至需要实现CoAP over TCP,否则反控很不稳定甚至无法联通。
  • MQTT异步Pub/Sub实现,好比发个微信,无需等待对方确认便可以继续,而不像CoAP那样必须等待对方应答才能返回的同步模式。
  • MQTT为物联网提供了许多体贴的设计,比如QoS,比如“遗言”的设计。

继续阅读