跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像AI 生图工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Python

JetLinks MQTT 设备属性主动上报 Python 实现

JetLinks 物联网平台支持 MQTT 协议通信,设备属性主动上报是核心交互场景。基于 Python 语言结合 paho-mqtt 库,演示如何在 Windows 环境下实现适配 MQTT 3.1.1 协议的 JetLinks 设备属性周期性上报功能。内容涵盖 MQTT 主题与报文格式规范、JetLinks 物模型配置要点(读写上报权限)、以及完整的 Python 代码实现。代码包含连接管理、自动重连策略、属性解析及日志记录功能,解决了协议版本兼容和连接稳定性问题,为物联网设备开发提供基础参考。

编程诗人发布于 2026/3/15更新于 2026/7/1445 浏览

1. 前言

JetLinks 是轻量级物联网开源平台,MQTT 协议作为其核心设备通信协议,是物联网教学与实操的重点内容。设备属性主动上报是物联网设备与平台交互的基础场景,本文聚焦教学场景,基于 Python 语言结合 paho-mqtt 库,实现适配 MQTT 3.1.1 协议的 JetLinks 设备属性周期性上报功能。通过明确上报主题、报文格式规范,以及 JetLinks 物模型配置要点,帮助学习者理解物联网设备侧 MQTT 通信的核心逻辑,同时解决协议版本兼容、连接稳定性、属性解析等实操中的常见问题,为后续物联网设备开发打下基础。

2. MQTT 主题及报文格式

报文格式

{"properties":{"temperature":25.5}}

主题格式

/{productId:产品 ID}/{deviceId:设备 ID}/properties/report
示例:/2017982230047920128/2017982371131723776/properties/report

3. JetLinks 配置

主要是配置产品的物模型

[图:JetLinks 物模型配置示例]

务必将 读 写 上报 都选上,否则会有问题

4. Python 实现

务必指明是 3.11 版本,5.0 版本应该会有问题,3.0 应该也没问题

import json
import logging
import time
import threading
from paho.mqtt import client as mqtt_client
from paho.mqtt.client import MQTTv311
import random

# ===================== 配置项 ======================
MQTT_BROKER = "192.168.147.134"
MQTT_PORT = 1883
MQTT_USERNAME = "admin"
MQTT_PASSWORD = "admin"
CLIENT_ID = "2017982371131723776"


REPORT_TOPIC =  
REPORT_INTERVAL =  


DEFAULT_PROPERTIES = {
    : , 
    :  
}


logging.basicConfig(
    level=logging.INFO,
    =
)
logger = logging.getLogger(__name__)

 () -> mqtt_client.Client:
    
    reconnect_count =  

     ():
         reconnect_count
        reconnect_count =  
        rc_msg = {
            : ,
            : ,
            : ,
            : ,
            : ,
            : ,
        }
         rc == :
            logger.info()
        :
            logger.error()

     ():
         reconnect_count
        reconnect_count += 
         rc == :
            logger.info()
        :
            disconnect_msg = {
                : ,
                : ,
                : ,
                : ,
                : ,
                : ,
            }
            logger.warning()
            
            time.sleep((reconnect_count * , )) 

    
    client = mqtt_client.Client(
        client_id=CLIENT_ID,
        callback_api_version=mqtt_client.CallbackAPIVersion.VERSION1,
        protocol=MQTTv311,
    )
    client.username_pw_set(MQTT_USERNAME, MQTT_PASSWORD)
    client.on_connect = on_connect
    client.on_disconnect = on_disconnect
    client.auto_reconnect =  
    client.reconnect_delay_set(min_delay=, max_delay=) 

    
    :
        client.connect(MQTT_BROKER, MQTT_PORT, keepalive=)
     Exception  e:
        logger.error()
        
     client

 () -> :
    
    property_keywords = [, , , ]
      (keyword  topic.lower()  keyword  property_keywords):
         {}
    :
        payload_data = json.loads(payload)
         payload_data.get(, payload_data)
     json.JSONDecodeError:
        :
            properties = {}
             item  payload.split():
                k, v = item.split(, )
                 v.replace(, ).isdigit():
                    v = (v)    v  (v)
                properties[k.strip()] = v
             properties
        :
            logger.error()
             {}

 ():
    
    topic = msg.topic
    payload = msg.payload.decode(, errors=)
    logger.info()
    logger.info()
    logger.info()
    properties = parse_property_message(topic, payload)
     properties:
        logger.info()
         (, , encoding=)  f:
            log_time = logging.Formatter().(logging.LogRecord(, , , , , (), ))
            f.write()
    :
        logger.info()

 ():
    
    client.subscribe(, qos=)
    client.on_message = on_message
    logger.info()

 ():
    
    logger.info()
     :
        :
            
            dynamic_properties = {
                : (DEFAULT_PROPERTIES[] + random.uniform(-, ), )
            }
            report_payload = json.dumps({: dynamic_properties}, ensure_ascii=)
            result = client.publish(REPORT_TOPIC, report_payload, qos=)
            status = result[]
             status == :
                logger.info()
                logger.info()
                logger.info()
            :
                logger.error()
         Exception  e:
            logger.error()
        time.sleep(REPORT_INTERVAL)

 ():
    
    logger.info()
    
    client = connect_mqtt()
    
    subscribe_all_topics(client)
    
    publish_thread = threading.Thread(
        target=publish_properties_periodically,
        args=(client,),
        daemon= 
    )
    publish_thread.start()
    
    client.loop_forever()

 __name__ == :
    :
        run()
     KeyboardInterrupt:
        logger.info()
     Exception  e:
        logger.error(, exc_info=)
# 主动上报配置(重点)
"/2017982230047920128/2017982371131723776/properties/report"
# 指定上报主题
5
# 上报间隔:5 秒
# 示例属性(可根据教学需求修改,格式:{"属性 ID":"属性值"}
"temperature"
25.0
# 温度(示例)
"humidity"
60.0
# 湿度(示例)
# 日志配置
format
"%(asctime)s - %(levelname)s - %(message)s"
def
connect_mqtt
"""优化后的连接逻辑:增加重连间隔、断开原因打印"""
0
# 重连计数(教学调试用)
def
on_connect
client, userdata, flags, rc, properties=None
nonlocal
0
# 连接成功重置计数
0
"连接成功"
1
"协议版本错误"
2
"客户端 ID 非法"
3
"服务器不可用"
4
"用户名/密码错误"
5
"未授权"
if
0
f"✅ MQTT 3.1.1 连接成功({MQTT_BROKER}:{MQTT_PORT})"
else
f"❌ 连接失败(rc={rc}):{rc_msg.get(rc,'未知错误')}"
def
on_disconnect
client, userdata, rc, properties=None
nonlocal
1
if
0
"🔌 主动断开连接"
else
1
"协议错误"
2
"客户端 ID 重复"
3
"服务器不可用"
4
"用户名密码错误"
5
"未授权"
128
"订阅越权"
f"⚠️ 被动断开(rc={rc}):{disconnect_msg.get(rc,'服务器主动断开')},第{reconnect_count}次重连..."
# 延迟重连(避免频繁请求触发服务器限流)
min
2
10
# 重连间隔:2s→4s→...→10s
# 创建客户端(MQTT 3.1.1 + 自动重连)
True
# 启用自动重连(优化重连策略)
2
10
# 重连间隔控制
# 连接服务器
try
60
except
as
f"❌ TCP 连接失败:{str(e)}"
raise
return
def
parse_property_message
topic: str, payload: str
dict
"""解析 MQTT 消息中的设备属性"""
"properties"
"report"
"upload"
"attr"
if
not
any
in
for
in
return
try
return
"properties"
except
try
for
in
","
":"
1
if
"."
""
float
if
"."
in
else
int
return
except
f"❌ 消息体解析失败:{payload}"
return
def
on_message
client, userdata, msg
"""监听 MQTT 消息并解析属性"""
"utf-8"
"ignore"
f"\n📩 收到消息:"
f" 📌 Topic: {topic}"
f" 📝 消息体:{payload}"
if
f"🔧 解析属性:{json.dumps(properties, ensure_ascii=False, indent=2)}"
with
open
"jetlinks_device_properties.log"
"a"
"utf-8"
as
"%(asctime)s"
format
""
0
""
0
""
None
f"{log_time} | Topic: {topic} | 属性:{json.dumps(properties, ensure_ascii=False)}\n"
else
"ℹ️ 非属性消息,忽略"
def
subscribe_all_topics
client: mqtt_client.Client
"""订阅所有 MQTT Topic"""
"#"
0
f"📌 订阅所有 Topic(协议 3.1.1),开始监听..."
def
publish_properties_periodically
client: mqtt_client.Client
"""周期性主动上报属性(5 秒一次)"""
f"🚀 启动属性主动上报(间隔{REPORT_INTERVAL}秒),上报 Topic:{REPORT_TOPIC}"
while
True
try
# 构造上报报文:严格按照 "{\"properties\":{\"属性 ID\":\"属性值\"}}" 格式
"temperature"
round
"temperature"
0.5
0.5
1
"properties"
False
0
0
if
0
f"\n📤 主动上报属性成功:"
f" 📌 上报 Topic: {REPORT_TOPIC}"
f" 📝 上报报文:{report_payload}"
else
f"❌ 主动上报属性失败,状态码:{status}"
except
as
f"❌ 主动上报属性异常:{str(e)}"
def
run
"""启动 MQTT 监听器 + 主动上报线程"""
"🚀 启动 JetLinks MQTT 监听器(教学稳定版)"
# 1. 建立 MQTT 连接
# 2. 订阅所有 Topic
# 3. 启动主动上报线程(与监听逻辑分离,避免阻塞)
True
# 主线程退出时,上报线程自动退出
# 4. 持续监听 MQTT 消息(阻塞式)
if
"__main__"
try
except
"\n🛑 退出监听"
except
as
f"❌ 程序异常:{str(e)}"
True
4.1 核心功能
  1. MQTT 稳定连接:适配 JetLinks 服务器认证(admin/admin),带自动重连、断开原因提示,避免频繁连接刷屏;
  2. 全 Topic 监听:订阅所有 MQTT 消息,解析设备属性(兼容 JSON/简化键值对格式),并将属性写入本地日志文件;
  3. 周期性主动上报:5 秒一次向指定 Topic 上报温度属性(模拟真实设备),严格遵循指定报文格式。
4.2 关键模块说明
模块/函数核心作用
配置项定义 MQTT 连接信息(IP/端口/账号)、上报 Topic、5 秒上报间隔、示例属性;
connect_mqtt()创建 MQTT 3.1.1 客户端,处理连接/断开回调,优化重连策略(间隔 2-10 秒);
parse_property_message解析收到的 MQTT 消息,提取设备属性(兼容多格式);
on_message()监听并打印收到的消息,解析属性后写入日志;
publish_properties_periodically独立线程运行,5 秒一次上报温度属性(带随机波动模拟真实设备);
run()整合逻辑:建立连接 → 订阅 Topic → 启动上报线程 → 持续监听;
4.3 核心特点
  1. 协议适配:显式指定 MQTT 3.1.1,兼容 paho-mqtt 2.0+ 版本,避免回调 API 版本错误;
  2. 线程安全:上报和监听分离(独立线程),互不阻塞,保证功能稳定性;
  3. 教学友好:
    • 日志清晰标注连接/上报/监听状态,便于调试;
    • 温度值带随机小波动,模拟真实设备的属性变化;
    • 异常捕获完善,上报失败/解析失败均有明确提示;
  4. 格式严格:主动上报报文严格遵循 {"properties":{"属性 ID":"属性值"}} 格式,上报 Topic 与你指定的完全一致。

5. 测试

[图:测试运行结果]

在 Windows 环境中,运行 Python 程序,客户端上传报文,服务端接收到消息。

6. 结论

本文完成了基于 Python 的 JetLinks MQTT 3.1.1 协议设备属性主动上报功能实现,核心成果与要点如下:

  1. 功能层面:成功实现 5 秒周期的温度属性主动上报,报文格式、上报主题严格匹配 JetLinks 平台要求,同时兼顾 MQTT 消息监听与属性解析,本地日志可留存上报/接收的属性数据,满足教学演示与调试需求;
  2. 适配层面:通过显式指定 MQTT 3.1.1 协议版本、优化重连策略,解决了协议兼容、连接不稳定等问题,JetLinks 物模型「读/写/上报」权限的配置保障了属性上报的正常交互;
  3. 拓展层面:本实现具备良好的灵活性,可直接修改配置项适配湿度、光照等不同属性的上报,也可调整上报间隔适配不同业务场景;同时该逻辑可无缝迁移至嵌入式硬件设备(如单片机),实现真实物理设备的数据上报,为物联网全链路实操提供了基础参考。

整体实现兼顾了教学易懂性与实操实用性,完整覆盖了 MQTT 协议适配、平台配置、代码实现、功能验证全流程,可作为 JetLinks 物联网平台 MQTT 通信实操的入门参考。

目录

  1. 1. 前言
  2. 2. MQTT 主题及报文格式
  3. 报文格式
  4. 主题格式
  5. 3. JetLinks 配置
  6. 4. Python 实现
  7. ===================== 配置项 ======================
  8. 主动上报配置(重点)
  9. 示例属性(可根据教学需求修改,格式:{"属性 ID":"属性值"}
  10. 日志配置
  11. 4.1 核心功能
  12. 4.2 关键模块说明
  13. 4.3 核心特点
  14. 5. 测试
  15. 6. 结论
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 微信小程序离线引入 IconFont 字体图标的解决方案
  • B205mini FPGA 工程架构与开发流程解析
  • OpenArm 开源协作机器人架构设计与实践
  • Python 3.12 Logging 核心:LogRecord 机制解析与定制实战
  • RocketMQ Java 生态消息中间件架构与实战
  • 阿里 Qoder AI 编程插件评测:JetBrains 原生支持与功能体验
  • GitHub 单个文件夹一键下载为 ZIP 的实用方法
  • 解决 Git 推送提示“密码认证不支持”:SSH 密钥配置实战
  • C++ STL list 模拟实现:从底层链表到容器封装
  • 基于 Function Calling 连接大模型与业务系统
  • Spring Boot 2.7.x 升级 Logback 至 1.3.x 及以上版本的解决方案
  • Sublime Text 3 在 Windows 10 上的安装与配置指南
  • MidJourney 创作 AI 艺术详细教程
  • 牛客 NC221681 dd 爱框框:滑动窗口解法实战
  • SQL Server 2000 企业管理器打开空白故障修复方案
  • AXI 总线详解与 FPGA 实现指南
  • 自然语言处理在社交媒体分析中的应用与实战
  • Linux 45 个高效命令技巧集锦
  • Stable Diffusion 模型下载器插件使用指南
  • ERNIE-4.5 模型系列解析:架构创新与多场景性能测评

相关免费在线工具

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online