物联网利器:MQTT+EMQ

伊言:近期有一个项目是做平台级的物联网项目,本人原本是做项目级别的那时候一般是只用一种通信协议,现在这个要用mqtt、tcp、udp、opc等,兜兜转转了几圈发现这个mqtt还是挺有意思的,在国内bat+三大运营商和国外aws基本都有看到它的影子故在此记录波。

一个物联网的项目不管千变万化,始终逃不过以下四层:感知层(设备层)、接入层、云平台、应用层。其实国内有很多头部云平台都已经提供了这四层的完整解决方案,可以看看之前写的文章,总结了国内八大物联网开放平台。这里首先介绍以比较热门的几个头部大平台:百度云IOT、阿里云IOT、腾讯云IOT、中国移动OneNET。

1、总

物联网的基本架构图:

大体是感知层-接入层-平台层(视产品)-应用层

大体总网上撸的一段话:从感知层到接入层

在IoT 物联网场景中,对我们的终端设备本身无连接互联网能力时,那么数据如何上云呢?

 

IoT物联网平台支持设备 MQTT 直连,也支持的设备挂载到网关上,作为网关的子设备,由网关代理接入IoT物联网平台。这样只需要网关建立一条 MQTT 长连接通道,所有子设备可以复用网关的 MQTT 通道,高效传输数据到云端。

 

这时候网关设备除了自身作为IoT网关设备(拥有身份三元组)与IoT物联网平台建立MQTT连接,收发数据,还要负责子设备管理,包括:

  • 网关添加子设备网络拓扑关系

  • 子设备复用网关mqtt连接通道上线

  • 网关把子设备数据上报到云端

  • 网关接收指令,并转发给子设备

  • 网关上报子设备下线

  • 网关删除子设备网络拓扑关系

 

网关和子设备通信的协议由本地网络决定,可以是 http、mqtt、ZigBee、Modbus、BLE、OPC-UA等,这部分逻辑由网关实现。整体架构如下:

2、什么是MQTT

MQTT(消息队列遥测传输)是ISO 标准(ISO/IEC PRF 20922)下基于发布/订阅范式的消息协议。它工作在 TCP/IP协议族上,是为硬件性能低下的远程设备以及网络状况糟糕的情况下而设计的发布/订阅型消息协议,为此,它需要一个消息中间件 

MQTT是一个由IBM主导开发的物联网传输协议,它被设计用于轻量级的发布/订阅式消息传输,旨在为低带宽和不稳定的网络环境中的物联网设备提供可靠的网络服务。

MQTT是非常流行的设备的接入协议,包括IBM、亚马逊、微软的IoT托管服务都有支持。MQTT基于TCP,实现了异步Pub/Sub,好比发个微信,无需等待对方确认便可以继续,以及为物联网提供了许多体贴的设计,比如QoS,比如“遗言”的设计

注意了这边说的MQTT是一种消息协议。

  • mqtt:一种通信协议,类似人类交谈中的汉语、英语、俄语中的一种语言规范

  • MQ:一种通信通道,也叫消息队列,类似人类交谈中的用电话、email、微信的一种通信方式

  • json:一种内容格式,类似人类交谈中的排比句等方式

要想了解mqtt和tcp的前世今生可以看下这篇文章:你不知道的MQTT物联网协议起源——基于卫星通信的石油管道远程监控

它的核心设计思想是开源、可靠、轻巧、简单,具有以下主要的几项特性:

1.  非常小的通信开销(最小的消息大小为 2 字节);

2.  支持各种流行编程语言(包括C,Java,Ruby,Python 等等)且易于使用的客户端;

3.  支持发布 / 预定模型,简化应用程序的开发;

4.  提供三种不同消息传递等级,让消息能按需到达目的地,适应在不稳定工作的网络传输需求

他的MQTT 遗嘱消息(Will Message)LWT机制在物联网监听接入设备上下状态还是很好用的。

由于它是一个协议需要消息中间件broken。

3、EMQ

消息中间件现在市场上有很多流行的。

最后选用了EMQ,它有分企业版的和免费版的。

它其中对mqtt的遗嘱消息有更强大的支持。

这边有安装EMQ和mqtt测试工具mqtt.fx的教程

官网描述:

有不少接触物联网、MQTT、EMQ X 的童鞋,都会询问如何获取设备上下线状态,因为设备上下状态数据是IoT数据一个基本呈现,很多更上层应用会基于此数据进行展现与分析,对此EMQ君将从MQTT协议侧、 Broker侧来介绍如何获取设备上下线状态:

