一些通訊硬體預設傳送和接收的是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>
完畢!