美文网首页
移远QuecPython(基于EC600s)开发物联网应用(九)

移远QuecPython(基于EC600s)开发物联网应用(九)

作者: 熊爸天下_56c7 | 来源:发表于2021-05-19 08:50 被阅读0次

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我用的少, 但毕竟腾讯出品, 我相信她是很完善的平台。大家可以自行尝试。

相关文章

网友评论

      本文标题:移远QuecPython(基于EC600s)开发物联网应用(九)

      本文链接:https://www.haomeiwen.com/subject/giofjltx.html