基于移远QuecPython开发板对接华为云

举报
星辰27 发表于 2022/02/26 15:20:50 2022/02/26
【摘要】 本文基于移远QuecPython cat1开发板EC600X_QuecPython_EVB_V2.0,基于其内部固件开发demo对接华为云

1 云端开发

首先进入华为云官网,登陆华为云账号,进入IoTDA(设备接入),点击产品,创建产品。

1.png

图1

按照下图,自定义产品名称、厂商名称以及设备类型。

2.png

图2

点击产品,在右侧产品名称列表中点击上述创建的产品名称,进入产品,点击上传模型文件,选择添加文件,将附件(Agriculture_Profile)中的模型文件压缩包上传到云端。

3.png

图3

点击上述产品中的在线调试,新增测试设备,注意设备标识码保持唯一性。

4.png

图4

创建设备后,会出现设备ID和产品秘钥,请保存好设备秘钥,或者点击左侧导航栏,进入设备列表,在“所有设备”中找到新增的真实设备,进行重置秘钥。注意设备ID和设备秘钥是设备对接华为云的关键信息,后面会用到二者进行设备鉴权。

5.png

图5

2 模组开发环境安装(如已经安装略过该步骤)

下载RDA驱动,根据系统环境进行选择对应系统版本安装,之后参考官方文档进行开发环境搭建,QuecPython开发环境搭建

3端侧开发

将下述脚本烧录到开发板,点击运行。需要将图5中的设备ID和设备秘钥替换为华为云IoTDA中的设备信息

图6

import utime
import _thread
import ujson
import modem
import hmac
from hashlib import sha256
from umqtt import MQTTClient
from machine import UART

# 如果想使用IMEI,可通过下列语句该进行获取IMEI号
IMEI = modem.getDevImei()

# 客户只需要提供DeviceID和DeviceSecret即可实现对接华为云
DeviceID = "62183fafe68aa647c087eee6_cat_test227"
DeviceSecret = "4fd113fbbdd5dcbe1a93091ce4ea1829"

TIME_STAMP = str(utime.time())
CLIENT_ID = DeviceID + "_0_0_"+ TIME_STAMP
SERVER = "a15fbbd7ce.iot-mqtts.cn-north-4.myhuaweicloud.com"
PORT = 1883

USER = DeviceID
PASSWORD = hmac.new(
    TIME_STAMP.encode('utf-8'),
    DeviceSecret.encode('utf-8'),
    digestmod=sha256).hexdigest()

state = 0

utime.time()

def sub_cb(topic, msg):
    global state
    global c
    #global state
    print("Subscribe Recv: Topic={},Msg={}".format(topic.decode(),msg.decode()))
    topic = topic.decode()
    msg = b'''{"result_code": 0}'''
    if r'/sys/commands/request_id=' in topic:
        c.publish('$oc/devices/{}/sys/commands/response/request_id={}'.format(DeviceID, (topic.split("=")[-1])), msg)
        #state = 1

def mqtt_init():
    global c
    # 创建一个mqtt实例
    c = MQTTClient(
        client_id=CLIENT_ID,
        server=SERVER,
        port=PORT,
        user=USER,
        password=PASSWORD,
        keepalive=30) # 必须要 keepalive=30 ,否则连接不上
    # 设置消息回调
    c.set_callback(sub_cb)

    # 建立连接
    c.connect()
    c.subscribe('$oc/devices/{}/sys/commands/#'.format(DeviceID))

# 数据上报任务
def thread_reportmsg():
    global c 

    while True:
        tem = utime.time() % 25
        hum = utime.time() % 35
        lum = utime.time() % 100
        Msg = {
            "services": [{
                "service_id": "Agriculture",
                "properties": {
                "Temperature": tem,
                "Humidity": hum,
                "Luminance": lum,
                "LightStatus": "ON",
                "MotorStatus": "OFF"
               }
            }]
        }

        msg = ujson.dumps(Msg)

        c.publish('$oc/devices/{}/sys/properties/report'.format(DeviceID), msg)
        utime.sleep_ms(2000)

# 命令处理任务
def thread_rcvmsg():
    global c

    print('Waiting command')
    while True:
        c.wait_msg()
        if state == 1:
            utime.sleep_ms(300)
            break
    # 断开连接函数没有执行,函数中没有将state置为1,如果想增加断开连接,可以在某处增加断开连接
    c.disconnect()

def main():
    mqtt_init()
    _thread.start_new_thread(thread_reportmsg, ())
    _thread.start_new_thread(thread_rcvmsg, ())

if __name__ == "__main__":
    main()

可以看见在云端看到设备在线同时将模拟数据上传到华为云。

6.png

图7

如果想看到数据一一对应的关系,可以在上述代码中添加打印日志,将msg打印出来实现对照具体如下图所示。可见上报消息与端侧打印的日志是一致的。

端.png

图8

云.png

图9

点击同步命令下发下的命令下发,选择命令以及命令值,进行命令下发

7.png

图10

点击命令下发,可见命令下发成功。

8.png

图11

同时在设备侧控制台可以看见日志打印信息。

9.png

图12

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。