美文网首页
移远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