docker pull emqx/emqx
docker run -it -d --name=emqx -p 18083:18083 -p 9094:8084 -p 9093:8083 -p 1884:1883 -p 9090:8080 emqx/emqx
mkdir /emqx
docker cp emqx:/opt/emqx/etc /emqx
docker cp emqx:/opt/emqx/data /emqx
docker cp emqx:/opt/emqx/lib /emqx
docker cp emqx:/opt/emqx/log /emqx
docker stop emqx
docker rm emqx
allow_anonymous = false
chown -R 1000:1000 /emqx
chown -R 755 /emqx
docker run -it -d --name=emqx \
--privileged=true \
-p 18083:18083 \
-p 9094:8084 \
-p 9093:8083 \
-p 1884:1883 \
-p 9090:8080 \
-v /emqx/etc:/opt/emqx/etc \
-v /emqx/data:/opt/emqx/data \
-v /emqx/lib:/opt/emqx/lib \
-v /emqx/log:/opt/emqx/log \
emqx/emqx
ifconfig
<dependency>
<groupId>org.springframework.integration</groupId>
<artifactId>spring-integration-mqtt</artifactId>
</dependency>
<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>
@Configuration
@Data
@ConfigurationProperties("mqtt")
@Component
@Slf4j
public class MqttConfig {
private String username;
private String password;
private String url;
private String clientId;
private Integer completionTimeout = 2000;
private String inputTopic;
private String deviceInfoReportTopic;
private String heartTopic;
private String outTopic;
private String noticeTopic;
private String httpHost;
@Bean
public MqttPahoClientFactory mqttPahoClientFactory() throws MqttException {
DefaultMqttPahoClientFactory factory = new DefaultMqttPahoClientFactory();
MqttConnectOptions options = new MqttConnectOptions();
options.setCleanSession(true);
options.setConnectionTimeout(0);
options.setKeepAliveInterval(90);
options.setAutomaticReconnect(true);
options.setUserName(username);
options.setPassword(password.toCharArray());
log.info("url:{}",url);
options.setServerURIs(new String[]{url});
factory.setConnectionOptions(options);
return factory;
}
}
package iot.mbus.config;
import iot.mbus.service.MqttSubscribeServer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.integration.annotation.ServiceActivator;
import org.springframework.integration.channel.DirectChannel;
import org.springframework.integration.endpoint.MessageProducerSupport;
import org.springframework.integration.mqtt.core.MqttPahoClientFactory;
import org.springframework.integration.mqtt.inbound.MqttPahoMessageDrivenChannelAdapter;
import org.springframework.integration.mqtt.support.DefaultPahoMessageConverter;
import org.springframework.messaging.MessageChannel;
import org.springframework.messaging.MessageHandler;
import javax.annotation.Resource;
@Configuration
public class MqttSubscribeConfig {
@Resource
private MqttConfig mqttConfig;
@Resource
private MqttPahoClientFactory factory;
@Resource
private MqttSubscribeServer mqttSubscribeServer;
@Bean
public MessageProducerSupport messageProducerSupport(){
MqttPahoMessageDrivenChannelAdapter adapter = new MqttPahoMessageDrivenChannelAdapter("subscribe",factory,mqttConfig.getInputTopic(),mqttConfig.getHeartTopic(),mqttConfig.getDeviceInfoReportTopic());
adapter.setCompletionTimeout(60000);
adapter.setConverter(new DefaultPahoMessageConverter());
adapter.setRecoveryInterval(10000);
adapter.setQos(0);
adapter.setOutputChannel(messageChannel());
return adapter;
}
@Bean
public MessageChannel messageChannel(){
return new DirectChannel();
}
@Bean
@ServiceActivator(inputChannel = "messageChannel")
public MessageHandler messageHandler(){
return mqttSubscribeServer;
}
}
package iot.mbus.config;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.integration.annotation.ServiceActivator;
import org.springframework.integration.channel.DirectChannel;
import org.springframework.integration.dsl.IntegrationFlow;
import org.springframework.integration.dsl.IntegrationFlows;
import org.springframework.integration.dsl.Pollers;
import org.springframework.integration.mqtt.core.MqttPahoClientFactory;
import org.springframework.integration.mqtt.outbound.MqttPahoMessageHandler;
import org.springframework.integration.stream.CharacterStreamReadingMessageSource;
import org.springframework.messaging.MessageChannel;
import org.springframework.messaging.MessageHandler;
import javax.annotation.Resource;
@Configuration
@Slf4j
public class MqttPublishConfig {
@Resource
private MqttConfig mqttConfig;
@Resource
private MqttPahoClientFactory factory;
@Bean
public IntegrationFlow publishFlow(){
return IntegrationFlows.from(CharacterStreamReadingMessageSource.stdin(),
e->e.poller(Pollers.fixedDelay(2000)))
.transform(p->p+"")
.handle(mqttPublish())
.get();
}
@Bean
@ServiceActivator(inputChannel = "publishChannel")
public MessageHandler mqttPublish(){
MqttPahoMessageHandler handler = new MqttPahoMessageHandler("publish",factory);
handler.setDefaultQos(0);
handler.setAsync(true);
return handler;
}
@Bean
public MessageChannel publishChannel(){
return new DirectChannel();
}
}
@Component
@MessagingGateway
public interface MqttPublishService {
@Gateway(requestChannel = "publishChannel")
void send(@Header(MqttHeaders.TOPIC) String topic, Message<byte[]> message);
}
@Component
@Slf4j
public class MqttSubscribeServer implements MessageHandler {
@Autowired
private DeviceLogServiceImpl deviceLogService;
@Override
public void handleMessage(Message<?> message) throws MessagingException {
MessageHeaders headers = message.getHeaders();
String topic = (String)headers.get(MqttHeaders.RECEIVED_TOPIC);
String[] topicArr = topic.split("/");
String payload = (String) message.getPayload();
log.info("收到{}:消息为:{}",topic,payload);
}
}