mqtt-emqx:keepAlive機制測試

mqtt keepAlive原理詳見【https://www.emqx.com/zh/blog/mqtt-keep-alive】

# 下面開始寫測試代碼

【pom.xml】

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.3.12.RELEASE</version>
</dependency>
<dependency><groupId>org.eclipse.paho</groupId><artifactId>org.eclipse.paho.client.mqttv3</artifactId><version>1.2.2</version>
</dependency>
<dependency><groupId>com.alibaba.fastjson2</groupId><artifactId>fastjson2</artifactId><version>2.0.49</version>
</dependency>

【MyDemo7MqttCallback.java】

package com.chz.myMqttV3.demo7;@Slf4j
public class MyDemo7MqttCallback implements MqttCallbackExtended {private MqttClient client;private MqttConnectOptions options;private String[] topics;public MyDemo7MqttCallback(MqttClient client, MqttConnectOptions options, String[] topics){this.client = client;this.options = options;this.topics = topics;}@SneakyThrows@Overridepublic void connectionLost(Throwable throwable) {log.error("connectionLost", throwable);while (!client.isConnected()) {log.info("emqx重新連接....................................................");client.connect(options);Thread.sleep(1000);}}@Overridepublic void messageArrived(String topic, MqttMessage message) throws Exception {log.info("messageArrived: topic={}, message={}", topic, new String(message.getPayload()));}@SneakyThrows@Overridepublic void deliveryComplete(IMqttDeliveryToken token) {if( token!=null ){MqttMessage message = token.getMessage();String topic = token.getTopics()==null ? null : Arrays.asList(token.getTopics()).toString();String str = message==null ? null : new String(message.getPayload());log.info("deliveryComplete: topic={}, message={}", topic, str);} else {log.info("deliveryComplete: null");}}@SneakyThrows@Overridepublic void connectComplete(boolean reconnect, String serverURI) {log.info("connectComplete: reconnect={}, serverURI={}", reconnect, serverURI);if( topics.length > 0 ){int[] qosArr = new int[topics.length];Arrays.fill(qosArr, 2);MyDemo7MqttMessageListener[] listeners = new MyDemo7MqttMessageListener[topics.length];Arrays.fill(listeners, new MyDemo7MqttMessageListener());client.subscribe(topics, qosArr, listeners);}}
}

【MyDemo7MqttMessageListener.java】

package com.chz.myMqttV3.demo7;@Slf4j
public class MyDemo7MqttMessageListener implements IMqttMessageListener
{@Overridepublic void messageArrived(String topic, MqttMessage message) {log.info("messageArrived: topic={}, message={}", topic, new String(message.getPayload()));}
}

【MyDemo7MqttClient1Test.java】

package com.chz.myMqttV3.demo7;public class MyDemo7MqttClient1Test
{public static void main(String[] args) throws  MqttException {MqttConnectOptions options = new MqttConnectOptions();options.setUserName("admin");options.setPassword("public".toCharArray());options.setCleanSession(true);options.setAutomaticReconnect(true);options.setConnectionTimeout(20);options.setKeepAliveInterval(10);MqttClient client = new MqttClient("tcp://192.168.44.228:1883", "MyDemo7MqttClient1Test", new MemoryPersistence());client.setCallback(new MyDemo7MqttCallback(client, options, new String[]{"device/#"}));client.connect(options);}
}

【MyDemo7MqttSenderTest.java】

