From 40abcb82e223cdff01ab0450f6cdb2f466da7e60 Mon Sep 17 00:00:00 2001 From: chenchi Date: Fri, 14 Jan 2022 11:01:35 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0readme.md=E5=92=8Cdocs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 18 +- docs/APTU_User_Guides.md | 261 +++++++ docs/{md => }/DTU_GUI_User_Guides.md | 148 ++-- docs/DTU_Product_Introduction.md | 180 +++++ docs/{md => }/DTU_Protocol_Specification.md | 474 +++++-------- docs/DTU_User_Guides.md | 525 ++++++++++++++ docs/md/DTU_Product_Introduction.md | 146 ---- docs/md/DTU_User_Guides.md | 638 ------------------ docs/md/img.png | Bin 1777 -> 0 bytes .../C2Py.png | Bin .../CMD_Mode_Working_Principle.png | Bin .../{pic/DTU_User_Guides => media}/CP2102.jpg | Bin .../DTU.png | Bin docs/media/QPYCom_V1.8.png | Bin 0 -> 30927 bytes .../RTU.png | Bin .../Reduce_Hardware_Costs.png | Bin .../Transparent_Mode_Working_Principle.png | Bin .../DTU_User_Guides => media}/aliyun_dn.png | Bin .../DTU_User_Guides => media}/aliyun_pkps.png | Bin .../DTU_User_Guides => media}/aliyun_send.png | Bin .../DTU_User_Guides => media}/antenna.jpg | Bin docs/media/aptu_01.png | Bin 0 -> 49809 bytes docs/media/aptu_02.png | Bin 0 -> 41336 bytes .../board_line_link.png | Bin .../cloud_recive.png | Bin .../DTU_User_Guides => media}/dev_board.png | Bin .../DTU_User_Guides => media}/dtt_recive.png | Bin .../DTU_User_Guides => media}/dtu_recive.png | Bin .../DTU_GUI_User_Guides => media}/gui_apn.png | Bin .../gui_channel_at.png | Bin .../gui_channel_http.png | Bin .../gui_channel_mqtt.png | Bin .../gui_channel_socket.png | Bin .../gui_check_config.png | Bin .../gui_edit.png | Bin .../gui_get_imei.png | Bin .../gui_gpio.png | Bin .../gui_import_config.png | Bin .../gui_input.png | Bin .../gui_open_port.png | Bin .../gui_open_port_done.png | Bin .../gui_opt_format.png | Bin .../gui_opt_hex.png | Bin .../gui_opt_time.png | Bin .../DTU_GUI_User_Guides => media}/gui_pwd.png | Bin .../gui_pwd2.png | Bin docs/media/gui_rtu.png | Bin 0 -> 16726 bytes .../gui_secret.png | Bin .../gui_send_cmd.png | Bin .../gui_send_cmd_pw.png | Bin .../gui_serial.png | Bin .../gui_tx_secret.png | Bin .../industry.png | Bin .../pc_get_recive.png | Bin .../DTU_User_Guides => media}/pc_uart.png | Bin .../pc_uart_send.png | Bin docs/{pic/DTU_User_Guides => media}/port.png | Bin .../qpycom_add_file.png | Bin .../DTU_User_Guides => media}/qpycom_dl.png | Bin .../qpycom_download.png | Bin .../qpycom_new_proj.png | Bin .../DTU_User_Guides => media}/qpycom_proj.png | Bin .../DTU_User_Guides => media}/qpycom_run.png | Bin .../DTU_User_Guides => media}/qpycom_run2.png | Bin .../DTU_User_Guides => media}/qpycom_run3.png | Bin .../qpycom_run_output.png | Bin .../qpycom_run_success.png | Bin .../qpycom_select_port.png | Bin .../qpycon_draft_file.png | Bin .../pic/DTU_GUI_User_Guides/gui_quecthing.png | Bin 56673 -> 0 bytes docs/pic/DTU_User_Guides/config_serial_id.png | Bin 21331 -> 0 bytes 71 files changed, 1214 insertions(+), 1176 deletions(-) create mode 100644 docs/APTU_User_Guides.md rename docs/{md => }/DTU_GUI_User_Guides.md (59%) create mode 100644 docs/DTU_Product_Introduction.md rename docs/{md => }/DTU_Protocol_Specification.md (58%) create mode 100644 docs/DTU_User_Guides.md delete mode 100644 docs/md/DTU_Product_Introduction.md delete mode 100644 docs/md/DTU_User_Guides.md delete mode 100644 docs/md/img.png rename docs/{pic/DTU_Product_Introduction => media}/C2Py.png (100%) rename docs/{pic/DTU_Product_Introduction => media}/CMD_Mode_Working_Principle.png (100%) rename docs/{pic/DTU_User_Guides => media}/CP2102.jpg (100%) rename docs/{pic/DTU_Product_Introduction => media}/DTU.png (100%) create mode 100644 docs/media/QPYCom_V1.8.png rename docs/{pic/DTU_Product_Introduction => media}/RTU.png (100%) rename docs/{pic/DTU_Product_Introduction => media}/Reduce_Hardware_Costs.png (100%) rename docs/{pic/DTU_Product_Introduction => media}/Transparent_Mode_Working_Principle.png (100%) rename docs/{pic/DTU_User_Guides => media}/aliyun_dn.png (100%) rename docs/{pic/DTU_User_Guides => media}/aliyun_pkps.png (100%) rename docs/{pic/DTU_User_Guides => media}/aliyun_send.png (100%) rename docs/{pic/DTU_User_Guides => media}/antenna.jpg (100%) create mode 100644 docs/media/aptu_01.png create mode 100644 docs/media/aptu_02.png rename docs/{pic/DTU_User_Guides => media}/board_line_link.png (100%) rename docs/{pic/DTU_User_Guides => media}/cloud_recive.png (100%) rename docs/{pic/DTU_User_Guides => media}/dev_board.png (100%) rename docs/{pic/DTU_User_Guides => media}/dtt_recive.png (100%) rename docs/{pic/DTU_User_Guides => media}/dtu_recive.png (100%) rename docs/{pic/DTU_GUI_User_Guides => media}/gui_apn.png (100%) rename docs/{pic/DTU_GUI_User_Guides => media}/gui_channel_at.png (100%) rename docs/{pic/DTU_GUI_User_Guides => media}/gui_channel_http.png (100%) rename docs/{pic/DTU_GUI_User_Guides => media}/gui_channel_mqtt.png (100%) rename docs/{pic/DTU_GUI_User_Guides => media}/gui_channel_socket.png (100%) rename docs/{pic/DTU_GUI_User_Guides => media}/gui_check_config.png (100%) rename docs/{pic/DTU_GUI_User_Guides => media}/gui_edit.png (100%) rename docs/{pic/DTU_GUI_User_Guides => media}/gui_get_imei.png (100%) rename docs/{pic/DTU_GUI_User_Guides => media}/gui_gpio.png (100%) rename docs/{pic/DTU_GUI_User_Guides => media}/gui_import_config.png (100%) rename docs/{pic/DTU_GUI_User_Guides => media}/gui_input.png (100%) rename docs/{pic/DTU_GUI_User_Guides => media}/gui_open_port.png (100%) rename docs/{pic/DTU_GUI_User_Guides => media}/gui_open_port_done.png (100%) rename docs/{pic/DTU_GUI_User_Guides => media}/gui_opt_format.png (100%) rename docs/{pic/DTU_GUI_User_Guides => media}/gui_opt_hex.png (100%) rename docs/{pic/DTU_GUI_User_Guides => media}/gui_opt_time.png (100%) rename docs/{pic/DTU_GUI_User_Guides => media}/gui_pwd.png (100%) rename docs/{pic/DTU_GUI_User_Guides => media}/gui_pwd2.png (100%) create mode 100644 docs/media/gui_rtu.png rename docs/{pic/DTU_GUI_User_Guides => media}/gui_secret.png (100%) rename docs/{pic/DTU_GUI_User_Guides => media}/gui_send_cmd.png (100%) rename docs/{pic/DTU_GUI_User_Guides => media}/gui_send_cmd_pw.png (100%) rename docs/{pic/DTU_GUI_User_Guides => media}/gui_serial.png (100%) rename docs/{pic/DTU_GUI_User_Guides => media}/gui_tx_secret.png (100%) rename docs/{pic/DTU_Product_Introduction => media}/industry.png (100%) rename docs/{pic/DTU_User_Guides => media}/pc_get_recive.png (100%) rename docs/{pic/DTU_User_Guides => media}/pc_uart.png (100%) rename docs/{pic/DTU_User_Guides => media}/pc_uart_send.png (100%) rename docs/{pic/DTU_User_Guides => media}/port.png (100%) rename docs/{pic/DTU_User_Guides => media}/qpycom_add_file.png (100%) rename docs/{pic/DTU_User_Guides => media}/qpycom_dl.png (100%) rename docs/{pic/DTU_User_Guides => media}/qpycom_download.png (100%) rename docs/{pic/DTU_User_Guides => media}/qpycom_new_proj.png (100%) rename docs/{pic/DTU_User_Guides => media}/qpycom_proj.png (100%) rename docs/{pic/DTU_User_Guides => media}/qpycom_run.png (100%) rename docs/{pic/DTU_User_Guides => media}/qpycom_run2.png (100%) rename docs/{pic/DTU_User_Guides => media}/qpycom_run3.png (100%) rename docs/{pic/DTU_User_Guides => media}/qpycom_run_output.png (100%) rename docs/{pic/DTU_User_Guides => media}/qpycom_run_success.png (100%) rename docs/{pic/DTU_User_Guides => media}/qpycom_select_port.png (100%) rename docs/{pic/DTU_User_Guides => media}/qpycon_draft_file.png (100%) delete mode 100644 docs/pic/DTU_GUI_User_Guides/gui_quecthing.png delete mode 100644 docs/pic/DTU_User_Guides/config_serial_id.png diff --git a/README.md b/README.md index ccadc57..fe6d40f 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,7 @@ - RTU功能 = DTU功能 + 控制单元。 - 下文中的DTU等同于RTU。 -![RTU.png](./media/RTU.png) +![RTU.png](./docs/media/RTU.png) ### 应用行业和场景 @@ -34,7 +34,7 @@ - 消防安全 - 市政管网等 -![industry.png](./media/industry.png) +![industry.png](./docs/media/industry.png) ## 移远DTU及其能力 @@ -99,7 +99,7 @@ 我司的QuecPython开发板的板载资源丰富,支持照度传感器、温湿度传感器、喇叭接口、咪头接口、三色LED灯、LCD屏接口、Camera接口,及其它丰富的外设接口,配合下节将提及的GUI工具,可在QuecPython开发板上进行终端产品的原型验证。 -![](./media/dev_board.png) +![](./docs/media/dev_board.png) #### 强大的上位机GUI工具 @@ -107,7 +107,7 @@ [点此下载DTU GUI工具。](https://python.quectel.com/download) -![](./media/gui_get_imei.png) +![](./docs/media/gui_get_imei.png) #### QPYcom工具 @@ -119,7 +119,7 @@ QPYcom工具是一个集**QuecPython repl交互、PC和模组间文件传输、 QPYCom的使用文档,参见安装目录下的`docs`文件夹。 -![](./media/QPYCom_V1.8.png) +![](./docs/media/QPYCom_V1.8.png) #### 线上生成配置文件 @@ -152,11 +152,11 @@ QPYCom的使用文档,参见安装目录下的`docs`文件夹。 - RTU可直接作为主控,省去MCU及其周边电路,降低硬件成本 - ![Reduce_Hardware_Costs.png](./media/Reduce_Hardware_Costs.png) + ![Reduce_Hardware_Costs.png](./docs/media/Reduce_Hardware_Costs.png) - 可使用Python进行二次开发,降低软件开发成本 - ![C2Py.png](./media/C2Py.png) + ![C2Py.png](./docs/media/C2Py.png) - 我司多平台模组适用,使用Python开发,无需修改代码即可快速切换至不同模组 @@ -169,11 +169,11 @@ QPYCom的使用文档,参见安装目录下的`docs`文件夹。 ### 命令模式 -![CMD_Mode_Working_Principle.png](./media/CMD_Mode_Working_Principle.png) +![CMD_Mode_Working_Principle.png](./docs/media/CMD_Mode_Working_Principle.png) ### 透传模式 -![Transparent_Mode_Working_Principle.png](./media/Transparent_Mode_Working_Principle.png) +![Transparent_Mode_Working_Principle.png](./docs/media/Transparent_Mode_Working_Principle.png) ### modbus模式 diff --git a/docs/APTU_User_Guides.md b/docs/APTU_User_Guides.md new file mode 100644 index 0000000..4f82749 --- /dev/null +++ b/docs/APTU_User_Guides.md @@ -0,0 +1,261 @@ +## 文档历史 + +**修订记录** + +| **版本** | **日期** | **作者** | **变更表述** | +| --- | --- | --- | --- | +| 1.0 | 2020-07-27 | 陈驰 | 初始版本 | + + + +## 摘要 + +本文旨在介绍QuecPython的APTU(Application Packet Transparent Unit,应用报文透传单元)的概念及应用方法。 + +## APTU简介 + + +### 概念 + +APTU,全称为Application Packet Transparent Unit,即应用报文透传单元。 + +APTU以数据透传的方式广泛应用于家电、工业等需要联网的应用场景,只需在生产时将配置文件导入到文件系统即可。 + +### 脚本文件 + +APTU功能共3个脚本文件,分别说明如下: + +- OTA.py:执行用户文件升级工作;该文件本身也可以被升级 +- aptu.py:执行透传业务主逻辑; +- aptu_config.json:配置文件,主要包含UART、网络、服务器、设备信息,及OTA等相关的配置信息。 + + +### 功能 + +- **通过配置文件配置所有功能的参数** + +aptu_config.json文件配置了功能相关的所有参数。 + +- **开机时事件上报** + +开机后,在数传功能准备好或出错时,会 **上报且仅上报一次** 事件通知。 + +- **数据透传** + +APTU以串口作为数据传输链路,来自设备端的串口数据以TCP协议直接透传到服务器; + +来自TCP服务器的数据,将直接通过串口透传到设备端。 + +- **脚本升级** + +开机并且网络连通后,会自动检测是否需要升级脚本,当有升级计划时,则会自动升级。 + +- **自动重连** + +当从服务器掉线后,模块会自动重连服务器。 + +设备端接收到数传功能准备好的通知后,即可开始数传业务。 + + +## 使用方法 + +### 配置文件 + +**配置文件内容** + +用户需根据自己的项目需求修改配置文件的参数。 + +配置文件的内容如代码清单1所示,为了方便理解,以下在json文本中添加了#打头的 **不应该存在的注释内容** + +代码清单1 aptu_config.json文件内容 + +{ + +```json +{ + "UART":{ # 串口相关配置 + "No":2, # 串口号 + "baudRate":9600, # 波特率 + "startBitsLen":1, # 起始位 + "dataBitsLen":8, # 数据位 + "parity":"None", # 奇偶校验,无:"None",奇校验:"Odd",偶校验:"Even" + "stopBitsLen":1, # 停止位 + "flowCtrl":"disable", # 硬件流控,使能:"enable",禁止:"disable" + "significantBit":"least" # LSB + }, + + "Network":{ # 网络相关配置 + "timeWaitForOK":30 # 等待自动拨号完成的超时时间,单位s + }, + + "Server":{ # 服务器相关配置 + "ipType":"IPv4", # 连接的IP类型,"IPv4"、"IPv6" + "protocol":"TCP", # 连接的传输层类型,"TCP"、"UDP" + "domain":"www.baidu.com", # 域名 + "port":80, # 端口 + "keepAlive":{ # 心跳配置 + "useThisItem":"off", # 关闭心跳,打开:"on",关闭:"off" + "parameters":{ # 心跳配置参数 + "keepIdle":60, # 心跳间隔时间,单位s + "keepInterval":5, # 每次心跳时,心跳包的重发时间间隔,单位s + "keepCount":3 # 每次心跳时,心跳包的重发次数 + } + } + }, + + "DeviceInfo":{ # 移远云平台上注册的设备信息 + "moduleType":"EC600S-CX", # 模块类型,建议"模块型号-项目名称"的命名方式 + "UID":"305", # 字符串类型,唯一标识符 + "PK":"2bb2a48bd30b6a525a30bc64d8b3d8e0" # 秘钥 + }, + + "OTA":{ # OTA升级配置 + "autoUpgrade":true # 布尔型,自动升级:true,非自动升级:false + } +} + +``` + +} + +**【注意】** + +- 冒号 **左边的** key,严格 **区分大小写** 。 +- 冒号 **右边的** value,除了DeviceInfo内部的字段以外,其余字符串类型的值 **不区分大小写** 。 +- 由于QuecPython暂时不支持TCP的心跳选项配置,Server.keepAlive.useThisItem的值请设置为off。 +- 布尔型的值,均为所有字母小写的true和false。 + +### 配置文件缺省值 + +配置文件中,"UART"的"No"和"baudRate"、"Server"的"domain"和"port"是 **必选项** 。 + +其他非必须项都可以删除,但是代码中会对其做缺省处理,现将缺省行为整理如表1所示: + +表1 配置文件缺省行为 + +![image-20210930105025809](media\aptu_01.png) + +上表中: + +- 任何字段的字体为黑色时,该字段及其下包含的内容,可从配置文件中删除,使用其缺省值。 +- 当黑色字体的字段出现在配置文件中时,其紧邻的下一级的红色字体的字段是必选项。 +- 第一列字体为红色的字段,必须出现在配置文件中。 +- "Server"对象中不含包"keepAlive"字段时,表示关闭心跳功能。 +- "DeviceInfo"和"OTA"对象同时出现,才能开启OTA功能。 + +### 导入脚本文件 + +通过QPYcom将三个文件全部导入到模块中。 + +导入成功后,看到QPYcom工具文件传输页面的右侧栏中增加了下图红框中的三个文件。 + +选中aptu.py后,点击图1中的执行按钮,即可测试脚本功能。 + +![](media\aptu_02.png) + +图1 脚本文件导入方法 + + +### 在业务中调用aptu模块 + +在业务脚本中添加代码清单2所示的3行代码,即可开启功能: + +代码清单2 启动APTU功能 + +```python +from usr import aptu +aptu_obj = aptu.aptu_cls() +aptu_obj.start() +``` + +aptu_cls类的对象初始化函数包含两个默认参数,原型如代码清单3所示: + +代码清单3 aptu_cls类的对象初始化函数 + +```python +@classmethod +def __init__(cls, projectName = "APTU", projectVersion = "V1.0.0"): + try: + cls.PROJECT_NAME = projectName + cls.PROJECT_VERSION = projectVersion + cls.config = cls.__read_config() + cls.__uart_init() + cls.__data_call_check() + cls.__ota_check() + except Exception as e: + cls.__exception_handler(e.args[0]) + raise + +``` + +可以看出,缺省的参数分别是项目名称和版本号,业务上根据自己的需要进行填充,默认值分别为"APTU"和"V1.0.0"。 + + +## 事件上报 + +虽然APTU完全工作与透传模式,但是开机后功能是否正常,是有必要通知到设备端的。 + +上文已经提及,在数传功能准备好或出错后,会 **上报且仅上报一次** 事件通知。 + + +### 事件上报的格式 + +事件上报以json文本的格式组织,示例如代码清单4所示: + +代码清单4 事件上报的json格式 + +{ + +```json +{ + "result": { + "code": 0, + "desc": "OK" + }, + "data": { + "SN": "D1Q21E2130204660P", + "IMEI": "861681053233719" + } +} + +``` + +} + +上述文本的json对象包含两个子对象"result"和"data"。 + +- "result"对象包含两个字段"code"和"desc",用于报告APTU是否准备好数传功能。 +- "data"对象包含两个字段"SN"和"IMEI",只有当"result"中的"code"值为0时,才会包含"data"对象。 + +以上各字段的数据类型说明如表2所示: + +表2 数据类型说明 + +| **字段** | **数据类型** | +| --- | --- | +| code | 整数 | +| desc | 字符串 | +| SN | 字符串 | +| IMEI | 字符串 | + +### 事件结果释义 + +"result"对象即为事件的结果通知。 + +事件的结果释义如表3所示: + +表3 事件结果释义 + +| **code** | **desc** | **mark** | +| --- | --- | --- | +| 1 | OTA plain comes | 有新版待更新,模块报出此通知后,会自动重启升级至新版本 | +| 0 | OK | 数传准备好,可以开始传输数据 | +| -1 | config error | 配置文件错误 | +| -2 | net error | 网络错误 | +| -3 | socket create error | socket创建失败 | +| -4 | socket option set error | socket选项设置失败 | +| -5 | socket connect error | 服务器连接失败 | +| -6 | DNS error | 域名解析失败 | +| -7 | UART error | 串口操作失败 | +| -8 | sys error | 系统级别错误 | + diff --git a/docs/md/DTU_GUI_User_Guides.md b/docs/DTU_GUI_User_Guides.md similarity index 59% rename from docs/md/DTU_GUI_User_Guides.md rename to docs/DTU_GUI_User_Guides.md index 2234cb7..f77467d 100644 --- a/docs/md/DTU_GUI_User_Guides.md +++ b/docs/DTU_GUI_User_Guides.md @@ -1,39 +1,39 @@ -# **DTU GUI工具使用说明** +## 修订历史 +| Version | **Date** | **Author** | **Change expression** | +| :------ | ---------- | ---------- | --------------------- | +| 1.0 | 2021-11-25 | 蒋子杨 | 初始版本 | +| 1.1 | 2021-11-30 | 陈驰 | 丰富概述章节的描述 | +## 概述 +![](./media/gui_rtu.png) -## 1.基本概述 +- DTU的GUI工具,主要用来在PC端调试DTU的功能,DTU所有开放出来的功能,在GUI工具上均有对应的调试模块。 -本文档主要介绍DTU GUI工具的使用。 +- GUI工具配合QuecPython开发板,可作为终端产品开发前的快速原型验证。 -DTU GUI工具现阶段主要为客户开发调试使用,DTU GUI工具提供基础的查询与设置功能, -用户可使用USB to TTL模块连接PC与DTU。 +- 进入我司的[QuecPython资源下载页面](https://python.quectel.com/download),可查找并下载DTU的GUI工具(目前仅支持Windows系统,但GUI使用跨平台工具开发,十分容易扩展到Ubuntu或Mac平台)。 -![](../../../docs/dtugui.png) - -DTU GUI基于wxPython开发,现阶段已编译的dtu_gui.exe仅支持Windows系统, -用户在Linux/macOS配置Python环境并安装wxPython lib后可直接运行dtu_gui.py或自行编译对应版本的exe程序。 - -## 2. 运行DTU GUI 工具 +## 运行DTU GUI 工具 **双击打开DTU GUI工具** -![](../pic/DTU_GUI_User_Guides/gui_open_port.png) +![](./media/gui_open_port.png) 运行后的DTU GUI的工具 -![](../pic/DTU_GUI_User_Guides/gui_open_port.png) +![](./media/gui_open_port.png) **打开串口** -![](../pic/DTU_GUI_User_Guides/gui_open_port_done.png) +![](./media/gui_open_port_done.png) -## 3. DTU GUI 功能介绍 +## DTU GUI 功能介绍 -## 3.1工具箱 +### 工具箱 **目前工具箱的查询功能如下:** @@ -51,28 +51,25 @@ DTU GUI基于wxPython开发,现阶段已编译的dtu_gui.exe仅支持Windows - 查询基站状态 - 基站定位 -### 示例: +**示例:**查询IMEI号: -查询IMEI号: +![](./media/gui_get_imei.png) -![](../pic/DTU_GUI_User_Guides/gui_get_imei.png) +返回的数据: `【2021-11-24 20:35:39】 869537055499330` -返回的数据: -`【2021-11-24 20:35:39】 869537055499330` - -## 3.2查询当前配置参数 +### 查询当前配置参数 **操作步骤如下图:** -![](../pic/DTU_GUI_User_Guides/gui_check_config.png) +![](./media/gui_check_config.png) **以上步骤操作完再点击查询当前配置参数** -## 3.3导入配置参数 +### 导入配置参数 -### 3.3.1基本参数配置 +#### 基本参数配置 -![](../pic/DTU_GUI_User_Guides/gui_import_config.png) +![](./media/gui_import_config.png) **如上图的数字编号:** @@ -93,34 +90,34 @@ DTU GUI基于wxPython开发,现阶段已编译的dtu_gui.exe仅支持Windows 如果在tcp/udp的配置参数中自定义了首次登录服务器发送的注册消息,则会发送用户自定义的。 -具体tcp/udp的参数配置后面会有详细的介绍 +具体tcp/udp的参数配置后面会有详细的介绍。 3. **固件版本号** -数值的范围是 > 0 +数值的范围是 > 0。 4. **是否开启自动更新** 打开自动更新会在DTU启动的时候去OTA Cloud查看是否有需要更新的固件包,如果有更新的任务就会下载固件包,校验固件包。校验通过开始更新,更新完毕会重启DTU固件。 -建议:开启自动更新前可以根据需要手动备份之前的配置文件。暂时不支持自动备份的功能 +建议:开启自动更新前可以根据需要手动备份之前的配置文件。暂时不支持自动备份的功能。 -### 3.3.2串口参数 +#### 串口参数 -![](../pic/DTU_GUI_User_Guides/gui_serial.png) +![](./media/gui_serial.png) -有三个串口参数配置,每个串口配置的参数有:波特率,数据位,校验位,停止位 +有三个串口参数配置,每个串口配置的参数有:波特率,数据位,校验位,停止位。 -目前不支持串口参数的配置功能,此项配置功能后续上线 +目前不支持串口参数的配置功能,此项配置功能后续上线。 -### 3.3.3网络参数配置 +#### 网络参数配置 -打开任意通道的"开启"按钮,则会将七个通道的数据导入到配置文件,由于其他的通道参数没有配置会导入空的配置参数到配置文件,因此点击"开启"按钮就需要按照需求将所以的通道配置参数都设置一下 +打开任意通道的"开启"按钮,则会将七个通道的数据导入到配置文件,由于其他的通道参数没有配置会导入空的配置参数到配置文件,因此点击"开启"按钮就需要按照需求将所以的通道配置参数都设置一下。 -#### 3.3.3.1 通道类型:HTTP +##### 通道类型:HTTP -![](../pic/DTU_GUI_User_Guides/gui_channel_http.png) +![](./media/gui_channel_http.png) | **字段** | **type** | **Required** | **含义** | | --- | --- | --- | --- | @@ -130,11 +127,11 @@ DTU GUI基于wxPython开发,现阶段已编译的dtu_gui.exe仅支持Windows | timeout | int | false | HTTP请求最长等待时间 | | serialD | int | true | HTTP绑定的串口号(1~2) | -提示:其中serialD的绑定串口号的功能暂未上线,后期会和串口配置功能一同上线,下同 +提示:其中serialD的绑定串口号的功能暂未上线,后期会和串口配置功能一同上线,下同。 -#### 3.3.3.2 通道类型:SOCKET TCP/SOCKET UDP +##### 通道类型:SOCKET TCP/SOCKET UDP -![](../pic/DTU_GUI_User_Guides/gui_channel_socket.png) +![](./media/gui_channel_socket.png) 上图中参数的对应含义: @@ -148,9 +145,9 @@ DTU GUI基于wxPython开发,现阶段已编译的dtu_gui.exe仅支持Windows | KeepAlive | int | false | 链接超时最大时间单位秒,默认300秒 | | serialD | int | true | tcp/udp绑定的串口号(1~2) | -#### 3.3.3.3 通道类型:MQTT +##### 通道类型:MQTT -![](../pic/DTU_GUI_User_Guides/gui_channel_mqtt.png) +![](./media/gui_channel_mqtt.png) | **字段** | **type** | **Required** | **含义** | | --- | --- | --- | --- | @@ -165,17 +162,17 @@ DTU GUI基于wxPython开发,现阶段已编译的dtu_gui.exe仅支持Windows | retain | int | true | MQTT的publish参数retain,默认0 | | serialD | int | true | MQTT通道捆绑的串口ID (1~3) | -#### 3.3.3.4 通道类型:阿里云/腾讯云 +##### 通道类型:阿里云/腾讯云 在进行阿里云和腾讯云的一型一密的时候,如果阿里云连接失败,需要手动创建secret.json,里面是设备名和设备密钥的json文件。具体可以参考"secret.json"文件 -![](../pic/DTU_GUI_User_Guides/gui_secret.png) +![](./media/gui_secret.png) -同理如果腾讯云的一型一密连接失败,也需要手动创建tx\_secret.json +同理,如果腾讯云的一型一密连接失败,也需要手动创建tx\_secret.json -![](../pic/DTU_GUI_User_Guides/gui_tx_secret.png) +![](./media/gui_tx_secret.png) -![](../pic/DTU_GUI_User_Guides/gui_channel_at.png) +![](./media/gui_channel_at.png) | **字段** | **type** | **Required** | **含义** | @@ -193,33 +190,17 @@ DTU GUI基于wxPython开发,现阶段已编译的dtu_gui.exe仅支持Windows | pubTopic | str | true | 发布主题 | | serialD | int | true | MQTT通道捆绑的串口ID (1~3) | -#### 3.3.3.5 通道类型:移远云 - -![](../pic/DTU_GUI_User_Guides/gui_quecthing.png) - -| **字段** | **type** | **Required** | **含义** | -| --- | --- | --- | --- | -| keepAlive | int | false | 通信之间允许的最长时间段(以秒为单位),默认为120,范围(60-1200)可不填 | -| ProductKey | str | true | 产品key | -| ProductSecret | str | false | 产品密钥| -| QOS | int | false | MQTT消息服务质量(默认0,可选择0或1)0:发送者只发送一次消息,不进行重试 1:发送者最少发送一次消息,确保消息到达Broker | -| SessionFlag | bool | true | 配置与云平台通信的数据是否采用session加密(默认值为False),True:加密,False:加密 | -| sendMode | str | true | 移远云数据收发模式,phy:物模型,pass:透传 | -| serialD | int | true | MQTT通道捆绑的串口ID (1~3) | - - -#### 3.3.3.5 APN设置 +##### APN设置 APN功能暂未上线 +![](./media/gui_apn.png) -![](../pic/DTU_GUI_User_Guides/gui_apn.png) - -#### 3.3.3.6 GPIO引脚设置 +##### GPIO引脚设置 GPIO引脚设置功能暂未上线 -![](../pic/DTU_GUI_User_Guides/gui_gpio.png) +![](./media/gui_gpio.png) NETLED -- 网路指示灯的GPIO (pio1~pio128) @@ -227,61 +208,60 @@ NETRDY -- 与服务器连上后通知GPIO (pio1~pio128) RSTCNF -- 重置DTU参数的GPIO (pio1~pio128) -## 3.4修改密码 +### 修改密码 -![](../pic/DTU_GUI_User_Guides/gui_pwd.png) +![](./media/gui_pwd.png) 1. 勾选密码,输入当前的密码 2. 输入新的密码 3. 点击"修改密码"的按钮 -![](../pic/DTU_GUI_User_Guides/gui_pwd2.png) +![](./media/gui_pwd2.png) -## 3.5 输出数据格式配置 +### 输出数据格式配置 -![](../pic/DTU_GUI_User_Guides/gui_opt_format.png) +![](./media/gui_opt_format.png) **HEX 将输出的数据转为十六进制的数据:** -![](../pic/DTU_GUI_User_Guides/gui_opt_hex.png) +![](./media/gui_opt_hex.png) **时间戳:在输出的数据前面添加时间** -![](../pic/DTU_GUI_User_Guides/gui_opt_time.png) +![](./media/gui_opt_time.png) **清空接收: 将输出框的内容清空** -## 3.6 输入框的格式要求 +### 输入框的格式要求 -![](../pic/DTU_GUI_User_Guides/gui_input.png) +![](./media/gui_input.png) **1.查询指令:** **不需要密码的查询指令** -输入 0 点击发送 +输入 `0 `点击发送 -![](../pic/DTU_GUI_User_Guides/gui_send_cmd.png) +![](./media/gui_send_cmd.png) **需要密码的查询指令** -1.在输入框输入功能码,再在上面打开密码输入框,输入正确的密码点击"发送" +1. 在输入框输入功能码,再在上面打开密码输入框,输入正确的密码点击"发送" -2.在输入框输入功能码和json数据 +2. 在输入框输入功能码和json数据 如: `28,1921009046,{"password":"123","data":{}}` -![](../pic/DTU_GUI_User_Guides/gui_send_cmd_pw.png) +![](./media/gui_send_cmd_pw.png) **2. 修改配置参数的指令** 功能码 + 修改的数据 - `47,1564156496,{"password":"123","data":{"apn": ["", "", ""]}}` 中间用”:”隔开,后面为修改的json数据 提示:json数据里面不能出现中文字符 -![](../pic/DTU_GUI_User_Guides/gui_edit.png) +![](./media/gui_edit.png) 上图中返回的数据success 为1表示修改成功 \ No newline at end of file diff --git a/docs/DTU_Product_Introduction.md b/docs/DTU_Product_Introduction.md new file mode 100644 index 0000000..7f65b8a --- /dev/null +++ b/docs/DTU_Product_Introduction.md @@ -0,0 +1,180 @@ +## 修订历史 + +| Version | **Date** | **Author** | **Change expression** | +| :------ | ---------- | ---------- | --------------------- | +| 1.0 | 2021-11-25 | 陈驰 | 初始版本 | +| 1.1 | 2021-11-30 | 陈驰 | 增加对DTU配套组件和服务的描述 | + +## DTU介绍 + +### DTU + +- 英文全称Data Transfer Unit,数据传输单元。是专门用于将来自于设备端MCU的串口数据通过无线通信网络传送至服务器的无线终端设备。 +- 业务逻辑:传感器采集数据发送给设备端MCU,设备端MCU通过串口将采集到的数据通过DTU发送到服务器;服务器接收到数据可以进行分析、处理、显示、保存等操作。 + +![DTU.png](./media/DTU.png) + +### RTU + +- 英文全称Remote Terminal Unit,远程终端单元。 +- 业务逻辑包括数据采集上报和远程指令控制两部分: + - 数据采集上报:和DTU的数据采集上报功能完全一致 + - 远程指令控制:服务器下发控制指令,RTU接收到指令后,触发控制设备执行动作 +- RTU功能 = DTU功能 + 控制单元。 +- 下文中的DTU等同于RTU。 + +![RTU.png](./media/RTU.png) + +### 应用行业和场景 + +- 水利水电 +- 矿产资源开发 +- 地质灾害检测预警 +- 环境保护 +- 消防安全 +- 市政管网等 + +![industry.png](./media/industry.png) + +## 移远DTU及其能力 + +### 产品线 + +|目前支持DTU的模组| +| --- | +| EC200U_CNLB | +| EC200U_EUAB | +| EC600U_CNLB | +| EC600U_CNLC | +| EC600N_CNLA | +| EC600N_CNLC | +| EC600S_CNLA | +| EC600S_CNLB | + + +### 产品能力 + +- **2个串口通道** +- **通道支持HTTP、TCP、UDP、MQTT、阿里云、腾讯云、移远云多种协议和云平台** +- **支持多个云端通道传输** +- **支持本地和远程参数配置** +- **支持OTA升级** +- **支持数据离线存储** + - 在网络连接不稳定情况下,将发送失败的数据暂存至本地,在网络恢复后优先将本地数据发送至云端 + - 离线存储的数据量可通过配置文件配置 +- **支持modbus协议** +- **支持命令模式和透传模式,方便不支持modbus协议的设备接入** + - 命令模式下,支持对DTU的控制和参数读取;支持指定云端通道、指定MQTT主题,而非向所有的通道或主题推送同一个报文数据 + - 透传模式下,每个串口仅支持单通道透传,但支持指定MQTT主题 +- **支持常用的传感器、执行单元和输入设备** + - 传感器: + - 照度传感器(BH1750、OPT3001、GL5516、GL5528) + - 三轴加速度传感器(ADXL346、BMA250、LIS2DH12TR) + - 温湿度传感器(HDC1080、HDC2080、AHT10、DHT11) + - 可燃气体传感器 + - CO2气体传感器 + - GNSS定位模块 + - ... + + - 执行单元: + - 功放 + - 电机 + - LED + - LCD(ILI9225、ST7735、ST7789、SSD1306、UC1628) + - ... + + - 输入设备: + - 麦克风 + - 摄像头(GC032A、BF3901) + - 矩阵键盘 + - ... +- **支持QuecPython,可以使用Python代码快速实现二次开发** +- **开放了GPIO、SPI、IIC、PWM等各种外设接口,方便外设扩充** + +### 产品配套组件和服务 + +我司DTU产品的配套组件和服务是为了更好地支持基于DTU的终端产品的原型验证和功能开发。 + +#### 板载资源丰富的QuecPython开发板 + +我司的QuecPython开发板的板载资源丰富,支持照度传感器、温湿度传感器、喇叭接口、咪头接口、三色LED灯、LCD屏接口、Camera接口,及其它丰富的外设接口,配合下节将提及的GUI工具,可在QuecPython开发板上进行终端产品的原型验证。 + +![](./media/dev_board.png) + +#### 强大的上位机GUI工具 + +针对DTU所有的单元功能,GUI均提供了对应的交互入口,用于通过PC调试DTU,可作为终端产品开发前的快速原型验证。 + +[点此下载DTU GUI工具。](https://python.quectel.com/download) + +![](./media/gui_get_imei.png) + +#### QPYcom工具 + +QPYcom工具是一个集**QuecPython repl交互、PC和模组间文件传输、文件系统镜像制作并打包到固件包、及固件烧录等各种功能**于一体的强大利器。 + +用户如需进行DTU的二次开发,使用QPYcom将会大大提高开发的效率。 + +[点此下载QPYCom工具。](https://python.quectel.com/download) + +QPYCom的使用文档,参见安装目录下的`docs`文件夹。 + +![](./media/QPYCom_V1.8.png) + +#### 线上生成配置文件 + +通过我司的DTU服务平台,用户只需要点击按钮或填写必要参数值,即可在线上快速生成配置文件,并支持导出到本地、和给DTU进行配置文件的在线升级。 + +该功能尚在开发中,即将上线。 + +### 产品优势 + +- **增加了命令模式,设备端可在该模式下控制DTU的行为,亦可主动向DTU推送数据** + +- **支持网页生成DTU配置文件(即将上线)** + +- **支持上位机GUI工具,快速实现设备开发的原型验证** + +- **支持云端通道选择与MQTT topic选择** + + - 在命令模式下,DTU支持向指定云端通道发送数据,而非向所有通道同时推送数据,可节省流量及减少垃圾数据产生 + - MQTT、阿里云与腾讯云类型通道支持topic选择,DTU可支持向指定的topic发布数据 + - 通道可绑定串口,绑定串口后仅会向绑定的串口发送数据 + +- **透传时增加校验机制,保证上传数据的正确性** + + - 与串口通信双重校验机制,同时校验数据长度与CRC32 + - 校验失败重发机制,发送失败时可自动重发 + +- **modbus模式和命令模式自适应,用户直接进行通信即可** + +- **RTU可直接做主控,摒弃MCU,降低软硬件开发成本** + + - RTU可直接作为主控,省去MCU及其周边电路,降低硬件成本 + + ![Reduce_Hardware_Costs.png](./media/Reduce_Hardware_Costs.png) + + - 可使用Python进行二次开发,降低软件开发成本 + + ![C2Py.png](./media/C2Py.png) + + - 我司多平台模组适用,使用Python开发,无需修改代码即可快速切换至不同模组 + +- **业务功能扩充方便** + - 开放了GPIO、SPI、IIC、PWM等各种外设接口,方便外设扩充 + +- **强大的客户服务和技术支持能力** + +## 移远DTU的工作原理 + +### 命令模式 + +![CMD_Mode_Working_Principle.png](./media/CMD_Mode_Working_Principle.png) + +### 透传模式 + +![Transparent_Mode_Working_Principle.png](./media/Transparent_Mode_Working_Principle.png) + +### modbus模式 + +modbus模式下,严格遵守modbus协议规范,且遵守modbus协议的DTU产品在行业内的应用规则:DTU作为主机,根据用户配置,周期性向从机设备索要数据,推送至云端。 diff --git a/docs/md/DTU_Protocol_Specification.md b/docs/DTU_Protocol_Specification.md similarity index 58% rename from docs/md/DTU_Protocol_Specification.md rename to docs/DTU_Protocol_Specification.md index 0c18854..8ad358b 100644 --- a/docs/md/DTU_Protocol_Specification.md +++ b/docs/DTU_Protocol_Specification.md @@ -1,13 +1,17 @@ -# **DTU 通信数据协议** +## 修订历史 -# 1 概述 +| Version | **Date** | **Author** | **Change expression** | +| :------ | ---------- | ---------- | --------------------- | +| 1.0 | 2021-11-25 | 陈驰 | 初始版本 | + +## 概述 本文档主要内容包括: - 与云端通信的报文格式 - 所有命令模式的指令报文格式:设置参数、查询参数 - dtu_config.json配置文件字段的详细说明 -# 2 数据格式 +## 数据格式 DTU与云端通信报文使用json格式 @@ -15,7 +19,7 @@ DTU与云端通信报文使用json格式 命令模式与modbus模式: -`{“msg_id”: msg_id, “data”: “1234”[, “cmd_code”: 40, “topic_id”: 1]}` +`{“msg_id”: msg_id, “data”: “1234”[, “cmd_code”: 0X40, “topic_id”: 1]}` 透传模式: @@ -35,7 +39,7 @@ topic_id:可选字段,填写mqtt返回需要publish的topic_id,此字段 命令模式与modbus模式: -`{“msg_id”: msg_id, “data”: “1234”[, “cmd_code”: 40, “status”: 1]}` +`{“msg_id”: msg_id, “data”: “1234”[, “cmd_code”: 0X40, “status”: 1]}` 透传模式: @@ -51,7 +55,7 @@ cmd_code:可选字段,填写对应功能码,并又DTU执行相应的操作 status:可选字段,仅在命令模式下生效,用于反馈命令是否执行成功 -# 3 指令说明 +## 指令说明 **协议功能码说明:** @@ -59,54 +63,58 @@ status:可选字段,仅在命令模式下生效,用于反馈命令是否 **2.返回数据的状态码可查询对应的状态码表** -## 3.1 功能码表 +### 功能码表 -| 功能码 | 功能 | -|--------|---------------| -| 0-49 | 查询指令 | -| 0 | 查询IMEI | -| 1 | 查询本机号码 | -| 2 | 查询固件版本号 | -| 3 | 查询信号强度 | -| 4 | 查询当前配置参数 | -| 5 | 诊断查询 | -| 6 | 查询ICCID | -| 7 | 查询ADC电压 | -| 8 | 查询GPIO信息 | -| 10 | 查询温湿度 | -| 11 | 查询网络连接信息 | -| 12 | 查询网络状态 | -| 13 | 查询基站定位信息 | -| 50~143 | 设置指令 | -| 50 | 协议短信透传 | -| 51 | 配置密码 | -| 52 | 添加设备识别码IMEI | -| 53 | 登录服务器发送注册信息 | -| 54 | 固件版本号 | -| 55 | 是否启用自动更新 | -| 56 | 日志输出 | -| 57 | 服务器获取配置参数 | -| 58 | 串口参数 | -| 59 | 通道配置参数 | -| 60 | Apn设置 | -| 61 | GPIO设置 | -| 62 | OTA | -| 63 | 参数设置 | -| 255 | 复位指令 | +| 功能码 | 功能 | +| --- | --- | +| 0x00-0x3f | 查询指令 | +| 0x00 | 查询IMEI | +| 0x01 | 查询本机号码 | +| 0x02 | 查询固件版本号 | +| 0x03 | 查询信号强度 | +| 0x04 | 查询当前配置参数 | +| 0x05 | 诊断查询 | +| 0X06 | 查询ICCID | +| 0X07 | 查询ADC电压 | +| 0X08 | 查询GPIO信息 | +| 0X10 | 查询温湿度 | +| 0X11 | 查询网络连接信息 | +| 0X12 | 查询网络状态 | +| 0X13 | 查询基站定位信息 | +| 0x50~0x8f | 设置指令 | +| 0x50 | 协议短信透传 | +| 0x51 | 配置密码 | +| 0x52 | 添加设备识别码IMEI | +| 0x53 | 登录服务器发送注册信息 | +| 0x54 | 固件版本号 | +| 0x55 | 是否启用自动更新 | +| 0x56 | 日志输出 | +| 0x57 | 服务器获取配置参数 | +| 0x58 | 串口参数 | +| 0x59 | 通道配置参数 | +| 0x60 | Apn设置 | +| 0x61 | GPIO设置 | +| 0x62 | GPS | +| 0x63 | 数据流 | +| 0x64 | 预警 | +| 0x65 | 任务 | +| 0xfd | 协议终止指令 | +| 0xfe | DTU启动中,无法接收指令 | +| 0xff | 复位指令 | -# 4 查询指令 +## 查询指令 -### 4.1.1 查询IMEI +### 查询IMEI **说明:** DTU的IMEI号 -功能码: 0 +功能码: 0x00 返回的数据内容: -`{"code": 0 , "data": "123456789012345" , "success":1}` +`{"code": 0x00 , "data": "123456789012345" , "success":1}` 字段说明: @@ -116,17 +124,17 @@ DTU的IMEI号 | data | str | 返回IMEI | | success | int | 0 失败 1成功 | -### 4.1.2 查询本机号码 +### 查询本机号码 **说明:** 查询SIM卡的号码 -功能码: 1 +功能码: 0x01 返回的数据内容: -`{"code": 1 , "data": "17201593988" , "success":1}` +`{"code": 0x01 , "data": "17201593988" , "success":1}` | **字段** | **类型** | **含义** | | --- | --- | --- | @@ -134,7 +142,7 @@ DTU的IMEI号 | data | str | SIM卡的手机号码 | | success | int | 0 失败 1成功 | -### 4.1.3 查询固件版本号 +### 查询固件版本号 **说明:** @@ -142,11 +150,11 @@ DTU的IMEI号 固件版本号格式为: v 1 -功能码: 2 +功能码: 0x02 返回的数据内容: -`{"code": 2 , "data": "v 1" , "success":1}` +`{"code": 0x02 , "data": "v 1" , "success":1}` | **字段** | **类型** | **含义** | | --- | --- | --- | @@ -154,17 +162,17 @@ DTU的IMEI号 | data | str | 固件版本号 | | success | int | 0 失败 1成功 | -### 4.1.4 查询信号强度 +### 查询信号强度 **说明:** 网络信号强度值范围0~31,值越大表示信号强度越好。 -功能码: 3 +功能码: 0x03 返回的数据内容: -`{"code": 3 , "data": " CSQ17 " , "success":1}` +`{"code": 0x03 , "data": " CSQ17 " , "success":1}` | **字段** | **字符串** | **含义** | | --- | --- | --- | @@ -172,19 +180,21 @@ DTU的IMEI号 | data | str | CSQ1~CSQ31 | | success | int | 0 失败 1成功 | -### 4.1.5 查询当前配置参数 +### 查询当前配置参数 -功能码: 4 +功能码: 0x04 数据内容: ``` -{"password": "012345", - "cmd_code": 4, +{ "password": "012345", + +"data":{} + } ``` 返回的数据内容: -`{"code": 4 , "data": " req config " , "success":1}` +`{"code": 0x04 , "data": " req config " , "success":1}` | **字段** | **字符串** | **含义** | | --- | --- | --- | @@ -192,17 +202,17 @@ DTU的IMEI号 | data | str | req config | | success | int | 0 失败 1成功 | -### 4.1.6 诊断查询 +### 诊断查询 说明: 查询当前DTU运行的错误上报信息 -功能码: 5 +功能码: 0x05 返回的数据内容: ``` -{"code":5, +{"code":0x05, -"data":[{"func_code": "5" , "error_code": " 6001"}], +"data":[{"func_code": "0x01" , "error_code": " 6001"}], "success":1} ``` @@ -214,15 +224,15 @@ DTU的IMEI号 | error_code | str | 错误码 | | success | int | 0 失败 1成功 | -### 4.1.7 iccid查询 +### iccid查询 说明: 查询iccid -功能码: 6 +功能码: 0x06 返回的数据内容: ``` -{"code":6, +{"code":0x06, "data": "12456465486561516515153", @@ -235,15 +245,15 @@ DTU的IMEI号 | data | str | 功能码 | | status | str | 0 失败 1成功 | -### 4.1.8 adc查询 +### adc查询 说明: 查询adc -功能码: 7 +功能码: 0x07 返回的数据内容: ``` -{"code":7, +{"code":0x07, "data": "3.7", @@ -255,15 +265,15 @@ DTU的IMEI号 | data | str | adc电压 | | status | str | 0 失败 1成功 | -### 4.1.9 gpio查询 +### gpio查询 说明: 查询gpio -功能码: 8 +功能码: 0x08 返回的数据内容: ``` -{"code":8, +{"code":0x08, "data": "gpio_msg", @@ -276,36 +286,15 @@ DTU的IMEI号 | data | str | gpio获取的信息 | | status | str | 0 失败 1成功 | -### 4.1.10 电池电压查询 - -说明: 查询gpio - -功能码: 9 - -返回的数据内容: -``` -{"code":9, - -"data": "3590", - -"status":1} -``` - -| **字段** | **类型** | **含义** | -| --- | --- | --- | -| code | int | 状态码 | -| data | str | gpio获取的信息 | -| status | str | 0 失败 1成功 | - -### 4.1.10 查询温湿度 +### 查询温湿度 说明: 查询温湿度 -功能码: 10 +功能码: 0x010 返回的数据内容: ``` -{"code":10, +{"code":0x10, "data": {"temperature": 26.0, "humidity": 60.0}, "status":1} ``` @@ -313,18 +302,18 @@ DTU的IMEI号 | **字段** | **类型** | **含义** | | --- | --- | --- | | code | int | 状态码 | -| data | dict | 温湿度信息{"temperature": temp, 'humidity': humid} | +| data | dict | 温湿度信息{"temperature": temp, &##39;humidity&##39;: humid} | | status | str | 0 失败 1成功 | -### 4.1.11 查询网络连接信息 +### 查询网络连接信息 说明: 查询网络连接信息,每种连接类型返回对应连接状态 -功能码: 11 +功能码: 0x11 返回的数据内容: ``` -{"code":11, +{"code":0x11, "data": "200", "status":1} ``` @@ -335,100 +324,36 @@ DTU的IMEI号 | data | str | 网络连接状态 | | status | str | 0 失败 1成功 | -网络连接状态说明 - -| **连接类型** | **含义** | -|-----------|--------------------------------| -| http | 返回http状态码 | -| tcp/udp | 参照套接字状态表 | -| mqtt | 0:连接成功 1:连接中 2:服务端连接关闭 -1:连接异常 | -| aliyun | 0:连接成功 1:连接中 2:服务端连接关闭 -1:连接异常 | -| txyun | 0:连接成功 1:连接中 2:服务端连接关闭 -1:连接异常 | -| quecthing | 参照quecthing连接状态表 | - -套接字状态表 - -| **状态值** | **状态** | **描述** | -|------|------------|---------------------------------------------------------------| -|0 | CLOSED | 套接字创建了,但没有使用这个套接字 | -|1 | LISTEN | 套接字正在监听连接 | -|2 | SYN_SENT | 套接字正在试图主动建立连接,即发送SYN后还没有收到ACK | -|3 | SYN_RCVD | 套接字正在处于连接的初始同步状态,即收到对方的SYN,但还没收到自己发过去的SYN的ACK | -|4 | ESTABLISHED | 连接已建立 | -|5 | FIN_WAIT_1 | 套接字已关闭,正在关闭连接,即发送FIN,没有收到ACK也没有收到FIN | -|6 | FIN_WAIT_2 | 套接字已关闭,正在等待远程套接字关闭,即在FIN_WAIT_1状态下收到发过去FIN对应的ACK | -|7 | CLOSE_WAIT | 远程套接字已经关闭,正在等待关闭这个套接字,被动关闭的一方收到FIN | -|8 | CLOSING | 套接字已关闭,远程套接字正在关闭,暂时挂起关闭确认,即在FIN_WAIT_1状态下收到被动方的FIN | -|9 | LAST_ACK | 远程套接字已关闭,正在等待本地套接字的关闭确认,被动方在CLOSE_WAIT状态下发送FIN | -|10 | TIME_WAIT | 套接字已经关闭,正在等待远程套接字的关闭,即FIN、ACK、FIN、ACK都完毕,经过2MSL时间后变为CLOSED状态 | - -quecthing连接状态表 - -|**整型**| **状态编号** | -|---|------------| -|0 | 未初始化 | -|1 | 已初始化 | -|2 | 正在认证 | -|3 | 认证成功 | -|4 | 认证失败 | -|5 | 正在注册 | -|6 | 注册成功,等待订阅 | -|7 | 注册失败 | -|8 | 已订阅,数据可发送 | -|9 | 订阅失败 | -|10 | 正在注销 | -|11 | 注销成功 | -|12 | 注销失败 | - - - -### 4.1.12 查询网络状态 +### 查询网络状态 说明: 查询网络连接状态,返回基站信息 -功能码: 12 +功能码: 0x12 返回的数据内容: ``` -{"code":12, +{"code":0x12, -"data": {"voice_state": 1, "data_state": 1}, +"data": ([], [], [(0, 14071232, 1120, 0, 123….), "status":1} ``` -| **字段** | **类型** | **含义** | -| --- | --- |---------------------------------------| -| code | int | 状态码 | -| data | turple | voice_state:语音连接状态, data_state:数据连接状态 | -| status | str | 0 失败 1成功 | +| **字段** | **类型** | **含义** | +| --- | --- | --- | +| code | int | 状态码 | +| data | turple | 基站连接状态 | +| status | str | 0 失败 1成功 | -状态说明 - -| **值** | **状态说明** | -| --- | --- | -| 0 | not registered, MT is not currently searching an operator to register to | -| 1 | registered, home network | -| 2 | not registered, but MT is currently trying to attach or searching an operator to register to | -| 3 | registration denied | -| 4 | unknown | -| 5 | registered, roaming | -| 6 | egistered for “SMS only”, home network (not applicable) | -| 7 | registered for “SMS only”, roaming (not applicable) | -| 8 | attached for emergency bearer services only | -| 9 | registered for “CSFB not preferred”, home network (not applicable) | -| 10 | registered for “CSFB not preferred”, roaming (not applicable) | -| 11 | emergency bearer services only | - -### 4.1.13 查询基站定位信息 +### 查询基站定位信息 说明: 查询基站定位信息 -功能码: 13 +功能码: 0x13 返回的数据内容: ``` -{"code":13, +{"code":0x13, "data": (117.1138, 31.82279, 550) , @@ -441,16 +366,14 @@ quecthing连接状态表 | data | str | 基站定位信息 | | status | str | 0 失败 1成功 | -# 5 复位指令 +## 复位指令 -功能码: 255 +功能码: 0xff 数据内容: ``` { Password: "012345", -"code":255, - "data":{} } @@ -458,7 +381,7 @@ quecthing连接状态表 返回的数据内容: -无 +`{"code": 0x06 , "data": " reset dtu " , "success":1}` | **字段** | **类型** | **含义** | | --- | --- | --- | @@ -466,13 +389,13 @@ quecthing连接状态表 | data | str | reset dtu | | success | int | 0 失败 1成功 | -# 6 设置指令 +## 设置指令 -## 6.1 基础设置 +### 基础设置 -### 6.1.1 协议短信(SMS)透传 message +#### 协议短信(SMS)透传 message -功能码: 50 +功能码: 0x50 数据内容: @@ -487,7 +410,7 @@ quecthing连接状态表 message: {"number":"12123123", -- 目标号码 -"sms_msg:" " -- 发送短信 +"data:" " -- 发送短信 } } @@ -496,7 +419,7 @@ message: {"number":"12123123", -- 目标号码 返回的数据内容: -`{"code": 50 , "data": " " , "success":1}` +`{"code": 0x50 , "data": " " , "success":1}` | **字段** | **类型** | **含义** | | --- | --- | --- | @@ -504,7 +427,7 @@ message: {"number":"12123123", -- 目标号码 | data | str | 接收的短信 | | success | int | 0 失败 1成功 | -### 6.1.2 配置密码 password +#### 配置密码 password **说明:** @@ -514,13 +437,13 @@ message: {"number":"12123123", -- 目标号码 是否开启自动更新需要密码 -功能码: 51 +功能码: 0x51 数据内容: ``` { "password":" ", -"data":{"new_password": "012345"} +"data":{ "password": "012345"} } ``` 说明:初始密码为固件IMEI的后六位 @@ -534,7 +457,7 @@ message: {"number":"12123123", -- 目标号码 返回的数据内容: -`{"code": 51 , "data": " " , "success":1}` +`{"code": 0x51 , "data": " " , "success":1}` | **字段** | **含义** | | --- | --- | @@ -543,13 +466,13 @@ message: {"number":"12123123", -- 目标号码 | | success | 0 失败 1成功 | -### 6.1.3 登录服务器发送注册信息 reg +#### 登录服务器发送注册信息 reg **说明:** 首次登陆服务器发送注册信息 -功能码: 53 +功能码: 0x53 数据内容: ``` @@ -567,7 +490,7 @@ message: {"number":"12123123", -- 目标号码 返回的数据内容: -`{"code": 53 , "data": " " , "success":1}` +`{"code": 0x53 , "data": " " , "success":1}` | **字段** | **类型** | **含义** | | --- | --- | --- | @@ -575,29 +498,27 @@ message: {"number":"12123123", -- 目标号码 | data | str | send reg | | success | int | 0 失败 1成功 | -### 6.1.4 固件版本号 version +#### 固件版本号 version **说明:** 修改固件版本号,用于fota升级(当开启fota升级,版本号小于服务器端的固件版本号就会进行fota升级) -固件版本号仅支持整数 - -功能码: 54 +功能码: 0x54 数据内容: ``` { "password":"", "data":{ -"version ": "100" --- 版本号(使用数字字符串) +" version ": "100" --- 版本号(使用数字字符串) } } ``` 返回的数据内容: -`{"code": 54 , "data": " " , "success":1}` +`{"code": 0x54 , "data": " " , "success":1}` | **字段** | **类型** | **含义** | | --- | --- | --- | @@ -605,13 +526,13 @@ message: {"number":"12123123", -- 目标号码 | data | str | 固件版本号 | | success | int | 0 失败 1成功 | -### 6.1.5 是否启用自动更新 fota +#### 是否启用自动更新 fota **说明:** Fota升级开关 -功能码: 55 +功能码: 0x55 数据内容: ``` @@ -624,7 +545,7 @@ Fota升级开关 ``` 返回的数据内容: -`{"code": 55 , "data": " fota" , "success":1}` +`{"code": 0x55 , "data": " fota" , "success":1}` | **字段** | **类型** | **含义** | | --- | --- | --- | @@ -632,13 +553,13 @@ Fota升级开关 | data | str | fota | | success | int | 0 失败 1成功 | -### 6.1.6 日志输出 nolog +#### 日志输出 nolog **说明:** 串口打印日志记录,目前不支持。日志输出连接Debug口 -功能码: 56 +功能码: 0x56 数据内容: ``` @@ -659,9 +580,9 @@ Fota升级开关 | data | str | log | | success | int | 0 失败 1成功 | -### 6.1.7 服务器获取配置参数 +#### 服务器获取配置参数 -功能码: 57 +功能码: 0x57 数据内容: ``` @@ -688,11 +609,9 @@ Fota升级开关 | data | str | service acquire | | success | int | 0 失败 1成功 | -### 6.1.8 串口参数 uconf +#### 串口参数 uconf -功能码: 58 - -**在透传模式下无法设置串口参数** +功能码: 0x58 数据内容: ``` @@ -718,32 +637,29 @@ Fota升级开关 | data | str | uconf | | success | int | 0 失败 1成功 | -### 6.1.9 通道配置参数 conf +#### 通道配置参数 conf -功能码: 59 - -**在透传模式下无法设置串口参数** +功能码: 0x59 数据内容: ``` {"password":"", - "data":{ - "conf":{ - "1": { - "protocol": "aliyun", - "type": "mos", - "keepAlive": "", - "clientID": "0", - "Devicename": "ec600n", - "ProductKey": "gbh26bFEA4M", - "DeviceSecret": "b7ff5acc0671d40adfd0eff57e7605f6", - "ProductSecret": "", - "cleanSession": true, - "qos": "1", - "subscribe": {"0": "/gbh26bFEA4M/ec600n/user/subtest"}, - "publish": {"0": "/gbh26bFEA4M/ec600n/user/pubtest"}, - "serialID": "0"} -}}} +"data":{ +"conf":"1": { +"protocol": "aliyun", +"type": "mos", +"keepAlive": "", +"clientID": "0", +"Devicename": "ec600n", +"ProductKey": "gbh26bFEA4M", +"DeviceSecret": "b7ff5acc0671d40adfd0eff57e7605f6", +"ProductSecret": "", +"cleanSession": true, +"qos": "1", +"subscribe": {"0": "/gbh26bFEA4M/ec600n/user/subtest"}, +"publish": {"0": "/gbh26bFEA4M/ec600n/user/pubtest"}, +"serialID": "0"} +}} ``` **对应通道的配置参数详见6.1.10.1的通道配置详解 :** @@ -757,9 +673,9 @@ Fota升级开关 | data | str | conf | | success | int | 0 失败 1成功 | -#### 6.1.9.1 通道配置详解 +##### 通道配置详解 -##### 6.1.9.1.1 HTTP参数 +###### HTTP参数 ``` { "protocol": "http", @@ -778,7 +694,7 @@ Fota升级开关 | timeout | int | HTTP请求最长等待时间 | | serialD | int | HTTP绑定的串口号(1~2) | -##### 6.1.9.1.2 SOCKET tcp参数 +###### SOCKET tcp参数 ``` { "protocol": "tcp", @@ -800,10 +716,10 @@ Fota升级开关 | KeepAlive | int | 链接超时最大时间单位秒,默认300秒 | | serialD | int | tcp/udp绑定的串口号(1~2) | -##### 6.1.9.1.3 SOCKET udp 参数 +###### SOCKET udp 参数 ``` { -"protocol": "udp", +"protocol": "tcp", "ping": "", "heartbeat": 30, "url": "220.180.239.212", @@ -822,7 +738,7 @@ Fota升级开关 | KeepAlive | int | 链接超时最大时间单位秒,默认300秒 (60~600) | | serialD | int | tcp/udp绑定的串口号(1~2) | -##### 6.1.9.1.4 MQTT参数 +###### MQTT参数 ``` { "protocol": "mqtt", @@ -852,7 +768,7 @@ Fota升级开关 | retain | int | MQTT的publish参数retain,默认0 | | serialD | int | MQTT通道捆绑的串口ID (1~3) | -##### 6.1.9.1.5 阿里云参数 +###### 阿里云参数 ``` { "protocol": "aliyun", @@ -886,7 +802,7 @@ Fota升级开关 | pubTopic | str | 发布主题 | | serialD | int | MQTT通道捆绑的串口ID (1~3) | -##### 6.1.9.1.6 腾讯云参数 +###### 腾讯云参数 ``` { "protocol": "txyun", @@ -911,7 +827,8 @@ Fota升级开关 | keepAlive | int | 通信之间允许的最长时间段(以秒为单位),默认为300,范围(60-1200)使用默认值就填""或者" "。 | | clientID | str | clientID ,自定义字符(不超过64) | | Devicename | str | 设备名称 | -| ProductKey | str |产品密钥| +| ProductKey | str | + | | DeviceSecret | str | 设备密钥(使用一型一密认证此参数传入"") | | ProductSecret | str | 产品密钥(使用一机一密认证时此参数传入"") | | cleanSession | int | MQTT 保存会话标志位( 0则客户端是持久客户端,当客户端断开连接时,订阅信息和排队消息将被保留, 1代理将在其断开连接时删除有关此客户端的所有信息 ) | @@ -920,44 +837,11 @@ Fota升级开关 | pubTopic | str | 发布主题 | | serialD | int | MQTT通道捆绑的串口ID (1~3) | - -##### 6.1.9.1.7 移远云参数 -``` -{ -"protocol": "quecthing", -"keepAlive": "", // lifetime -"ProductKey": " a1QNbCDxIWM ", -"ProductSecret": "", -"qos": "1", -"SessionFlag": "", -"sendMode": "phy", -"serialID": "1", -} -``` -| **字段** | **类型** | **含义** | -| --- | --- | --- | -| quecthing | str | 腾讯云IOT的标识 | -| keepAlive | int | 通信之间允许的最长时间段(以秒为单位),默认为120,范围(60-1200)使用默认值就填""或者" "。 | -| ProductKey | str |产品id| -| ProductSecret | str | 产品密钥| -| QOS | int | MQTT消息服务质量(默认0,可选择0或1)0:发送者只发送一次消息,不进行重试 1:发送者最少发送一次消息,确保消息到达Broker | -| SessionFlag | bool | 配置与云平台通信的数据是否采用session加密(默认值为False),True:加密,False:加密 | -| sendMode | str | 移远云数据收发模式,phy:物模型,pass:透传 | -| serialD | int | MQTT通道捆绑的串口ID (1~3) | - - -移远云开发说明请点击以下连接获取文档: - -[Quectel_移远通信物联网设备管理平台设备接入_应用指导_(Python)_2.9.0.pdf](https://quec-pro-oss.oss-cn-shanghai.aliyuncs.com/documentCenter/Quectel_%E7%A7%BB%E8%BF%9C%E9%80%9A%E4%BF%A1%E7%89%A9%E8%81%94%E7%BD%91%E8%AE%BE%E5%A4%87%E7%AE%A1%E7%90%86%E5%B9%B3%E5%8F%B0%E8%AE%BE%E5%A4%87%E6%8E%A5%E5%85%A5_%E5%BA%94%E7%94%A8%E6%8C%87%E5%AF%BC_(Python)_2.9.0.pdf) - - -# 7 设置APN +## 设置APN 说明:这个指令只适合配置和使用不是同一张卡的场景 -**在透传模式下无法设置串口参数** - -功能码: 60 +功能码: 0x60 数据内容: ``` @@ -976,7 +860,7 @@ apn对应列表说明: 返回的数据内容: -`{"code": 60 , "status":1}` +`{"code": 0x60 , "status":1}` | **字段** | **类型** | **含义** | | --- | --- | --- | @@ -984,26 +868,22 @@ apn对应列表说明: | data | str | set apn | | success | int | 0 失败 1成功 | -# 8 GPIO pins +## GPIO pins -功能码: 61 - -**在透传模式下无法设置串口参数** - -pins的长度必须为3 +功能码: 0x61 数据内容: ``` {"password": " ", "data":{"pins":[ -"1", -- 网路指示灯的GPIO (pio1~pio128) -"2", -- 与服务器连上后通知GPIO (pio1~pio128) -"3" -- 重置DTU参数的GPIO (pio1~pio128) +"pio2", -- 网路指示灯的GPIO (pio1~pio128) +"pio4", -- 与服务器连上后通知GPIO (pio1~pio128) +"pio4" -- 重置DTU参数的GPIO (pio1~pio128) ]}} ``` 返回的数据内容: -`{"code": 61 , "status":1}` +`{"code": 0x61 , "status":1}` | **字段** | **类型** | **含义** | | --- | --- | --- | @@ -1011,9 +891,9 @@ pins的长度必须为3 | data | str | set gpio pins | | success | int | 0 失败 1成功 | -# 9 OTA +## OTA -功能码: 62 +功能码: 0x62 数据内容: ``` @@ -1023,34 +903,30 @@ pins的长度必须为3 ``` 返回的数据内容: -`{"code": 62 , "status":1}` +`{"code": 0x62 , "status":1}` | **字段** | **类型** | **含义** | | --- | --- | --- | | code | Str | 状态码 | | data | str | OTA状态 | -| status | int | 0 失败 1成功 | +| success | int | 0 失败 1成功 | +## 参数设置 -# 10 参数设置 - -功能码: 63 +功能码: 0x63 数据内容: ``` {"password": " ", -"data":{"dtu_config":{完整配置文件内容} +"data":{ 完整配置文件(省略) } ``` - -完整配置文件参照《DTU上手说明》 - 返回的数据内容: -`{"code": 63 , "status":1}` +`{"code": 0x63 ,"status":1}` | **字段** | **类型** | **含义** | | --- | --- | --- | | code | Str | 状态码 | -| status | int | 0 失败 1成功 | - +| data | dict | 完整的配置文件 | +| status | int | 0 失败 1成功 | \ No newline at end of file diff --git a/docs/DTU_User_Guides.md b/docs/DTU_User_Guides.md new file mode 100644 index 0000000..d9199bd --- /dev/null +++ b/docs/DTU_User_Guides.md @@ -0,0 +1,525 @@ +## 修订历史 + +| Version | **Date** | **Author** | **Change expression** | +| :------ | ---------- | ---------- | --------------------- | +| 1.0 | 2021-11-25 | 陈驰 | 初始版本 | + +## 基本概述 + +本文档旨在指导用户如何基于我司的QuecPython开发板进行DTU功能开发。 + +## 使用前准备 + +### 在NANO SIM卡座中插入SIM卡 + +![](./media/dev_board.png) + +### 将天线插入至开发板背面标注为"LTE"的插座中,并用力压紧直到听到"啪"一声 + +![](./media/antenna.jpg) + +### 使用USB数据线连接开发板至电脑USB接口 +### 设备开机与QPYcom下载请点击以下连接查看说明 + +[QuecPython 开发环境搭建](https://python.quectel.com/doc/doc/Quick_start/zh/QuecPythonStart/dev_env.html) + +## DTU固件、配置文件加载到开发板 + +### 打开代码库中的DTU文件夹,按需求编写配置文件 + +**配置文件格式与说明如下** + +```json +{ + "plate": 1, //是否在报文中添加IMEI + "password": "123", //设置密码 + "conf": { //设置在线连接 +"1": { //通道序号 +//HTTP连接设置 + "protocol": "http", //连接类型,固定为http + "method": "get", //请求方式 + "url": "http://httpbin.org/get", //请求url + "reg_data": "", //附带的固定文本 + "timeout": "", //超时 + "serialID": 1 //捆绑的串口(1-2) + }, +"2": { +//TCP&UDP连接设置 + "protocol": "tcp", //连接类型,TCP填写”tcp”,UDP填写”udp” + "ping": "", //ping + "heartbeat": 30, //心跳时间 + "url": "220.180.239.212", //请求url + "port": "8305", //端口 + "keepAlive": 300, //保持连接时间 + "serialID": 2 //捆绑串口 + }, +"3": { +//mqtt连接设置 + "protocol": "mqtt", //连接类型 + "clientID": "test_mqtt", //客户端id + "keepAlive": "", //keep alive超时 + "url": "mq.tongxinmao.com", //url + "port": "18830", //端口 + "cleanSession": "0", //clean session + "subscribe": {"0": "/public/TEST/python"}, //订阅的主题(支持多个) + "publish": {"0": "/public/TEST/python"}, //发布的主题(支持多个) + "qos": "0", //QoS + "retain": "1", //是否使用内部重连 + "serialID": "1" //捆绑的串口 +}, +//阿里云连接设置 + "4": { + "protocol": "aliyun", //连接类型 + "type": "mos", //一机一密/一型一密设置 + "keepAlive": "", // keep alive超时 + "clientID": " test_mos ", //客户端id + "Devicename": " light01", //设备名称 + "ProductKey": " a1QNbCDxIWM ", //product key + "DeviceSecret": "0bceb8010ade0df2e6989982e63f7601", //device secret + "ProductSecret": "", //product secret + "cleanSession": "0", //clean session + "qos": "1", //QoS + "subscribe": {"0": "/a1QNbCDxIWM/light01/user/get"}, //订阅的主题(支持多个) + "publish": {"0": "/a1QNbCDxIWM/light01/user/update"}, //发布的主题(支持多个) + "serialID": "1" //捆绑的串口 + }, +"5": { +//腾讯云设置 + "protocol": "txyun", + "type": "mos", + "keepAlive": "", + "clientID": "test_tx_mos", + "Devicename": "Smart_test01", + "ProductKey": "H7MBLRYXN9", + "DeviceSecret": "89c7tXT3s3grZTr/YFjxSg==", + "ProductSecret": "", + "cleanSession": "0", + "qos": "1", + "subscribe": {"0": "H7MBLRYXN9/Smart_test01/control"}, + "publish": {"0": "H7MBLRYXN9/Smart_test01/event"}, + "serialID": "1" + } + }, + "reg": 1, //发送登陆消息 + "convert": 0, + "version": 100, //固件版本 + "nolog": 0, //是否输出log + "message": {}, //协议短信透传 + "uconf": { //串口设置 + "1": { + "baudrate": "115200", + "databits": "8", + "parity": "0", + "stopbits": "1", + "flowctl": "0" + }, + "2": { + "baudrate": "115200", + "databits": "8", + "parity": "0", + "stopbits": "1", + "flowctl": "0" + } + }, + "fota": 1, //是否启用fota + "pins": [ //启用的pio + "pio1", + "pio2", + "pio3" + ], + "direction_pin": {}, //需要控制的方向的GPIO与默认方向 + "apn": [ //APN设置 + "", + "", + "" + ], + "service_acquire": 0, //是否开启服务器获取参数 + "work_mode": "command", //工作模式 + "auto_connect": 1, //自动连接 + "offline_storage": false //离线存储 +} + + +``` + + + + +按需求编写配置文件后将配置文件保存为"dtu_config.json",并保存至DTU代码库中的"dtu"文件夹内 + +**注:json文件保存前需要移除注释** + +### 下载代码到设备 + +#### 接上数据线,连接至电脑,短按开发板上的"PWK"按键启动设备,并在QPYcom上选择MI05接口连接 + +![](./media/port.png) + +#### 切换到下载选项卡,点击创建项目,并输入任意项目名称 + +![](./media/qpycom_proj.png) + +#### 将代码包"dtu"文件夹内所有文件拖入此框内,并应包含图示文件 + +![](./media/qpycom_add_file.png) + +#### 单击箭头,选择"下载脚本",并等待下载完成 + +![](./media/qpycom_download.png) + +#### 切换至"文件"选项卡,在右边选中"dtu\_handler.py",点击运行按钮,即可开始dtu调试运行,如果需要上电自动运行,只需要将"dtu\_handler.py"更名为"main.py"即可实现上电自动运行 + +![](./media/qpycom_run.png) + +## 重启开发板 + +上面的步骤完成之后,选择USB MI05 COM Port(老版本是USB串行设备),打开串口。 + +![](./media/qpycom_run2.png) + +DTU运行成功,下面为读取的配置文件。 + +![](./media/qpycom_run_success.png) + +## 报文格式 + +### 命令模式/modbus模式 + +支持多通道透传,通过配置文件中的serialID字段可以对通道与串口进行绑定,每个串口均支持绑定多个通道。在发送数据时需要传入通道id,DTU会向指定的通道发送数据。 + +在命令模式与modbus模式下,接受到的报文会先进行命令解析,如果解析失败才会向串口传输数据。 + +数据格式说明: + +#### HTTP/TCP/UDP + +- 上行数据报文格式: + +`","[,"",””]` + +- 下行数据报文格式: + +`","[,"",””]` + +- 字段说明: + +channel_id:通道id,配置文件中通道id + +msg_len:消息体长度,字符串格式,可以为0 + +crc32:消息数据crc32校验码,当msg_len为0时,此项可省略 + +msg_data:消息体,当msg_len为0时,此项可省略 + +- 示例报文: + +**发送报文:** + +`“1,6,376e6e7,abcedf”` (msg_len不为0) + +`“1,0”` (msg_len为0) + +**返回报文:** + +`“5,2e46f5,20001”` + +#### MQTT/Aliyun/Txyun + +- 上行数据报文格式: + +`",,","","` + +- 下行数据报文格式: + +`",,","","` + +- 字段说明: + +channel_id:通道id,配置文件中通道id + +topic_id:mqtt通道topic_id,上行为publish topic id,下行为subscribe topic id + +msg_len:消息体长度,字符串格式,可以为0 + +crc32:消息数据crc32校验码,当msg_len为0时此项也不可省略 + +msg_data:消息体,当msg_len为0时此项也不可省略 + +- 示例报文: + +**发送报文:** + +`“1,1,6,376e6e7,abcedf”` + +**返回报文:** + +`“1,1,5,2e46f5,20002”` + +### 透传模式 + +支持MQTT/TCP/UDP/HTTP双通道透传(串口1&串口2),透传模式每个串口仅支持绑定一个通道,可在配置文件中配置serialID对通道和串口进行绑定。透传模式如果串口配置了多个通道,只会选择第一个通道配置,后面的配置都会被忽略。 + +透传模式传输时无需在数据格式上传入channel\_id,DTU会自动向串口绑定通道发送数据。 + +数据格式说明: + +#### HTTP/TCP/UDP + +- 上行数据报文格式: + +`""[,"",””]"` + +- 下行数据报文格式: + +`""[,"",””]"` + +- 字段说明: + +msg_len:消息体长度,字符串格式,可以为0 + +crc32:消息数据crc32校验码,当msg_len为0时,此项可省略 + +msg_data:消息体,当msg_len为0时,此项可省略 + +- 示例报文: + +**发送报文:** + +`“6,376e6e7,abcedf”` (msg_len不为0) + +`“0”` (msg_len为0) + +**返回报文:** + +`“5,2e46f5,20001”` + +#### MQTT/Aliyun/Txyun + +- 上行数据报文格式: + +`,,,` + +- 下行数据报文格式: + +`,,,` + +- 字段说明: + +topic_id:mqtt通道topic_id,上行为publish topic id,下行为subscribe topic id + +msg_len:消息体长度,字符串格式,可以为0 + +crc32:消息数据crc32校验码,当msg_len为0时此项也不可省略 + +msg_data:消息体,当msg_len为0时此项也不可省略 + +- 示例报文: + +**发送报文:** + +`“6,376e6e7,abcedf”` + +**返回报文:** + +`“5,2e46f5,20002”` + +### 与云端通信报文 + +DTU与云端通信报文使用json格式 + +#### 云端下行报文 + +- 命令模式与modbus模式: + +`{“msg_id”: msg_id, “data”: “1234”[, “cmd_code”: 0X40, “topic_id”: 1]}` + +- 透传模式: + +`{“msg_id”: msg_id, “data”: “1234”}` + +- 字段说明: + +msg_id:报文id,一般为时间戳+3位随机数 + +data:报文消息字段 + +cmd_code:可选字段,填写对应功能码,并又DTU执行相应的操作,此字段仅在命令模式下生效 + +topic_id:可选字段,填写mqtt返回需要publish的topic\_id,此字段仅在命令模式与使用MQTT/Aliyun/Txyun时生效 + +#### 云端上行报文 + +命令模式与modbus模式: + +`{“msg_id”: msg_id, “data”: “1234”[, “cmd_code”: 0X40, “status”: 1]}` + +透传模式: + +`{“msg_id”: msg_id, “data”: “1234”}` + +- 字段说明: + +msg_id:报文id,一般为时间戳+3位随机数,回复报文会使用相同的msg\_id + +data:报文消息字段 + +cmd_code:可选字段,填写对应功能码,并又DTU执行相应的操作,此字段仅在命令模式下生效 + +status:可选字段,仅在命令模式下生效,用于反馈命令是否执行成功 + +## 阿里云MQTT案例说明 + +### 连接设备 + +本案例使用EC600N开发板与CP2102 USB to TTL模块进行调试 + +使用3根杜邦线分别连接CP2102的TX,RX和GND针脚 + +![](./media/CP2102.jpg) + +将CP2102的TX引出线连接至EC600N开发板的RX0针脚(编号7),将CP2102的RX引出线连接至开发板的TX0针脚(编号6),将CP2101的GND引出线连接至开发板的GND针脚(编号1) + +![](./media/board_line_link.png) + +将开发板与CP2102分别连接至电脑的USB口,开发板按下PWK按键开机 + +### 获得阿里云连接参数 + +用户需要在阿里云上注册账户,新建项目,注册设备名称并获得以下参数 + +设备名称(Devicename) + +产品秘钥(ProductKey) + +设备秘钥(DeviceSecret):使用一机一密认证时需要提供的参数,使用一型一密时不存在此参数 + +产品秘钥(ProductSecret):使用一型一密认证时需要提供的参数,使用一机一密时不存在此参数 + +获得阿里云pk/ps + +![](./media/aliyun_pkps.png) + +获得DeviceName + +![](./media/aliyun_dn.png) + +### 编写配置文件 + +编写配置文件,并将其命名为dtu_config.json + +配置文件包含信息如下: + +```json +{ + "plate": 1, + "password": "123", + "conf": { + "1": { + "protocol": "aliyun", + "type": "mos", + "keepAlive": "", + "clientID": "0", + "Devicename": " ec600n", + "ProductKey": " gbh26bFEA4M", + "DeviceSecret": " b7ff5acc0671d40adfd0eff57e7605f6", + "ProductSecret": "", + "cleanSession": true, + "qos": "1", + "subscribe": {"0": " /gbh26bFEA4M/ec600n/user/subtest"}, + "publish": {"0": " /gbh26bFEA4M/ec600n/user/pubtest"}, + "serialID": "0" + } + }, + "reg": 0, + "convert": 0, + "version": 100, + "nolog": 0, + "message": {}, + "uconf": { + "0": { + "baudrate": "115200", + "databits": "8", + "parity": "0", + "stopbits": "1", + "flowctl": "0" + } + }, + "fota": 1, + "pins": [ + "pio1", + "pio2", + "pio3" + ], + "direction_pin": {}, + "apn": [ + "", + "", + "" + ], + "service_acquire": 0, + "work_mode": "through", + "auto_connect": 1, + "offline_storage": false +} + +``` + +### 烧录代码 + +#### 连接开发板至电脑,开机,打开QPYCom,选择Qutctel USB MI05 Port端口,并点击连接 + +![](./media/qpycom_select_port.png) + +#### 切换到下载选项卡,点击"创建项目",输入项目名称,并点击"确定" + +![](./media/qpycom_new_proj.png) + +#### 将dtu文件夹内所有内容拖入"用户脚本/文件"框内 + +![](./media/qpycon_draft_file.png) + +#### 点击"下载脚本" + +![](./media/qpycom_dl.png) + +### 运行 + +#### 切换至"文件"选项卡,选中"dtu_handler.py",并点击运行 + +![](./media/qpycom_run3.png) + +### 运行结果输出 + +![](./media/qpycom_run_output.png) + +### 向云端发送消息 + +#### 打开串口调试工具,选择CP210X USB to UART 连接至CP2102转换板,并打开串口 + +![](./media/pc_uart.png) + +#### 在uart调试工具中按指定格式传入topic_id, msg_length, crc32值, 需要发送的数据,并点击"send"; + +![](./media/pc_uart_send.png) + +#### DTU收到数据,并发送至云端 + +![](./media/dtt_recive.png) + +#### 云端接收到的消息 + +![](./media/cloud_recive.png) + +### 云端向设备发送信息 + +#### 在阿里云topic列表中向自定义topic发送消息 + +![](./media/aliyun_send.png) + +#### DTU成功收到消息并向串口透传数据 + +![](./media/dtu_recive.png) + +#### 串口收到透传消息 + +![](./media/pc_get_recive.png) \ No newline at end of file diff --git a/docs/md/DTU_Product_Introduction.md b/docs/md/DTU_Product_Introduction.md deleted file mode 100644 index 3446ad6..0000000 --- a/docs/md/DTU_Product_Introduction.md +++ /dev/null @@ -1,146 +0,0 @@ -## 1. DTU和RTU的概念 - -### 1.1 DTU - -- 英文全称Data Transfer Unit,数据传输单元。是专门用于将来自于设备端MCU的串口数据通过无线通信网络传送至服务器的无线终端设备。 -- 业务逻辑:传感器采集数据发送给设备端MCU,设备端MCU通过串口将采集到的数据通过DTU发送到服务器;服务器接收到数据可以进行分析、处理、显示、保存等操作。 - -![image_1fl8ad0ct150a195i169m1hk2i3g33.png-40.8kB][1] - -### 1.2 RTU - -- 英文全称Remote Terminal Unit,远程终端单元。 -- 业务逻辑包括数据采集上报和远程指令控制两部分: - - 数据采集上报:和DTU的数据采集上报功能完全一致 - - 远程指令控制:服务器下发控制指令,RTU接收到指令后,触发控制设备执行动作 -- RTU功能 = DTU功能 + 控制单元。 - -![image_1fl8bn24285j2a23qrvd5pcd29.png-33.4kB][2] - -### 1.3 应用行业和场景 - -- 水利水电 -- 矿产资源开发 -- 地质灾害检测预警 -- 环境保护 -- 消防安全 -- 市政管网等 - -![image_1fl8i96dc1kheeb5109pb281mjs2j.png-99kB][3] - -## 2. 移远DTU及其能力 - -### 2.1 产品线 - -目前支持DTU的模组列表: - -- EC200U_CNLB -- EC200U_EUAB -- EC600U_CNLB -- EC600U_CNLC -- EC600N_CNLA -- EC600N_CNLC -- EC600S_CNLA -- EC600S_CNLB - -### 2.2 产品能力 - -- **2个串口通道** - -- **通道支持HTTP、TCP、UDP、MQTT、阿里云、腾讯云、移远云多种协议和云平台** - -- **支持多个云端通道传输** - -- **支持本地和远程参数配置** - -- **支持OTA升级** - -- **支持数据离线存储** - - 在网络连接不稳定情况下,将发送失败的数据暂存至本地,在网络恢复后优先将本地数据发送至云端 - - 离线存储的数据量可通过配置文件配置 - -- **支持modbus协议** - -- **支持命令模式和透传模式,方便不支持modbus协议的设备接入** - - 命令模式下,支持对DTU的控制和参数读取;对比友商的DTU,我司的DTU支持指定云端通道、指定MQTT主题,而非向所有的通道或主题推送同一个报文数据 - - 透传模式下,每个串口仅支持单通道透传,但对比友商的DTU,我司的DTU仍然支持指定MQTT主题 - -- **支持常用的传感器、执行单元和输入设备** - - - 传感器: - - 照度传感器(BH1750、OPT3001、GL5516、GL5528) - - 三轴加速度传感器(ADXL346、BMA250、LIS2DH12TR) - - 温湿度传感器(HDC1080、HDC2080、AHT10、DHT11) - - 可燃气体传感器 - - CO2气体传感器 - - GNSS定位模块 - - ... - - - 执行单元: - - 功放 - - 电机 - - LED - - LCD(ILI9225、ST7735、ST7789、SSD1306、UC1628) - - ... - - - 输入设备: - - 麦克风 - - 摄像头(GC032A、BF3901) - - 矩阵键盘 - - ... - -- **支持QuecPython,可以使用Python代码快速实现二次开发** - -- **开放了GPIO、SPI、IIC、PWM等各种外设接口,方便外设扩充** - -### 2.3 产品优势 - -- **支持网页生成DTU配置文件(即将上线)** - -- **支持云端通道选择与MQTT topic选择** - - 在命令模式下,DTU支持向指定云端通道发送数据,可节省流量及减少垃圾数据产生 - - MQTT、阿里云与腾讯云类型通道支持topic选择,DTU可支持向指定的topic发布数据 - - 通道可绑定串口,绑定串口后仅会向绑定的串口发送数据 - -- **透传时增加校验机制,保证上传数据的正确性** - - 与串口通信双重校验机制,同时校验数据长度与CRC32 - - 校验失败重发机制,发送失败时可自动重连 - -- **modbus模式和命令模式自适应,用户直接进行通信即可** - -- **RTU可直接做主控,摒弃MCU,降低软硬件开发成本** - - RTU可直接作为主控,省去MCU及其周边电路,降低硬件成本 - - ![image_1fl87kl5c1f6p1t3c26ahga7951s.png-39.9kB][4] - - - 使用Python开发,降低软件开发成本 - - ![image_1fl8c92841mic1r8d1r0h177i8qs2m.png-13.5kB][5] - - - 我司多平台模组适用,使用Python开发,无需修改代码即可快速切换至不同模组 - -- **业务功能扩充方便** - - 开放了GPIO、SPI、IIC、PWM等各种外设接口,方便外设扩充 - -- **强大的客户服务和技术支持能力** - -## 3. 移远DTU的工作原理 - -### 3.1 命令模式 - -![image_1fl8lu3af1tgmgoruqeofq15qof1.png-139.4kB][6] - -### 3.2 透传模式 - -![image_1fl8lh3nn1kmbullse416vq105nbu.png-92.6kB][7] - -## 4. 附件链接 - - - [1]: http://static.zybuluo.com/chenchi/pinotn6ajcibu0rgo122vvj0/image_1fl8ad0ct150a195i169m1hk2i3g33.png - [2]: http://static.zybuluo.com/chenchi/0312gv62wstwsh1mfgdz2g6m/image_1fl8bn24285j2a23qrvd5pcd29.png - [3]: http://static.zybuluo.com/chenchi/6vkjl7repti62n6eonpc3d55/image_1fl8i96dc1kheeb5109pb281mjs2j.png - [4]: http://static.zybuluo.com/chenchi/kovfl64tqfzp4alalml14rf9/image_1fl87kl5c1f6p1t3c26ahga7951s.png - [5]: http://static.zybuluo.com/chenchi/ucyn1otc6oj1yib97bz45loi/image_1fl8c92841mic1r8d1r0h177i8qs2m.png - [6]: http://static.zybuluo.com/chenchi/8h3rkym31o6hjdurnmtcuw26/image_1fl8lu3af1tgmgoruqeofq15qof1.png - [7]: http://static.zybuluo.com/chenchi/70f0is2vbkla2q5tgunykvl8/image_1fl8lh3nn1kmbullse416vq105nbu.png \ No newline at end of file diff --git a/docs/md/DTU_User_Guides.md b/docs/md/DTU_User_Guides.md deleted file mode 100644 index 78d1bec..0000000 --- a/docs/md/DTU_User_Guides.md +++ /dev/null @@ -1,638 +0,0 @@ - - -# **DTU上手说明_V1.0** - - - - -## 1.基本概述 - -本文档主要基于介绍DTU上手使用说明。 - -## 2.使用前准备 - -### 2.1 在NANO SIM卡座中插入SIM卡 - -![](../pic/DTU_User_Guides/dev_board.png) - -### 2.2. 将天线插入至开发板背面标注为"LTE"的插座中,并用力压紧直到听到"啪"一声 - -![](../pic/DTU_User_Guides/antenna.jpg) - -### 2.3. 使用USB数据线连接开发板至电脑USB接口 -### 2.4. 设备开机与QPYcom下载请点击以下连接查看说明 - -[QuecPython开发环境搭建](https://python.quectel.com/doc/doc/Quick_start/zh/QuecPythonStart/dev_env.html) - -## 3. DTU固件、配置文件加载到开发板 - -### 3.1 打开代码库中的DTU文件夹,按需求编写配置文件 - -**配置文件格式与说明如下** - -```json -{ - "plate": 1, //是否在报文中添加IMEI - "password": "123", //设置密码 - "conf": { //设置在线连接 - "1": { //通道序号 - //HTTP连接设置 - "protocol": "http", //连接类型,固定为http - "method": "get", //请求方式 - "url": "http://httpbin.org/get", //请求url - "reg_data": "", //附带的固定文本 - "timeout": "", //超时 - "serialID": 1 //捆绑的串口(1-2),需要为配置文件中uconf中存在的key - }, - "2": { - //TCP&UDP连接设置 - "protocol": "tcp", //连接类型,TCP填写”tcp”,UDP填写”udp” - "ping": "", //ping - "heartbeat": 30, //心跳时间 - "url": "220.180.239.212", //请求url - "port": "8305", //端口 - "keepAlive": 300, //保持连接时间 - "serialID": 2 //捆绑串口,需要为配置文件中uconf中存在的key - }, - "3": { - //mqtt连接设置 - "protocol": "mqtt", //连接类型 - "clientID": "test_mqtt", //客户端id - "keepAlive": "", //keep alive超时 - "url": "mq.tongxinmao.com", //url - "port": "18830", //端口 - "cleanSession": "0", //clean session - "subscribe": {"0": "/public/TEST/python"}, //订阅的主题(支持多个) - "publish": {"0": "/public/TEST/python"}, //发布的主题(支持多个) - "qos": "0", //QoS - "retain": "1", //是否使用内部重连 - "serialID": "1" //捆绑的串口 -}, - "4": { - //阿里云连接设置 - "protocol": "aliyun", //连接类型 - "type": "mos", //一机一密/一型一密设置 - "keepAlive": "", // keep alive超时 - "clientID": " test_mos ", //客户端id - "Devicename": " light01", //设备名称 - "ProductKey": " a1QNbCDxIWM ", //product key - "DeviceSecret": "0bceb8010ade0df2e6989982e63f7601", //device secret - "ProductSecret": "", //product secret - "cleanSession": "0", //clean session - "qos": "1", //QoS - "subscribe": {"0": "/a1QNbCDxIWM/light01/user/get"}, //订阅的主题(支持多个) - "publish": {"0": "/a1QNbCDxIWM/light01/user/update"}, //发布的主题(支持多个) - "serialID": "1" //捆绑的串口 - }, - "5": { - //腾讯云设置 - "protocol": "txyun", - "type": "mos", - "keepAlive": "", - "clientID": "test_tx_mos", - "Devicename": "Smart_test01", - "ProductKey": "H7MBLRYXN9", - "DeviceSecret": "89c7tXT3s3grZTr/YFjxSg==", - "ProductSecret": "", - "cleanSession": "0", - "qos": "1", - "subscribe": {"0": "H7MBLRYXN9/Smart_test01/control"}, - "publish": {"0": "H7MBLRYXN9/Smart_test01/event"}, - "serialID": "1" - }, - "6": { - //移远云设置 - "protocol": "quecthing", //连接类型 - "keepAlive": "", //心跳时间 - "ProductKey": "p1118c", //product key - "ProductSecret": "c3Jzd3ZaNzVrV2Vj", //product secret - "qos": "1", //qos - "SessionFlag": false, //是否采用session加密 - "sendMode": "phy", //发送模式 - "serialID": "1" //捆绑的串口 - } - }, - "reg": 1, //发送登陆消息 - "convert": 0, - "version": 100, //固件版本 - "nolog": 0, //是否输出log - "message": {}, //协议短信透传 - "uconf": { //串口设置 - "1": { //key为UART编号,使用UART0填入:“0”,使用UART1则填入“1”,以此类推;同时, - //该值同时在通道配置的serialID项中使用 - "baudrate": "115200", - "databits": "8", - "parity": "0", - "stopbits": "1", - "flowctl": "0" - }, - "2": { - "baudrate": "115200", - "databits": "8", - "parity": "0", - "stopbits": "1", - "flowctl": "0" - } - }, - "fota": 1, //是否启用fota - "pins": [ //启用的pio - "pio1", - "pio2", - "pio3" - ], - "direction_pin": {}, //需要控制的方向的GPIO与默认方向 - "apn": [ //APN设置 - "", - "", - "" - ], - "service_acquire": 0, //是否开启服务器获取参数 - "work_mode": "command", //工作模式 - "auto_connect": 1, //自动连接 - "offline_storage": false //离线存储 -} - - -``` - -配置文件中"serialID"字段配置说明: - -conf通道配置中的“serialID”字段为捆绑的UART口编号,serialID中的数值必须是uconf串口配置中已经配置的UART口编号 - -![](../pic/DTU_User_Guides/config_serial_id.png) - - -按需求编写配置文件后将配置文件保存为"dtu_config.json",并保存至DTU代码库中的"dtu"文件夹内 - -**注:json文件保存前需要移除注释** - -### 3.2 下载代码到设备 - -#### 3.2.1 接上数据线,连接至电脑,短按开发板上的"PWK"按键启动设备,并在QPYcom上选择MI05接口连接 - -![](../pic/DTU_User_Guides/port.png) - -#### 3.2.2 切换到下载选项卡,点击创建项目,并输入任意项目名称 - -![](../pic/DTU_User_Guides/qpycom_proj.png) - -#### 3.2.3 将代码包"dtu"文件夹内所有文件拖入此框内,并应包含图示文件 - -![](../pic/DTU_User_Guides/qpycom_add_file.png) - -#### 3.2.4 单击箭头,选择"下载脚本",并等待下载完成 - -![](../pic/DTU_User_Guides/qpycom_download.png) - -#### 3.2.5 切换至"文件"选项卡,在右边选中"dtu\_handler.py",点击运行按钮,即可开始dtu调试运行,如果需要上电自动运行,只需要将"dtu\_handler.py"更名为"main.py"即可实现上电自动运行 - -![](../pic/DTU_User_Guides/qpycom_run.png) - -## 4. 重启开发板 - -上面的步骤完成之后,选择USB MI05 COM Port(老版本是USB串行设备),打开串口。 - -![](../pic/DTU_User_Guides/qpycom_run2.png) - -DTU运行成功,下面为读取的配置文件。 - -![](../pic/DTU_User_Guides/qpycom_run_success.png) - -## 5 .报文格式 - -### 5.1 命令模式/modbus模式 - -支持多通道透传,通过配置文件中的serialID字段可以对通道与串口进行绑定,每个串口均支持绑定多个通道。在发送数据时需要传入通道id,DTU会向指定的通道发送数据。 - -在命令模式与modbus模式下,接受到的报文会先进行命令解析,如果解析失败才会向串口传输数据。 - -#### 5.1.1 HTTP/TCP/UDP - -- 上行数据报文格式: - -`","[,"",””]` - -- 下行数据报文格式: - -`","[,"",””]` - -- 字段说明: - -channel_id:通道id,配置文件中通道id - -msg_len:消息体长度,字符串格式,可以为0 - -crc32:消息数据crc32校验码,当msg_len为0时,此项可省略 - -msg_data:消息体,当msg_len为0时,此项可省略 - -**示例报文:** - -- 上行报文: - -`“1,6,1398235801,abcedf”` (msg_len不为0) - -`“1,0”` (msg_len为0) - -- 下行报文: - -`“1,6,2584251182,ijklmn”` - -#### 5.1.2 MQTT/Aliyun/Txyun - -- 上行数据报文格式: - -`",,","","` - -- 下行数据报文格式: - -`",,","","` - -- 字段说明: - -channel_id:通道id,配置文件中通道id - -topic_id:mqtt通道topic_id,上行为publish topic id,下行为subscribe topic id - -msg_len:消息体长度,字符串格式,可以为0 - -crc32:消息数据crc32校验码,当msg_len为0时此项也不可省略 - -msg_data:消息体,当msg_len为0时此项也不可省略 - -**示例报文:** - -- 上行报文: - -`“1,1,6,1398235801,abcedf”` - -- 下行报文: - -`“1,1,6,2584251182,ijklmn”` - -#### 5.1.3 quecthing - -- 上行数据报文格式: - -`",,","","` - -- 下行数据报文格式: - -`",,","","` - -- 字段说明: - -channel_id:通道id,配置文件中通道id - -pkgid:quecthing物模型pkgid,透传模式上行、下行报文与物模型上行非应答报文时该字段固定值为0 - -msg_len:消息体长度,字符串格式,可以为0 - -crc32:消息数据crc32校验码,当msg_len为0时此项也不可省略 - -msg_data:消息体,当msg_len为0时此项也不可省略 - -**示例报文:** - -- 上行报文: - -`“1,0,6,1398235801,abcedf”` (透传&物模型非应答) - -`“1,16929,6,1398235801,abcedf”` (物模型应答) - -- 下行报文: - -`“1,0,6,2584251182,ijklmn”` (透传报文) - -`“1,16930,6,2584251182,ijklmn”` (物模型报文) - -#### 5.1.4 从串口执行控制命令 - -- 上行命令报文格式: - -`",","","` - -- 下行命令报文格式: - -`"","","` - -- 字段说明: - -identify: 串口控制命令识别码,固定值为"99" - -msg_len:消息体长度,字符串格式,可以为0 - -crc32:消息数据crc32校验码,当msg_len为0时此项也不可省略 - -msg_data:消息体,当msg_len为0时此项也不可省略 - -- 上行报文: - -`“99,6,1398235801,abcedf”` - -- 下行报文: - -`“99,6,2584251182,ijklmn”` - - -### 5.2 **透传模式** - -支持MQTT/TCP/UDP/HTTP双通道透传(串口1&串口2),透传模式每个串口仅支持绑定一个通道,可在配置文件中配置serialID对通道和串口进行绑定。透传模式如果串口配置了多个通道,只会选择第一个通道配置,后面的配置都会被忽略。 - -透传模式传输时无需在数据格式上传入channel\_id,DTU会自动向串口绑定通道发送数据。 - - -#### 5.2.1 HTTP/TCP/UDP - -- 上行数据报文格式: - -`""[,"",””]"` - -- 下行数据报文格式: - -`""[,"",””]"` - -- 字段说明: - -msg_len:消息体长度,字符串格式,可以为0 - -crc32:消息数据crc32校验码,当msg_len为0时,此项可省略 - -msg_data:消息体,当msg_len为0时,此项可省略 - -**示例报文:** - -- 发送报文: - -`“6,1398235801,abcedf”` (msg_len不为0) - -`“0”` (msg_len为0) - -- 返回报文: - -`“6,2584251182,ijklmn”` - -#### 5.2.2 MQTT/Aliyun/Txyun - -- 上行数据报文格式: - -`,,,` - -- 下行数据报文格式: - -`,,,` - -- 字段说明: - -topic_id:mqtt通道topic_id,上行为publish topic id,下行为subscribe topic id - -msg_len:消息体长度,字符串格式,可以为0 - -crc32:消息数据crc32校验码,当msg_len为0时此项也不可省略 - -msg_data:消息体,当msg_len为0时此项也不可省略 - -**示例报文:** - -- 发送报文: - -`“6,1398235801,abcedf”` - -- 返回报文: - -`“6,2584251182,ijklmn”` - -#### 5.2.3 quecthing - -- 上行数据报文格式: - -`",","","` - -- 下行数据报文格式: - -`",","","` - -- 字段说明: - -pkgid:quecthing物模型pkgid,透传模式上行、下行报文与物模型上行非应答报文时该字段固定值为0 - -msg_len:消息体长度,字符串格式,可以为0 - -crc32:消息数据crc32校验码,当msg_len为0时此项也不可省略 - -msg_data:消息体,当msg_len为0时此项也不可省略 - -**示例报文:** - -- 上行报文: - -`“0,6,1398235801,abcedf”` (透传&物模型非应答) - -`“16929,6,1398235801,abcedf”` (物模型应答) - -- 下行报文: - -`“0,6,2584251182,ijklmn”` (透传报文) - -`“16930,6,2584251182,ijklmn”` (物模型报文) - -### 5.3 与云端通信报文 - -DTU与云端通信报文使用json格式 - -#### 5.3.1 云端下行报文 - -- 命令模式与modbus模式: - -`{“msg_id”: msg_id, “data”: “1234”[, “cmd_code”: 0X40, “topic_id”: 1]}` - -- 透传模式: - -`{“msg_id”: msg_id, “data”: “1234”}` - -- 字段说明: - -msg_id:报文id,一般为时间戳+3位随机数 - -data:报文消息字段 - -cmd_code:可选字段,填写对应功能码,并又DTU执行相应的操作,此字段仅在命令模式下生效 - -topic_id:可选字段,填写mqtt返回需要publish的topic\_id,此字段仅在命令模式与使用MQTT/Aliyun/Txyun时生效 - -#### 5.3.2 云端上行报文 - -- 命令模式与modbus模式: - -`{“msg_id”: msg_id, “data”: “1234”[, “cmd_code”: 0X40, “status”: 1]}` - -- 透传模式: - -`{“msg_id”: msg_id, “data”: “1234”}` - -- 字段说明: - -msg_id:报文id,一般为时间戳+3位随机数,回复报文会使用相同的msg\_id - -data:报文消息字段 - -cmd_code:可选字段,填写对应功能码,并又DTU执行相应的操作,此字段仅在命令模式下生效 - -status:可选字段,仅在命令模式下生效,用于反馈命令是否执行成功 - -## 6阿里云MQTT案例说明 - -### 6.1 连接设备 - -本案例使用EC600N开发板与CP2102 USB to TTL模块进行调试 - -使用3根杜邦线分别连接CP2102的TX,RX和GND针脚 - -![](../pic/DTU_User_Guides/CP2102.jpg) - -将CP2102的TX引出线连接至EC600N开发板的RX0针脚(编号7),将CP2102的RX引出线连接至开发板的TX0针脚(编号6),将CP2101的GND引出线连接至开发板的GND针脚(编号1) - -![](../pic/DTU_User_Guides/board_line_link.png) - -将开发板与CP2102分别连接至电脑的USB口,开发板按下PWK按键开机 - -### 6.2 获得阿里云连接参数 - -用户需要在阿里云上注册账户,新建项目,注册设备名称并获得以下参数 - -设备名称(Devicename) - -产品秘钥(ProductKey) - -设备秘钥(DeviceSecret):使用一机一密认证时需要提供的参数,使用一型一密时不存在此参数 - -产品秘钥(ProductSecret):使用一型一密认证时需要提供的参数,使用一机一密时不存在此参数 - -获得阿里云pk/ps - -![](../pic/DTU_User_Guides/aliyun_pkps.png) - -获得DeviceName - -![](../pic/DTU_User_Guides/aliyun_dn.png) - -### 6.3 编写配置文件 - -编写配置文件,并将其命名为dtu_config.json - -配置文件包含信息如下: - -```json -{ - "plate": 1, - "password": "123", - "conf": { - "1": { - "protocol": "aliyun", - "type": "mos", - "keepAlive": "", - "clientID": "0", - "Devicename": " ec600n", - "ProductKey": " gbh26bFEA4M", - "DeviceSecret": " b7ff5acc0671d40adfd0eff57e7605f6", - "ProductSecret": "", - "cleanSession": true, - "qos": "1", - "subscribe": {"0": " /gbh26bFEA4M/ec600n/user/subtest"}, - "publish": {"0": " /gbh26bFEA4M/ec600n/user/pubtest"}, - "serialID": "0" - } - }, - "reg": 0, - "convert": 0, - "version": 100, - "nolog": 0, - "message": {}, - "uconf": { - "0": { - "baudrate": "115200", - "databits": "8", - "parity": "0", - "stopbits": "1", - "flowctl": "0" - } - }, - "fota": 1, - "pins": [ - "pio1", - "pio2", - "pio3" - ], - "direction_pin": {}, - "apn": [ - "", - "", - "" - ], - "service_acquire": 0, - "work_mode": "through", - "auto_connect": 1, - "offline_storage": false -} - -``` - -### 6.4 烧录代码 - -#### 6.4.1 连接开发板至电脑,开机,打开QPYCom,选择Qutctel USB MI05 Port端口,并点击连接 - -![](../pic/DTU_User_Guides/qpycom_select_port.png) - -#### 6.4.2 切换到下载选项卡,点击"创建项目",输入项目名称,并点击"确定" - -![](../pic/DTU_User_Guides/qpycom_new_proj.png) - -#### 6.4.3 将dtu文件夹内所有内容拖入"用户脚本/文件"框内 - -![](../pic/DTU_User_Guides/qpycon_draft_file.png) - -#### 6.4.4 点击"下载脚本" - -![](../pic/DTU_User_Guides/qpycom_dl.png) - -### 6.5 运行 - -#### 6.5.1 切换至"文件"选项卡,选中"dtu_handler.py",并点击运行 - -![](../pic/DTU_User_Guides/qpycom_run3.png) - -### 6.6 运行结果输出 - -![](../pic/DTU_User_Guides/qpycom_run_output.png) - -### 6.7 向云端发送消息 - -#### 6.7.1 打开串口调试工具,选择CP210X USB to UART 连接至CP2102转换板,并打开串口 - -![](../pic/DTU_User_Guides/pc_uart.png) - -#### 6.7.2 在uart调试工具中按指定格式传入topic_id, msg_length, crc32值, 需要发送的数据,并点击"send"; - -![](../pic/DTU_User_Guides/pc_uart_send.png) - -#### 6.7.3 DTU收到数据,并发送至云端 - -![](../pic/DTU_User_Guides/dtt_recive.png) - -#### 6.7.4 云端接收到的消息 - -![](../pic/DTU_User_Guides/cloud_recive.png) - -### 6.8 云端向设备发送信息 - -#### 6.8.1 在阿里云topic列表中向自定义topic发送消息 - -![](../pic/DTU_User_Guides/aliyun_send.png) - -#### 6.8.2 DTU成功收到消息并向串口透传数据 - -![](../pic/DTU_User_Guides/dtu_recive.png) - -#### 6.8.3 串口收到透传消息 - -![](../pic/DTU_User_Guides/pc_get_recive.png) \ No newline at end of file diff --git a/docs/md/img.png b/docs/md/img.png deleted file mode 100644 index 7ce3994733840b8bdd0c551ac37f0eb2fd304f2d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1777 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 literal 0 HcmV?d00001 diff --git a/docs/pic/DTU_Product_Introduction/RTU.png b/docs/media/RTU.png similarity index 100% rename from docs/pic/DTU_Product_Introduction/RTU.png rename to docs/media/RTU.png diff --git a/docs/pic/DTU_Product_Introduction/Reduce_Hardware_Costs.png b/docs/media/Reduce_Hardware_Costs.png similarity index 100% rename from docs/pic/DTU_Product_Introduction/Reduce_Hardware_Costs.png rename to docs/media/Reduce_Hardware_Costs.png diff --git a/docs/pic/DTU_Product_Introduction/Transparent_Mode_Working_Principle.png b/docs/media/Transparent_Mode_Working_Principle.png similarity index 100% rename from docs/pic/DTU_Product_Introduction/Transparent_Mode_Working_Principle.png rename to docs/media/Transparent_Mode_Working_Principle.png diff --git a/docs/pic/DTU_User_Guides/aliyun_dn.png b/docs/media/aliyun_dn.png similarity index 100% rename from docs/pic/DTU_User_Guides/aliyun_dn.png rename to docs/media/aliyun_dn.png diff --git a/docs/pic/DTU_User_Guides/aliyun_pkps.png b/docs/media/aliyun_pkps.png similarity index 100% rename from docs/pic/DTU_User_Guides/aliyun_pkps.png rename to docs/media/aliyun_pkps.png diff --git a/docs/pic/DTU_User_Guides/aliyun_send.png b/docs/media/aliyun_send.png similarity index 100% rename from docs/pic/DTU_User_Guides/aliyun_send.png rename to docs/media/aliyun_send.png diff --git a/docs/pic/DTU_User_Guides/antenna.jpg b/docs/media/antenna.jpg similarity index 100% rename from docs/pic/DTU_User_Guides/antenna.jpg rename to docs/media/antenna.jpg diff --git a/docs/media/aptu_01.png b/docs/media/aptu_01.png new file mode 100644 index 0000000000000000000000000000000000000000..2d850b5e89ad3009ff9ebdfe62c1b101c9faa218 GIT binary patch literal 49809 zcmd432Q-}f+b$d}YM3Efj5b=dFeJ=~8lxnHi0DF?C{Ys3mgu6z=&|)gm*^!JLPQNl zbWui0q6`K@L=B>Rk7VzEdCz;^^PTtm&RQpHS=MAdk6*uk*L_{rJrTF`w9e68pgVKs z%(?5@$lGVmP}rY2L+(X$7Wf~=fbTiLFEaFPt!rn>`ytD~2TBLEn`&pyRL0RC+E4+X zY2CEV(7>Y~PJhU7j|%UfInyS59jSK5%WCaNzl3{Ylo)|8Es9W+Y7rO`P>;JTU03+x z^(Hq>Ci`=y8yB5suII%o-nx(z^t0&D=7Ft~?X6*b#ut4Zpfxol@;(>Gu*O(So9;75CMXm-)slLt>fw2N z8Kf@=44ybkj9#v=YMfN^-F0dH!N2~saq3Z@0KNfD?Elsg#r{(%{$BcZcp(M-{Zr5Y@cZgonkyG@}KX>*eZxyJX!zxWqs{& zg>`f0f%nhdHRXbHo>g9Xhh-LTcYS$dS%WkipcW!iN7x0VrA+netcXfZ+ru9pc)!W+ z`t6K9*%$0ij|gYt4R{XB#H)e&MK4UH>BO9;`s6wOXXD-1%BXj$rBPXr&8`a!*}Ejf zIldI=PZ#L&6r9c*9;<(7K5@2sZMJ%#5Ic1=$Nn=~srlsS3GNbYMmYx4m5T1$09oz- zwBEQYYg`Mu^}ZO+ZWYm6;zCT1Q_y-&3I>MKTN|Eryxq`V%xNp3ethlgd+%!BgYD&j zb*RE!VESPNy&Ic98bS7w8y&^$(=1n?eYPTnBNwAb5y380VQCCzg1w;oDtoOO{I$1I zXWe*}e6YUzn+wXsf4*PkwnAHdNZ>BBzB6ys?xhqj=cNHQcdhB16eB{^YD0luNHE)P zu)8Ol^c71J8XQy(z!`ofyI&jWOI&bp%faPH3?>?37n{<|G{$UCBeO{nJKY=@*!<(k zoM#8f(X4c#-E>R2Lg7#LHYQ+h#=3qiVLiKVicg_xl|uKN%3dtEA~|t{2FK?8zK1`S z3#MsnlyC}v{arH!9HHie#Jgf?lKAPUX)xFG20FbIB?VX-rj$ z$uZmagYQSRD@FQ?_s)}x(8{Vhc2vMRVVMtiCSNm%JFKT|UDgHGzEdKNz+YUL5@y0? zkC8I&*^KkPUua?SDO=>-MQiIP42~j`9^_|+3~vAvl^!mHRzxz-74DQoL!6HSD<$$xkDMZE#olEH=$9pbY-9L)ie5`6^a3AE zuMonO*l1)2f4$v*x&uXwyEj!{^xtV6&5gX&&egn4vG5x5t?6TAuW8b{h*BckaFJcxoc#?7P8z zrTb6YhB;u>uQh2El%c<1tIpX^QA~@7t9YxlikSjKmkHnyZ0GcJ8(cQw)IcKV{n8b1 zD5EGN@yQ}_6SY#mj+2W$-&X|M=)jtYcCIO`nRWR2`UoI;bV>NC`Wa-llOj2HNlq7X zS6fbCEWj4tdhXS zgo#ISeElw^fz}tgolKQLWmnm;*W~*1?{a~6fS6ZO@wg%D_>Ui7b=GB-q0xlu0pRnI zOBO#A>QP-Ejo|s;2&0~y@@1CR_7fCst6D0PYXO@H{+(KsHoGCbem~ebxQMq|2zTqf zeD}W3QeOwI2wLI`0)MBiT@?P@1Nl%6TXFgto{@pJX#Yt&p%~=L%A3l$uCZ|0$KC%H zQOWqRXKl_#3xslp!hasEH%}3za--i{AI>$r7aF{@Oeb9jtmEzeD>!wph4sLWCw-<9 z*Hkx(=PbR1WGbpM(8^A$iNC_D%k5Mnubs_A*jD#^TIj?}`A3iSvy{KA-))}(ZY-T& zL2W%u+BrhXxN$FY95%met|BPoP}-?CK?huV9s;2gqNx0vR%wbM(gJT3eYPEcY%cWp z_iHd*0Jl-Q=2?fXn^uJ^e#Wwqug*Cb$6$-u^W-qE%y-#oFV ze3W?haRcx1_qmeb_nKWdSa28BZ5PC>WJ9|Ka>I8&mRu8?R2OtlUqgj)9xd`pAnaX+ zjKyn^lNA9wUw%x$^%}e_*Ac>Rp0)z#GTEaWA{EG6Dg=c8d1^>=;K^~o`Z{p<_y?;@ zdm<_q{jEF&r9yc*uG%@z`~EShu#lg$2AkpmL1;ioGk7-$X7G^9NA>b`Zx&xzlNmc2k3A=G&kZ=!uO%`F8N|Nm^}2n$be2^yjmAjcD`kA_FgmFP&rbGXy z(H&T+UpK^Xa+|J9RH&Iw%l0PtGDMw^|DF@)fr?TwV zsp|`l`awi(MXZ)l8WF5D<|)TgI;rl_usgBb7K0a1AphM@O_^kxNaUrL|ErrII-}~! zrjmlIXs;kzv@P0%(W1nt?A`VEe)^JlQi5VEl~F2;ad!*87%k}-1LHG=c%M5b4V>Au zbm!P`FWc7=Cwa@dtd^3+OV{3Sl*F3NkIJ~k zc5o_lxGQ4I)N;b+M>6^Eo#Y%`)VNWsp3!BQ6qh$?r1MTXfOAomh^CV@?l#Y5*y}g5 znka7X=4i%pd@sK5D%F&yX?EMi1n4>IY0ooA`AM$Qz_ya6;SOMh-Q#j+R_Oz?MS9|rolTjZ0?{XyzQE9TZPdA2m-C`@b zZ)H{9lIN3((ggOH&f*Ayr^LL}d`RzZJ)P}>__3DRGZS90F-E$Z|Lb^u-+{ubuA4{z zsIt+@hU#FzD*}!y;%E2afko^UU}*3)MT5Abi{bYoN5v;;F2<=wdO+w6aE~!n+GdtR zY~F`qC>)z~=S6+49XMb2oT6hvr2J{C_RA0^aEB8cln&Mr$>F-gT=GD2R+EcHZjv5! zzcf7_cAS(Kj@q501Sxq? z{Sg}&mn6S9F#v)5`xTUiVhZ%K-hDLfC+iycvx9wDIq(bb>d7H-xCw}Gb_9t2FJ#^Y z@!i`U%KO5rvVZ>vzM?r3iOXs}{L~!M9Js$z@#JKaz`K6D*<<~!A{%&ZVfOFWEPeNe ziCOx&gqa)hKZlQ-k9XfTG#?JD+?)bdIVA$E_`kjuX?E}ZBX78*LInV^r~m(@3CmmG zzBC*qW4aDt|G1Oyw}((O#WIULnr`~?1%R0cz7jwh@nS_W;Lz*Fw&#y;UqX%y;x30T zIg}5+1JM8Fat=Zc(rjfupv(8@U?)HyIll=P$|n>s?r&Uu@~wBbIn7}p^JbIBvbt0! zezTxGmN<~L{sTD{^(&M36f%Pl88kQ^E3?pwk`2DvdYSJY%XZPpTu0P;hu+P^djFrh zr7e0Yl-u>UDz4D-XI0+mDnX$dBCmksdu9?-W10Gu>#5cT!1jBMhfkS!&HQ0&+${2- z`;EsI!S4NVjq=F97aq%(%`a@eO@1+m-FKyo(a7c+uQ&74>BV$!1wZGCh;-wD+JDVa4+Vesq`lXX;FZxahln|BYVUgC+>NE-{e+SyS# zUf?p{7xWI@uYdp2K93QARUW=jl76t5?!0odC5TUzlf29B+KIO=B_@t6I81et{yF~* z^9Y|ZzhJ?V2WB+xP5ic9k7!@i59*Z!b{gUO1YgA#eX5RfEV*X2u9(Uv;Xk@K`yrfH z5FF3e9xF7nz7am51x@by@JNGaE&R;f-ck@tQ}w~PBei47E`~|9VU-1K(f*+U=-f(; z-wq6UXj7^)Ii%79c~hxsBg|e$=Sw5vmlS=_PDcEQRxAT?SE#JcM)MA4|v!`j9^7P2pn- zJh6=({M6ITf;!p9IW2B!-_v$nf>D-P63^#YnREr z=&cHtX%$y$l%uSC=WATV?`l zBdnVTyiuNsKG?fGr$Hif{FcY;UR0hM)1QROlk>e*!G79N#;PxR76R(YFLBJim;##- zp;4pr7}OObk=PHfFXcWX9G2OQ7cek#heuRv0GY%4)GiiX59|09WZKaSt(S>?EPovI ztzqve*6Zqx*5m33mYi3A)>~ptNVQ!+|34WsA}K9m(L6Ld2YC|2uk@ygC9UhA=qt*B z2f10OY^!4kNTSgl_6=-FfACGH6KQ=VOPO%6Frb{RN23LOxmARhLV~Q3 zK9J2MR=9GALCb+Zk%f`oUuizs*a8zvgFbpv0-spLjy*!n5aTr%_H3x?w@!`IZ;R4ogDD*p3QVN0KDw3TUvalSz*%#I2qiu(^D))dy2M3itnA((!SPla&43>T>Vh- z_S2uFGb1I+)+Z7~K^K;W7k`gzusB4Zw4cF;W&A0jEPJq6y&3+)>I_ZcRXPbsURgS0 zjZT{St$fdO6^c{Tk=(9n^!c{HeyKRMA6$gGt)#(XuZmv2_nmd(N z-Ao>*=x5{qK#35p*B!ACXM=x=S3kSb;Y7QTru}wBdJHAJFr>#6yFl0;2yKjf(F?;z z$c*MVa9kyeZ1PYsyNG;xp@t&5#wg!v{T)*t=>zc=g$vUG6F)2VAY?CEcBG)9jtvq= ziuSh)N~uushrCl(&9W3J_l=Hv|F!;Y_Ot?w-~H>5z21DxB(eGtch(lt82L(THwoP$ z6&Ba8OvlR&qigPg9da~bsq7G$J-5Q|9N7u_xj26wiIdA+?_IJ?v7%lX-OCM3Ml;tg zN2Xmib7IncoTg}))vTn((qBitCheVnuDj!Yqfx*1o~ z2-_bJ!zMbVkYPqUA5rUuu^ryKyvkaWj;*FeFAZ5G_p5s&(67Hplp=6mqcWX(cge3# znY~$r8N>znu!KB)jH;2graqSWhAJe`nB!TyNOvvnDV8PaN$*8<72UT+P#+q%XRLnM zlsi6mqLJR!bO=%k?`QhBDQA4)b3?EFosz7LESeN zb1w7G)0Sjg%XfS{eHg2+eOYOdg*bEbBDPTF!<7VjcwoCat9avM5RH3T-9y~==)2_b za;7Z15?5tXvNkQp6f9UYJB~xkPZ$ffl`^bQ!Mh5U!;|CiB+!l)%FZucKWfs-ZE5n; zBUS=uNHZqA4OUr96(D{XuxsPZb;1gBoF|GUy6*Qp4Pc77ii^5;$6?ts+sZOL^4P3j zt+wxhb5UitT$(eJZm&fGI{jhK#^xWAM8e32${)g&N+QZ0shq-1HD4qG;A1N(5kBia z5OfBOxwqd=gst=HmGL*zSM|%UTQ-;`6^{%QcuM->m1g#|x3{zVI836^NaY_O?dS}W zX%Rlld5Yy`bYmvEk#So~MF~vzK61E$v5Z7Fzf&$r)C>&g+lxEakHu)mp=^!l580ZY zhdydQnRWP(WfypEPoWz^v7&oX>3ydQQPtD1=PKPY#F36tN&vfx8DsDJ?5jhBg&n(?dCo7eIkDY_OsAoP}L zHDNkrcXQ|J+5RNCA{|>5Wt`R3=(lIh%WZT<7SQ1wsAq~RZ(TwIRy?y6QTeXN9+I;2 z3j_SaPE1`T#Pi=L?o?iadgv8bD6$=j(oWwc2+c5|l>@kWr#JCQnavE)Z!wM?Q3e@8 z_@HsM#vxM;J)zT`)oyCn&|5>DE|6f&te1WOBYV_3&+c$xp_oO426+`8071dEgsW!X z0N5yiV)8Y_mH5%kRfO3ekG|JzRQsenor|c=*@>%nSPDT$%0$N;UBr{5ZYwz)5YQNc z3sD*Ug#*2oN1a8s#vOco5wBp~i9-xCWof-WYpz`IhG}xn%jIq7i=V)iWQ+q1>XXoU zidkyMkf+zR8o#D}wqnancPOz^G6B%zy?MOWOrFm%%gMM;VJMSeYz@ydyYK$9vKA4$ zOfd}$>RO(2rtR_I#2mky(KqKm-?M1NCdneP)XPC#OJ(2rG_Qq1%&8)?Ej0G|E88|e zm51CzFK{J5v_q;WxPJ62<-zZ*TL&DGzBC{1;ecFbGv%kgDH2&O+rNSQB}Mesgsb=;?_Vxb zsbeM_*NmUwr;i{1NC`YBcwhlMC;#_z|EXm0H$^ud@=GQ;RZHF-p1=4%q;3BtbNIi_ z69QSp@xc!1%hAstPfoKQqUC&l#?=Os3ahmri(9J`)n5p>I3Uw$oFevyY{2@vzcf5~ zGLWS*y&h4@{tq6rRTRcO6xzb6_7fe-Nxs?|LOo3nLvqfEsrw4RIQY7Jj^0udM9FW@ zS9Sd;Y}38uR;)Cm`(bE>5@3^*c?#OMlk19ti$tP*__`lXHys^`v2Rh`e#-GG4$x${ zEz9yGyWe|l%>8@}gTqr(*&ECp7_x0nCv;|VRV8dd2b;cLZBbk`eSqd~SZ{^1wrrGW5(=Z`Ls3ICm3 z5v#%t)1kM1Bp!g&1X|p+tOkYzCVgY1Rf)@>zMK zRK)6{{#CO?wGlNM{z<39wFsroXQnHybsp*EZDrI16r@IRE?O?mRYW?on}1X3va4j{ z1K`@~;VCvu*I}g7DQc5wNsG%|;huw_C^~mx|3)yX0zAq&fD&leVl&NqtKjjoz1mn; zeHDbZ$Q7Qu?2nC2z(>9X!0a1d6lU*2k3_FrC0ZIR!l${2sy_m$B^~Sp z73xD4Jln_c^d7uPrj5nqPJfg`xN10&Q#n2WvnIz8qXG73p@YtHhPor_N*J*_XHgfz2(pt87E!-?rGmiy@;Flm{EP%CgV#z^VnFqb?ks)A+2T|?LPbv-@^u9E@EMJ#gZFQkXM z+L{cHSpv6hb-Q=Ryo&nOiTGJpfCfas zAQmZ6yg`%0=85Q>=0Q9*%H^?JQM~tS(%e%JIxcvlYlNb|!0-!HX_f!tBt>lH!o3Ft zLRMXQif!a-Cfv@0C0VUQ;S{ek%)gfVaKX@M3X2%$;mQBCXRhlRB=MSGH(*3=;P%%ai&!X3Ii1!|dq$@C%)!fi%Trmx?Yz`jotzf0B(Hr0l zAAVFb;N^34Hm|a#CBAwy4AVQPN19YqELtr~H8RJ`^vj~8fg25hwVi>@o2H_4z6vvj z-zwU0ptRF+FJo;GODyt_U4a0zVe-fY8;@$oM`P)?z7pBPP4Ezl#F{Jh)btd@;L&5I1%xk<`2R5*Y3oG>SC&RHtxA2X=FQ@gD)Mp3dMGO zu;{#4#a30O|8H-Z=xWha-Wapc=$V&SFz1Wb6gL@pRMurz7&mCE_zP8~3-<=94#xO2i5~m?jB18R1Rp*??R7es2jc%WPN)KNbpUAzREvWZR^uxTLSl< zK+vnROzS$k@$^HirCj$OXlxp5y zk32bEd(u1==m8)BmRqS2z~2uuW7AB_lvaQ4EUaeHJii@?!wAMPQWQ5$C#vLAw#wYwU zU(vlPhlZ&;LlIGb+gIw%Z92R00|C2Vlcd?Ut`NJm(BKpFuo-TjNRiBF0NaKi8$Bku~v^r)eK+jVnsy3HL z+@+D1mR8|tzzmk4tl$nv5x=cBCL+D#71N?UP>C+@!$E4>@*S0dV5^gLgY=A8JT)(fG+Uc$D_w?&tJaj9ErKuexU+N9%xZwHIILXDLoY6Z>f;KtuooO z9h#F)m2s-X{!-L|CFJDm2WgE6RVpN(5KZUtNo8Fk9o;4+E*O>DR$)C0Bp8DJ_sHCC z=mr8@{kP+zpACT7=NtNx2eCin3!s4S`fhpeu1VcMZMRy2s(L0LTOlzi4~L zt(n%4FM#G<;M$2Mjg>w4snF`sx^t%g#A*%s?MyRAH@bgfUvn#urZ><$B2hvU(K9|CnJ(xIyQA-B{~~qh zMJ!9Y8&a{X{h-v3GEIv#x)e$&s><+*x(Khae($WDyB znCIeR&CVf?zubQ=XhK2XOyoB+U;a`lwA!_?+bwC2saFGe-&G=JnFeYcdu{wVNP50f zfyEokOO7Gr;fWx(k%0|`$sp66h$Nm#JKot*a@e((Gzns_3ZF#Zd!razITR;jV zZ~I?iCOeOdT_#n{9E5>T(Rl;eVOuG2^t&vlxeLCJ$L%}(^-7}n>|O;q_e%_>H0U*q z+x@(4-i`w56bie`A&tT|v4*_4n%tpOxn+@WGRNuFMnl}~Do0)l%kv(t`(@@t%_0 z$)B-RcYz7pPJi6up4pzElghot)a&U2AnUWIVq17gu!!pYh2JPw%syAS@}*Is55$9) z)e7-y`kk$uf=O)5q#}~dt3HDy*qh#5n&9$wc&zLB!XgaE<5sMw(N@{%OgG}t+!Pff z5LK1P&!1WqlE>%`pK^OVOG6qiUy2%GxeM^m^@?jmREzhhBD}LG=-1d(V{LG%y26(h zk)LB-ZQYOEqdx~EA}C?-Ia!#>ibmvU(O0HGWX6S`T115(3U`*`(Ds%t)ZSdSc(*xlO%pTr&=XD z2N#7%#!?kTCeXUwfY(DP=dNE^tH~@L((>$Qo#afikw{m6{Mh|r{F72cir>pDgnoaZ zRB}51TAzg>FU-gDG-&V@ahFA^$7Z$Ph}FmiOa*xF-4Au3yPOy&Z{ zJS-@R?%2N?JT}Mx##uo;yr%%Ph5h0rU}$X^IyT(+zF3}|D0iR&_(-A7_m&}Xsn`94z%1UZ@pYV) z*iI{3IlI`Pe}GQ$UBiM=o(IdGG>&;~o*&md{LQzh7x~K8Q;oU^rh~p${tW-}O6W8g zOtAgShWj99`2J@Mx}WiE>xTfiYj+sMhsrr@l`J%FH#X>9cUed*Ys%hBp1& z6HK+Sf?Y?c7KGFX_PLe$?$spkh+;V>fv9jReE((>Pr5Z$i_U|`j(ky|G`#~>>zfs2 zslR6#@<7}H18jIVa|?c}=JUXw`j#%MEI{Mcg`N|J~rTX&Th-K*MWpK&@{r7Ff{|=|l{~vSr z{pRTY`!M8h_rNJ!IyC_}UYm)|K0>rHknIBaWIc={m%%+Lr!k&`;kOZB<2;$DhuOc* z4nWs63Oy{ow?do8gQ=Q&`zWxvJ4{-D3Zr&V2LPYeQH9Ce-Y9mdrbi;oggMhyL%GdG z)w@&~mcqYrM6E5;Y^pPKaAwZ}bmk$z!%>Cy2*)iCvV1I=`7PE1WGV=i4BC(mJr^;q z%~L_6`CF~O7yxxE%(7OBe*E)&dk50;@a&;McKA~?RK5-UU3tO zddaxxfmH}9c@yr|mU5Fa<_wP8TS+UVihUg>%rxmD@Vo+!SlkbB+IG)#`P9XGUp|V7*N-8lq*Z_Yd-OWcRoAt}C=%y(KEcy)J0pz3r?a7CSnEo`XBbZpo*#@>lEgDjr2X z83gO>u+nwAmtOk

