使用emqx搭建mqtt服务器并简单使用

#安装emqx
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
#创建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
#停止emqx
docker stop emqx
#删除emqx服务器
docker rm emqx
#修改配置文件emqx.conf中的 anonymous匿名连接改为false
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
# 18083-web管理界面端口
# 8083-MQTT/WebSocket 端口
# 8084-MQTT/WebSocket with SSL 端口
# 8080-MQTT执行引擎HTTP API 端口
# 1883-MQTT TCP 协议端口

#开启web_hook
#查看本机网卡ip
ifconfig
#复制ip配置到emqx_web_hook.conf上

  • springboot 使用如下,引入如下依赖
<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>
  • mqtt配置
@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);
   }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值