package com.chz.myMqttV3.demo7;public class MyDemo7MqttSenderTest
{public static void main(String[] args) throws UnknownHostException, MqttException, InterruptedException {MqttConnectOptions options = new MqttConnectOptions();options.setUserName("admin");options.setPassword("public".toCharArray());options.setCleanSession(true);options.setAutomaticReconnect(true);options.setConnectionTimeout(20);options.setKeepAliveInterval(10);// 這里設置遺囑消息,當broker認為本client斷聯時會將遺囑消息發出,可以用來確認borker是否認為本client已經斷聯options.setWill("device/1", "I am MyDemo7MqttSenderTest, I am dead!!!".getBytes(), 1, false);MqttClient client = new MqttClient("tcp://192.168.44.228:1883", "MyDemo7MqttSenderTest", new MemoryPersistence());client.setCallback(new MyDemo7MqttCallback(client, options, new String[]{}));client.connect(options);for( int i=0; true; i++ ){String topic = "device/1";MqttMessage mqttMessage = new MqttMessage();mqttMessage.setRetained(true);String msg = "I am MyDemo7MqttSenderTest, at node [192.168.44.228:1883]:" + i;mqttMessage.setPayload(msg.getBytes(StandardCharsets.UTF_8));client.publish(topic, mqttMessage);System.out.println("send: " + msg);Thread.sleep(1000L);    // 測試運行的時候在這里加入斷點,卡住MqttClient內部自動發的PINGREQ消息}}
}

# 下面開始進行測試

1、啟動【MyDemo7MqttClient1Test】。
2、在【MyDemo7MqttSenderTest】的【sleep】那一句加入斷點,然后運行【MyDemo7MqttSenderTest】
在這里插入圖片描述
等一段時間,可以看到遺囑消息【I am MyDemo7MqttSenderTest, I am dead!!!】發出來了
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/24382.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/24382.shtml
英文地址,請注明出處:http://en.pswp.cn/web/24382.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Ubuntu項目部署

解壓jdk tar -zxvf jdk-8u151-linux-x64.tar.gz 配置Java環境變量&#xff1a; vim ~/.bashrc export JAVA_HOME/root/soft/jdk1.8.0_151 export JRE_HOME${JAVA_HOME}/jre export CLASSPATH.:${JAVA_HOME}/lib:${JRE_HOME}/lib export PATH${JAVA_HOME}/bin:$PATH 設置環境變…

Python中的面向對象編程(OOP):概念、實踐與優勢

Python中的面向對象編程(OOP):概念、實踐與優勢 面向對象編程(Object-Oriented Programming,簡稱OOP)是一種程序設計模型,它將對象作為程序的基本單元,以提高代碼的可重用性、靈活性和擴展性。Python作為一種高級編程語言,對OOP提供了強大的支持。本文將詳細闡述Pyth…

武漢理工大學 云計算與服務計算 期末復習

云計算與的定義 長定義是&#xff1a;“云計算是一種商業計算模型。它將計算任務分布在大量計算機構成的資源池上&#xff0c;使各種應用系統能夠根據需要獲取計算力、存儲空間和信息服務。” 短定義是&#xff1a;“云計算是通過網絡按需提供可動態伸縮的廉價計算服務。 云計…

Lecture1——對最優化的介紹

一&#xff0c;簡介——什么是最優化&#xff1f; 1&#xff0c;三種問題&#xff1a; 用80米的圍欄盡可能的圍成一個面積最大的矩形如何規劃產品的生產&#xff0c;使得公司獲得的利潤最大給你一個圖&#xff08;Graph&#xff09;&#xff0c;如何獲得最短的距離 2&#xf…

MATLAB基礎應用精講-【數模應用】主成分(pca)分析(補充篇)(附MATLAB、R語言和python代碼實現)

目錄 前言 幾個高頻面試題目 主成分分析(PCA)與獨立成分分析(ICA) 1. 技術背景 2. 主成分分析 3. 獨立成分分析 算法原理 數據降維 PCA 涉及的主要問題 PCA 的優化目標 主成分分析(PCA)的基本思想 數學模型 協方差和散度矩陣 PCA的推導:基于最小投影距離 ?…

matlab BP神經網絡

clear clc % 準備數據 inputs rand(10, 100); % 100組輸入&#xff0c;每組10個特征 outputs rand(1, 100); % 100組輸出&#xff0c;每組1個輸出值 % 將數據分成訓練集和測試集 trainRatio 0.8; valRatio 0.1; testRatio 0.1; [trainInd, valInd, testInd] divid…

數據結構筆記2 棧和隊列

為什么在循環隊列中&#xff0c;判斷隊滿的條件是&#xff08;Q.rear1&#xff09;模maxqsize? 取模運算&#xff08;%&#xff09;在循環隊列中起到關鍵作用&#xff0c;主要是因為它能確保索引值在數組的有效范圍內循環。具體來說&#xff0c;取模運算有以下幾個重要作用&am…

【Go語言精進之路】構建高效Go程序:了解切片實現原理并高效使用

&#x1f525; 個人主頁&#xff1a;空白詩 文章目錄 引言一、切片究竟是什么&#xff1f;1.1 基礎的創建數組示例1.2 基礎的創建切片示例1.3 切片與數組的關系 二、切片的高級特性&#xff1a;動態擴容2.1 使用 append 函數擴容2.2 容量管理與性能考量2.3 切片的截取與縮容 三…

底板外設倒灌到處理器分析

在嵌入式系統中&#xff0c;底板外設通常與處理器通過各種接口&#xff08;如UART、SPI、I2C、GPIO等&#xff09;進行連接。這些外設可能包括傳感器、執行器、存儲器、通信模塊等。倒灌是指當外設向處理器提供的信號電平超出了處理器能夠接受的范圍&#xff0c;導致處理器無法…

Python 潮流周刊#54:ChatTTS 強大的文本生成語音模型

本周刊由 Python貓 出品&#xff0c;精心篩選國內外的 250 信息源&#xff0c;為你挑選最值得分享的文章、教程、開源項目、軟件工具、播客和視頻、熱門話題等內容。愿景&#xff1a;幫助所有讀者精進 Python 技術&#xff0c;并增長職業和副業的收入。 本期周刊分享了 12 篇文…

無錫哲訊——機械行業ERP管理系統,引領智能制造新紀元

機械行業作為現代工業的基石&#xff0c;正面臨著前所未有的變革。隨著智能制造的興起&#xff0c;ERP管理系統在機械行業中的作用日益凸顯。無錫哲訊智能科技有限公司&#xff0c;憑借其在ERP領域的專業實力和豐富經驗&#xff0c;為機械行業客戶提供定制化的ERP解決方案&…

ASP.NET Core 中使用基本消息的 RabbitMQ 消費者

介紹 RabbitMQ 是一種流行的消息代理&#xff0c;它使應用程序能夠通過交換消息進行異步通信。本文中&#xff0c;我們將探討如何使用基本消息處理程序在 ASP.NET Core 應用程序中實現 RabbitMQ 消費者。我們將利用 ASP.NET Core 中間件的靈活性來創建一個可重復使用的消息處理…

【Python錯誤】:AttributeError: ‘generator‘ object has no attribute ‘next‘解決辦法

【Python錯誤】&#xff1a;AttributeError: ‘generator’ object has no attribute next’解決辦法 在Python中&#xff0c;生成器是一種使用yield語句的特殊迭代器&#xff0c;它允許你在函數中產生一個值序列&#xff0c;而無需一次性創建并返回整個列表。然而&#xff0c;…

微信小程序畢業設計-家庭事務管理系統項目開發實戰(附源碼+論文)

大家好&#xff01;我是程序猿老A&#xff0c;感謝您閱讀本文&#xff0c;歡迎一鍵三連哦。 &#x1f49e;當前專欄&#xff1a;微信小程序畢業設計 精彩專欄推薦&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python畢業設計…

psql導入數據報錯排查

問題&#xff1a;采用pg_dump導出表數據后&#xff0c;用psql導入表數據&#xff0c;導入時報錯 無效的命令 \N定位該問題的方法 --進入psql \set ON_ERROR_STOP on --退出psqlpsql -U postgres -d test -v ON_ERROR_STOPon < /home/postgres/test.dmp參考文章&#xff1a…

08 塊設備驅動

新手建議跳過本章節。等到 SD 卡章節的時候,博主會以 SD 卡為實例給大家講解。 塊設備驅動要遠比字符設備驅動復雜得多,不同類型的存儲設備又對應不同的驅動子系統,本章我們重點學習一下塊設備相關驅動概念,不涉及到具體的存儲設備。 1、什么是塊設備? 塊設備是針對存儲…

算法2:滑動窗口(下)

文章目錄 水果成籃找到字符串中所有字母異位詞串聯所有單詞的子串*最小覆蓋子串* 水果成籃 兩元素排空操作 窗口中存在元素交錯情況&#xff0c;所以出窗口一定要出干凈&#xff01;&#xff01;&#xff01; class Solution { public:int totalFruit(vector<int>& …

【瀑布模型概述】

文章目錄 前言一、什么是瀑布模型&#xff1f;二、瀑布模型的階段1. 需求分析&#xff08;Requirements Analysis&#xff09;2. 系統設計&#xff08;System Design&#xff09;3. 實現&#xff08;Implementation&#xff09;4. 測試&#xff08;Testing&#xff09;5. 部署&…

行心科技中祿松波攜手,開啟智能健康新時代

在2024年第34屆健博會暨中國大健康產業文化節的盛大舞臺上&#xff0c;廣州市行心信息科技有限公司&#xff08;以下簡稱“行心科技”&#xff09;與浙江中祿松波生物工程有限公司&#xff08;以下簡稱“中祿松波”&#xff09;宣布達成戰略合作&#xff0c;共同推動醫康養產業…

[職場] 美術指導的重要作用 #學習方法#筆記

美術指導的重要作用 美術指導是廣告、電影、電視劇等創意作品中的一個重要角色&#xff0c;負責整體視覺風格和美術設計的指導和管理。 美術指導的目標是通過視覺表達來傳達故事的情感、氛圍和主題&#xff0c;以及塑造角色和場景的形象。 美術指導在創作過程中扮演著重要的角…