springboot整合Mqtt实现

pom

 
 <dependency>
            <groupId>org.eclipse.paho</groupId>
            <artifactId>org.eclipse.paho.client.mqttv3</artifactId>
            <version>1.1.0</version>
        </dependency>

 接收端

package com.sitech.mqtt.mqtt;


@Component
public class ReportMqtt implements MqttCallback {
    @Value("${host}")
    public   String HOST ;
    @Value("${SH_INCOMING_TOPIC}")
    public  String TOPIC;
    @Value("${name}")
    private  String name;
    @Value("${password}")
    private  String passWord ;

    private MqttClient client;
    private MqttConnectOptions options;

    //clientId不能重复所以这里我设置为系统时间
    String  clientid= String.valueOf(System.currentTimeMillis());
    MessageInfo info =new MessageInfo();
    @PostConstruct
    public void result() {
        try {
            // host为主机名,clientid即连接MQTT的客户端ID,一般以唯一标识符表示,MemoryPersistence设置clientid的保存形式,默认为以内存保存
            client = new MqttClient(HOST, clientid, new MemoryPersistence());
            // MQTT的连接设置
            options = new MqttConnectOptions();
            // 设置是否清空session,这里如果设置为false表示服务器会保留客户端的连接记录,这里设置为true表示每次连接到服务器都以新的身份连接
            options.setCleanSession(true);
            // 设置连接的用户名
            options.setUserName(name);
            // 设置连接的密码
            options.setPassword(passWord.toCharArray());
            // 设置超时时间 单位为秒
            options.setConnectionTimeout(10);
            // 设置会话心跳时间 单位为秒 服务器会每隔1.5*20秒的时间向客户端发送个消息判断客户端是否在线,但这个方法并没有重连的机制
            options.setKeepAliveInterval(3600);
            // 设置回调
            client.setCallback(this);
            client.connect(options);
            //订阅消息
            int[] Qos  = {1};
            String[] topic1 = {TOPIC};
            client.subscribe(topic1, Qos);

        } catch (Exception e) {
            log.info("ReportMqtt客户端连接异常,异常信息:"+e);
        }

    }

    @Override
    public void connectionLost(Throwable throwable) {
        try {
            log.info("程序出现异常,DReportMqtt断线!正在重新连接...:");
            client.close();
            this.result();
            log.info("ReportMqtt重新连接成功");
        } catch (MqttException e) {
            log.info(e.getMessage());
        }
    }

    @Override
    public void messageArrived(String topic, MqttMessage message)  {
        log.info("接收消息主题:"+ topic);
        log.info("接收消息Qos:"+ message.getQos());
        log.info("接收消息内容 :"+ new String(message.getPayload()));
        
    }

    @Override
    public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {
        log.info("消息发送成功");
    }
}

 

package com.sitech.mqtt.mqtt;


@RestController
@RequestMapping("/mqtt")
@Component
public class PlatformMqtt implements MqttCallback {


    @Value("${host}")
    private String HOST;
    @Value("${name}")
    private String name;
    @Value("${password}")
    private String passWord;

    private MqttClient client;
    private MqttMessage message;
    private final static Logger log = LoggerFactory.getLogger(PlatformMqtt.class);
    String  clientid= String.valueOf(System.currentTimeMillis());
    @PostConstruct
    public void send() {
        try {
            client = new MqttClient(HOST, clientid, new MemoryPersistence());

        } catch (MqttException e) {
            e.printStackTrace();
        }
        MqttConnectOptions options = new MqttConnectOptions();
        options.setCleanSession(false);
        options.setUserName(name);
        options.setPassword(passWord.toCharArray());
        // 设置超时时间
        options.setConnectionTimeout(10);
        // 设置会话心跳时间
        options.setKeepAliveInterval(3600);
        try {
            client.setCallback(this);
            client.connect(options);
        } catch (Exception e) {
            log.info("platform-Mqtt客户端连接异常,异常信息:"+e);
        }

    }

    @RequestMapping("/request")
    @ResponseBody
    public void publish(@RequestBody InputParameter<Map<String, Object>>  parameter) throws MqttException {
            String body= String.valueOf(parameter.getRequestBody().get("body"));
            String topic= String.valueOf(parameter.getRequestBody().get("topic"));
            topic="DataTopic/"+topic;
            log.info("请求主题为:"+topic+",消息为:"+body);
            message = new MqttMessage();
            message.setQos(0);
            message.setRetained(false);
            message.setPayload(body.getBytes());
            client.publish(topic,message);
    }

    @Override
    public void connectionLost(Throwable throwable) {
        log.info("程序出现异常,正在重新连接...:");
        try {
            client.close();
            send();
        } catch (MqttException e) {
            log.info(e.getMessage());
        }
        log.info("platform-Mqtt重新连接成功");
    }

    @Override
    public void messageArrived(String s, MqttMessage mqttMessage) {

    }

    @Override
    public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {
        log.info("消息发送成功");
    }
}

 

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值