通用方式

  • MQTT协议-遗嘱机制

MQTT 协议层面获取设备上下线状态,可利用 MQTT 协议遗嘱机制获取设备状态,设备连接时启用遗嘱,在连接到Broker时,设置 Will-Topic、Will-Payload等属性,当Client异常断开时(即设备没有发送Disconnect报文),Broker会发布遗嘱 Topic 与 Payload,但遗嘱机制明显弊端是,只有异常断开才会获得下线状态。

  • MQTT协议-主题设计

从MQTT协议侧,来获取设备上下线状态,更好的技巧和解决方法,可在 MQTT 协议 Topic 侧做设计,可以为 “presence” 进行主题设计。如,“presence/connect/client-id” ,当设备上线时,对其发布上线消息,当设备正常离线时(即设备发送Disconnect报文)对主题”presence/disconnect/client-id“发布其离线消息。

EMQ X 实现方式

以上两种方式,是依赖MQTT 协议的遗嘱机制,或是主题层面的设计来获取设备在线状态,可适用任何实现MQTT 协议的Broker,但 EMQ君,在这里介绍如何简单、快速从EMQ X Broker获取设备在线状态的三种方式。

  • EMQ X 系统主题

EMQ X Broker 上下线状态主题:

上线主题:$SYS/brokers/<node>/clients/<clientid>/connected

下线主题:$SYS/brokers/<node>/clients/<clientid>/disconnected

1)<node>、<clientid> 可分别指定具体节点名、设备ClientID

2)支持'+'、‘#’通配符

mosquitto示例:

mosquitto_sub -i mosuqitto_test -t '$SYS/brokers/+/clients/+/+' -d

通过以上命令订阅系统上下线主题后,如有设备上、下线,将收到其上下线消息,将打印下面的消息:

<!--上线消息>
Client mosuqitto_test received PUBLISH (d0, q0, r0, m0, '$SYS/brokers/emqx@127.0.0.1/clients/emq/connected', ... (163 bytes))
{"clientid":"emq","username":"undefined","ipaddress":"127.0.0.1","connack":0,"ts":1538147419,"proto_ver":3,"proto_name":"MQIsdp","clean_start":true,"keepalive":60}

<!--下线消息>
Client mosuqitto_test received PUBLISH (d0, q0, r0, m0, '$SYS/brokers/emqx@127.0.0.1/clients/emq/disconnected', ... (75 bytes))
{"clientid":"emq","username":"undefined","reason":"closed","ts":1538147420}
  • EMQ X Web Hook插件

EMQ X Broker官方提供了多种插件(更详细插件内容,可到官网查阅),其中emqx-web-hook(EMQ X 2.0版本为emq-web-hook)可将MQTT 消息桥接到用户所指定Web Server,其中包括设备上、下线状态,在Dashboard插件管理或终端emqx_ctl(2.0为emqttd_ctl)启动emqx_web_hook,如有设备上下线,即可获得设备上、下状态数据,以下是通过emq-web-hook桥接Web Server上下数据示例:

POST / HTTP/1.1
content-type: application/json
content-length: 93
te:
host: 127.0.0.1:8087
connection: keep-alive

{"action":"client_connected","client_id":"mqttjs_bc06a34f41","username":"admin","conn_ack":0}

下线消息:

POST / HTTP/1.1
content-type: application/json
content-length: 101
te:
host: 127.0.0.1:8087
connection: keep-alive

{"action":"client_disconnected","client_id":"mqttjs_bc06a34f41","username":"admin","reason":"normal"}
  • EMQ X Enterprise - 直接存取数据库

以上两种方式,在 EMQ X 开源社区版已经支持,商业化版本EMQ X Enterprise可将 MQTT消息(订阅关系、设备在线状态、离线消息、保留消息)更高效存储到后端数据库(MySQL、PostgreSQL、Cassandra、Redis、MongoDB)、消息中间件(Kafka、RabbitMQ),用户可以通过直接查询数据库中相关的数据就得到设备上下线的状态信息。

EMQ X Enterpise设计目标是:

  • 实现企业级高可靠,高可用;
  • 支持承载海量物联网终端的MQTT连接;
  • 支持在海量物联网设备间低延时消息路由,高效存储MQTT消息。

 

  • 0
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值