【物聯網】基于樹莓派的物聯網開發【19】——樹莓派搭建MQTT客戶端及MQTTX使用

場景介紹

實現測試客戶端與 MQTT 服務器的連接、訂閱、取消訂閱、收發消息等功能。

MQTT發布消息到代理服務器

安裝paho-mqtt

使用pip工具安裝paho-mqtt,輸入以下指令即可:

sudo pip install paho-mqtt

安裝 MQTT 客戶端庫

為了方便連接到 MQTT 服務器,我們需要安裝 paho-mqtt 庫。可以選擇以下兩種方法之一進行安裝。

1、使用源碼安裝

git clone https://github.com/eclipse/paho.mqtt.python 
cd paho.mqtt.python 
python3 setup.py install

2、使用 pip3 安裝

pip3 install paho-mqtt

MQTT 的使用

連接 MQTT 服務器

可以使用 EMQX 提供的 免費公共 MQTT 服務器,該服務基于 EMQX 的 MQTT 物聯網云平臺 創建。服務器接入信息如下:

● Broker: broker.emqx.io
● TCP Port: 1883
● Websocket Port: 8083

如果有需要,也可以使用 docker 在本地快速安裝 EMQX 服務器。
docker run -d --name emqx -p 1883:1883 -p 8083:8083 -p 8084:8084 -p 18083:18083 emqx/emqx

連接測試代碼

est_connect.py 
import paho.mqtt.client as mqtt 回調函數。當嘗試與 MQTT broker 建立連接時,觸發該函數。
client 是本次連接的客戶端實例。
userdata 是用戶的信息,一般為空。但如果有需要,也可以通過 user_data_set 函數設置。
flags 保存服務器響應標志的字典。
rc 是響應碼。一般情況下,我們只需要關注 rc 響應碼是否為 0 就可以了。
def on_connect(client, userdata, flags, rc):if rc == 0:print("Connected success")else:print(f"Connected fail with code {rc}")client = mqtt.Client() 
client.on_connect = on_connect 
client.connect("broker.emqx.io", 1883, 60) 
client.loop_forever()

將上面的代碼保存為 test_connect.py 文件,并運行
python3 test_connect.py

我們在 on_connect 函數里對響應碼進行了判斷,為 0 則輸出 Connected success 表示連接成功。如果返回的是其它數字,我們就需要對照下面的響應碼進行判斷。

在 MQTT 協議的概念中,消息是通過主題傳遞的,比如設備 A 向主題 T 發送消息,那么只有訂閱了主題 T 的設備才能接收到。所以僅僅接入 MQTT 服務器并沒有太大意議,要完整地使用 MQTT 服務,我們還需要知道如何訂閱和發布消息。

訂閱消息

打開任意編輯器,輸入下面的代碼,并保存為 subscriber.py 文件:

#subscriber.py
import paho.mqtt.client as mqttdef on_connect(client, userdata, flags, rc):print(f"Connected with result code {rc}")# 訂閱,需要放在 on_connect 里# 如果與 broker 失去連接后重連,仍然會繼續訂閱 raspberry/topic 主題client.subscribe("raspberry/topic")# 回調函數,當收到消息時,觸發該函數
def on_message(client, userdata, msg):print(f"{msg.topic} {msg.payload}")client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message# 設置遺囑消息,當樹莓派斷電,或者網絡出現異常中斷時,發送遺囑消息給其他客戶端
client.will_set('raspberry/status',  b'{"status": "Off"}')# 創建連接,三個參數分別為 broker 地址,broker 端口號,保活時間
client.connect("broker.emqx.io", 1883, 60)# 設置網絡循環堵塞,在調用 disconnect() 或程序崩潰前,不會主動結束程序
client.loop_forever()

調用 subscribe() 函數,可以讓樹莓派訂閱一個主題。在上面的代碼中,我們使用它訂閱了 raspberry/topic 主題,并監聽消息。
另外,我們還使用 will_set() 設置了遺囑消息。 遺囑消息是 MQTT 的一個特性,當設備在意外斷開網絡連接后,會向某個特定的主題發送消息。通過這個特性,可以得知樹莓派是否斷電,或者出現網絡異常。

發布消息

打開任意編輯器,輸入下面的代碼,并保存為 publisher.py 文件:

import paho.mqtt.client as mqtt
import timedef on_connect(client, userdata, flags, rc):print(f"Connected with result code {rc}")client = mqtt.Client()
client.on_connect = on_connect
client.connect("broker.emqx.io", 1883, 60)
# 每間隔 1 秒鐘向 raspberry/topic 發送一個消息,連續發送 5 次
for i in range(5):# 四個參數分別為:主題,發送內容,QoS, 是否保留消息client.publish('raspberry/topic', payload=i, qos=0, retain=False)print(f"send {i} to raspberry/topic")time.sleep(1)client.loop_forever()

