玩轉物聯網只需十行代碼,可它為何悄悄停止維護

文章目錄

  • 玩轉物聯網只需十行代碼,可它為何悄悄停止維護
    • 1 背景:MQTT 遇上 asyncio,為什么選 hbmqtt?
    • 2 hbmqtt 是什么?
    • 3 安裝:一行命令,但別裝最新
    • 4 五大核心 API:10 行代碼跑通發布訂閱
    • 5 實戰五連擊:代碼復制即可跑
      • 5.1 萬級消息吞吐——異步批量發布
      • 5.2 斷網自恢復——監聽重連事件
      • 5.3 本地 Broker——單元測試不依賴外網
      • 5.4 WebSocket 直播——網頁秒級訂閱
      • 5.5 SSL 上云——一參開啟加密
    • 6 三大常見坑:報錯 + 原因 + 急救方案
    • 7 總結:遺產代碼安全駕駛指南

在這里插入圖片描述

玩轉物聯網只需十行代碼,可它為何悄悄停止維護

本文帶你速通 Python 老牌異步 MQTT 庫 hbmqtt——從安裝到踩坑,從入門到放棄(以及平滑遷移)。讀完你將明白:
它為何曾是“高并發 IoT 第一神器”,又為何在 2023 年正式謝幕;如何在遺留項目里繼續安全駕駛;新項目又該投奔誰。


1 背景:MQTT 遇上 asyncio,為什么選 hbmqtt?

  • 物聯網場景動輒萬級長連接低帶寬高延遲,MQTT 憑借“輕量級發布/訂閱”成為事實標準。
  • Python 側早期全是同步阻塞客戶端(Paho),一條網絡抖動就卡死整個線程。
  • hbmqtt 率先100% 協程化,單進程輕松撐住10k 并發;還自帶Broker 實現,本地測試一條龍。
  • 但!官方已宣布停止維護,社區分叉出繼任者 amqtt。
    ? 老項目仍可用,新項目建議直接上 amqtt 或 gmqtt。

2 hbmqtt 是什么?

一句話:純 Python 寫的異步 MQTT 3.1.1 客戶端 + 代理雙角色庫,基于 asyncio,支持 QoS0-2、WS/WSS、自動重連、插件鑒權。


3 安裝:一行命令,但別裝最新

# 官方最終穩定版
python -m pip install "hbmqtt==0.9.6"

?? 不指定版本會拉到 0.10+ 預發行版,API 已變且含未修復 Bug。


4 五大核心 API:10 行代碼跑通發布訂閱

import asyncio
from hbmqtt.client import MQTTClientasync def demo():client = MQTTClient()                       # 1. 創建客戶端await client.connect('mqtt://broker.emqx.io:1883')  # 2. 連接await client.subscribe([('demo/hi', 1)])    # 3. 訂閱await client.publish('demo/hi', b'hello', qos=1)  # 4. 發布msg = await client.deliver_message()        # 5. 收消息print('Got:', msg.publish_packet.payload.data)await client.disconnect()                   # 6. 優雅斷開asyncio.run(demo())
作用
1事件循環入口
3生成異步客戶端實例
4TCP 連接公網免費 broker
5訂閱列表,支持通配符 +/ #
6發布字節串,必須 bytes
7阻塞等待下一條消息(協程不會卡線程)
9釋放 TCP / 會話資源

5 實戰五連擊:代碼復制即可跑

5.1 萬級消息吞吐——異步批量發布

async def bulk_publish(n=10_000):cli = MQTTClient()await cli.connect('mqtt://127.0.0.1:1883')# 使用 asyncio.gather 把發布變成“并發煙花”await asyncio.gather(*(cli.publish('load/test', f'pkt{i}'.encode(), qos=0) for i in range(n)))await cli.disconnect()

5.2 斷網自恢復——監聽重連事件

client = MQTTClient(config={'auto_reconnect': True, 'reconnect_max_interval': 5})
# 網絡抖動后自動重連,QoS1/2 消息不丟

5.3 本地 Broker——單元測試不依賴外網

from hbmqtt.broker import Broker
import yaml, asyncioasync def start_local():config = {'listeners': {'default': {'type': 'tcp', 'bind': '0.0.0.0:1883'}}}broker = Broker(yaml.safe_dump(config))await broker.start()await asyncio.sleep(60)          # 跑 1 min 示例await broker.shutdown()

5.4 WebSocket 直播——網頁秒級訂閱

# 只改 URL
await client.connect('ws://broker.emqx.io:8083/mqtt')

5.5 SSL 上云——一參開啟加密

await client.connect('mqtts://broker.emqx.io:8883', cafile='/path/ca.pem')

6 三大常見坑:報錯 + 原因 + 急救方案

