MQTT协议详解及阿里云物联网平台实战指南

目录

1. MQTT协议概述

2. 阿里云配置云服务

2.1. 开通公共实例

2.2. 新建产品

2.2.1. 单击创建产品

2.2.2. 填入产品名称

2.2.3. 选择产品类别

2.3. 功能定义

2.4. 添加设备

3. Python设备-aliyun-iot-linkkit

3.1. 环境初始化

3.2. 配置物模型

3.3. 配置设备参数

3.4. 设置上报数据格式

4. Python设备-PahoMQTT

4.1. 参数定义

4.2. python发布

4.3. python订阅

4.4. 完整示例


前言:
随着物联网技术的快速发展,设备间的高效通信成为关键需求。MQTT(Message Queuing Telemetry Transport)作为一种轻量级、低开销的通信协议,凭借其发布/订阅模式、灵活的QoS级别和强大的可靠性机制,成为物联网领域的首选协议之一。本文将深入解析MQTT协议的核心特性,并结合阿里云物联网平台,手把手指导您完成设备接入、消息发布与订阅的完整流程,帮助开发者快速实现物联网应用的高效通信。

1. MQTT协议概述

MQTT(Message Queuing Telemetry Transport)是一种轻量级的消息传输协议,设计用于在低带宽和不稳定网络环境下进行高效的通信。以下是MQTT协议的主要特点:

发布/订阅模式:MQTT采用发布/订阅模式,其中客户端可以订阅一个或多个主题(Topic),而服务器则负责将消息发布到这些主题。这种模式使得多个客户端可以同时接收到感兴趣的消息。

轻量级:MQTT协议非常轻量级,协议头部信息很小,有效减少了网络传输的开销和数据流量。这使得MQTT非常适合在低带宽和有限资源的设备上使用,例如物联网设备。

QoS级别:MQTT支持三个不同的消息传输质量(QoS)级别:0、1和2。QoS级别决定了消息传输的可靠性和保证程度。较高的QoS级别会增加通信开销,但可以提供更可靠的消息传输。

  • QoS 0:最多一次交付
  • QoS 1:至少一次交付
  • QoS 2:只有一次交付
  • 阿里云关于QoS的介绍:https://developer.aliyun.com/article/1362875

可靠性和持久性:MQTT协议具有可靠性和持久性机制。客户端可以选择是否要求服务器保留未传递的消息,以便在客户端重新连接时重新发送。这确保了即使在网络中断或重新连接时,消息也不会丢失。

安全性:MQTT协议支持使用TLS/SSL进行加密和身份验证,以确保通信的安全性。这对于保护敏感数据和防止未经授权的访问非常重要。

总结而言,MQTT协议是一种灵活、可靠且适用于物联网应用的通信协议。它具有低开销、轻量级和可扩展等特点,使得它成为物联网设备之间进行高效通信的理想选择。

常用MQTT Broker:华为云,阿里云,涂鸦云,emqx

免费在线测试:broker.emqx.io

2. 阿里云配置云服务

阿里云登录 - 欢迎登录阿里云,安全稳定的云计算服务平台

2.1. 开通公共实例

点击左上角,搜索物联网,点击物联网平台

点击立即开通

确认成功开通

选择华东2-上海,点击开通公共实例

成功开通后,界面如下:

设备与阿里云关系图

设备接入物联网平台的具体流程:云端开发和设备端开发_物联网平台(IoT)-阿里云帮助中心

2.2. 新建产品

2.2.1. 单击创建产品

2.2.2. 填入产品名称

2.2.3. 选择产品类别

2.3. 功能定义

产品 - 功能定义 - 前往编辑草稿 里添加一个主灯开关功能:

2.4. 添加设备

批量添加设备

选择产品并设置数量如下:

点击确认后

这里会为每个设备生成唯一的DeviceName和DeviceSecret,用于在设备代码里通过MQTT与阿里云服务通讯。云平台会根据这些参数识别是哪个设备。这里没有点击下载到证书也没关系,可以在管理页面上查看或下载。

3. Python设备-aliyun-iot-linkkit

参考文档,根据开发文档配置Python运行环境:

Python Link SDK开发环境的推荐版本和配置方法_物联网平台(IoT)-阿里云帮助中心

设备使用Python Link SDK物模型通信_物联网平台(IoT)-阿里云帮助中心

如何下载设备端SDK_物联网平台(IoT)-阿里云帮助中心

3.1. 环境初始化

创建和激活VirtualEnvironments(可选)

# 进入工程所在目录,创建虚拟环境
python -m venv test_env
# 激活虚拟环境
test_env\Scripts\activate.bat            

安装Link SDK:

执行以下命令安装paho-mqtt 1.4.0版本。

pip install paho-mqtt==1.4.0

执行以下命令安装Link SDK最新版本。

pip install aliyun-iot-linkkit

官方示例代码:

python-linkkit-examples.zip

3.2. 配置物模型

查看并导出模型文件

覆盖原有tsl.json模型内容

3.3. 配置设备参数

这里要根据每个设备的信息进行配置如下:

self.__linkkit = linkkit.LinkKit(
            host_name="cn-shanghai",
            product_key="k1jkx735wzr",
            device_name="3WHrZxxxxxPauMxSFdUh",
            device_secret="3d10e399yyyyyy94d2e779cc0a87e32c")

3.4. 设置上报数据格式

prop_data = {
    "CurrentTemperature": 110,
    "CurrentHumidity": 120,
    "LightSwitch": 1,
}

4. Python设备-PahoMQTT

PahoMQTT是更加通用的MQTT通讯实现框架,可适用于所有物联网云平台。

可参考如下文档,根据开发文档配置Python运行环境:

