基于移远QuecPython开发板对接华为云
【摘要】 本文基于移远QuecPython cat1开发板EC600X_QuecPython_EVB_V2.0,基于其内部固件开发demo对接华为云
1 云端开发
首先进入华为云官网,登陆华为云账号,进入IoTDA(设备接入),点击产品,创建产品。
图1
按照下图,自定义产品名称、厂商名称以及设备类型。
图2
点击产品,在右侧产品名称列表中点击上述创建的产品名称,进入产品,点击上传模型文件,选择添加文件,将附件(Agriculture_Profile)中的模型文件压缩包上传到云端。
图3
点击上述产品中的在线调试,新增测试设备,注意设备标识码保持唯一性。
图4
创建设备后,会出现设备ID和产品秘钥,请保存好设备秘钥,或者点击左侧导航栏,进入设备列表,在“所有设备”中找到新增的真实设备,进行重置秘钥。注意设备ID和设备秘钥是设备对接华为云的关键信息,后面会用到二者进行设备鉴权。
图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()
可以看见在云端看到设备在线同时将模拟数据上传到华为云。
图7
如果想看到数据一一对应的关系,可以在上述代码中添加打印日志,将msg打印出来实现对照具体如下图所示。可见上报消息与端侧打印的日志是一致的。
图8
图9
点击同步命令下发下的命令下发,选择命令以及命令值,进行命令下发
图10
点击命令下发,可见命令下发成功。
图11
同时在设备侧控制台可以看见日志打印信息。
图12
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)