調用 publish() 函數,可以向一個主題發送消息。在上面的代碼中,我們使用了它向主題 raspberry/topic 發送消息。其中參數 QoS 是另一個 MQTT 特性,這里我們暫且設為 0。

MQTT客戶端下載安裝

瀏覽器輸入網址:https://mqttx.app/zh下載MQTTX客戶端工具進行測試。
在這里插入圖片描述

測試訂閱消息

運行 Python 代碼,并主動發送一個消息。

  1. 打開終端,運行 Python 代碼,監聽消息 。
    python3 subscriber.py

  2. 使用 MQTTX 客戶端與 MQTT 服務器建立連接,并向主題 raspberry/topic 發送消息 。
    在這里插入圖片描述

  3. 查看樹莓派終端信息,將會看到已成功接收到 MQTTX 發布的消息。
    在這里插入圖片描述

測試發布消息

  1. 在 MQTTX 客戶端中訂閱 raspberry/topic 主題 。

  2. 在終端運行 Python 代碼。
    在這里插入圖片描述

  3. 在 MQTTX 客戶端中,查看樹莓派發送的消息。
    在這里插入圖片描述

總結
我們完成了在樹莓派上使用 Python MQTT 客戶端庫 paho-mqtt 編寫測試客戶端, 并實現了測試客戶端與 MQTT 服務器的連接、訂閱、取消訂閱、收發消息等功能。

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

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

相關文章

5G-A技術浪潮勾勒通信產業新局,微美全息加快以“5.5G+ AI”新勢能深化場景應用

7月31日,國家互聯網信息辦公室發布《國家信息化發展報告》。《報告》中提出,新一代通信技術研發取得新成果,5G-A地空通信(5G-ATG)技術研發成功并完成測試驗證。5G-A技術研發測試驗證移動通信技術一般代際生命周期為10年…

SQLite Where 子句詳解

SQLite Where 子句詳解 SQLite 是一款輕量級的數據庫管理系統,廣泛應用于移動設備、嵌入式系統以及個人電腦。在 SQLite 中,WHERE 子句是 SQL 查詢語句中不可或缺的一部分,它用于指定查詢條件,從而篩選出滿足特定條件的記錄。本文將詳細介紹 SQLite 中的 WHERE 子句,包括…

AI IDE+AI 輔助編程-生成的大綱-一般般

引言概述 AI IDE 和 AI 輔助編程的興起及其對開發效率的影響提出核心問題:AI 工具能否真正幫助程序員減少加班(告別 996)?AI IDE 與 AI 輔助編程的定義與現狀解釋 AI IDE(集成 AI 的開發環境)和 AI 輔助編程…

ABP VNext + Dapr Workflows:輕量級分布式工作流

🚀 ABP VNext Dapr Workflows:輕量級分布式工作流 📚 目錄🚀 ABP VNext Dapr Workflows:輕量級分布式工作流一、引言 ?TL;DR 🔥二、環境與依賴 🛠?三、系統架構與流程圖 🏗?四、…

? Unity 實現UI視差滾動效果(Parallax)鼠標控制、可拓展陀螺儀與腳本控制

? 效果如下在許多游戲、APP 或動效頁面中,我們常見的一種視覺效果是 視差滾動(Parallax Scrolling):前景、中景、背景在鼠標或設備移動時以不同速率輕微移動,從而營造出一種空間感和深度感。目前遇到這樣一個需求 所以…

【05】VM二次開發——模塊參數配置--帶渲染/不帶渲染(WinForm界面調用 模塊參數配置)

