【物联网】记录一次使用RabbitMQ作为MQTT服务端并自定义设备连接权限的经历


目录

前言

一、部署RabbitMQ

二、设备连接鉴权

1.开启插件

2.修改配置

3.连接鉴权

4.消息鉴权

5.参考案例


前言

我们最近使用MQTT协议与设备通信,考虑到客户数据的安全性和私密性、预算的限制,以及线上环境已经在使用RabbitMQ,因此我们决定采用开源的RabbitMQ搭建服务端。我们的目标是支撑上万台设备同时在线。RabbitMQ在集群和高可用性方面表现出色,同时还能满足项目的消息中间件需求。虽然它仅支持3.1.1版本的协议,但对于我们这个项目来说已经足够了。


一、部署RabbitMQ

由于我们目前数据量不大,所以使用单机模式。我本地使用的是win10环境,进行安装测试开发,线上使用的是linux环境。RabbitMQ具体下载安装步骤不是本文重点。

RabbitMQ安装成功后,需要安装插件来开启MQTT协议支持

提供与后端服务交互使用,端口1883

rabbitmq-plugins enable rabbitmq_mqtt

开启成功后,我们可以通过MQTTX这个工具来测试我们的MQTT服务端是否工作正常,使用RabbitMQ默认用户guest进行连接,注意将MQTT版本改为3.1.1

二、设备连接鉴权

1.开启插件

想让RabbiqMQ走我们自定义的鉴权接口,需要先开启 rabbitmq_auth_backend_http 插件,同时该插件还推荐配合 rabbitmq_auth_backend_cache 通过缓存减轻授权认证服务器压力。

rabbitmq-plugins enable rabbitmq_auth_backend_http
rabbitmq-plugins enable rabbitmq_auth_backend_cache

另外使用 rabbitmq-plugins list 命令可以查看已经开启的插件和版本。

2.修改配置

然后我们可以去下载

Netty是一个高性能、异步事件驱动的网络应用框架,常用于开发高发、高可靠性的网络应用程序。MQTT是一种轻量级的消息传输协议,常用于物联网设备与服务器之间的通信。 在Netty中实现MQTT服务端的数据采集,需要完成以下步骤: 1. 使用Netty的ChannelPipeline实现MQTT协议的解析和处理,包括消息的发布、订阅、取消订阅等操作; 2. 通过Netty的ChannelHandlerContext将收到的MQTT消息发送到消息队列(如Kafka、RabbitMQ等); 3. 对消息进行处理,包括存储、转发、分析等操作; 4. 实现MQTT的QoS(服务质量)机制,确保消息的可靠传输。 示例代码: ```java public class MqttServerHandler extends ChannelInboundHandlerAdapter { private final MqttMessageHandler mqttMessageHandler; public MqttServerHandler(MqttMessageHandler mqttMessageHandler) { this.mqttMessageHandler = mqttMessageHandler; } @Override public void channelRead(ChannelHandlerContext ctx, Object msg) { if (msg instanceof MqttMessage) { MqttMessage mqttMessage = (MqttMessage) msg; // 解析MQTT消息 MqttMessageType messageType = mqttMessage.fixedHeader().messageType(); switch (messageType) { case CONNECT: // 处理连接请求 mqttMessageHandler.handleConnect(ctx, (MqttConnectMessage) mqttMessage); break; case SUBSCRIBE: // 处理订阅请求 mqttMessageHandler.handleSubscribe(ctx, (MqttSubscribeMessage) mqttMessage); break; case UNSUBSCRIBE: // 处理取消订阅请求 mqttMessageHandler.handleUnsubscribe(ctx, (MqttUnsubscribeMessage) mqttMessage); break; case PUBLISH: // 处理发布消息请求 mqttMessageHandler.handlePublish(ctx, (MqttPublishMessage) mqttMessage); break; case PUBACK: // 处理QoS=1消息确认 mqttMessageHandler.handlePubAck(ctx, (MqttPubAckMessage) mqttMessage); break; case PUBREC: // 处理QoS=2消息接收 mqttMessageHandler.handlePubRec(ctx, (MqttPubRecMessage) mqttMessage); break; case PUBREL: // 处理QoS=2消息释放 mqttMessageHandler.handlePubRel(ctx, (MqttPubRelMessage) mqttMessage); break; case PUBCOMP: // 处理QoS=2消息完成 mqttMessageHandler.handlePubComp(ctx, (MqttPubCompMessage) mqttMessage); break; case DISCONNECT: // 处理断开连接请求 mqttMessageHandler.handleDisconnect(ctx, (MqttDisconnectMessage) mqttMessage); break; default: break; } } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值