#錯誤信息根本原因現成解藥
1NoDataException: No more data 頻繁出現0.9.6 心跳線程 Bug,長時間空閑會自行斷鏈升級至社區 fork amqtt==0.11.x;或手動 await client.ping() 每 30 s
2publish 返回 0,但訂閱端收不到QoS0 不存儲、不重發;網絡閃斷即丟包業務關鍵消息改用 qos=1 及以上
3OSError: [Errno 24] Too many open files單進程文件描述符默認 1024,萬連接瞬間打爆ulimit -n 65535 + 使用連接池復用客戶端

7 總結:遺產代碼安全駕駛指南

  • hbmqtt 0.9.6 仍能穩定服役,但不再修 Bug;新項目請直接 pip install amqtt
  • 牢記“字節串、QoS、心跳”三大檢查點,可避開 90% 的坑。
  • 若需 MQTT 5.0、共享訂閱等高級特性,轉向 gmqttpaho-mqtt v5

把這篇 cheatsheet 貼在工位,下次 IoT 需求來襲,你能在 15 分鐘內給出可擴展、可維護、不踩坑的異步 MQTT 方案。祝編碼愉快,消息永不丟!
如果你覺得文章還不錯,請大家 點贊、分享、留言 下,因為這將是我持續輸出更多優質文章的最強動力!

在這里插入圖片描述

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

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

相關文章

從零開始學大模型之預訓練語言模型

預訓練語言模型 本文較長&#xff0c;建議點贊收藏&#xff0c;以免遺失。更多AI大模型開發 學習視頻/籽料/面試題 都在這>>Github<< >>Gitee<< 3.1 Encoder-only PLM 在上一章&#xff0c;我們詳細講解了給 NLP 領域帶來巨大變革注意力機制以及使用…

JMeter接口測試全流程解析

1. Jmeter的界面介紹和功能組件&#xff08;元件&#xff09;1、測試計劃&#xff1a;Jmeter的起點和容器2、線程組&#xff1a;代表一定的虛擬用戶&#xff08;一個用戶一個線程&#xff09;3、取樣器&#xff1a;發送請求的最小單元4、邏輯控制器&#xff1a;控制組件的執行順…

Effective Modern C++ 條款26:避免在通用引用上重載

在C編程中&#xff0c;函數重載是一項強大的特性&#xff0c;它允許我們為不同的參數類型提供不同的實現。然而&#xff0c;當涉及到通用引用&#xff08;universal references&#xff09;時&#xff0c;重載可能會帶來意想不到的問題。Effective Modern C的條款26明確指出&am…

OpenLayers數據源集成 -- 章節一:圖像圖層詳解

前言在前面的文章中&#xff0c;我們學習了OpenLayers的基礎控件操作。本文將深入探討OpenLayers中的圖像圖層&#xff08;ImageLayer&#xff09;功能&#xff0c;通過一個完整的示例來展示如何使用ImageArcGISRest數據源加載ArcGIS服務&#xff0c;并詳細解釋圖層配置、事件監…

通義萬相wan2.2 Fun系列--Camera鏡頭控制與lnp首尾幀視頻模型

上節內容講解了wan2.2 fun control本節內容對wan2.2 fun系列模型的camera鏡頭控制模型與lnp首尾幀視頻模型進行測試與講解。 Wan2.2-Fun-Camera-Control是阿里基于Wan2.2框架推出的圖生視頻運鏡控制模型 。它支持512、768、1024等多分辨率的視頻預測&#xff0c;以81幀、每秒16…

JavaSE 集合從入門到面試:全面解析與實戰指南

JavaSE 集合從入門到面試&#xff1a;全面解析與實戰指南 在 Java 編程中&#xff0c;集合是處理數據的核心工具&#xff0c;幾乎所有 Java 應用都會用到集合框架。從簡單的列表存儲到復雜的數據分析&#xff0c;集合框架提供了豐富的數據結構和操作方法。本文將從基礎概念到面…

自建云音樂服務器:Navidrome+cpolar讓無損音樂隨身聽

文章目錄前言1. 安裝Docker2. 創建并啟動Navidrome容器3. 公網遠程訪問本地Navidrome3.1 內網穿透工具安裝3.2 創建遠程連接公網地址3.3 使用固定公網地址遠程訪問前言 “想聽自己的無損音樂還要開會員&#xff1f;”——音樂發燒友小王的煩惱。商業音樂平臺音質壓縮&#xff…

C3P0連接池適配HGDB

文章目錄文檔用途詳細信息文檔用途 講解常用的并且需要與數據庫進行交互的開源框架C3P0&#xff0c;以及C3P0框架是如何適配HGDB的。 詳細信息 1.C3P0概述 C3P0是一個開源的JDBC連接池&#xff0c;它實現了數據源和JNDI綁定&#xff0c;支持JDBC3規范和JDBC2的標準擴展。目…

