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 7ce3994..0000000 Binary files a/docs/md/img.png and /dev/null differ diff --git a/docs/pic/DTU_Product_Introduction/C2Py.png b/docs/media/C2Py.png similarity index 100% rename from docs/pic/DTU_Product_Introduction/C2Py.png rename to docs/media/C2Py.png diff --git a/docs/pic/DTU_Product_Introduction/CMD_Mode_Working_Principle.png b/docs/media/CMD_Mode_Working_Principle.png similarity index 100% rename from docs/pic/DTU_Product_Introduction/CMD_Mode_Working_Principle.png rename to docs/media/CMD_Mode_Working_Principle.png diff --git a/docs/pic/DTU_User_Guides/CP2102.jpg b/docs/media/CP2102.jpg similarity index 100% rename from docs/pic/DTU_User_Guides/CP2102.jpg rename to docs/media/CP2102.jpg diff --git a/docs/pic/DTU_Product_Introduction/DTU.png b/docs/media/DTU.png similarity index 100% rename from docs/pic/DTU_Product_Introduction/DTU.png rename to docs/media/DTU.png diff --git a/docs/media/QPYCom_V1.8.png b/docs/media/QPYCom_V1.8.png new file mode 100644 index 0000000..247456e Binary files /dev/null and b/docs/media/QPYCom_V1.8.png differ 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 0000000..2d850b5 Binary files /dev/null and b/docs/media/aptu_01.png differ diff --git a/docs/media/aptu_02.png b/docs/media/aptu_02.png new file mode 100644 index 0000000..2dcb387 Binary files /dev/null and b/docs/media/aptu_02.png differ 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 0000000..e1ad9f5 Binary files /dev/null and b/docs/media/gui_rtu.png differ 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 e94bde5..0000000 Binary files a/docs/pic/DTU_GUI_User_Guides/gui_quecthing.png and /dev/null differ 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 707a909..0000000 Binary files a/docs/pic/DTU_User_Guides/config_serial_id.png and /dev/null differ