quecpython提供了aLiYun( 阿里云物联网套件客户端功能) 和 TenCentYun(腾讯云物联网套件客户端功能), 可以非常方便的连接这两个云平台, 在真正使用umqtt库之前, 我们先了解一下这两个模块, 以便将来我们写出API风格类似的模块
第一部分 阿里云服务
一. aLiYun - 阿里云服务
阿里云物联网套件客户端功能,目前的产品节点类型仅支持“设备”,设备认证方式支持“一机一密和“一型一密”
关于阿里云IOT平台的设置, 我们不在赘述, 可参考之前的文章: https://www.jianshu.com/p/f0d46324a2c6
导入模块
from aLiYun import aLiYun
1. 实例化阿里云连接
aLiYun(productKey, productSecret, DeviceName, DeviceSecret)
我们要找到关键的三元组信息:
aLiYun模块这里多了一个productSecret , 此参数是为一型一密设计的, 如果是一机一密的方式,可以传None, 需要时也可按如下方式找到
2. 设置MQTT数据通道的参数
aLiYun.setMqtt(clientID, clean_session, keepAlive)
需要注意的是,当进行阿里云的一型一密连接的时候,会在本地生成secret.json的文件用以保存设备的设备密钥,如果重刷固件或者删除,再进行连接的时候会因为没有secret.json而报错,所以重刷固件或者删除了secert.json文件,需要手动新建secret.json文件,下面secret.json文件的模板
{
"Test01": "9facf9aba414ec9eea7c10d8a4cb69a0"
}
# Test01 : 设备名
# "9facf9aba414ec9eea7c10d8a4cb69a0" 设备密钥
3.注册回调函数
aLiYun.setCallback(sub_cb)
4. 订阅mqtt主题
aLiYun.subscribe(topic,qos)
5. 发布消息
aLiYun.publish(topic,msg, qos=0)
6. 运行连接
aLiYun.start()
7. 关闭连接
aLiYun.disconnect()
二. 上传数据举例: 阿里云上传温湿度信息
from aLiYun import aLiYun
import ujson
PRODUCT_KEY = 'a1AYa96sZMJ'
PRODUCT_SECRET = None
DEVICE_NAME = 'EspTempAndHumi_D001'
DEVICE_SECRET = 'a23249cb179feee41ca2f8f38525113d'
aLiY = aLiYun(PRODUCT_KEY, PRODUCT_SECRET, DEVICE_NAME, DEVICE_SECRET)
state = 1
# 设备下发命令的set主题
ALINK_TOPIC_PROP_SET = "/sys/" + PRODUCT_KEY + \
"/" + DEVICE_NAME + "/thing/service/property/set"
# 设备上传数据的post主题
ALINK_TOPIC_PROP_POST = "/sys/" + PRODUCT_KEY + \
"/" + DEVICE_NAME + "/thing/event/property/post"
# 设备post上传数据要用到一个json字符串, 这个是拼接postJson用到的一个字符串
ALINK_METHOD_PROP_POST = "thing.event.property.post"
def sub_cb(topic, msg):
global state
print(
"Subscribe Recv: Topic={},Msg={}".format(
topic.decode(), msg.decode()))
state -= 1
clientID = "testDevice"
aLiY.setMqtt(clientID, clean_session=False, keepAlive=300)
aLiY.setCallback(sub_cb)
aLiY.subscribe(ALINK_TOPIC_PROP_POST)
data_dict = {
"CurrentTemperature": 24.3,
"CurrentHumidity": 47.5,
"GeoLocation": {
"CoordinateSystem": 2,
"Latitude": 36.11,
"Longitude": 117.09,
"Altitude": 150
}
}
msg_dict = {
"id": 1,
"version": 1.0,
"method": ALINK_METHOD_PROP_POST,
"params": data_dict
}
aLiY.publish(ALINK_TOPIC_PROP_POST, ujson.dumps(msg_dict))
aLiY.start()
while True:
if state:
pass
else:
aLiY.disconnect()
break
三. 下发命令举例: 远程控制灯开关
from aLiYun import aLiYun
import ujson
from machine import Timer
PRODUCT_KEY = 'a17lGhkKwXs'
PRODUCT_SECRET = None
DEVICE_NAME = 'esp32LightHome'
DEVICE_SECRET = '14fb77db62910b887dd28c5e449f406e'
aLiY = aLiYun(PRODUCT_KEY, PRODUCT_SECRET, DEVICE_NAME, DEVICE_SECRET)
# 设备下发命令的set主题
ALINK_TOPIC_PROP_SET = b"/sys/" + PRODUCT_KEY + \
"/" + DEVICE_NAME + "/thing/service/property/set"
# 设备上传数据的post主题
ALINK_TOPIC_PROP_POST = b"/sys/" + PRODUCT_KEY + \
"/" + DEVICE_NAME + "/thing/event/property/post"
light_status = 0
# 回调函数
def sub_cb(topic, msg):
if topic == ALINK_TOPIC_PROP_POST:
print(
"上报成功! Subscribe Recv: Topic={},Msg={}".format(
topic.decode(), msg.decode()))
elif topic == ALINK_TOPIC_PROP_SET:
print("下发成功! Subscribe Recv: Topic={},Msg={}".format(
topic.decode(), msg.decode()))
params = ujson.loads(msg.decode())['params']
global light_status
light_status = params["LightSwitch"]
print("灯亮了" if light_status else "灯灭了")
clientID = "testDevice" # 客户端ID,随便取名
aLiY.setMqtt(clientID, clean_session=False, keepAlive=300) # 设置MQTT连接
aLiY.setCallback(sub_cb) # 设置回调函数
aLiY.subscribe(ALINK_TOPIC_PROP_POST) # 订阅上传数据主题
def send_msg_to_AliY(args):
# 要上传的数据
data_dict = {
"LightSwitch": light_status
}
# 上传数据格式
msg_dict = {
"id": 1,
"version": 1.0,
"method": "thing.event.property.post",
"params": data_dict
}
aLiY.publish(ALINK_TOPIC_PROP_POST, ujson.dumps(msg_dict))
timer1 = Timer(Timer.Timer1)
timer1.start(period=5000, mode=Timer.PERIODIC, callback=send_msg_to_AliY)
aLiY.start()
while True:
pass
第二部分 腾讯云服务
腾讯云物联网套件客户端功能,目前的产品节点类型仅支持“设备”,设备认证方式支持“一机一密和“动态注册认证”。
from TenCentYun import TXyun
一. TenCentYun- 腾讯云服务
1. 实例化腾讯云服务
TXyun(productID, devicename, devicePsk, ProductSecret)
2. 设置MQTT数据通道的参数
TXyun.setMqtt(clean_session, keepAlive)
3. 注册回调函数
TXyun.setCallback(sub_cb)
4. 订阅mqtt主题
TXyun.subscribe(topic,qos=0)
5. 发布消息
TXyun.publish(topic,msg, qos=0)
6. 运行连接
TXyun.start()
7. 关闭连接
TXyun.disconnect()
二. 举例
现在看来, 腾讯云和阿里云IOT一毛一样, 直接参考阿里云的例子即可
此外, 我看腾讯云IOT文档, 好多是基于SDK介绍的, 而又没用提供micro-python SDK, 这就很尴尬了,腾讯云IOT我用的少, 但毕竟腾讯出品, 我相信她是很完善的平台。大家可以自行尝试。