安装mqtt
下载地址:https://www.emqx.io/cn/downloads
下载成功后解压,在bin目录下打开cmd,输入命令 emqx install
安装成功后输入命令emqx start
启动
启动成功后可登录mq后台127.0.0.1:18083查看,并验证是否安装成功,默认的登录名admin,密码public
springboot集成mqtt
添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-integration</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.integration</groupId>
<artifactId>spring-integration-stream</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.integration</groupId>
<artifactId>spring-integration-mqtt</artifactId>
</dependency>
mqtt配置
spring.mqtt.username=username
spring.mqtt.password=password
spring.mqtt.host-url=tcp://127.0.0.1:1883
spring.mqtt.client-id=clientId
spring.mqtt.service-id=serverId
spring.mqtt.default-topic=topic
spring.mqtt.completionTimeout=10000
MqttConfiguration
@Component
@Data
@EqualsAndHashCode(callSuper = false)
public class MqttConfiguration {
@Value("${spring.mqtt.username}")
private String username;
@Value("${spring.mqtt.password}")
private String password;
@Value("${spring.mqtt.host-url}")
private String host_url;
@Value("${spring.mqtt.client-id}")
private String client_id;
@Value("${spring.mqtt.default-topic}")
private String topic;
@Value("${spring.mqtt.completionTimeout}")
private Integer completionTimeout;
}
mqtt消息生产端
@Configuration
public class MqttOutboundConfiguration {
@Autowired
private MqttConfiguration mqttProperties;
@Bean
public MqttPahoClientFactory mqttClientFactory() {
DefaultMqttPahoClientFactory factory = new DefaultMqttPahoClientFactory();
String[] array = mqttProperties.getHost_url().split(",");
MqttConnectOptions options = new MqttConnectOptions();
options.setServerURIs(array);
options.setUserName(mqttProperties.getUsername());
options.setPassword(mqttProperties.getPassword().toCharArray());
options.setCleanSession(true);
factory.setConnectionOptions(options);
return factory;
}
@Bean
@ServiceActivator(inputChannel = "mqttOutboundChannel")
public MessageHandler mqttOutbound() {
MqttPahoMessageHandler messageHandler = new MqttPahoMessageHandler(
mqttProperties.getClient_id(), mqttClientFactory());
messageHandler.setAsync(true);
return messageHandler;
}
@Bean
public MessageChannel mqttOutboundChannel() {
return new DirectChannel();
}
}
mqtt消息消费端
@Configuration
public class MqttInboundConfiguration {
@Autowired
private MqttConfiguration mqttProperties;
@Autowired
private IMqttService mqttService;
private static Log log = LogFactory.getLog(MqttInboundConfiguration.class);
@Bean
public MessageChannel mqttInputChannel() {
return new DirectChannel();
}
@Bean
public MqttPahoClientFactory mqttClientFactory() {
DefaultMqttPahoClientFactory factory = new DefaultMqttPahoClientFactory();
String[] array = mqttProperties.getHost_url().split(",");
MqttConnectOptions options = new MqttConnectOptions();
options.setServerURIs(array);
options.setUserName(mqttProperties.getUsername());
options.setPassword(mqttProperties.getPassword().toCharArray());
options.setCleanSession(true);
factory.setConnectionOptions(options);
return factory;
}
@Bean
public MessageProducer inbound() {
String[] inboundTopics = mqttProperties.getTopic().split(",");
MqttPahoMessageDrivenChannelAdapter adapter = new MqttPahoMessageDrivenChannelAdapter(
mqttProperties.getClient_id(),mqttClientFactory(), inboundTopics);
adapter.setCompletionTimeout(50000);
adapter.setQos(1);
adapter.setOutputChannel(mqttInputChannel());
return adapter;
}
@Bean
@ServiceActivator(inputChannel = "mqttInputChannel")
public MessageHandler handler() {
return new MessageHandler() {
@Override
public void handleMessage(Message<?> message) throws MessagingException {
String topic = (String) message.getHeaders().get("mqtt_receivedTopic");
Integer qos = (Integer) message.getHeaders().get("mqtt_receivedQos");
mqttService.receiveMqtt(topic,qos,message.getPayload().toString());
}
};
}
}
消息发送接口
@MessagingGateway(defaultRequestChannel = "mqttOutboundChannel")
@Component
public interface MqttGateway {
void sendToMqtt(String payload);
void sendToMqtt(String payload, @Header(MqttHeaders.TOPIC) String topic);
void sendToMqtt(@Header(MqttHeaders.TOPIC) String topic, @Header(MqttHeaders.QOS) int qos, String payload);
void sendToMqtt(@Header(MqttHeaders.TOPIC) String topic, @Header(MqttHeaders.QOS) int qos, @Header(MqttHeaders.RETAINED) String retain, String payload);
}
调用接口发送消息
@RequestMapping(value = "/mqtt")
@RestController
public class MqttController {
@Autowired
private MqttGateway mqttGateway;
@GetMapping(value = "sendToMqtt")
public R sendToMqtt( @RequestParam String payload, @RequestParam String topic) {
mqttGateway.sendToMqtt(payload, topic);
return new R();
}
@GetMapping(value = "sendToMqttByqos")
public R sendToMqttByqos(@RequestParam String payload, @RequestParam String topic, @RequestParam Integer qos) {
mqttGateway.sendToMqtt(topic, qos, payload);
return new R();
}
}