ZeroGPU Spaces 加速實踐:PyTorch 提前編譯全解析

ZeroGPU 讓任何人都能在 Hugging Face Spaces 中使用強大的 Nvidia H200 硬件&#xff0c;而不需要因為空閑流量而長期占用 GPU。 它高效、靈活&#xff0c;非常適合演示&#xff0c;不過需要注意的是&#xff0c;ZeroGPU 并不能在所有場景下完全發揮 GPU 與 CUDA 棧的全部潛能…

8.ImGui-輸入框

免責聲明&#xff1a;內容僅供學習參考&#xff0c;請合法利用知識&#xff0c;禁止進行違法犯罪活動&#xff01; 本次游戲沒法給 內容參考于&#xff1a;微塵網絡安全 上一個內容&#xff1a;7.ImGui-單選框和復選框 單行輸入框使用 ImGui::InputText()&#xff0c;下圖中…

2025年- H120-Lc28. 找出字符串中第一個匹配項的下標(數組)--Java版

1.題目2.思路 短的子串相對不變 所以我們用長的字符串去截取in個長度的子串做遍歷 如果兩者相等 返回字符串第一個匹配項的索引的下標 3.代碼實現 class Solution {public int strStr(String haystack, String needle) {int s1haystack.length();int s2needle.length();//遍歷最…

uport1100系列轉接頭,SZ系列光電編碼器RS485通信

安裝uport1100系列轉接頭驅動 &#xff1a;選擇對應自己系統內核版本的驅動。否則爆出系統內核過高過低等問題。 查看系統內核版本指令&#xff1a; uname -r #簡要 uname -a #詳細驅動下載官網&#xff1a; https://www.moxa.com.cn/support/product-support/software-and-…

Java全棧開發面試實戰:從基礎到微服務架構

Java全棧開發面試實戰&#xff1a;從基礎到微服務架構 在一次互聯網大廠的Java全棧開發崗位面試中&#xff0c;一位名叫李明的28歲程序員&#xff0c;擁有計算機科學與技術本科學歷&#xff0c;工作年限為5年。他的主要職責包括設計和實現前后端分離的Web應用、參與微服務架構的…

win10(三)視頻剪裁

上傳一刻相冊&#xff0c;有30M大小限制。這個軟件能免費剪裁視頻而且支持手機的H.265格式&#xff0c;這個格式目前連potplayer都支持不好。但是配合FFmpeg可以檢測并且能按大小&#xff08;或時間&#xff09;剪裁&#xff0c;并上傳到一刻相冊上播放。 下載FFmpeg的方法&am…

Linux--線程

Linux線程概念 1 什么是線程 ? 在?個程序?的?個執?路線就叫做線程&#xff08;thread&#xff09;。更準確的定義是&#xff1a;線程是“?個進程內部 的控制序列” ? ?切進程?少都有?個執?線程 ? 線程在進程內部運?&#xff0c;本質是在進程地址空間內運? ? 在L…

【C++】C++11的包裝器:function與bind簡介

各位大佬好&#xff0c;我是落羽&#xff01;一個堅持不斷學習進步的學生。 如果您覺得我的文章還不錯&#xff0c;歡迎多多互三分享交流&#xff0c;一起學習進步&#xff01; 也歡迎關注我的blog主頁: 落羽的落羽 文章目錄一、function1. 概念2. 用法二、bind1. 概念2. 用法…

MySQL高級特性詳解

MySQL高級特性詳解 一、自關聯查詢 概念 自關聯查詢是指一個表與它自己進行連接的查詢。通常用于處理具有層級關系或遞歸結構的數據。 應用場景 員工與上級關系分類的父子關系地區的層級關系 示例 -- 創建員工表 CREATE TABLE employees (emp_id INT PRIMARY KEY,emp_name VARC…

深度學習——調整學習率

學習率調整方法詳解在深度學習訓練過程中&#xff0c;學習率&#xff08;Learning Rate, LR&#xff09; 是影響模型收斂速度和效果的關鍵超參數。學習率過大可能導致訓練不穩定、震蕩甚至無法收斂&#xff1b;學習率過小又會導致收斂過慢甚至陷入局部最優。因此&#xff0c;如…

Java分頁 Element—UI

前端代碼 <div class"block"><span class"demonstration">頁數較少時的效果</span><el-paginationlayout"prev, pager, next":total"50"></el-pagination> </div>參考Element-UI total:0, form: …

html中列表和表格的使用

列表一般來說只有一列一列的進行使用&#xff0c;是一維的列表分為三種列表形式<!-- 列表標簽ul-li:無序列表&#xff0c;必須用 <ul> 當 “容器”&#xff08;代表 “無序列表”&#xff09;&#xff0c;每個條目用 <li> 包起來&#xff08;代表 “列表項”&am…