=============== 发布端================
发布端连接得到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;