基于RabbitMQ搭建MQTT服务器,并整合Springboot完成通信

1. 安装RabbitMQ并开启MQTT 协议

安装过程略,使用插件开启MQTT协议

rabbitmq-plugins enable rabbitmq_mqtt
rabbitmq-plugins enable rabbitmq_web_mqtt

2. SpringBoot项目引入依赖

        <dependency>
            <groupId>org.springframework.integration</groupId>
            <artifactId>spring-integration-mqtt</artifactId>
            <version>5.5.1</version>
        </dependency>
        <dependency>
            <groupId>org.eclipse.paho</groupId>
            <artifactId>org.eclipse.paho.client.mqttv3</artifactId>
            <version>1.2.0</version>
        </dependency>

3. MQTT连接配置类

@Configuration
public class MqttConfig {

    private static String Servers[] = {"tcp://xx.xx.xx.xx:1883"};
    private static String username = "xxxxx";
    private static String password = "xxxxx";
    

    @Bean
    public MqttConnectOptions getMqttConnectOptions() {
        MqttConnectOptions options = new MqttConnectOptions();
        // 设置是否清空session,这里如果设置为false表示服务器会保留客户端的连接记录,
        // 这里设置为true表示每次连接到服务器都以新的身份连接
        options.setCleanSession(true);
        // 设置连接的用户名
        options.setUserName(username);
        // 设置连接的密码
        options.setPassword(password.toCharArray());
        options.setServerURIs(Servers);
        // 设置超时时间 单位为秒
        options.setConnectionTimeout(10);
        // 设置会话心跳时间 单位为秒 服务器会每隔1.5*20秒的时间向客户端发送心跳判断客户端是否在线,但这个方法并没有重连的机制
        options.setKeepAliveInterval(20);
        // 设置“遗嘱”消息的话题,若客户端与服务器之间的连接意外中断,服务器将发布客户端的“遗嘱”消息。
//        options.setWill("willTopic", WILL_DATA, 2, false);

        return options;
    }

    @Bean
    public MqttPahoClientFactory mqttClientFactory() {
        DefaultMqttPahoClientFactory factory = new DefaultMqttPahoClientFactory();
        factory.setConnectionOptions(getMqttConnectOptions());
        return factory;
    }
}

4. 生产者配置类

@Configuration
public class MqttProducerConfig {

    public static final String CHANNEL_NAME_OUT = "mqttOutboundChannel";

    private static String ClientId = "test/producer";
    private static String Topic = "towerTest";

    @Autowired
    MqttPahoClientFactory mqttClientFactory;

    /**
     * MQTT信息通道(生产者)
     */
    @Bean(name = CHANNEL_NAME_OUT)
    public MessageChannel mqttOutboundChannel() {
        return new DirectChannel();
    }

    /**
     * MQTT消息处理器(生产者)
     */
    @Bean
    @ServiceActivator(inputChannel = CHANNEL_NAME_OUT)
    public MessageHandler mqttOutbound() {
        MqttPahoMessageHandler messageHandler = new MqttPahoMessageHandler(ClientId, mqttClientFactory);
        messageHandler.setAsync(false);
        messageHandler.setDefaultTopic(Topic);
        return messageHandler;
    }
}

5. 监听器配置类

@Configuration
public class MqttListener {

    public static final String CHANNEL_NAME_IN = "mqttInboundChannel";

    private static String ClientId = "test/consumer";
    private static String ListenTopic = "towerTest";

    @Autowired
    MqttPahoClientFactory mqttClientFactory;

    /**
     * MQTT消息通道(消费者)
     */
    @Bean(name = CHANNEL_NAME_IN)
    public MessageChannel mqttInboundChannel() {
        return new DirectChannel();
    }

    /**
     * MQTT消息订阅绑定(消费者)
     */
    @Bean
    public MessageProducer inbound() {
        MqttPahoMessageDrivenChannelAdapter adapter = new MqttPahoMessageDrivenChannelAdapter(ClientId, mqttClientFactory, ListenTopic);
        adapter.setCompletionTimeout(5000);
        adapter.setConverter(new DefaultPahoMessageConverter());
        adapter.setQos(1);
        adapter.setOutputChannel(mqttInboundChannel());
        return adapter;
    }

