MQTT系列(四)

1 在Java中使用MQTT

1.1 Eclipse Paho Java Client

具体步骤:

1、创建一个Spring Boot项目,添加如下依赖

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>3.0.5</version>
</parent>

<dependencies>

    <!-- spring boot整合junit单元测试的起步依赖 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
    </dependency>

    <!-- mqtt java客户端依赖 -->
    <dependency>
        <groupId>org.eclipse.paho</groupId>
        <artifactId>org.eclipse.paho.client.mqttv3</artifactId>
        <version>1.2.5</version>
    </dependency>

</dependencies>

2、建立连接代码实现

 @Test
    public void createConnection() throws MqttException {
    
        // 定义链接相关参数
        String broker = "tcp://192.168.136.147:1883";
        String username = "zhangsan";
        String password = "123";
        String clientid = "mqtt_java_client_01";
    
        // 创建MqttJava客户端对象
        // MqttClientPersistence: 代表一个持久的数据存储,用于在传输过程中存储出站和入站的信息
        MqttClient client = new MqttClient(broker, clientid , new MemoryPersistence());   
        MqttConnectOptions options = new MqttConnectOptions();
        options.setUserName(username);
        options.setPassword(password.toCharArray());
        client.connect(options);
    
        // 阻塞当前线程
        while (true) ;
    }

3、发布消息代码演示

@Test
public void sendMessage() throws MqttException {

    // 定义链接相关参数
    String broker = "tcp://192.168.136.147:1883";
    String username = "zhangsan";
    String password = "123";
    String clientid = "mqtt_java_client_01";

    // 创建MqttJava客户端对象
    MqttClient client = new MqttClient(broker, clientid , new MemoryPersistence());
    MqttConnectOptions options = new MqttConnectOptions();
    options.setUserName(username);
    options.setPassword(password.toCharArray());
    client.connect(options);

    // 创建消息对象QoS
    String content = "hello mqtt";
    MqttMessage message = new MqttMessage(content.getBytes());
    message.setQos(2);
    message.setRetained(true);

    // 发送消息
    client.publish("a/c" , message);

    // 关闭链接释放资源
    client.disconnect();
    client.close();

}

4、订阅主题获取消息

@Test
public void receiveMessage() throws MqttException {

    // 定义链接相关参数
    String broker = "tcp://192.168.136.147:1883";
    String username = "zhangsan";
    String password = "123";
    String clientid = "mqtt_java_client_02";

    // 创建MqttJava客户端对象
    MqttClient client = new MqttClient(broker, clientid , new MemoryPersistence());
    MqttConnectOptions options = new MqttConnectOptions();
    options.setUserName(username);
    options.setPassword(password.toCharArray());

    // 添加回调函数获取主题消息
    client.setCallback(new MqttCallback() {
        
        @Override
        public void connectionLost(Throwable cause) {  // 连接丢失时被调用
            System.out.println("connectionLost: " + cause.getMessage());
        }

        @Override
        public void messageArrived(String topic, MqttMessage message) throws Exception {  // 接收到消息时被调用
            System.out.println("topic: " + topic);
            System.out.println("Qos: " + message.getQos());
            System.out.println("message content: " + new String(message.getPayload()));
        }

        @Override
        public void deliveryComplete(IMqttDeliveryToken token) {  // 消息接收完成时被调用
            System.out.println("deliveryComplete---------" + token.isComplete());
        }
        
    });

    // 订阅主题
    client.connect(options);
    client.subscribe("a/d" , 2);

    while(true) ;

}

1.2 spring-integration-mqtt

1.2.1 基础环境搭建

1、创建一个Spring Boot项目,并加入如下依赖:


