物联网开发平台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 -d2.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为:
gkhQzMgMsWqxEFJcd8HfwqbQ5fAbeCKb2.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)




