diff --git a/docs/Advanced_development/zh/QuecPythonCloud/QuecCloud.md b/docs/Advanced_development/zh/QuecPythonCloud/QuecCloud.md index f22211bfe8bad0f0981c50ef9ebf88210e3fb82e..1334a7124fe64f168fb517e0f838d4002536f17a 100644 --- a/docs/Advanced_development/zh/QuecPythonCloud/QuecCloud.md +++ b/docs/Advanced_development/zh/QuecPythonCloud/QuecCloud.md @@ -1,197 +1,196 @@ -# QuecPython 接入QuecCloud +## 文档历史 -文档主要介绍如何使用QuecCloud移远云,QuecCloud物联网平台,为客户的多种终端设备提供安全可靠的网络快速接入、数据传输、数据存储、数据管理等完整的交互服务。可通过云端调用API实现海量设备和应用的数据传输,达到控制设备和采集数据的目的。 +| **版本** | **日期** | **作者** | **变更表述** | +| -------- | ---------- | -------- | ------------ | +| 1.0 | 2021-04-30 | Chic | 初始版本 | -下面主要从MQTT连接方式讲解,通过阅读本文,您将了解到QuecPython连接QuecCloud的过程操作和验证实验理论。 -## 云端设置 -移远云首页: +## 平台设置 -### 进入平台 - -点击【控制台】 - -![](media/cf31ba54e8b803da79ad1e8b9fccfa4e.png) - -### 创建产品 - -![](media/88b354fa6b1122bc4eae448106fdb35e.png) - -![](media/01d0bcf1fbf597194344c90c7b58e995.png) - -### 添加设备 - -![](media/ed3b9173920f4482dfa234c37b3850e7.png) - -进入【设备列表】后,点击【+添加设备】 - -![](media/ee86dd4eeaf37ec47d9a51073c1ca133.png) - -![](media/440b41bd014245ad52d9f4680babcbac.png) - -IMEI在模组的丝印面上可以找到,也可以通过AT指令“AT+GSN”读取。 - -至此,手动添加设备已经完成。 - -![](media/642222a1f350d8d00ea7df18a97d1da9.png) - -### 获取Secret - -在设备详情页面里面记下Secret,用于连接移远云平台。 - -![](media/56bc1e7957122a00bd028918c3bb5d18.png) - -批量时可通过API接口获取Secret,用于连接移远云平台 - -文档中心说明:[https://iot.quectel.com/doc_getStart.html\#api_AcquireTheInformation](https://iot.quectel.com/doc_getStart.html#api_AcquireTheInformation) - -![](media/5cb4cffb7b4e9f1d2464ee487f5f1544.png) - -### 生成连接信息 - -``` -CLIENT_ID = IMEI - -SERVER = b"southbound.quectel.com" - -PORT = 1883 +移远云首页: -USER = IMEI - -PASSWORD = b '7fe0570d91f2ef2bcd4d5683f68521e5' -``` +### 进入平台 -**CLIENT_ID:**固定为IMEI +![image-20210429152213712](media\QuecPythonCloud_210430_01.png) -**SERVER:**固定为"southbound.quectel.com" +### 创建项目 -**PORT:**固定为1883 +点击进入【研发中心】后,点击【创建新项目】 -**USER:**固定为IMEI +![image-20210430094256723](media\QuecPythonCloud_210430_02.png) -**PASSWORD:**上一步骤获取的Secret +设置项目名称: -### 上报和下发数据 +![image-20210429152734418](media\QuecPythonCloud_210430_03.png) -调试设备时,上传、下发的数据都可以在【设备详情】---【数据交互】查看: +### 创建产品 -![](media/a77c5bba88013408eb44dde38f358938.png) +在创建的项目表中,点击【查看产品】 -> 【创建产品】 -## 软件设计 +![image-20210430094646473](media\QuecPythonCloud_210430_04.png) -在QuecCloud平台取得Secret之后,即可在umqtt连接云平台,模块的IMEI在代码中自动获取,其IMEI号和Secret号码在平台中添加的设备一一对应,连接云平台的地址和端口固定不变,因此在程序中设定Secret的值之后,就可以运行实验了。 +根据需求自定义产品: -示例代码: +连网方式选择:蜂窝移动 -```python -from umqtt import MQTTClient +数据格式:Json时,根据物模型的功能点解释数据; 透传时,数据原样直达模组,自行解释数据。 -import modem +![image-20210429160105700](media\QuecPythonCloud_210430_05.png) -import utime +点击【下一步】选择一个产品所用的模组型号,便于跟踪管理产品。 -import _thread +![image-20210429170536898](media\QuecPythonCloud_210430_06.png) -IMEI = None # modem.getDevImei() +产品创建完成后,可看到新增的产品: -Secret = '7fe0570d91f2ef2bcd4d5683f68521e5' +![image-20210429175540612](media\QuecPythonCloud_210430_07.png) -address = "southbound.quectel.com" -Port = 1883 -def GetDevImei(): +### 定义物模型 - global IMEI +点击【产品信息】 -> 【功能定义】,根据自己的需求增加产品的功能。注意:这里的“**功能ID**”序号,在代码上用到。 - IMEI = modem.getDevImei() +![image-20210429175757844](media\QuecPythonCloud_210430_08.png) - #print(IMEI) -state = 0 -def sub_cb(topic, msg): +至此,平台创建操作已经完成。 - global state - print( - "Subscribe Recv: Topic={},Msg={}".format( +### 认证设备 - topic.decode(), +模组连接平台时,将自动创建设备并认证,无需手动添加设备。 - msg.decode())) +![image-20210429161558848](media\QuecPythonCloud_210430_09.png) - state = 1 +目前还没有设备,设备列表为空。 -def MQTT_Init(): +![image-20210429172733143](media\QuecPythonCloud_210430_10.png) - # 创建一个mqtt实例 +### 获取Secret - c = MQTTClient( +“研发中心” -> “查看产品” -> “产品信息” -> 点击【查看】,ProductKey和ProductSecret将发送到您的注册邮箱,用于连接平台。 - IMEI, +![image-20210429180045538](media\QuecPythonCloud_210430_11.png) - address, +![image-20210429171216156](media\QuecPythonCloud_210430_12.png) - Port, +获取ProductKey、ProductSecret之后,就可以使用QuecPython代码连接平台了。 - user=IMEI, +**提醒:所有操作都在“研发中心”** - password=Secret) - # 设置消息回调 - c.set_callback(sub_cb) - - # 建立连接 +## 软件设计 - c.connect() +示例代码: - # 订阅主题 +```python +import quecIot +import quecTtlv + +key = "p1116T" # 填入产品key +src = "bGpkVnordkFodFZj" # 填入产品密钥 + +DEF_ID_TYPE = ['0', '温度', '湿度', '光照'] +DEF_DATA_TYPE0 = 'bool' +DEF_DATA_TYPE1 = 'num' +DEF_DATA_TYPE2 = 'byte' +DEF_DATA_TYPE3 = 'struct' +DEF_DATA_TYPE = [ + DEF_DATA_TYPE0, + DEF_DATA_TYPE1, + DEF_DATA_TYPE2, + DEF_DATA_TYPE3] +# 0 布尔 +# 1 数值 +# 2 Byt +# 3 结构体 + + +class Quecthing: + def __init__(self): + # ''' 初始化qucsdk ''' + quecIot.init() + # ''' 注册事件回调函数 ''' + quecIot.setEventCB(self.eventCB) + # ''' 配置产品信息''' + quecIot.setProductinfo(key, src) + # ''' 配置服务器信息,可选,默认连接MQTT生产环境服务器 ''' + # quecIot.setServer(1, "http://iot-south.quectel.com:2883") + # ''' 配置PDP context Id,可选,默认为1 ''' + # quecIot.setPdpContextId(1) + # ''' 配置lifetime,可选,MQTT默认为120 ''' + # quecIot.setLifetime(120) + # ''' 配置外部MCU标识号和版本号,可选,如没有外部MCU则不需要配置 ''' + # quecIot.setMcuVersion("MCU1", "1_0_0") + # ''' 启动云平台连接 ''' + quecIot.setConnmode(1) + return + + @staticmethod + def eventCB(data): + print("event:", data) + + if 5 == data[0] and 10210 == data[1]: + data = data[2] + listret = quecTtlv.nodeGet(data) + print(listret) + listretlen = len(listret) + for i in range(listretlen): + id = listret[i][0] + type = listret[i][1] + if DEF_DATA_TYPE[type] == DEF_DATA_TYPE0: + ret = quecTtlv.idGetBool(data, id) + print(DEF_ID_TYPE[id], ret) + elif DEF_DATA_TYPE[type] == DEF_DATA_TYPE1: + ret = quecTtlv.idGetNum(data, id) + print(DEF_ID_TYPE[id], ret) + + +if __name__ == '__main__': + Quecthing() +``` - c.subscribe('quec/{}/down'.format(IMEI)) +接下来就可以下载验证了,python代码不需要编译,直接通过QPYcom工具把.py文件下载到模块中运行。 - # 发布消息 +## 下载验证 - c.publish('quec/{}/up'.format(IMEI), b"test publish") +下载.py文件到模组运行: - while True: +![image-20210429173115854](media\QuecPythonCloud_210430_13.png) - c.wait_msg() +下载之后,手动让脚本运行起来。 - if state == 1: +![image-20210429174656611](media\QuecPythonCloud_210430_14.png) - break +回到设备管理平台的设备管理列表中: - # 关闭连接 +![image-20210429172813553](media\QuecPythonCloud_210430_15.png) - c.disconnect() +设备列表自动新增了一个设备,已经连接平台并认证了。 -def main(): +![image-20210429172700699](media\QuecPythonCloud_210430_16.png) - GetDevImei() - MQTT_Init() -if __name__ == "__main__": +## 下发数据 - main() -``` +移远IoT设备管理平台提供设备调试功能, -接下来就可以下载验证了,python代码不需要编译,直接通过QPYcom工具把.py文件下载到模块中运行。 +![image-20210430093707367](media\QuecPythonCloud_210430_17.png) -## 下载验证 +进入“设备详细”页面,点击【设备调试】,看到调试界面,改变数据,【发送指令】即可,模组将收到数据。 -下载.py文件到模组运行: +![image-20210430093737418](media\QuecPythonCloud_210430_18.png) -![](media/0d9c74f77ca83805912f29392d23cf08.png) +模组收到数据后,在代码里解释,QPYcom调试工具显示如下: -下载之后,手动让脚本运行起来。 +![image-20210429205539854](media\QuecPythonCloud_210430_19.png) -![](media/7404fb362b289bcd55a5d50aa25c8546.png) -![](media/20cb75f8677c6c8c4f54642e400036d9.png) ## 配套代码 diff --git a/docs/Advanced_development/zh/QuecPythonCloud/code/QuecIoTCloud.py b/docs/Advanced_development/zh/QuecPythonCloud/code/QuecIoTCloud.py new file mode 100644 index 0000000000000000000000000000000000000000..751dcd08f368f85ddce664f904e34ab643e4bbb2 --- /dev/null +++ b/docs/Advanced_development/zh/QuecPythonCloud/code/QuecIoTCloud.py @@ -0,0 +1,64 @@ +import quecIot +import quecTtlv + +key = "p1116T" # 填入产品key +src = "bGpkVnordkFodFZj" # 填入产品密钥 + +DEF_ID_TYPE = ['0', '温度', '湿度', '光照'] +DEF_DATA_TYPE0 = 'bool' +DEF_DATA_TYPE1 = 'num' +DEF_DATA_TYPE2 = 'byte' +DEF_DATA_TYPE3 = 'struct' +DEF_DATA_TYPE = [ + DEF_DATA_TYPE0, + DEF_DATA_TYPE1, + DEF_DATA_TYPE2, + DEF_DATA_TYPE3] +# 0 布尔 +# 1 数值 +# 2 Byt +# 3 结构体 + + +class Quecthing: + def __init__(self): + # ''' 初始化qucsdk ''' + quecIot.init() + # ''' 注册事件回调函数 ''' + quecIot.setEventCB(self.eventCB) + # ''' 配置产品信息''' + quecIot.setProductinfo(key, src) + # ''' 配置服务器信息,可选,默认连接MQTT生产环境服务器 ''' + # quecIot.setServer(1, "http://iot-south.quectel.com:2883") + # ''' 配置PDP context Id,可选,默认为1 ''' + # quecIot.setPdpContextId(1) + # ''' 配置lifetime,可选,MQTT默认为120 ''' + # quecIot.setLifetime(120) + # ''' 配置外部MCU标识号和版本号,可选,如没有外部MCU则不需要配置 ''' + # quecIot.setMcuVersion("MCU1", "1_0_0") + # ''' 启动云平台连接 ''' + quecIot.setConnmode(1) + return + + @staticmethod + def eventCB(data): + print("event:", data) + + if 5 == data[0] and 10210 == data[1]: + data = data[2] + listret = quecTtlv.nodeGet(data) + print(listret) + listretlen = len(listret) + for i in range(listretlen): + id = listret[i][0] + type = listret[i][1] + if DEF_DATA_TYPE[type] == DEF_DATA_TYPE0: + ret = quecTtlv.idGetBool(data, id) + print(DEF_ID_TYPE[id], ret) + elif DEF_DATA_TYPE[type] == DEF_DATA_TYPE1: + ret = quecTtlv.idGetNum(data, id) + print(DEF_ID_TYPE[id], ret) + + +if __name__ == '__main__': + Quecthing() diff --git a/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_01.png b/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_01.png new file mode 100644 index 0000000000000000000000000000000000000000..614a7b8539bad8485a9e1accb0b02fc8a60ac224 Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_01.png differ diff --git a/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_02.png b/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_02.png new file mode 100644 index 0000000000000000000000000000000000000000..9e54b39bef6c5aa6290ecd7cb8d9166d311cef07 Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_02.png differ diff --git a/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_03.png b/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_03.png new file mode 100644 index 0000000000000000000000000000000000000000..5c7244c13aeaec346556e336a840a800bea49cc9 Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_03.png differ diff --git a/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_04.png b/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_04.png new file mode 100644 index 0000000000000000000000000000000000000000..456ae8874d0e9ecaa2a1f36de1ff6c9833515bb4 Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_04.png differ diff --git a/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_05.png b/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_05.png new file mode 100644 index 0000000000000000000000000000000000000000..1d58fbee9a8a7a280af8963383a3b01aa0f7b9a6 Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_05.png differ diff --git a/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_06.png b/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_06.png new file mode 100644 index 0000000000000000000000000000000000000000..6543f10084c45867b7d9e0e4265e74292842cfe2 Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_06.png differ diff --git a/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_07.png b/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_07.png new file mode 100644 index 0000000000000000000000000000000000000000..0b913c4e90ff7a5f2ef00179ce4989ffcfbf6833 Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_07.png differ diff --git a/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_08.png b/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_08.png new file mode 100644 index 0000000000000000000000000000000000000000..224e2ee147ee984e863b9618e7e1077d2a891e9b Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_08.png differ diff --git a/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_09.png b/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_09.png new file mode 100644 index 0000000000000000000000000000000000000000..5925e10ac2dee7a6a339d334711f54b517d6c8a5 Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_09.png differ diff --git a/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_10.png b/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_10.png new file mode 100644 index 0000000000000000000000000000000000000000..a8fde8c7554ca55fc6c5117c0db30f6af328064b Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_10.png differ diff --git a/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_11.png b/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_11.png new file mode 100644 index 0000000000000000000000000000000000000000..dfc0b493ef3a8724ac1e8ca5445cb4118780bb4e Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_11.png differ diff --git a/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_12.png b/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_12.png new file mode 100644 index 0000000000000000000000000000000000000000..cdf32912a2dfd94260ccbd056f12f2b0e904f75f Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_12.png differ diff --git a/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_13.png b/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_13.png new file mode 100644 index 0000000000000000000000000000000000000000..72d27d648e44b8a284ac7864184c6bc45107f13a Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_13.png differ diff --git a/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_14.png b/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_14.png new file mode 100644 index 0000000000000000000000000000000000000000..a58c4a7402112b3d3bda32861967e964d2d0e315 Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_14.png differ diff --git a/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_15.png b/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_15.png new file mode 100644 index 0000000000000000000000000000000000000000..a8fde8c7554ca55fc6c5117c0db30f6af328064b Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_15.png differ diff --git a/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_16.png b/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_16.png new file mode 100644 index 0000000000000000000000000000000000000000..2631c4c57384aa68616709e6c1befdc9e6c4bbf1 Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_16.png differ diff --git a/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_17.png b/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_17.png new file mode 100644 index 0000000000000000000000000000000000000000..84f311855a2616d3ac3bb09f84403665c168daab Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_17.png differ diff --git a/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_18.png b/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_18.png new file mode 100644 index 0000000000000000000000000000000000000000..9d898906b29096e18d897457e5c516250eb26919 Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_18.png differ diff --git a/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_19.png b/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_19.png new file mode 100644 index 0000000000000000000000000000000000000000..c8fdd43eee6fadbd4baebece11b9f2ad346d7e8d Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_19.png differ