cZ$xZqYgE2so1ATztY*oJ=?-Ja0tku|}hIyT`$@ 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 NQ#uCP1)3KF{}10~Lo5IQ literal 0 HcmV?d00001 diff --git a/docs/media/aptu_02.png b/docs/media/aptu_02.png new file mode 100644 index 0000000000000000000000000000000000000000..2dcb3878446122e37e2e00c1df8d34f819c82dff GIT binary patch literal 41336 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 Q$*GXNdu+{%Ox+{@4exFM2mk;8 literal 0 HcmV?d00001 diff --git a/docs/pic/DTU_User_Guides/board_line_link.png b/docs/media/board_line_link.png similarity index 100% rename from docs/pic/DTU_User_Guides/board_line_link.png rename to docs/media/board_line_link.png diff --git a/docs/pic/DTU_User_Guides/cloud_recive.png b/docs/media/cloud_recive.png similarity index 100% rename from docs/pic/DTU_User_Guides/cloud_recive.png rename to docs/media/cloud_recive.png diff --git a/docs/pic/DTU_User_Guides/dev_board.png b/docs/media/dev_board.png similarity index 100% rename from docs/pic/DTU_User_Guides/dev_board.png rename to docs/media/dev_board.png diff --git a/docs/pic/DTU_User_Guides/dtt_recive.png b/docs/media/dtt_recive.png similarity index 100% rename from docs/pic/DTU_User_Guides/dtt_recive.png rename to docs/media/dtt_recive.png diff --git a/docs/pic/DTU_User_Guides/dtu_recive.png b/docs/media/dtu_recive.png similarity index 100% rename from docs/pic/DTU_User_Guides/dtu_recive.png rename to docs/media/dtu_recive.png diff --git a/docs/pic/DTU_GUI_User_Guides/gui_apn.png b/docs/media/gui_apn.png similarity index 100% rename from docs/pic/DTU_GUI_User_Guides/gui_apn.png rename to docs/media/gui_apn.png diff --git a/docs/pic/DTU_GUI_User_Guides/gui_channel_at.png b/docs/media/gui_channel_at.png similarity index 100% rename from docs/pic/DTU_GUI_User_Guides/gui_channel_at.png rename to docs/media/gui_channel_at.png diff --git a/docs/pic/DTU_GUI_User_Guides/gui_channel_http.png b/docs/media/gui_channel_http.png similarity index 100% rename from docs/pic/DTU_GUI_User_Guides/gui_channel_http.png rename to docs/media/gui_channel_http.png diff --git a/docs/pic/DTU_GUI_User_Guides/gui_channel_mqtt.png b/docs/media/gui_channel_mqtt.png similarity index 100% rename from docs/pic/DTU_GUI_User_Guides/gui_channel_mqtt.png rename to docs/media/gui_channel_mqtt.png diff --git a/docs/pic/DTU_GUI_User_Guides/gui_channel_socket.png b/docs/media/gui_channel_socket.png similarity index 100% rename from docs/pic/DTU_GUI_User_Guides/gui_channel_socket.png rename to docs/media/gui_channel_socket.png diff --git a/docs/pic/DTU_GUI_User_Guides/gui_check_config.png b/docs/media/gui_check_config.png similarity index 100% rename from docs/pic/DTU_GUI_User_Guides/gui_check_config.png rename to docs/media/gui_check_config.png diff --git a/docs/pic/DTU_GUI_User_Guides/gui_edit.png b/docs/media/gui_edit.png similarity index 100% rename from docs/pic/DTU_GUI_User_Guides/gui_edit.png rename to docs/media/gui_edit.png diff --git a/docs/pic/DTU_GUI_User_Guides/gui_get_imei.png b/docs/media/gui_get_imei.png similarity index 100% rename from docs/pic/DTU_GUI_User_Guides/gui_get_imei.png rename to docs/media/gui_get_imei.png diff --git a/docs/pic/DTU_GUI_User_Guides/gui_gpio.png b/docs/media/gui_gpio.png similarity index 100% rename from docs/pic/DTU_GUI_User_Guides/gui_gpio.png rename to docs/media/gui_gpio.png diff --git a/docs/pic/DTU_GUI_User_Guides/gui_import_config.png b/docs/media/gui_import_config.png similarity index 100% rename from docs/pic/DTU_GUI_User_Guides/gui_import_config.png rename to docs/media/gui_import_config.png diff --git a/docs/pic/DTU_GUI_User_Guides/gui_input.png b/docs/media/gui_input.png similarity index 100% rename from docs/pic/DTU_GUI_User_Guides/gui_input.png rename to docs/media/gui_input.png diff --git a/docs/pic/DTU_GUI_User_Guides/gui_open_port.png b/docs/media/gui_open_port.png similarity index 100% rename from docs/pic/DTU_GUI_User_Guides/gui_open_port.png rename to docs/media/gui_open_port.png diff --git a/docs/pic/DTU_GUI_User_Guides/gui_open_port_done.png b/docs/media/gui_open_port_done.png similarity index 100% rename from docs/pic/DTU_GUI_User_Guides/gui_open_port_done.png rename to docs/media/gui_open_port_done.png diff --git a/docs/pic/DTU_GUI_User_Guides/gui_opt_format.png b/docs/media/gui_opt_format.png similarity index 100% rename from docs/pic/DTU_GUI_User_Guides/gui_opt_format.png rename to docs/media/gui_opt_format.png diff --git a/docs/pic/DTU_GUI_User_Guides/gui_opt_hex.png b/docs/media/gui_opt_hex.png similarity index 100% rename from docs/pic/DTU_GUI_User_Guides/gui_opt_hex.png rename to docs/media/gui_opt_hex.png diff --git a/docs/pic/DTU_GUI_User_Guides/gui_opt_time.png b/docs/media/gui_opt_time.png similarity index 100% rename from docs/pic/DTU_GUI_User_Guides/gui_opt_time.png rename to docs/media/gui_opt_time.png diff --git a/docs/pic/DTU_GUI_User_Guides/gui_pwd.png b/docs/media/gui_pwd.png similarity index 100% rename from docs/pic/DTU_GUI_User_Guides/gui_pwd.png rename to docs/media/gui_pwd.png diff --git a/docs/pic/DTU_GUI_User_Guides/gui_pwd2.png b/docs/media/gui_pwd2.png similarity index 100% rename from docs/pic/DTU_GUI_User_Guides/gui_pwd2.png rename to docs/media/gui_pwd2.png diff --git a/docs/media/gui_rtu.png b/docs/media/gui_rtu.png new file mode 100644 index 0000000000000000000000000000000000000000..e1ad9f5bf4effb78f34b5a7d611f335df7830856 GIT binary patch literal 16726 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 NrlhS{F8}1s{{n&%daM8d literal 0 HcmV?d00001 diff --git a/docs/pic/DTU_GUI_User_Guides/gui_secret.png b/docs/media/gui_secret.png similarity index 100% rename from docs/pic/DTU_GUI_User_Guides/gui_secret.png rename to docs/media/gui_secret.png diff --git a/docs/pic/DTU_GUI_User_Guides/gui_send_cmd.png b/docs/media/gui_send_cmd.png similarity index 100% rename from docs/pic/DTU_GUI_User_Guides/gui_send_cmd.png rename to docs/media/gui_send_cmd.png diff --git a/docs/pic/DTU_GUI_User_Guides/gui_send_cmd_pw.png b/docs/media/gui_send_cmd_pw.png similarity index 100% rename from docs/pic/DTU_GUI_User_Guides/gui_send_cmd_pw.png rename to docs/media/gui_send_cmd_pw.png diff --git a/docs/pic/DTU_GUI_User_Guides/gui_serial.png b/docs/media/gui_serial.png similarity index 100% rename from docs/pic/DTU_GUI_User_Guides/gui_serial.png rename to docs/media/gui_serial.png diff --git a/docs/pic/DTU_GUI_User_Guides/gui_tx_secret.png b/docs/media/gui_tx_secret.png similarity index 100% rename from docs/pic/DTU_GUI_User_Guides/gui_tx_secret.png rename to docs/media/gui_tx_secret.png diff --git a/docs/pic/DTU_Product_Introduction/industry.png b/docs/media/industry.png similarity index 100% rename from docs/pic/DTU_Product_Introduction/industry.png rename to docs/media/industry.png diff --git a/docs/pic/DTU_User_Guides/pc_get_recive.png b/docs/media/pc_get_recive.png similarity index 100% rename from docs/pic/DTU_User_Guides/pc_get_recive.png rename to docs/media/pc_get_recive.png diff --git a/docs/pic/DTU_User_Guides/pc_uart.png b/docs/media/pc_uart.png similarity index 100% rename from docs/pic/DTU_User_Guides/pc_uart.png rename to docs/media/pc_uart.png diff --git a/docs/pic/DTU_User_Guides/pc_uart_send.png b/docs/media/pc_uart_send.png similarity index 100% rename from docs/pic/DTU_User_Guides/pc_uart_send.png rename to docs/media/pc_uart_send.png diff --git a/docs/pic/DTU_User_Guides/port.png b/docs/media/port.png similarity index 100% rename from docs/pic/DTU_User_Guides/port.png rename to docs/media/port.png diff --git a/docs/pic/DTU_User_Guides/qpycom_add_file.png b/docs/media/qpycom_add_file.png similarity index 100% rename from docs/pic/DTU_User_Guides/qpycom_add_file.png rename to docs/media/qpycom_add_file.png diff --git a/docs/pic/DTU_User_Guides/qpycom_dl.png b/docs/media/qpycom_dl.png similarity index 100% rename from docs/pic/DTU_User_Guides/qpycom_dl.png rename to docs/media/qpycom_dl.png diff --git a/docs/pic/DTU_User_Guides/qpycom_download.png b/docs/media/qpycom_download.png similarity index 100% rename from docs/pic/DTU_User_Guides/qpycom_download.png rename to docs/media/qpycom_download.png diff --git a/docs/pic/DTU_User_Guides/qpycom_new_proj.png b/docs/media/qpycom_new_proj.png similarity index 100% rename from docs/pic/DTU_User_Guides/qpycom_new_proj.png rename to docs/media/qpycom_new_proj.png diff --git a/docs/pic/DTU_User_Guides/qpycom_proj.png b/docs/media/qpycom_proj.png similarity index 100% rename from docs/pic/DTU_User_Guides/qpycom_proj.png rename to docs/media/qpycom_proj.png diff --git a/docs/pic/DTU_User_Guides/qpycom_run.png b/docs/media/qpycom_run.png similarity index 100% rename from docs/pic/DTU_User_Guides/qpycom_run.png rename to docs/media/qpycom_run.png diff --git a/docs/pic/DTU_User_Guides/qpycom_run2.png b/docs/media/qpycom_run2.png similarity index 100% rename from docs/pic/DTU_User_Guides/qpycom_run2.png rename to docs/media/qpycom_run2.png diff --git a/docs/pic/DTU_User_Guides/qpycom_run3.png b/docs/media/qpycom_run3.png similarity index 100% rename from docs/pic/DTU_User_Guides/qpycom_run3.png rename to docs/media/qpycom_run3.png diff --git a/docs/pic/DTU_User_Guides/qpycom_run_output.png b/docs/media/qpycom_run_output.png similarity index 100% rename from docs/pic/DTU_User_Guides/qpycom_run_output.png rename to docs/media/qpycom_run_output.png diff --git a/docs/pic/DTU_User_Guides/qpycom_run_success.png b/docs/media/qpycom_run_success.png similarity index 100% rename from docs/pic/DTU_User_Guides/qpycom_run_success.png rename to docs/media/qpycom_run_success.png diff --git a/docs/pic/DTU_User_Guides/qpycom_select_port.png b/docs/media/qpycom_select_port.png similarity index 100% rename from docs/pic/DTU_User_Guides/qpycom_select_port.png rename to docs/media/qpycom_select_port.png diff --git a/docs/pic/DTU_User_Guides/qpycon_draft_file.png b/docs/media/qpycon_draft_file.png similarity index 100% rename from docs/pic/DTU_User_Guides/qpycon_draft_file.png rename to docs/media/qpycon_draft_file.png diff --git a/docs/pic/DTU_GUI_User_Guides/gui_quecthing.png b/docs/pic/DTU_GUI_User_Guides/gui_quecthing.png deleted file mode 100644 index e94bde5f262189b9fee79e9bf952f552a418dd8b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 56673 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 diff --git a/docs/pic/DTU_User_Guides/config_serial_id.png b/docs/pic/DTU_User_Guides/config_serial_id.png deleted file mode 100644 index 707a909cc2c44d0eaaa4a9c9e743bee8ae2f1459..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21331 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 QK}~@iAXx1yG$Td)2Nc|{%K!iX