Springboot整合MQTT

=============== 发布端================
发布端连接得到sampleClient实例

package com.chalk.mqtt.publish;

import com.chalk.common.constant.MqttConstants;
import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

/**
 * @author gluoh
 * @Description 发布客户端连接
 * @date 2021/02/26 11:30
 */
@Component
public class PublishConnect {
   
    @Value("${mq.broker}")
    private String broker;

    public MqttClient connectMqttClient(MqttPublishDto mqttPublishDto, MqttConnectOptions mqttConnectOptions) throws MqttException {
   
        // 内存存储
        MemoryPersistence persistence = new MemoryPersistence();
        // 创建客户端
        MqttClient sampleClient = new MqttClient(broker, MqttConstants.DEVICE_NUM_FLAG+mqttPublishDto.getDeviceNum(), persistence);
        // 在重新启动和重新连接时记住状态
        mqttConnectOptions.setCleanSession(false);
        // 设置回调
        sampleClient.setCallback(new PublishCallback());
        // 建立连接
        sampleClient.connect(mqttConnectOptions);
        return sampleClient;
    }
}

发布主题的回调类

package com.chalk.mqtt.publish;

import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
import org.eclipse.paho.client.mqttv3.MqttCallback;
import org.eclipse.paho.client.mqttv3.MqttMessage;

/**
 * @author gluoh
 * @Description 发布主题的回调类
 * @date 2021/02/26 10:46
 */
public class PublishCallback implements MqttCallback {
   

    /**
     * 在断开连接时调用
     * @param cause
     */
    @Override
    public void connectionLost(Throwable cause) {
   
        System.out.println("连接断开,可以做重连");
    }

    /**
     * 接收已经预订的发布
     * @param topic
     * @param message
     * @throws Exception
     */
    @Override
    public void messageArrived(String topic, MqttMessage message) throws Exception {
   
        // subscribe后得到的消息会执行到这里面
        System.out.println("Server 接收消息主题 : " + topic);
        System.out.println("Server 接收消息Qos : " + message.getQos());
        System.out.println("Server 接收消息内容 : " + new String(message.getPayload()));
    }

    /**
     * 接收到已经发布的 QoS 1 或 QoS 2 消息的传递令牌时调用。
     * 由 MqttClient.connect 激活此回调。
     * @param token
     */
    @Override
    public void deliveryComplete(IMqttDeliveryToken token) {
   
        System.out.println("deliveryComplete---------" + token.isComplete());
    }
}

通用发布端DTO

package com.chalk.mqtt.publish;

import lombok.Data;

/**
 * @author gluoh
 * @Description
 * @date 2021/02/26 18:21
 */
@Data
public class MqttPublishDto {
   
    // MQTT Client部分
    /** MQTT服务器地址 */
    private String broker;
    /** 主题 */
    private String topic;
    /** 消息内容 */
    private String message;
    /** 账号 */
    private String userName;
    /** 密码 */
    private String password;
    /** 客户端ID */
    private String clientId;
    /** 信号质量 */
    private Integer qos;
    
    /*-------------以下部分根据自己业务处理---------------*/

    // 平台设备部分
    /** 设备号 */
    private String deviceNum;
    /** 消息版本号 */
    private Integer version;
    /** 消息名称 */
    private String name;
    /** 消息值 */
    private String value;

    // 业务部分
    /** 订单ID */
    private String orderId;
}

发布接口

package com.chalk.mqtt.publish.service;

import com.chalk.common.util.Result;
import com.chalk.mqtt.publish.MqttPublishDto;

/**
 * @author gluoh
 * @Description
 * @date 2021/02/26 9:50
 */
public interface MqttPublishService {
   

    /**
     * 项目中发布主题
     * @param mqttPublishDto 发布主题DTO
     * @return
     */
    Result publish(MqttPublishDto mqttPublishDto);

    /**
     * 原始发布主题
     * @param mqttPublishDto 发布主题DTO
     * @return
     */
    Result publishOrigin(MqttPublishDto mqttPublishDto);

}

发布接口实现

package com.chalk.mqtt.publish.service.impl;

import com.chalk.common.constant.MqttConstants;
import com.chalk.common.util.RedisUtil;
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值