You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python中通过Mosquitto将latest_dweet变量作为消息发送?

解决方案

要实现将latest_dweet作为MQTT消息发送,你需要解决两个核心问题:将Python对象转为可传输的JSON字符串,以及安全拼接shell命令避免转义错误,具体步骤如下:

1. 关键问题分析

直接将latest_dweet硬塞进os.system的命令字符串会失败,原因是:

  • latest_dweet是Python列表对象,不是标准的字符串格式,直接转换会生成不符合MQTT预期的Python风格字符串(比如带方括号和单引号)。
  • shell命令中的引号处理容易出错,特殊字符会导致命令被截断或解析失败。

2. 修改后的代码实现

推荐使用subprocess模块替代os.system(更安全,无需手动转义),同时用json模块将Python对象转为标准JSON字符串:

import dweepy
import os
import json
import subprocess

_ = os.system("clear")

myThing = "4400D_sensor" # 替换为你的dweet thing名称

print("getting latest dweet...")
latest_dweet = dweepy.get_latest_dweet_for(myThing) # 获取最新dweet
latest_created = latest_dweet[0]["created"]  
latest_content = latest_dweet[0]["content"]
print("Latest dweet time:", latest_created)
print("Latest dweet content:", latest_content)
print("Latest dweet JSON")
print(latest_dweet)
print()

# 将Python对象转为标准JSON字符串
# 若只需发送传感器数据部分,可替换为 json.dumps(latest_content)
message = json.dumps(latest_dweet)

# 使用subprocess发送MQTT消息,无需处理shell转义
subprocess.run([
    'mosquitto_pub', 
    '-d', 
    '-h', '172.19.0.12', 
    '-t', 'cisco/iots/user', 
    '-m', message
])

3. 可选:仍使用os.system的写法

如果坚持用os.system,需要手动转义JSON字符串中的引号,确保shell能正确解析:

# 转义JSON中的双引号,并用单引号包裹消息内容
message = json.dumps(latest_dweet).replace('"', '\\"')
os.system(f'mosquitto_pub -d -h 172.19.0.12 -t cisco/iots/user -m "{message}"')

注意:这种写法仍存在shell注入风险,仅适合测试场景,生产环境优先用subprocess的列表参数形式。

内容的提问来源于stack exchange,提问作者Benjamin Lee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 05:31:35