文章目錄1 Winform 窗口界面 (帶渲染的參數配置控件)2 配置代碼3 運行測試4 不帶渲染的參數配置控件 對比4.1 添加控件4.2 代碼及演示效果模塊參數配置本教程介紹如何在VM二次開發中對模塊參數進行配置 1 Winform 窗口界面 (帶渲染的參數配置…

Android 之 藍牙通信(2.0 經典)

??一、環境配置??1. ??添加依賴??在 build.gradle 中添加庫依賴&#xff1a;dependencies {implementation com.github.akexorcist:bluetoothspp:1.0.0 }2. ??權限聲明&#xff08;AndroidManifest.xml&#xff09;?<uses-permission android:name"androi…

使用 Scikit-LLM 進行零樣本和少樣本分類

使用 Scikit-LLM 進行零樣本和少樣本分類 使用 Scikit-LLM 進行零樣本和少樣本分類 在本文中&#xff0c;您將學習&#xff1a; Scikit-LLM如何將OpenAI的GPT等大型語言模型與Scikit-learn框架集成以進行文本分析。零樣本和少樣本分類之間的區別以及如何使用Scikit-LLM實現它…

android內存作假通殺補丁(4GB作假8GB)

可過如下app檢測&#xff1a; 安兔兔、魯大師、白眼、AIDA64、CPU X、CPU-Z、DevCheck、DeviceInfoHW lyw235yk235:~/Extend/lyw235/V/sprdroid1_v_4/sprdroid1_v$ git diff vnd/bsp/kernel5.15/kernel5.15/mm/page_alloc.c diff --git a/vnd/bsp/kernel5.15/kernel5.15/mm/pag…

Android 之 MVC架構

介紹1. MVC架構分工????Model層??&#xff1a;處理數據驗證、網絡請求等業務邏輯。??View層??&#xff1a;XML布局定義界面&#xff0c;Activity處理用戶輸入和顯示結果。??Controller層??&#xff1a;Activity作為控制器&#xff0c;協調Model和View的交互對于登…

Centos Docker 安裝手冊(可用)

Centos 安裝 Docker # 卸載舊版 yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine \docker-selinux # 安裝依賴工具 yum install -y yum-utils device-mapper-persistent-d…

烽火HG680-KX-海思MV320芯片-2+8G-安卓9.0-強刷卡刷固件包

烽火HG680-KX-海思MV320芯片-28G-安卓9.0-強刷卡刷固件包U盤強刷刷機步驟&#xff1a;1、強刷刷機&#xff0c;用一個usb2.0的8G以下U盤&#xff0c;fat32&#xff0c;2048塊單分區格式化&#xff08;強刷對&#xff35;盤非常非常挑剔&#xff0c;usb2.0的4G U盤兼容的多&…

Python爬蟲實戰:研究pycares技術構建DNS解析系統

1. 引言 1.1 研究背景 隨著互聯網的飛速發展,網絡上的數據量呈現爆炸式增長。網絡爬蟲作為一種高效的數據采集工具,被廣泛應用于數據分析、市場調研、學術研究等領域。傳統的爬蟲在進行大規模數據采集時,往往會受到 DNS 解析效率的制約,成為影響爬取性能的瓶頸之一。 DNS…

從 0 到 1 認識 Spring MVC:核心思想與基本用法(下)

文章目錄&#x1f4d5;4. 響應??4.1 返回靜態頁面??4.2 返回數據ResponseBody???4.3 返回HTML代碼片段???4.4 返回JSON??4.5 設置狀態碼??4.6 設置Header&#xff08;了解&#xff09;&#x1f4d5;5. 案例練習??5.1 加法計算器??5.2 用戶登錄??5.3 留言板…

Python-初學openCV——圖像預處理(五)——梯度處理、邊緣檢測、圖像輪廓

目錄 一、圖像梯度處理 1、垂直邊緣提取 2、Sobel算子 3、Laplacian算子 二、圖像邊緣檢測 1、高斯濾波 2、計算圖像的梯度、方向 3、非極大值抑制 4、雙閾值篩選 三、繪制圖像輪廓 1、概念 2、尋找輪廓 3、繪制輪廓 一、圖像梯度處理 還記得高數中的一階導數求極值…

【Redis】安裝Redis,通用命令,常用數據結構,單線程模型

目錄 一.在Ubuntu系統安裝Redis 二. redis客戶端介紹 三. 全局命令 3.1.GET和SET命令 3.2.KEYS&#xff08;生產環境禁止使用&#xff09; 3.3.EXISTS 3.4.DEL 3.5.EXPIRE 3.6.TTL 3.6.1.Redis的過期策略 3.6.2.基于優先級隊列/堆的實現去實現定時器 3.6.3.定時器&a…

ubuntu22.04系統實踐 linux基礎入門命令(三) 用戶管理命令

以下有免費的4090云主機提供ubuntu22.04系統的其他入門實踐操作 地址&#xff1a;星宇科技 | GPU服務器 高性能云主機 云服務器-登錄 相關兌換碼星宇社區---4090算力卡免費體驗、共享開發社區-CSDN博客 之所以推薦給大家使用&#xff0c;是因為上面的云主機目前是免費使用的…

DPDK中的TCP頭部處理

1. TCP頭部結構 TCP頭部通常為20字節&#xff08;不含可選字段&#xff09;&#xff0c;每個字段占據固定的字節位置。以下是TCP頭部的結構&#xff0c;按字節位置逐一說明&#xff1a;0 1 2 30 1 2 3 4 5 6 7 8 9 0 1 …

開源在線客服系統Chatwoot配置文件

參考&#xff1a; https://developers.chatwoot.com/self-hosted/deployment/dockerhttps://developers.chatwoot.com/self-hosted/deployment/docker 1、.env 配置文件 # Learn about the various environment variables at # https://www.chatwoot.com/docs/self-hosted/co…

PHP進階語法詳解:命名空間、類型轉換與文件操作

掌握了PHP面向對象編程的基礎后&#xff0c;就可以深入學習命名空間、類型轉換、文檔注釋、序列化以及文件操作等重要概念。 1、命名空間&#xff08;Namespace&#xff09; 命名空間是PHP 5.3引入的重要特性&#xff0c;它解決了類名、函數名和常量名沖突的問題&#xff0c;使…