```powershell

```powershell
 <dependencies>
    	
        <!-- spring boot项目web开发的起步依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    
    	<!-- spring boot项目集成消息中间件基础依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-integration</artifactId>
        </dependency>
    
    	<!-- spring boot项目和mqtt客户端集成起步依赖 -->
        <dependency>
            <groupId>org.springframework.integration</groupId>
            <artifactId>spring-integration-mqtt</artifactId>
            <version>5.4.3</version>
        </dependency>
    
        <!-- lombok依赖 -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    
        <!-- fastjson依赖 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.83</version>
        </dependency>
    
    </dependencies>

2、编写启动类

 @EnableConfigurationProperties(value = MqttConfigurationProperties.class)
    @SpringBootApplication
    public class MqttDemoApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(MqttDemoApplication.class , args) ;
        }
    
    }

3、在application.yml文件中添加如下配置

  spring:
      mqtt:
        username: zhangsan
        password: 123
        url: tcp://192.168.136.147:1883
        subClientId: sub_client_id_123
        subTopic: atguigu/iot/lamp/line
        pubClientId: pub_client_id_123

4、创建实体类读取自定义配置

@Data
@ConfigurationProperties(prefix = "spring.mqtt")
public class MqttConfigurationProperties {

    private String username;
    private String password;
    private String url;
    private String subClientId ;
    private String subTopic ;
    private String pubClientId ;

}

5、创建配置类配置链接工厂

 @Configuration
    public class MqttConfiguration {
    
        @Autowired
        private MqttConfigurationProperties mqttConfigurationProperties ;
    
        @Bean
        public MqttPahoClientFactory mqttClientFactory(){
    
            // 创建客户端工厂
            DefaultMqttPahoClientFactory factory = new DefaultMqttPahoClientFactory();
    
            // 创建MqttConnectOptions对象
            MqttConnectOptions options = new MqttConnectOptions();
            options.setCleanSession(true);
            options.setUserName(mqttConfigurationProperties.getUsername());
            options.setPassword(mqttConfigurationProperties.getPassword().toCharArray());
            options.setServerURIs(new String[]{mqttConfigurationProperties.getUrl()});
            factory.setConnectionOptions(options);
    
            // 返回
            return factory;
        }
    
    }

1.2.2 订阅主题获取消息

具体步骤:

1、配置入站适配器

@Configuration
public class MqttInboundConfiguration {

    @Autowired
    private MqttConfigurationProperties mqttConfigurationProperties ;

    @Autowired
    private ReceiverMessageHandler receiverMessageHandler;

    /**
     * 配置消息传输通道
     * @return
     */
    @Bean
    public MessageChannel mqttInputChannel() {
        return new DirectChannel();
    }

    /**
     * 配置入站适配器
     */
    @Bean
    public MessageProducer messageProducer(MqttPahoClientFactory mqttPahoClientFactory) {
        MqttPahoMessageDrivenChannelAdapter adapter  =
                new MqttPahoMessageDrivenChannelAdapter(mqttConfigurationProperties.getUrl() ,
                        mqttConfigurationProperties.getSubClientId() ,
                        mqttPahoClientFactory , mqttConfigurationProperties.getSubTopic().split(",")) ;
        adapter.setConverter(new DefaultPahoMessageConverter());
        adapter.setQos(1);
        adapter.setOutputChannel(mqttInputChannel());
        return adapter ;
    }

    /**
     * 配置入站消息处理器
     * @return
     */
    @Bean
    @ServiceActivator(inputChannel = "mqttInputChannel")
    public MessageHandler messageHandler() {
        return this.receiverMessageHandler ;
    }

}

2、定义监听主题消息的处理器

   @Component
    public class ReceiverMessageHandler implements MessageHandler {
    
        @Override
        public void handleMessage(Message<?> message) throws MessagingException {
            MessageHeaders headers = message.getHeaders();
            String receivedTopicName = (String) headers.get("mqtt_receivedTopic");
            if("atguigu/iot/lamp/line".equals(receivedTopicName)) {
                System.out.println("接收到消息:" + message.getPayload());
            }
        }
    
    }

测试:通过MQTTX向atguigu/iot/lamp/line主题发送消息

1.2.3 向指定主题发送消息

具体步骤:

1、配置出站消息处理器

 @Configuration
    public class MqttOutboundConfiguration {
    
        @Autowired
        private MqttConfigurationProperties mqttConfigurationProperties ;
    
        @Autowired
        private MqttPahoClientFactory pahoClientFactory ;
    
        @Bean
        public MessageChannel mqttOutputChannel() {
            return new DirectChannel();
        }
    
        @Bean
        @ServiceActivator(inputChannel = "mqttOutputChannel")
        public MessageHandler mqttOutboundMassageHandler() {
            MqttPahoMessageHandler messageHandler = new MqttPahoMessageHandler(mqttConfigurationProperties.getUrl() ,
                    mqttConfigurationProperties.getPubClientId() , pahoClientFactory ) ;
            messageHandler.setAsync(true);
            messageHandler.setDefaultQos(0);
            messageHandler.setDefaultTopic("default");
            return messageHandler ;
        }
    
    }

2、定义发送消息的网关接口

  @MessagingGateway(defaultRequestChannel = "mqttOutputChannel")
    public interface MqttGateway {
    
        /**
         * 发送mqtt消息
         * @param topic 主题
         * @param payload 内容
         */
        void sendToMqtt(@Header(MqttHeaders.TOPIC) String topic, String payload);
    
        /**
         * 发送包含qos的消息
         * @param topic 主题
         * @param qos 对消息处理的几种机制。
         *          * 0 表示的是订阅者没收到消息不会再次发送,消息会丢失。<br>
         *          * 1 表示的是会尝试重试,一直到接收到消息,但这种情况可能导致订阅者收到多次重复消息。<br>
         *          * 2 多了一次去重的动作,确保订阅者收到的消息有一次。
         * @param payload 消息体
         */
        void sendToMqtt(@Header(MqttHeaders.TOPIC) String topic, @Header(MqttHeaders.QOS) int qos, String payload);
        
    }

3、定义发送消息的服务类

   @Component
    @AllArgsConstructor
    public class MqttMessageSender {
    
        private MqttGateway mqttGateway;
    
        /**
         * 发送mqtt消息
         * @param topic 主题
         * @param message 内容
         */
        public void send(String topic, String message) {
            mqttGateway.sendToMqtt(topic, message);
        }
    
        /**
         * 发送包含qos的消息
         * @param topic 主题
         * @param qos 质量
         * @param message 消息体
         */
        public void send(String topic, int qos, byte[] message){
            mqttGateway.sendToMqtt(topic, qos, message);
        }
    }
内容概要:本文档详细介绍了基于直驱永磁同步发电机(PMSG)的1.5MW风力发电系统在Simulink环境下的建模与仿真全过程,涵盖了风力机空气动力学模型、PMSG电磁特性建模、不可控整流与逆变电路、直流环节、空间矢量脉宽调制(SVPWM)技术以及核心控制策略的设计。重点实现了最大功率点跟踪(MPPT)控制以提升风能捕获效率,并构建了电压外环与电流内环协同工作的双闭环控制系统,通过仿真验证了系统在不同风速条件下稳定运行的能力及动态响应性能。; 适合人群:适用于具备电力系统、电机控制理论基础及Simulink仿真操作经验的研究生、科研人员和从事新能源发电系统开发的工程技术人员;特别适合正在进行风电系统建模、控制算法研究或完成相关毕业设计的专业人士。; 使用场景及目标:①深入理解直驱式PMSG风力发电系统的整体架构与工作机理;②掌握从物理部件建模到控制策略实现的完整Simulink仿真流程;③学习并复现MPPT控制、双闭环控制等关键技术方案;④为后续开展低电压穿越、并网稳定性分析、故障诊断等高级课题提供可靠的仿真平台支撑。; 阅读建议:建议结合Matlab/Simulink软件动手实践,逐模块搭建模型,重点关注各控制环节的参数设计与调试方法,同时可参照文中提供的其他风电相关资源进行拓展学习与对比分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

后端技术那点事

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值