目录
3. Python设备-aliyun-iot-linkkit
前言:
随着物联网技术的快速发展,设备间的高效通信成为关键需求。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)-阿里云帮助中心
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
官方示例代码:
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
官方示例代码:
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将在更多场景中发挥重要作用。希望本文能为您在物联网开发中提供有价值的参考,助力您构建更高效、更稳定的物联网系统!