MQTT接收HEX(2/2)

獵手家園發表於2022-04-25

一些通訊硬體預設傳送和接收的是UTF-8字元和ASCII的訊息,但也是有一些通訊硬體的是透過16進位制訊息進行互動的。

一、配置pom的maven依賴

<dependency>
    <groupId>org.fusesource.hawtbuf</groupId>
    <artifactId>hawtbuf</artifactId>
    <version>1.11</version>
</dependency>
<dependency>
    <groupId>org.fusesource.hawtdispatch</groupId>
    <artifactId>hawtdispatch</artifactId>
    <version>1.22</version>
</dependency>
<dependency>
    <groupId>org.fusesource.hawtdispatch</groupId>
    <artifactId>hawtdispatch-transport</artifactId>
    <version>1.22</version>
</dependency>
<dependency>
    <groupId>org.fusesource.mqtt-client</groupId>
    <artifactId>mqtt-client</artifactId>
    <version>1.16</version>
</dependency>

 

為了程式碼的可閱讀性,我將以下程式碼按照功能封裝到不同的類當中。

 

二、MQTT資料接收類

package com.xxxx.worker.controller.Server.MQTT;

import com.xxxx.common.utils.PropertyUtils;
import com.xxxx.worker.controller.Server.Execute.MessageExecute;
import org.fusesource.mqtt.client.Future;
import org.fusesource.mqtt.client.FutureConnection;
import org.fusesource.mqtt.client.MQTT;
import org.fusesource.mqtt.client.Message;
import org.fusesource.mqtt.client.QoS;
import org.fusesource.mqtt.client.Topic;

/**
 * @title: MQTT訊息訂閱(接收十六進位制)
 * @author: hunttown
 * @date: 2021年01月06日 16:32
 * @description: 當前類用bean注入,不要使用註解注入,因為下面要將其配置到worker裡。
 */
public class MQTTSubHex {

    //伺服器地址
    private final static String serverUrl = "你的伺服器IP:埠";

    //客戶端唯一標識
    private final static String clientid = "隨便起個名字";

    //訂閱主題
    private final static String subtopic = "你的訂閱主題";

    //使用者名稱
    private final static String username = "使用者名稱";

    //密碼
    private final static String password = "密碼";

    //傳輸質量:0至多一次;1至少一次;2確保只有一次。
    private final static int qos = 0;

    void start() {
        try {
            //建立MQTT物件
            MQTT mqtt = new MQTT();

            // 設定MQTT Broker的ip和埠
            mqtt.setHost(serverUrl);

            // 連線前清空會話資訊
            mqtt.setCleanSession(true);

            // 設定重新連線的次數
            mqtt.setReconnectAttemptsMax(10);

            // 設定重連的間隔時間(毫秒)
            mqtt.setReconnectDelay(2000);

            // 設定心跳時間(秒)
            mqtt.setKeepAlive((short) 30);

            // 設定緩衝的大小
            mqtt.setSendBufferSize(2 * 1024 * 1024);

            // 設定客戶端ID
            mqtt.setClientId(clientid);

            // 設定使用者名稱和字碼
            mqtt.setUserName(username);
            mqtt.setPassword(password);

            final FutureConnection connection = mqtt.futureConnection();
            connection.connect();

            Topic[] topics = {new Topic(subtopic, QoS.AT_LEAST_ONCE)};
            connection.subscribe(topics);

            System.out.println("MQTT訂閱設定初始化完畢!");

            MessageExecute hexExecute = new MessageExecute();

            while (true) {
                //接收資訊
                Future<Message> futrueMessage = connection.receive();
                Message message = futrueMessage.await();

                String msg = String.valueOf(message.getPayloadBuffer());
                System.out.println("接收到資訊:" + msg);

                //這裡開始處理你的業務
                //1、如果資料量較大,可使用中介軟體暫存資訊,如:MQ
                //2、如果資料量較小,可以使用非同步處理
                //TODO
            }

        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("MQTT訂閱設定初始化失敗!");
        }
    }
}

 

三、執行緒類

package com.xxxx.worker.controller.Server.MQTT;

/**
 * @title: 啟動一個執行緒
 * @author: hunttown
 * @date: 2021年03月23日 15:55
 * @description:
 */
public class MQTTHexThread extends Thread {

    private static MQTTSubHex mqttSubHex;

    public void run() {
        mqttSubHex.start();
    }

    public static MQTTSubHex getMqttSubHex() {
        return mqttSubHex;
    }

    public static void setMqttSubHex(MQTTSubHex mqttSubHex) {
        MQTTHexThread.mqttSubHex = mqttSubHex;
    }
}

 

四、監聽類

package com.xxxx.worker.controller.TaskListener;

import com.xxxx.worker.controller.Server.MQTT.MQTTHexThread;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.http.HttpServlet;

/**
 * @title: MQTT監聽類
 * @author: hunttown
 * @date: 2020年10月19日 18:06
 * @description: MQTT類
 */
public class MQTTHexListener extends HttpServlet implements ServletContextListener {
    public void contextInitialized(ServletContextEvent arg0) {

        System.out.println("----------------- MQTT:Hex執行緒已啟動 --------------------------");

        MQTTHexThread thread = new MQTTHexThread();
        thread.setDaemon(true); //設定執行緒為後臺執行緒
        thread.start();
    }

    public void contextDestroyed(ServletContextEvent arg0) {
        // TODO
    }
}

 

五、將監聽類配置到web.xml中

<listener>
    <!-- MQTT:接收Hex資料 -->
    <listener-class>com.hunttown.analysis.worker.controller.TaskListener.MQTTHexListener</listener-class>
</listener>

 

完畢!

 

相關文章