    /**
     * MQTT消息监听器(消费者)
     * MessageHandler: org.springframework:spring-messaging
     */
    @Bean
    @ServiceActivator(inputChannel = CHANNEL_NAME_IN)
    public MessageHandler handlerTest() {

        return message -> {
            try {
                String string = message.getPayload().toString();
                System.out.println("接收到消息:" + string);
            } catch (MessagingException e) {
                e.printStackTrace();
                //logger.info(e.getMessage());
            }
        };
    }

}

6. 消息发送器

@Component
@MessagingGateway(defaultRequestChannel = MqttProducerConfig.CHANNEL_NAME_OUT)
public interface MqttSender {

    /**
     * 发送信息到MQTT服务器
     *
     * @param data 发送的文本
     */
    void sendToMqtt(String data);

    /**
     * 发送信息到MQTT服务器
     *
     * @param topic   主题
     * @param payload 消息主体
     */
    void sendToMqtt(@Header(MqttHeaders.TOPIC) String topic, String payload);

    /**
     * 发送信息到MQTT服务器
     *
     * qos:
     * 0 至多一次,数据可能丢失
     * 1 至少一次,数据可能重复
     * 2 只有一次,且仅有一次,最耗性能
     *
     * @param topic   主题
     * @param qos     服务质量
     * @param payload 消息主体
     */
    void sendToMqtt(@Header(MqttHeaders.TOPIC) String topic, @Header(MqttHeaders.QOS) int qos, String payload);
}

7. MqttController

@RestController
public class MqttController {

    @Resource
    private MqttSender iMqttSender;
    
    
    /**
     * 发送MQTT消息
     *
     * @param message 消息内容
     * @return 返回
     */
    @PostMapping(value = "/mqtt", produces = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<String> sendMqtt(@RequestParam(value = "msg") String message) {
        System.out.println("================生产MQTT消息================" + message);
        iMqttSender.sendToMqtt(message);
        return new ResponseEntity<>("OK", HttpStatus.OK);
    }


    /**
     * 发送MQTT消息
     *
     * @param message 消息内容
     * @return 返回
     */
    @PostMapping(value = "/mqtt2", produces = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<String> sendMqtt2(@RequestParam(value = "msg") String message) {
        System.out.println("================生产MQTT消息================" + message);
        iMqttSender.sendToMqtt("hello", message);
        return new ResponseEntity<>("OK", HttpStatus.OK);
    }
}
  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
要使用RabbitMQ搭建MQTT服务器,需要遵循以下详细步骤: 1. 安装和配置RabbitMQ: - 下载并安装RabbitMQ,官方网站提供了不同平台的安装程序。 - 安装完成后,启动RabbitMQ服务器。 2. 启用MQTT插件: - 打开终端或命令提示符窗口。 - 运行以下命令来启用MQTT插件: ``` rabbitmq-plugins enable rabbitmq_mqtt ``` - 重新启动RabbitMQ服务器。 3. 创建MQTT用户和虚拟主机: - 打开终端或命令提示符窗口。 - 运行以下命令以创建新的用户和虚拟主机: ``` rabbitmqctl add_user your_username your_password rabbitmqctl set_user_tags your_username administrator rabbitmqctl add_vhost your_vhost_name rabbitmqctl set_permissions -p your_vhost_name your_username ".*" ".*" ".*" ``` 4. 配置MQTT连接参数: - 打开配置文件 `rabbitmq.config`,该文件通常位于 RabbitMQ 安装目录下的 `conf` 文件夹中(例如:`/etc/rabbitmq/rabbitmq.config`)。 - 添加以下配置项来启用 MQTT 监听端口和设置默认虚拟主机: ```erlang [ {rabbit, [ {tcp_listeners, [{"0.0.0.0", 1883}]}, {default_vhost, <<"your_vhost_name">>} ]} ]. ``` - 保存并关闭配置文件。 5. 重启RabbitMQ服务器以应用配置更改。 现在你已经成功搭建了一个MQTT服务器使用RabbitMQ。你可以使用任何MQTT客户端来连接和与服务器进行通信。 请注意,这只是一个简单的演示,实际上你可能需要进一步配置和保护你的MQTT服务器,例如设置TLS/SSL加密、访问控制等。 希望这些步骤对你有所帮助!如果还有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值