物联网开发平台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进行选型,并选择最合适的方案,并对选型方案进行实战验证。
选型的原则:免费、开放、不耦合开发商、功能完备为优先考虑。
1.1 个人优秀作品
名称: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消费数据
是否使用:否
名称:ActiveMQ/ActiveMQ Artemis
地址:http://activemq.apache.org/mqtt.html
一票否决:部分实现MQTT协议
是否使用:否
1.3 专业型1.3.1 常用
名称:Mosquitto
地址:https://mosquitto.org
一票否决:无REST管理API;无内置集群策略
是否使用:否
1.3.2 企业级
名称:EMQ X
地址:https://www.emqx.io
一票否决:收费软件
是否使用:否
名称:HiveMQ
地址: https://www.hivemq.com
一票否决:收费软件,社区办不提供集群功能
是否使用:否
名称:VerneMQ
地址: https://vernemq.com/
一票否决:
是否使用:是
名称:JoramMQ
地址: http://jorammq.com/
一票否决:收费软件
是否使用:否
1.4 云IoT服务
名称:阿里云物联网
地址: https://iot.aliyun.com
一票否决:收费;使用阿里云的Link SDK,可能会导致云IoT服务商锁定。
是否使用:否
1.5 边缘计算
名称:KubeEdge
地址: https://kubeedge.io
一票否决:我们当前的方案采用设备直连云端,无Edge边缘计算节点
是否使用:否
名称:K3S
地址: https://k3s.io
一票否决:我们当前的方案采用设备直连云端,无Edge边缘计算节点
是否使用:否
1.6 结论
从上面选型过程中,可得出最终结论:选型为VerneMQ。
VerneMQ是一个高性能、分布式的MQTT broker。它可实现在普通硬件上的水平和垂直扩展,支持大量并发的发布者和消费者,并且能维持低延迟和容错的功能。VerneMQ可作为IOT平台和智能设备可靠的消息枢纽。
- 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
- 下载安装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上显示有两个在线的客户端:
- 设计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的订阅界面接收到的信息:
- 设计Topic名称:device/open/device1,第一个device表示设备类型,open表示动作,device1作为设备的唯一标识;
- 在App1客户端页面,向Topic:device/open/device1发布消息,先不要点击Publish:
- 在device1客户端界面,监听device/open/device1,可将open改为通配符 ,可监听多个动作,填好后点击Subscribe;
- 此时我们在App1客户端界面点击Publish按钮,发布的内容为{'caller':'App1'}
- 此时查看device1的订阅界面接收到的信息:
访问vernemq集群状态界面:http://localhost:8888/status
访问vernemq集群健康接口:http://localhost:8888/health
$ docker exec docker_vmq_1 vmq-admin api-key create
docker_vmq_1为容器名称,此处生成的key为:
gkhQzMgMsWqxEFJcd8HfwqbQ5fAbeCKb
2.6.2 设备状态
使用Postman访问 http://gkhQzMgMsWqxEFJcd8HfwqbQ5fAbeCKb@localhost:8888/api/v1/session/show?--user=device1
MQTT协议支持Last Will功能,设备离线会像Will Topic(device/dead/device1)里发送消息:
我们只需要监听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 Androidhttps://www.eclipse.org/paho/clients/android/
3.2.2 IOShttps://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)