执行以下命令安装Python语言版本的Paho MQTT库,您也可访问Paho-MQTT,查看更多信息。

pip install paho-mqtt==1.6.1

官方示例代码:

aiot-python-demo.zip

4.1. 参数定义

productKey="k0ejuKHBeSm"
deviceName="Dx2loZ2kr3e7EnhzBKZD"
deviceSecret="7b62a2dbb171a55b0a3cb29c1427de2a"
clientId = "Dx2loZ2kr3e7EnhzBKZD"

subTopic = f"/sys/{productKey}/{deviceName}/thing/event/property/post_reply"
pubTopic = f"/sys/{productKey}/{deviceName}/thing/event/property/post"

4.2. python发布

def publish_message():
    # publish 5 messages to pubTopic("/a1LhUsK****/python***/user/update")
    data = {"id": "123",
            "version": "1.0",
            "params": {
                        "PowerSwitch": 1,
                       "CurrentTemperature": 27.6
                       },
            "method": "thing.event.property.post"
            }
    for i in range(5):
        data["params"]["CurrentTemperature"] = 23.6+i
        message = json.dumps(data)
        client.publish(pubTopic, message)
        print("publish msg: " + str(i))
        print("publish msg: " + message)
        time.sleep(2)

4.3. python订阅

def subscribe_topic():
    # subscribe to subTopic("/a1LhUsK****/python***/user/get") and request messages to be delivered
    client.subscribe(subTopic)
    print("subscribe topic: " + subTopic)

import json
import time
import paho.mqtt.client as mqtt
from MqttSign import AuthIfo

# set the device info, include product key, device name, and device secret

productKey="k0ejuKHBeSm"
deviceName="Dx2loZ2kr3e7EnhzBKZD"
deviceSecret="7b62a2dbb171a55b0a3cb29c1427de2a"
clientId = "Dx2loZ2kr3e7EnhzBKZD"
# set timestamp, clientid, subscribe topic and publish topic
timeStamp = str((int(round(time.time() * 1000))))

subTopic = f"/sys/{productKey}/{deviceName}/thing/event/property/post_reply"
subTopic1 = f"/sys/{productKey}/{deviceName}/thing/service/property/set"
pubTopic = f"/sys/{productKey}/{deviceName}/thing/event/property/post"
# set host, port
host = productKey + ".iot-as-mqtt.cn-shanghai.aliyuncs.com"
# instanceId = "***"
# host = instanceId + ".mqtt.iothub.aliyuncs.com"
port = 1883

# set tls crt, keepalive
tls_crt = "root.crt"
keepAlive = 300

# calculate the login auth info, and set it into the connection options
m = AuthIfo()
m.calculate_sign_time(productKey, deviceName, deviceSecret, clientId, timeStamp)
m.calculate_sign(productKey,deviceName,deviceSecret,clientId)
client = mqtt.Client(m.mqttClientId)
client.username_pw_set(username=m.mqttUsername, password=m.mqttPassword)
client.tls_set(tls_crt)

print(f"clientid:{m.mqttClientId}")
print(f"username:{m.mqttUsername}")
print(f"password:{m.mqttPassword}")
print(f"pub_topic:{pubTopic}")
print(f"subTopic:{subTopic}")
print(f"subTopic1:{subTopic1}")

def on_connect(client, userdata, flags, rc):
    if rc == 0:
        print("Connect aliyun IoT Cloud Sucess")
    else:
        print("Connect failed...  error code is:" + str(rc))

def on_message(client, userdata, msg):
    topic = msg.topic
    payload = msg.payload.decode()
    print("receive message ---------- topic is : " + topic)
    print("receive message ---------- payload is : " + payload)

    if ("thing/service/property/set" in topic):
        on_thing_prop_changed(client, msg.topic, msg.payload)

def on_thing_prop_changed(client, topic, payload):
    post_topic = topic.replace("service","event")
    post_topic = post_topic.replace("set","post")
    Msg = json.loads(payload)
    params = Msg['params']
    post_payload = "{\"params\":" + json.dumps(params) + "}"
    print("reveice property_set command, need to post ---------- topic is: " + post_topic)
    print("reveice property_set command, need to post ---------- payload is: " + post_payload)
    client.publish(post_topic, post_payload)

def connect_mqtt():
    client.connect(host, port, keepAlive)
    return client

def publish_message():
    # publish 5 messages to pubTopic("/a1LhUsK****/python***/user/update")
    data = {"id": "123",
            "version": "1.0",
            "params": {
                        "PowerSwitch": 1,
                       "CurrentTemperature": 27.6
                       },
            "method": "thing.event.property.post"
            }
    for i in range(5):
        data["params"]["CurrentTemperature"] = 23.6+i
        message = json.dumps(data)
        client.publish(pubTopic, message)
        print("publish msg: " + str(i))
        print("publish msg: " + message)
        time.sleep(2)

def subscribe_topic():
    # subscribe to subTopic("/a1LhUsK****/python***/user/get") and request messages to be delivered
    client.subscribe(subTopic)
    print("subscribe topic: " + subTopic)

client.on_connect = on_connect
client.on_message = on_message
client = connect_mqtt()
client.loop_start()
time.sleep(2)

subscribe_topic()
publish_message()

while True:
    time.sleep(1)

 结语:
MQTT协议以其轻量化和高可靠性的特点,为物联网设备通信提供了理想的解决方案。通过本文的介绍和实战演示,相信您已经掌握了MQTT的核心概念及如何在阿里云平台上快速部署设备通信。未来,随着物联网技术的不断演进,MQTT将在更多场景中发挥重要作用。希望本文能为您在物联网开发中提供有价值的参考,助力您构建更高效、更稳定的物联网系统!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

薛慕昭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值