關于阿里云-云消息隊列MQTT的連接和使用,以及SpringBoot的集成使用

一、目的

本文主要記錄物聯網設備接入MQTT以及對接服務端SpringBoot整個的交互流程和使用。

二、概念

2.1什么是MQTT?

MQTT是基于TCP/IP協議棧構建的異步通信消息協議,是一種輕量級的發布、訂閱信息傳輸協議。可以在不可靠的網絡環境中進行擴展,適用于設備硬件存儲空間或網絡帶寬有限的場景。使用MQTT協議,消息發送者與接收者不受時間和空間的限制。物聯網平臺支持設備使用MQTT協議接入。
簡單來講:為物聯網弱聯網設備提供可靠的消息傳輸,比如傳感器、藍牙、手表等。本文的應用場景是葡萄糖檢測儀,實時上傳接受推送消息至服務器,服務器推送到設備端通知消息等。

2.2工作原理

當然不能直接使用,下邊簡單圖解一下
MQTT(Message Queuing Telemetry Transport)由IBM于1999年開發的一種基于發布訂閱模式"的輕量級的消息傳輸協議
發布訂閱模式是一種傳統的客戶端-服務器架構的替代方案,因為一般傳統的客戶端-服務器是客戶端能夠直接和服務器進行通信完成消息的傳輸。發布訂閱模式會將發送消息的發布者publisher與接收消息的訂閱者subscribers進行分離,publisher與subscribers 并不會直接通信,他們甚至都不清楚對方是否存在,他們之間的交流由第三方組件broker代理。
在這里插入圖片描述

在這里插入圖片描述
看到這個有沒有很熟悉?像不像RabbitMQ的發布訂閱?像不像RocketMQ?
沒錯,其實都是一個套路。
MQTT特殊的是,它只是一種通信協議,如果想要使用它,就需要基于MQTT協議的服務端實現,哎,這個服務端的實現,就類似消息中心的功能,負責消息的中轉,甚至還能在客戶端崩潰時,緩存接收到的消息(正因為此,它的可靠性是極高的)。
看到中間的 MQTT Broker了嗎,這個就是對MQTT協議服務端的實現,負責處理客戶端請求的關鍵組件,包括建立連接、斷開連接、訂閱和取消訂閱等操作,同時還負責消息的轉發。

2.3如何使用

如果沒有購買云消息隊列MQTT,就需要用第三方實現了MQTT的消息代理

2.3.1 EMQX

EMQX,是一款實現了MQTT協議的,開源的MQTT消息代理軟件。MQTT定義了消息通訊的規則和流程,而EMQX則是遵循這些規則的軟件,使得設備能夠依據MQTT協議進行有效通信。在新版本的EMQX中同時支持MQTT3.1.1協議和5.0協議
下載地址:
官網地址
其他代理軟件

2.3.2 EMQX部署

選擇EMQX企業版進行部署:企業版
購買云服務器ECS(不想買的話可以用虛擬機安裝,也可以去薅免費試用的),安裝Docker:

# 移除舊版本docker
sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine# 配置docker yum源。
sudo yum install -y yum-utils
sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo# 安裝 最新 docker
sudo yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin# 啟動& 開機啟動docker; enable + start 二合一
systemctl enable docker --now# 配置加速
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{"registry-mirrors": ["https://82m9ar63.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

運行啟動

docker run -d --name emqx-enterprise \-p 1883:1883 -p 8083:8083 \-p 8084:8084 -p 8883:8883 \-p 18083:18083 \-v emqx_data:/opt/emqx/data \-v emqx_log:/opt/emqx/log \-v emqx_etc:/opt/emqx/etc \emqx/emqx-enterprise:5.6.1

常見端口介紹:

端口號說明
1883TCP端口
8083WebSocket端口
8084WebSocket Secure 端口
8883SSL/TLS 端口
18083Broker的Dashboard訪問端口號

下邊就可以使用了,至于這個軟件的功能,這里不贅述了,有興趣的可以找我要筆記。

2.4 客戶端

2.4.1 運行docker容器模擬消息接收客戶端

docker run -e TOPIC="xxx"  \-e INSTANCE_ID="mqtt-cn-xx" \-e ENDPOINT="xx" \-e DEVICE_ID="xx" \-e GROUP_ID="您在 Group 管理頁面中創建的 Group 的 ID" \-e AK="您訪問阿里云的 AccessKey" \-e SK="您訪問阿里云的 SecretKey" \registry.cn-hangzhou.aliyuncs.com/aliyun-mq/mqtt
# TOPIC 你創建的Topic
# -e TOPIC="cgm_monitor"
# 設置 MQTT 的主題(Topic)為 cgm_monitor。MQTT 客戶端將訂閱或發布到這個主題。# -e INSTANCE_ID="mqtt-cn-hic4av7iy01"
# 設置阿里云 MQTT 實例的 ID。這是您在阿里云上創建的 MQTT 實例的唯一標識。# -e ENDPOINT="mqtt-cn-hic4av7iy01.mqtt.aliyuncs.com"
# 設置 MQTT 服務的接入點(Endpoint),即 MQTT 服務器的地址。# -e DEVICE_ID="i3c7bfbe"
# 設置設備 ID。MQTT 客戶端會以這個設備身份連接到阿里云 MQTT 服務。# -e GROUP_ID="您在 Group 管理頁面中創建的 Group 的 ID"
# 設置設備所屬的 Group ID。Group 是阿里云 MQTT 服務中用于管理一組設備的邏輯單元。

不懂看下圖
先建立topic才能有公網訪問地址,也要建Group
在這里插入圖片描述
建立topic
在這里插入圖片描述
建立Group
在這里插入圖片描述
簽名校驗得到,Client ID/用戶名/密碼
在這里插入圖片描述
這樣 去云服務運行上面這段docker命令,就可以得到一個連接云MQTT的客戶端,也就是消費者。

2.4.2 使用MQTTX客戶端

MQTTX 簡化了使用 MQTT broker 的過程,包括連接,發布與訂閱消息主題。無論你使用桌面版,命令行,或是網頁版,MQTTX 使每個關鍵步驟都更加順滑。
官網地址:MQTTX
在這里插入圖片描述
下載后傻瓜式安裝就行,下一步直到完成。
可以設置下中文
在這里插入圖片描述
點擊新建連接
在這里插入圖片描述
可以參考我的配置:
在這里插入圖片描述
如果用的不是云MQTT,本地自己docker安裝的 其實訪問更簡單,直接界面化Broker那里自己設置用戶名/密碼。
下邊就可以連接了
在這里插入圖片描述
如果你都配置正確,點擊連接會出現已連接
在這里插入圖片描述
下邊演示下在阿里云MQTT控制臺,快速體驗消息收發:
在這里插入圖片描述
可以看到,已經發送成功了!那么客戶端MQTTX有沒有收到消息呢?
在這里插入圖片描述
可以看到,確實是收到了!!!如此便成功了!

2.4.3SpringBoot集成MQTT

這里把源碼貼在這里,有興趣的也可以去阿里云官網看,一樣的

package com.kiki.app.mqtt.demo;import java.util.concurrent.ExecutorService;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;import com.kiki.app.util.ConnectionOptionWrapper;
import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
import org.eclipse.paho.client.mqttv3.MqttCallbackExtended;
import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;/*** 本代碼提供簽名鑒權模式下 MQ4IOT 客戶端發送消息到 MQ4IOT 客戶端的示例,其中初始化參數請根據實際情況修改* 簽名模式即使用阿里云賬號系統提供的 AccessKey 和 SecretKey 對每個客戶端計算出一個獨立的簽名供客戶端識別使用。* 對于實際業務場景使用過程中,考慮到私鑰 SecretKey 的隱私性,可以將簽名過程放在受信任的環境完成。** 完整 demo 工程,參考https://github.com/AliwareMQ/lmq-demo*/
public class MQ4IoTSendMessageToMQ4IoTUseSignatureMode {public static void main(String[] args) throws Exception {/*** MQ4IOT 實例 ID,購買后控制臺獲取*/String instanceId = "test001";/*** 接入點地址,購買 MQ4IOT 實例,且配置完成后即可獲取,接入點地址必須填寫分配的域名,不得使用 IP 地址直接連接,否則可能會導致客戶端異常。* */String endPoint = "xxx";/*** 賬號 accesskey,從賬號系統控制臺獲取* 阿里云賬號AccessKey擁有所有API的訪問權限,建議您使用RAM用戶進行API訪問或日常運維。* 強烈建議不要把AccessKey ID和AccessKey Secret保存到工程代碼里,否則可能導致AccessKey泄露,威脅您賬號下所有資源的安全。* 本示例以把AccessKey ID和AccessKey Secret保存在環境變量為例說明。運行本代碼示例之前,請先配置環境變量MQTT_AK_ENV和MQTT_SK_ENV* 例如:export MQTT_AK_ENV=<access_key_id>*      export MQTT_SK_ENV=<access_key_secret>* 需要將<access_key_id>替換為已準備好的AccessKey ID,<access_key_secret>替換為AccessKey Secret。*/String accessKey = "xxx";/*** 賬號 secretKey,從賬號系統控制臺獲取,僅在Signature鑒權模式下需要設置*/String secretKey = "xxx";/*** MQ4IOT clientId,由業務系統分配,需要保證每個 tcp 連接都不一樣,保證全局唯一,如果不同的客戶端對象(tcp 連接)使用了相同的 clientId 會導致連接異常斷開。* clientId 由兩部分組成,格式為 GroupID@@@DeviceId,其中 groupId 在 MQ4IOT 控制臺申請,DeviceId 由業務方自己設置,clientId 總長度不得超過64個字符。*/String clientId = "GID_test01@@@pub001";/*** MQ4IOT 消息的一級 topic,需要在控制臺申請才能使用。* 如果使用了沒有申請或者沒有被授權的 topic 會導致鑒權失敗,服務端會斷開客戶端連接。*/final String parentTopic = "xxx";/*** MQ4IOT支持子級 topic,用來做自定義的過濾,此處為示意,可以填寫任何字符串,具體參考https://help.aliyun.com/document_detail/42420.html?spm=a2c4g.11186623.6.544.1ea529cfAO5zV3* 需要注意的是,完整的 topic 參考 https://help.aliyun.com/document_detail/63620.html?spm=a2c4g.11186623.6.554.21a37f05ynxokW。*/final String mq4IotTopic = parentTopic + "/" + "testMq4Iot";/*** QoS參數代表傳輸質量,可選0,1,2,根據實際需求合理設置,具體參考 https://help.aliyun.com/document_detail/42420.html?spm=a2c4g.11186623.6.544.1ea529cfAO5zV3*/final int qosLevel = 0;ConnectionOptionWrapper connectionOptionWrapper = new ConnectionOptionWrapper(instanceId, accessKey, secretKey, clientId);final MemoryPersistence memoryPersistence = new MemoryPersistence();/*** 客戶端使用的協議和端口必須匹配,具體參考文檔 https://help.aliyun.com/document_detail/44866.html?spm=a2c4g.11186623.6.552.25302386RcuYFB* 如果是 SSL 加密則設置ssl://endpoint:8883*/final MqttClient mqttClient = new MqttClient("tcp://" + endPoint + ":1883", clientId, memoryPersistence);/*** 客戶端設置好發送超時時間,防止無限阻塞*/mqttClient.setTimeToWait(5000);final ExecutorService executorService = new ThreadPoolExecutor(1, 1, 0, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>());mqttClient.setCallback(new MqttCallbackExtended() {@Overridepublic void connectComplete(boolean reconnect, String serverURI) {/*** 客戶端連接成功后就需要盡快訂閱需要的 topic*/System.out.println("connect success---------------------------------------------------");executorService.submit(new Runnable() {@Overridepublic void run() {try {final String topicFilter[] = {mq4IotTopic};final int[] qos = {qosLevel};mqttClient.subscribe(topicFilter, qos);} catch (MqttException e) {e.printStackTrace();}}});}@Overridepublic void connectionLost(Throwable throwable) {throwable.printStackTrace();}@Overridepublic void messageArrived(String s, MqttMessage mqttMessage) throws Exception {/*** 消費消息的回調接口,需要確保該接口不拋異常,該接口運行返回即代表消息消費成功。* 消費消息需要保證在規定時間內完成,如果消費耗時超過服務端約定的超時時間,對于可靠傳輸的模式,服務端可能會重試推送,業務需要做好冪等去重處理。超時時間約定參考限制* https://help.aliyun.com/document_detail/63620.html?spm=a2c4g.11186623.6.546.229f1f6ago55Fj*/System.out.println("receive msg from topic " + s + " , body is " + new String(mqttMessage.getPayload()));}@Overridepublic void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {System.out.println("send msg succeed topic is : " + iMqttDeliveryToken.getTopics()[0]);}});mqttClient.connect(connectionOptionWrapper.getMqttConnectOptions());for (int i = 0; i < 10; i++) {MqttMessage message = new MqttMessage("hello mq4Iot pub sub msg".getBytes());message.setQos(qosLevel);/***  發送普通消息時,topic 必須和接收方訂閱的 topic 一致,或者符合通配符匹配規則*/mqttClient.publish(mq4IotTopic, message);/*** MQ4IoT支持點對點消息,即如果發送方明確知道該消息只需要給特定的一個設備接收,且知道對端的 clientId,則可以直接發送點對點消息。* 點對點消息不需要經過訂閱關系匹配,可以簡化訂閱方的邏輯。點對點消息的 topic 格式規范是  {{parentTopic}}/p2p/{{targetClientId}}*/final String p2pSendTopic = parentTopic + "/p2p/" + clientId;message = new MqttMessage("hello mq4Iot p2p msg".getBytes());message.setQos(qosLevel);mqttClient.publish(p2pSendTopic, message);}Thread.sleep(Long.MAX_VALUE);}
}

有需要的同學,可以私聊找我要源碼!!!

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

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

相關文章

車載功能框架 --- 整車安全策略

我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 簡單,單純,喜歡獨處,獨來獨往,不易合同頻過著接地氣的生活,除了生存溫飽問題之外,沒有什么過多的欲望,表面看起來很高冷,內心熱情,如果你身…

HarmonyOS5 讓 React Native 應用支持 HarmonyOS 分布式能力:跨設備組件開發指南

以下是 HarmonyOS 5 與 React Native 融合實現跨設備組件的完整開發指南&#xff0c;綜合關鍵技術與實操步驟&#xff1a; 一、分布式能力核心架構 React Native JS 層 → Native 橋接層 → HarmonyOS 分布式能力層(JavaScript) (ArkTS封裝) (設備發現/數據同步/硬件…

Unity打包到微信小程序的問題

GUI Error: Invalid GUILayout state in FlowchartWindow view. Verify that all layout Begin/End calls match UnityEngine.GUIUtility:ProcessEvent (int,intptr,bool&) 第一個問題可以不用管&#xff0c;這個不影響&#xff0c;這個錯誤&#xff0c;但是可以正常運行&a…

Hugging face 和 魔搭

都是知名的模型平臺&#xff0c;二者在定位、功能、生態等方面存在區別&#xff0c;具體如下&#xff1a; 一、定位與背景 Hugging Face&#xff1a; 定位是以自然語言處理&#xff08;NLP&#xff09;為核心發展起來的開源模型平臺&#xff0c;后續逐步拓展到文本、音頻、圖…

React 第六十一節 Router 中 createMemoryRouter的使用詳解及案例注意事項

前言 createMemoryRouter 是 React Router 提供的一種特殊路由器,它將路由狀態存儲在內存中而不是瀏覽器的 URL 地址欄中。 這種路由方式特別適用于測試、非瀏覽器環境(如 React Native)以及需要完全控制路由歷史的場景。 一、createMemoryRouter 的主要用途 測試環境:在…

透視黃金窗口:中國有機雜糧的高質量躍遷路徑

一、行業概覽&#xff1a;藍海市場背后的結構性紅利 伴隨全民健康意識提升和中產階層的擴大&#xff0c;中國有機雜糧市場正迎來新一輪結構性紅利期。根據《健康中國3.0時代&#xff1a;粗糧食品消費新趨勢與市場增長極》數據顯示&#xff0c;2020 年中國有機雜糧市場規模約 3…

實現p2p的webrtc-srs版本

1. 基本知識 1.1 webrtc 一、WebRTC的本質&#xff1a;實時通信的“網絡協議棧”類比 將WebRTC類比為Linux網絡協議棧極具洞察力&#xff0c;二者在架構設計和功能定位上高度相似&#xff1a; 分層協議棧架構 Linux網絡協議棧&#xff1a;從底層物理層到應用層&#xff08;如…

OpenCV CUDA模塊圖像變形------對圖像進行上采樣操作函數pyrUp()

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 函數用于對圖像進行 上采樣操作&#xff08;升采樣&#xff09;&#xff0c;是 GPU 加速版本的 高斯金字塔向上采樣&#xff08;Gaussian Pyrami…

勒貝格測度、勒貝格積分

又要接觸測度論了。隨著隨機規劃的不斷深入&#xff0c;如果涉及到證明部分&#xff0c;測度論的知識幾乎不可或缺。 測度論的相關書籍&#xff0c;基本都非常艱澀難讀&#xff0c;對于非數學專業出身的人入門非常不易。從十幾年前開始&#xff0c;我很難把測度論教材看到超過…

UE5 學習系列(一)創建一個游戲工程

這個系類筆記用來記錄學習 UE 過程中遇到的一些問題與解決方案。整個博客的動機是在使用 AirSim 中遇到了不少性能瓶頸&#xff0c;因此想要系統性地去學一下 UE &#xff0c;這個系列博客主要是跟著 B 站大佬 歐醬&#xff5e; 和 GenJi是真想教會你 的系列視頻 《500 分鐘學會…

Nginx 負載均衡、高可用及動靜分離

Nginx 負載均衡、高可用及動靜分離深度實踐與原理剖析 在互聯網應用架構不斷演進的今天&#xff0c;如何高效地處理大量用戶請求、保障服務的穩定性與性能&#xff0c;成為開發者和運維人員面臨的關鍵挑戰。Nginx 作為一款高性能的 Web 服務器和反向代理服務器&#xff0c;憑借…

stm32溫濕度-超聲波-LCD1602結合項目(Proteus仿真程序)

資料下載地址&#xff1a;stm32溫濕度-超聲波-LCD1602結合項目(Proteus仿真程序) 程序實現功能&#xff1a; 程序基于stm32芯片實現了控制LED燈亮滅、按鍵控制、串口通信、電機控制、溫濕度數據采集、超聲波測距、LCD顯示屏顯示內容這幾個功能&#xff0c;并用proteus8進行仿…

新一代python管理工具--uv

uv 工具全方位介紹 起源與背景 uv 是由 Astral&#xff08;pipx 作者&#xff09;團隊用 Rust 語言開發的新一代 Python 包和環境管理工具。其目標是解決傳統 pip/venv/conda 在依賴解析慢、環境隔離繁瑣、命令復雜等方面的痛點&#xff0c;為現代 Python 項目提供極速、自動…

路由交換技術-思科拓撲搭建

配置流程 1.搭建網絡拓撲圖。 2.規劃配置IP地址&#xff0c;內網配置為192.168.1.0和192.168.2.0網段。 3.劃分vlan10&#xff0c;vlan20&#xff0c;vlan30。 4.配置靜態、動態路由。配置路由器Router7&#xff0c;使內外網互通。 5.配置鏈路聚合。通過鏈路聚合技術&#xff…

清華大學視覺空間智能新突破!Spatial-MLLM:提升多模態大語言模型的視覺空間智能能力

作者&#xff1a;Diankun Wu, Fangfu Liu, Yi?Hsin Hung, Yueqi Duan 單位&#xff1a;清華大學 論文標題&#xff1a;Spatial-MLLM: Boosting MLLM Capabilities in Visual-based Spatial Intelligence 論文鏈接&#xff1a;https://arxiv.org/pdf/2505.23747 項目主頁&a…

AI與機器學習ML:利用Python 從零實現神經網絡

自線性回歸以來&#xff0c;我們已經涵蓋了很多領域。在本期中&#xff0c;我們將開始了解神經網絡內部工作原理的旅程*。* 如果一個人試圖了解任何使用生成式 AI 的工具、應用程序、網站或其他系統的內部工作原理&#xff0c;那么掌握神經網絡的架構至關重要。在這個故事中&a…

Vim 匹配跳轉與搜索命令完整學習筆記

Vim 匹配跳轉與搜索命令完整學習筆記 文章目錄 Vim 匹配跳轉與搜索命令完整學習筆記1. 括號/結構匹配% - 括號匹配跳轉[[ / ]] - 函數定義跳轉[{ / ]} - 代碼塊邊界跳轉 2. 精確單詞搜索* - 向下精確搜索# - 向上精確搜索 3. 模糊單詞搜索g* - 向下模糊搜索g# - 向上模糊搜索 4…

安卓9.0系統修改定制化____系列 ROM解打包 修改 講解 導讀篇

專欄系列前言&#xff1a; &#x1f49d;&#x1f49d;&#x1f49d;本專欄作者從事rom系統修改以及手機維修 刷機多年。從當年山寨機開始。歷經安卓4.--至目前的安卓15.合作伙伴遍及各類工作室以及PDA商家 私人玩友等。在廣告機 平板 pda設備 會議機 車機的rom修改中略有經…

Vue3本地存儲實現方案

在 Vue 3 中實現本地存儲&#xff08;如用戶配置數據&#xff09;&#xff0c;主要通過瀏覽器提供的 localStorage 或 sessionStorage API。以下是詳細實現方案&#xff1a; 基礎實現&#xff08;原生 API&#xff09; javascript 復制 下載 // 存儲數據 localStorage.set…

計算機視覺與深度學習 | 2024年至2025年圖像匹配算法總結(原理,公式,代碼,開源鏈接)

圖像匹配算法 一、核心算法分類與技術路線1. **傳統局部特征 + 匹配優化**(魯棒性強,適合資源受限場景)2. **端到端密集匹配網絡**(高精度,適合復雜形變/弱紋理)3. **基于光流思想的匹配網絡**4. **2024-2025年新趨勢**二、核心開源工具庫匯總三、典型代碼流程(以LoFTR為…