快捷搜索:  汽车  科技

物联网开发平台mqtt模块(物联网MQTT协议解决方案选型与实战)

物联网开发平台mqtt模块(物联网MQTT协议解决方案选型与实战)$ docker exec docker_vmq_1 vmq-admin api-key createdocker_vmq_1为容器名称,此处生成的key为:访问vernemq集群健康接口:http://localhost:8888/health名称:jmqtt 地址:https://github.com/Cicizz/jmqtt 一票否决:无知名成功案例 是否使用:否1.2 消息中间件兼职名称:RabbitMQ 地址:https://www.rabbitmq.com/mqtt.html 一票否决:部分实现MQTT协议 是否使用:否名称:Kafka MQTT Proxy 地址:https://docs.confluent.io/current/kafka-mqtt/index.html 一票否决:无双向通讯能力,仅能从MQTT向Kafka消费数据 是否使用:否名称:Ac

应用场景分析:

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

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

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

物联网开发平台mqtt模块(物联网MQTT协议解决方案选型与实战)(1)

1、选型
1.1 个人优秀作品

物联网开发平台mqtt模块(物联网MQTT协议解决方案选型与实战)(2)

名称:jmqtt 地址:https://github.com/Cicizz/jmqtt 一票否决:无知名成功案例 是否使用:否1.2 消息中间件兼职

物联网开发平台mqtt模块(物联网MQTT协议解决方案选型与实战)(3)

名称:RabbitMQ 地址:https://www.rabbitmq.com/mqtt.html 一票否决:部分实现MQTT协议 是否使用:否

物联网开发平台mqtt模块(物联网MQTT协议解决方案选型与实战)(4)

名称:Kafka MQTT Proxy 地址:https://docs.confluent.io/current/kafka-mqtt/index.html 一票否决:无双向通讯能力,仅能从MQTT向Kafka消费数据 是否使用:否

物联网开发平台mqtt模块(物联网MQTT协议解决方案选型与实战)(5)

名称:ActiveMQ/ActiveMQ Artemis 地址:http://activemq.apache.org/mqtt.html 一票否决:部分实现MQTT协议 是否使用:否1.3 专业型1.3.1 常用

物联网开发平台mqtt模块(物联网MQTT协议解决方案选型与实战)(6)

名称:Mosquitto 地址:https://mosquitto.org 一票否决:无REST管理API;无内置集群策略 是否使用:否1.3.2 企业级

物联网开发平台mqtt模块(物联网MQTT协议解决方案选型与实战)(7)

名称:EMQ X 地址:https://www.emqx.io 一票否决:收费软件 是否使用:否

物联网开发平台mqtt模块(物联网MQTT协议解决方案选型与实战)(8)

名称:HiveMQ 地址: https://www.hivemq.com 一票否决:收费软件,社区办不提供集群功能 是否使用:否

物联网开发平台mqtt模块(物联网MQTT协议解决方案选型与实战)(9)

名称:VerneMQ 地址: https://vernemq.com/ 一票否决: 是否使用:是

物联网开发平台mqtt模块(物联网MQTT协议解决方案选型与实战)(10)

名称:JoramMQ 地址: http://jorammq.com/ 一票否决:收费软件 是否使用:否 1.4 云IoT服务

物联网开发平台mqtt模块(物联网MQTT协议解决方案选型与实战)(11)

名称:阿里云物联网 地址: https://iot.aliyun.com 一票否决:收费;使用阿里云的Link SDK,可能会导致云IoT服务商锁定。 是否使用:否1.5 边缘计算

物联网开发平台mqtt模块(物联网MQTT协议解决方案选型与实战)(12)

名称:KubeEdge 地址: https://kubeedge.io 一票否决:我们当前的方案采用设备直连云端,无Edge边缘计算节点 是否使用:否

物联网开发平台mqtt模块(物联网MQTT协议解决方案选型与实战)(13)

名称:K3S 地址: https://k3s.io 一票否决:我们当前的方案采用设备直连云端,无Edge边缘计算节点 是否使用:否1.6 结论

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

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

物联网开发平台mqtt模块(物联网MQTT协议解决方案选型与实战)(14)

1.6.1 成功案例

物联网开发平台mqtt模块(物联网MQTT协议解决方案选型与实战)(15)

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 -d2.2 客户端测试

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

物联网开发平台mqtt模块(物联网MQTT协议解决方案选型与实战)(16)

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

物联网开发平台mqtt模块(物联网MQTT协议解决方案选型与实战)(17)

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

物联网开发平台mqtt模块(物联网MQTT协议解决方案选型与实战)(18)

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

物联网开发平台mqtt模块(物联网MQTT协议解决方案选型与实战)(19)

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

物联网开发平台mqtt模块(物联网MQTT协议解决方案选型与实战)(20)

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

物联网开发平台mqtt模块(物联网MQTT协议解决方案选型与实战)(21)

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

物联网开发平台mqtt模块(物联网MQTT协议解决方案选型与实战)(22)

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

物联网开发平台mqtt模块(物联网MQTT协议解决方案选型与实战)(23)

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

物联网开发平台mqtt模块(物联网MQTT协议解决方案选型与实战)(24)

2.4 集群状态监控

访问vernemq集群状态界面:http://localhost:8888/status

物联网开发平台mqtt模块(物联网MQTT协议解决方案选型与实战)(25)

2.5 集群健康监控

访问vernemq集群健康接口:http://localhost:8888/health

物联网开发平台mqtt模块(物联网MQTT协议解决方案选型与实战)(26)

2.6 HTTP API管理2.6.1 创建管理API key

$ docker exec docker_vmq_1 vmq-admin api-key create

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

gkhQzMgMsWqxEFJcd8HfwqbQ5fAbeCKb2.6.2 设备状态

使用Postman访问 http://gkhQzMgMsWqxEFJcd8HfwqbQ5fAbeCKb@localhost:8888/api/v1/session/show?--user=device1

物联网开发平台mqtt模块(物联网MQTT协议解决方案选型与实战)(27)

2.6.3 设备掉线主动通知

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

物联网开发平台mqtt模块(物联网MQTT协议解决方案选型与实战)(28)

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

3、MQTT各端客户端3.1 后台

https://docs.spring.io/spring-integration/reference/html/mqtt.html(可不用了解底层API)

https://www.eclipse.org/paho/clients/java/(可与Android通用API)

3.1 设备

https://www.eclipse.org/paho/clients/android/

3.2 手机3.2.1 Android

https://www.eclipse.org/paho/clients/android/

3.2.2 IOS

https://github.com/novastone-media/MQTT-Client-Framework(1.6k)

https://github.com/emqx/CocoaMQTT(star:1k)

https://github.com/mobile-web-messaging/MQTTKit (star:452)

https://github.com/flightonary/Moscapsule(start:228)

猜您喜欢: