View Categories

Python通过MQTT接入示例

概述 #

本文以Python语言为例,介绍通过MQTTS/MQTT协议接入平台,基于平台接口实现“属性上报”、“订阅接收命令”等功能。

说明:

本文中使用的代码为样例代码,仅用于体验平台通信功能,如需进行商用,可以参考资源获取获取对应语言的IoT Device SDK进行集成。

前提条件 #

  • 已安装python,若未安装请参考安装python
  • 已在管理控制台获取设备接入地址。获取地址的操作步骤,请参考平台对接信息。
  • 已在管理控制台创建产品和设备。创建产品和设备的具体操作细节,请参考创建产品、注册单个设备或批量注册设备。

准备工作 #

  • 安装python
  1. 访问python官网,选择合适系统的版本下载并安装。(本文以windows系统为例,安装python3.8.2)。Python通过MQTT接入示例插图
  2. 下载完成后,运行exe文件进行安装。
  3. 勾选“Add python 3.8 to PAYTH”(如无勾选,需手动配置环境变量),单击“Customize installation”,按照界面提示安装。Python通过MQTT接入示例插图1
  4. 检查python是否安装成功。Win键 + r –>输入 cmd–>回车,进入命令行窗口,输入python –V,回车后显示python版本即表示安装成功。Python通过MQTT接入示例插图2

完整代码 #

# -*- coding: utf-8 -*-

import paho.mqtt.client as mqtt
import json
import threading

# MQTT 服务器地址
MQTT_BROKER = "iot.modbus.cn"
# MQTT 端口号
MQTT_PORT = 1883
# MQTT 客户端 ID
MQTT_CLIENT_ID = "4QR8TZ9ThuL4G"
# MQTT 用户名
MQTT_USERNAME = "ceshi"
# MQTT 密码
MQTT_PASSWORD = "Abc123456"
# 订阅的主题
MQTT_TOPIC_SUBSCRIBE = "/server/coo/4QR8TZ9ThuL4G"
# 发布的主题
MQTT_TOPIC_PUBLISH = "/dev/coo/4QR8TZ9ThuL4G"

# 创建 MQTT 客户端
client = mqtt.Client(client_id=MQTT_CLIENT_ID)
client.username_pw_set(MQTT_USERNAME, MQTT_PASSWORD)

# 连接成功回调函数
def on_connect(client, userdata, flags, rc):
    print("Connected with result code " + str(rc))
    # 订阅主题
    client.subscribe(MQTT_TOPIC_SUBSCRIBE)

# 接收消息回调函数
def on_message(client, userdata, msg):
    print("Received message: " + msg.topic + " " + msg.payload.decode())

# 发布消息
def publish_message(client, topic, payload):
    client.publish(topic, payload)

# 心跳函数
def send_heartbeat():
    print("Sending heartbeat")
    # 发送心跳消息
    publish_message(client, MQTT_TOPIC_PUBLISH, "heartbeat")
    # 定时调用自身
    threading.Timer(60, send_heartbeat).start()

# 定时上报函数
def report_data():
    print("Reporting data")
    # 待上报的数据
    message = [
        {"sensor_device_id": 1, "port_id": 1, "sdata": 33},
        {"sensor_device_id": 1, "port_id": 2, "sdata": 60}
    ]
    payload = json.dumps(message)
    # 发布数据
    publish_message(client, MQTT_TOPIC_PUBLISH, payload)
    # 定时调用自身
    threading.Timer(10, report_data).start()

# 设置回调函数
client.on_connect = on_connect
client.on_message = on_message

# 连接 MQTT 服务器
client.connect(MQTT_BROKER, MQTT_PORT, 60)

# 启动心跳定时器
send_heartbeat()

# 启动定时上报定时器
report_data()

# 循环监听消息
client.loop_forever()

备注:从设备地址是sensor_device_id ,寄存器是port_id,数据数值是Sdata ,具体稍后有具体说明。

MQTT基本信息

Topic权限说明
Broker Addressiot.modbus.cnMQTT地址
Broker Port1883MQTT端口号
Client ID4QR8TZ9ThuL4G设备号SN(请替换为自己的)

MQTT账号密码

Topic权限说明
User Nameceshi用户账户
Password123456用户密码

MQTT 主题一览 #

Modbus物联网平台 作为物联网 PaaS 云平台,对设备 MQTT 接入提供了内置的访问协议规范,让设备和云平台的消息通信更加有章可循,大大简化了物联网项目的开发难度,缩短了产品的开发周期。

不同于普通的 MQTT 使用方式,我们提供了标准的内置主题,这足以实现绝大多数的物联网应用场景。

Topic权限说明
/dev/coo/4QR8TZ9ThuL4GPublished上行通信:设备通过该Topic向物联网平台发送消息。
/server/coo/4QR8TZ9ThuL4G订阅下行通信:设备通过订阅该Topic,获取从物联网平台下发的消息。

4QR8TZ9ThuL4G为示例设备号SN,请替换为自己的!

详解介绍 #

  1. 导入必要的库和模块:
pythonCopy code
import paho.mqtt.client as mqtt
import json
import threading

此外,请确保您已经安装了paho-mqtt库。您可以使用以下命令安装它:

pip install paho-mqtt
  1. 定义 MQTT 相关的参数:
pythonCopy code
MQTT_BROKER = "cloud.modbus.cn"
MQTT_PORT = 1883
MQTT_CLIENT_ID = "4QR8TZ9ThuL4G"
MQTT_USERNAME = "ceshi"
MQTT_PASSWORD = "Abc123456"
MQTT_TOPIC_SUBSCRIBE = "/server/coo/4QR8TZ9ThuL4G"
MQTT_TOPIC_PUBLISH = "/dev/coo/4QR8TZ9ThuL4G"
  1. 创建 MQTT 客户端:
pythonCopy code
client = mqtt.Client(client_id=MQTT_CLIENT_ID)
client.username_pw_set(MQTT_USERNAME, MQTT_PASSWORD)
  1. 定义连接成功的回调函数:
pythonCopy code
def on_connect(client, userdata, flags, rc):
    print("Connected with result code " + str(rc))
    client.subscribe(MQTT_TOPIC_SUBSCRIBE)
  1. 定义接收消息的回调函数:
pythonCopy code
def on_message(client, userdata, msg):
    print("Received message: " + msg.topic + " " + msg.payload.decode())
  1. 定义发布消息的函数:
pythonCopy code
def publish_message(client, topic, payload):
    client.publish(topic, payload)
  1. 定义心跳函数:
pythonCopy code
def send_heartbeat():
    print("Sending heartbeat")
    publish_message(client, MQTT_TOPIC_PUBLISH, "heartbeat")
    threading.Timer(60, send_heartbeat).start()
  1. 定义定时上报函数:
pythonCopy code
def report_data():
    print("Reporting data")
    message = [
        {"sensor_device_id": 1, "port_id": 1, "sdata": 33},
        {"sensor_device_id": 1, "port_id": 2, "sdata": 60}
    ]
    payload = json.dumps(message)
    publish_message(client, MQTT_TOPIC_PUBLISH, payload)
    threading.Timer(10, report_data).start()
  1. 设置客户端的连接成功和消息接收的回调函数:
pythonCopy code
client.on_connect = on_connect
client.on_message = on_message
  1. 连接 MQTT 服务器:
pythonCopy code
client.connect(MQTT_BROKER, MQTT_PORT, 60)
  1. 启动心跳定时器:
pythonCopy code
send_heartbeat()
  1. 启动定时上报定时器:
pythonCopy code
report_data()
  1. 进入消息监听循环:
pythonCopy code
client.loop_forever()

Powered by BetterDocs

发表回复

Your email address will not be published. 必填项已用 * 标注