您的位置 首页 php

物联网MQTT协议解决方案选型与实战

应用场景分析:

实现 终端设备 (Android)与 手机 App(Android、IOS)双向通讯的能力。同时有一个服务端可以对这些设备进行监控。

这时我们需要一个MQTT的消息Broker来实现,本文主要是对眼花缭乱的MQTT Broker进行选型,并选择最合适的方案,并对选型方案进行实战验证。

选型的原则:免费、开放、不耦合开发商、功能完备为优先考虑。

1、选型
1.1 个人优秀作品

 名称:jmqtt

地址:

一票否决:无知名成功案例

是否使用:否  

1.2 消息中间件兼职

 名称:RabbitMQ

地址:

一票否决:部分实现MQTT协议

是否使用:否  

 名称:Kafka MQTT Proxy	

地址:

一票否决:无双向通讯能力,仅能从MQTT向Kafka消费数据

是否使用:否  

 名称:ActiveMQ/ActiveMQ Artemis

地址:

一票否决:部分实现MQTT协议

是否使用:否  

1.3 专业型

1.3.1 常用

 名称:Mosquitto

地址:

一票否决:无REST管理API;无内置集群策略

是否使用:否  

1.3.2 企业级

 名称:EMQ X	

地址:

一票否决:收费软件

是否使用:否  

 名称:HiveMQ

地址:	

一票否决:收费软件,社区办不提供集群功能

是否使用:否  

 名称:VerneMQ

地址:	

一票否决:

是否使用:是  

 名称:JoramMQ

地址:	

一票否决:收费软件

是否使用:否	  

1.4 云IoT服务

 名称: 阿里云 物联网	

地址:	

一票否决:收费;使用阿里云的Link SDK,可能会导致云IoT服务商锁定。	

是否使用:否  

1.5 边缘计算

 名称:KubeEdge

地址:	

一票否决:我们当前的方案采用设备直连云端,无Edge边缘计算节点

是否使用:否  

 名称:K3S

地址:	

一票否决:我们当前的方案采用设备直连云端,无Edge边缘计算节点

是否使用:否  

1.6 结论

从上面选型过程中,可得出最终结论:选型为 VerneMQ

VerneMQ是一个高性能、分布式的MQTT broker。它可实现在普通硬件上的水平和垂直扩展,支持大量并发的发布者和消费者,并且能维持低延迟和容错的功能。VerneMQ可作为IOT平台和智能设备可靠的消息枢纽。

1.6.1 成功案例

1.6.2 VerneMQ的功能

  • QoS 0, QoS 1, QoS 2 消息级别支持
  • 基于文件的认证和授权
  • 基于数据PostgreSQL, MySQL , Redis & MongoDB的认证和授权
  • Bridge 支持
  • $SYSTree用来监控和报告
  • TLS (SSL) 加密
  • Websockets 支持
  • 集群支持
  • 日志支持 (Console, Files, Syslog)
  • 报告导出到Graphite
  • 报告导出到Prometheus
  • 扩展插件架构
  • 共享订阅
  • 单客户端多个会话支持
  • 会话负载均衡
  • 消息负载调整
  • 消息负载切断 (为了保护系统)
  • 离线消息存储 (基于LevelDB)
  • 队列可处理 FIFO 或 LIFO 风格的消息.
  • PROXY v2 协议
  • Lua插件脚本支持
  • Webhooks
  • HTTP管理API

2、快速开始

2.1 快速部署

  • 下载安装 Docker Machine
  • 编写 single.yml 文件
 version: '3'

services:
  vmq:
    image: vernemq/vernemq
    environment:
      - DOCKER_VERNEMQ_ACCEPT_EULA=yes
      - DOCKER_VERNEMQ_ALLOW_ANONYMOUS=on
    ports:
    - 1883:1883
    - 8080:8080
    - 8888:8888
    - 8883:8883  
  • 启动vernemq
 docker-compose -f single.yml up -d  

2.2 客户端测试

  • 下载安装 MQTTBox
  • 添加MQTT Client,名称为 device1 ,username也为 device1 ,代表一个唯一的智能设备,注意MQTT broker地址为 localhost:1883

  • 再添加一个MQTT Cliet,名称为 App1 ,Username也为 App1 ,代表标识一个唯一手机应用:

  • 此时MQTTBox上显示有两个在线的客户端:

2.3 场景模拟

2.3.1 设备向手机发送信息,手机监听信息

  • 设计 Topic 名称: App/call/App1 ,第一个 App 表示设备类型, call 表示动作, App1 作为手机App的唯一标识;
  • device1 客户端页面,向 Topic : App/call/App1 发布消息,先不要点击 Publish

  • App1 客户端监听 App/call/App1 ,可以将 call 换成通配符 + ,这样便可监听各种类型的动作,将 App1 也换成通配符 + ,可以监听不同手机的事件,填好Topic后点击 Subscribe

  • 此时我们在 device1 客户端界面点击 Publish 按钮,发布的内容为 {‘caller’:’device1′}
  • 此时查看 App1 的订阅界面接收到的信息:

2.3.2 手机向设备发送信息,设备监听信息

  • 设计 Topic 名称: device/open/device1 ,第一个 device 表示设备类型, open 表示动作, device1 作为设备的唯一标识;
  • App1 客户端页面,向 Topic : device/open/device1 发布消息,先不要点击 Publish

  • device1 客户端界面,监听 device/open/device1 ,可将 open 改为通配符 + ,可监听多个动作,填好后点击 Subscribe

  • 此时我们在 App1 客户端界面点击 Publish 按钮,发布的内容为 {‘caller’:’App1′}
  • 此时查看 device1 的订阅界面接收到的信息:

2.4 集群状态监控

访问vernemq集群状态界面:

2.5 集群健康监控

访问vernemq集群健康接口:

2.6 HTTP API管理

2.6.1 创建管理API key

 $ docker exec docker_vmq_1 vmq-admin api-key create  

docker_vmq_1 为容器名称,此处生成的key为:

 gkhQzMgMsWqxEFJcd8HfwqbQ5fAbeCKb  

2.6.2 设备状态

使用Postman访问

2.6.3 设备掉线主动通知

MQTT协议支持Last Will功能,设备离线会像Will Topic( device/dead/device1 )里发送消息:

我们只需要监听Will Topic: device/dead/+ 就知道哪台设备离线了。

3、MQTT各端客户端

3.1 后台

(可不用了解底层API)

(可与Android通用API)

3.1 设备

3.2 手机

3.2.1 Android

3.2.2 IOS

(1.6k)

(star:1k)

(star:452)

(start:228)

文章来源:智云一二三科技

文章标题:物联网MQTT协议解决方案选型与实战

文章地址:https://www.zhihuclub.com/77632.shtml

关于作者: 智云科技

热门文章

网站地图