实习项目-MQTT实战

Posted by ni on November 21, 2024
本文共2445 字 | 大约需要8.15 分钟阅读

前言

学习MQTT协议过后,从代码中探索控制硬件流程

提前准备

  • 部署依赖

    <dependency>
        <groupId>org.eclipse.paho</groupId>
        <artifactId>org.eclipse.paho.client.mqttv3</artifactId>
        <version>1.2.5</version>
    </dependency>
    
  • 配置MQTT的客户端类,其中进行对MQTT服务的配置

    public static void createMqttConnect() {
            String hostIp = mqttListener.syncConfig.getHostIp();
            hostIp="tcp://"+"MQTT服务器IP"+":"+"MQTT服务器端口";
            try {
                // host为主机名,clientid即连接MQTT的客户端ID,一般以客户端唯一标识符表示,
                // MemoryPersistence设置clientid的保存形式,默认为以内存保存
                client = new MqttClient(hostIp, MQTT_CLIENT_ID, new MemoryPersistence());
    //            配置参数信息
                options = new MqttConnectOptions();
                // 设置是否清空session,这里如果设置为false表示服务器会保留客户端的连接记录,
                // 这里设置为true表示每次连接到服务器都以新的身份连接
                options.setCleanSession(true);
                // 设置用户名
                options.setUserName(MQTT_USERNAME);
                // 设置密码
                options.setPassword(MQTT_PASSWORD.toCharArray());
                // 设置超时时间 单位为秒
                options.setConnectionTimeout(10);
                // 设置会话心跳时间 单位为秒 服务器会每隔1.5*20秒的时间向客户端发送个消息判断客户端是否在线,但这个方法并没有重连的机制
                options.setKeepAliveInterval(20);
                // 连接
                client.connect(options);
                // 订阅
                client.subscribe("#");
      
    //            设置回调
                client.setCallback(new PushCallback());//new PushCallback()
      
            } catch (MqttException e) {
                e.printStackTrace();
            }
        }
      
      
    //  发送消息方法
        public static Boolean sendMessage(String topicName,String message){
            MqttMessage mqttMessage = new MqttMessage();
            // 设置字符类型例如UTF-8
            byte[] messageType = message.getBytes();
            mqttMessage.setPayload(messageType);
            // 设置Qos, 0: 只传输一次不论是否接受 1: 一直传输直到回传 2: 保证对方只接收1次
            mqttMessage.setQos();
            try {
                // 消息推送
                client.publish(topicName,mqttMessage);
                return  true;
            } catch (MqttException e) {
                return  false;
            }
        }
    
  • 编写回调类

    @Component
    PushCallback implements MqttCallback{
        // 该方法为接收消息的方法
        @Override
        public void messageArrived(String topicName, MqttMessage mqttMessage) throws Exception {}
          
    }
    

实战顺序

ps: 代码不好展示

使用 sendMessage(topicName, MqttMessage)发送主题为topicName,消息为mqttMessage的消息,这个topicName为自己规定,但需要你想控制的设备对其进行监听,并获取消息做出反应,设置Qos为1或者2(根据自己场景设置)会获得回调。

想要获取结果可以在发送前发送一个redis的key,value为”“,在回调中可以对redis进行修改,并且在发送方法下循环进行线程sleep,获取该key的值,改变则为成功