更新readme.md和docs

This commit is contained in:
chenchi 2022-01-14 11:01:35 +08:00
parent 5ffa687b92
commit 40abcb82e2
71 changed files with 1214 additions and 1176 deletions

View File

@ -23,7 +23,7 @@
- RTU功能 = DTU功能 + 控制单元。 - RTU功能 = DTU功能 + 控制单元。
- 下文中的DTU等同于RTU。 - 下文中的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及其能力 ## 移远DTU及其能力
@ -99,7 +99,7 @@
我司的QuecPython开发板的板载资源丰富支持照度传感器、温湿度传感器、喇叭接口、咪头接口、三色LED灯、LCD屏接口、Camera接口及其它丰富的外设接口配合下节将提及的GUI工具可在QuecPython开发板上进行终端产品的原型验证。 我司的QuecPython开发板的板载资源丰富支持照度传感器、温湿度传感器、喇叭接口、咪头接口、三色LED灯、LCD屏接口、Camera接口及其它丰富的外设接口配合下节将提及的GUI工具可在QuecPython开发板上进行终端产品的原型验证。
![](./media/dev_board.png) ![](./docs/media/dev_board.png)
#### 强大的上位机GUI工具 #### 强大的上位机GUI工具
@ -107,7 +107,7 @@
[点此下载DTU GUI工具。](https://python.quectel.com/download) [点此下载DTU GUI工具。](https://python.quectel.com/download)
![](./media/gui_get_imei.png) ![](./docs/media/gui_get_imei.png)
#### QPYcom工具 #### QPYcom工具
@ -119,7 +119,7 @@ QPYcom工具是一个集**QuecPython repl交互、PC和模组间文件传输、
QPYCom的使用文档参见安装目录下的`docs`文件夹。 QPYCom的使用文档参见安装目录下的`docs`文件夹。
![](./media/QPYCom_V1.8.png) ![](./docs/media/QPYCom_V1.8.png)
#### 线上生成配置文件 #### 线上生成配置文件
@ -152,11 +152,11 @@ QPYCom的使用文档参见安装目录下的`docs`文件夹。
- RTU可直接作为主控省去MCU及其周边电路降低硬件成本 - RTU可直接作为主控省去MCU及其周边电路降低硬件成本
![Reduce_Hardware_Costs.png](./media/Reduce_Hardware_Costs.png) ![Reduce_Hardware_Costs.png](./docs/media/Reduce_Hardware_Costs.png)
- 可使用Python进行二次开发降低软件开发成本 - 可使用Python进行二次开发降低软件开发成本
![C2Py.png](./media/C2Py.png) ![C2Py.png](./docs/media/C2Py.png)
- 我司多平台模组适用使用Python开发无需修改代码即可快速切换至不同模组 - 我司多平台模组适用使用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模式 ### modbus模式

261
docs/APTU_User_Guides.md Normal file
View File

@ -0,0 +1,261 @@
## 文档历史
**修订记录**
| **版本** | **日期** | **作者** | **变更表述** |
| --- | --- | --- | --- |
| 1.0 | 2020-07-27 | 陈驰 | 初始版本 |
## 摘要
本文旨在介绍QuecPython的APTUApplication 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 | 系统级别错误 |

View File

@ -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工具提供基础的查询与设置功能 - 进入我司的[QuecPython资源下载页面](https://python.quectel.com/download)可查找并下载DTU的GUI工具目前仅支持Windows系统但GUI使用跨平台工具开发十分容易扩展到Ubuntu或Mac平台
用户可使用USB to TTL模块连接PC与DTU。
![](../../../docs/dtugui.png) ## 运行DTU GUI 工具
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的工具 运行后的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的参数配置后面会有详细的介绍 具体tcp/udp的参数配置后面会有详细的介绍
3. **固件版本号** 3. **固件版本号**
数值的范围是 > 0 数值的范围是 > 0
4. **是否开启自动更新** 4. **是否开启自动更新**
打开自动更新会在DTU启动的时候去OTA Cloud查看是否有需要更新的固件包如果有更新的任务就会下载固件包校验固件包。校验通过开始更新更新完毕会重启DTU固件。 打开自动更新会在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** | **含义** | | **字段** | **type** | **Required** | **含义** |
| --- | --- | --- | --- | | --- | --- | --- | --- |
@ -130,11 +127,11 @@ DTU GUI基于wxPython开发现阶段已编译的dtu_gui.exe仅支持Windows
| timeout | int | false | HTTP请求最长等待时间 | | timeout | int | false | HTTP请求最长等待时间 |
| serialD | int | true | HTTP绑定的串口号1~2 | | 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秒 | | KeepAlive | int | false | 链接超时最大时间单位秒,默认300秒 |
| serialD | int | true | tcp/udp绑定的串口号(1~2) | | 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** | **含义** | | **字段** | **type** | **Required** | **含义** |
| --- | --- | --- | --- | | --- | --- | --- | --- |
@ -165,17 +162,17 @@ DTU GUI基于wxPython开发现阶段已编译的dtu_gui.exe仅支持Windows
| retain | int | true | MQTT的publish参数retain默认0 | | retain | int | true | MQTT的publish参数retain默认0 |
| serialD | int | true | MQTT通道捆绑的串口ID (1~3) | | serialD | int | true | MQTT通道捆绑的串口ID (1~3) |
#### 3.3.3.4 通道类型:阿里云/腾讯云 ##### 通道类型:阿里云/腾讯云
在进行阿里云和腾讯云的一型一密的时候如果阿里云连接失败需要手动创建secret.json,里面是设备名和设备密钥的json文件。具体可以参考"secret.json"文件 在进行阿里云和腾讯云的一型一密的时候如果阿里云连接失败需要手动创建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** | **含义** | | **字段** | **type** | **Required** | **含义** |
@ -193,33 +190,17 @@ DTU GUI基于wxPython开发现阶段已编译的dtu_gui.exe仅支持Windows
| pubTopic | str | true | 发布主题 | | pubTopic | str | true | 发布主题 |
| serialD | int | true | MQTT通道捆绑的串口ID (1~3) | | serialD | int | true | MQTT通道捆绑的串口ID (1~3) |
#### 3.3.3.5 通道类型:移远云 ##### APN设置
![](../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或10发送者只发送一次消息不进行重试 1发送者最少发送一次消息确保消息到达Broker |
| SessionFlag | bool | true | 配置与云平台通信的数据是否采用session加密默认值为FalseTrue加密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) ##### GPIO引脚设置
#### 3.3.3.6 GPIO引脚设置
GPIO引脚设置功能暂未上线 GPIO引脚设置功能暂未上线
![](../pic/DTU_GUI_User_Guides/gui_gpio.png) ![](./media/gui_gpio.png)
NETLED -- 网路指示灯的GPIO (pio1~pio128) NETLED -- 网路指示灯的GPIO (pio1~pio128)
@ -227,61 +208,60 @@ NETRDY -- 与服务器连上后通知GPIO (pio1~pio128)
RSTCNF -- 重置DTU参数的GPIO (pio1~pio128) RSTCNF -- 重置DTU参数的GPIO (pio1~pio128)
## 3.4修改密码 ### 修改密码
![](../pic/DTU_GUI_User_Guides/gui_pwd.png) ![](./media/gui_pwd.png)
1. 勾选密码,输入当前的密码 1. 勾选密码,输入当前的密码
2. 输入新的密码 2. 输入新的密码
3. 点击"修改密码"的按钮 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 将输出的数据转为十六进制的数据:** **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.查询指令:** **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":{}}` 如: `28,1921009046,{"password":"123","data":{}}`
![](../pic/DTU_GUI_User_Guides/gui_send_cmd_pw.png) ![](./media/gui_send_cmd_pw.png)
**2. 修改配置参数的指令** **2. 修改配置参数的指令**
功能码 + 修改的数据 功能码 + 修改的数据
`47,1564156496,{"password":"123","data":{"apn": ["", "", ""]}}` `47,1564156496,{"password":"123","data":{"apn": ["", "", ""]}}`
中间用”:”隔开后面为修改的json数据 中间用”:”隔开后面为修改的json数据
提示json数据里面不能出现中文字符 提示json数据里面不能出现中文字符
![](../pic/DTU_GUI_User_Guides/gui_edit.png) ![](./media/gui_edit.png)
上图中返回的数据success 为1表示修改成功 上图中返回的数据success 为1表示修改成功

View File

@ -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
- LCDILI9225、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作为主机根据用户配置周期性向从机设备索要数据推送至云端。

View File

@ -1,13 +1,17 @@
# **DTU 通信数据协议** ## 修订历史
# 1 概述 | Version | **Date** | **Author** | **Change expression** |
| :------ | ---------- | ---------- | --------------------- |
| 1.0 | 2021-11-25 | 陈驰 | 初始版本 |
## 概述
本文档主要内容包括: 本文档主要内容包括:
- 与云端通信的报文格式 - 与云端通信的报文格式
- 所有命令模式的指令报文格式:设置参数、查询参数 - 所有命令模式的指令报文格式:设置参数、查询参数
- dtu_config.json配置文件字段的详细说明 - dtu_config.json配置文件字段的详细说明
# 2 数据格式 ## 数据格式
DTU与云端通信报文使用json格式 DTU与云端通信报文使用json格式
@ -15,7 +19,7 @@ DTU与云端通信报文使用json格式
命令模式与modbus模式 命令模式与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模式 命令模式与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可选字段仅在命令模式下生效用于反馈命令是否执行成功 status可选字段仅在命令模式下生效用于反馈命令是否执行成功
# 3 指令说明 ## 指令说明
**协议功能码说明:** **协议功能码说明:**
@ -59,54 +63,58 @@ status可选字段仅在命令模式下生效用于反馈命令是否
**2.返回数据的状态码可查询对应的状态码表** **2.返回数据的状态码可查询对应的状态码表**
## 3.1 功能码表 ### 功能码表
| 功能码 | 功能 | | 功能码 | 功能 |
|--------|---------------| | --- | --- |
| 0-49 | 查询指令 | | 0x00-0x3f | 查询指令 |
| 0 | 查询IMEI | | 0x00 | 查询IMEI |
| 1 | 查询本机号码 | | 0x01 | 查询本机号码 |
| 2 | 查询固件版本号 | | 0x02 | 查询固件版本号 |
| 3 | 查询信号强度 | | 0x03 | 查询信号强度 |
| 4 | 查询当前配置参数 | | 0x04 | 查询当前配置参数 |
| 5 | 诊断查询 | | 0x05 | 诊断查询 |
| 6 | 查询ICCID | | 0X06 | 查询ICCID |
| 7 | 查询ADC电压 | | 0X07 | 查询ADC电压 |
| 8 | 查询GPIO信息 | | 0X08 | 查询GPIO信息 |
| 10 | 查询温湿度 | | 0X10 | 查询温湿度 |
| 11 | 查询网络连接信息 | | 0X11 | 查询网络连接信息 |
| 12 | 查询网络状态 | | 0X12 | 查询网络状态 |
| 13 | 查询基站定位信息 | | 0X13 | 查询基站定位信息 |
| 50~143 | 设置指令 | | 0x50~0x8f | 设置指令 |
| 50 | 协议短信透传 | | 0x50 | 协议短信透传 |
| 51 | 配置密码 | | 0x51 | 配置密码 |
| 52 | 添加设备识别码IMEI | | 0x52 | 添加设备识别码IMEI |
| 53 | 登录服务器发送注册信息 | | 0x53 | 登录服务器发送注册信息 |
| 54 | 固件版本号 | | 0x54 | 固件版本号 |
| 55 | 是否启用自动更新 | | 0x55 | 是否启用自动更新 |
| 56 | 日志输出 | | 0x56 | 日志输出 |
| 57 | 服务器获取配置参数 | | 0x57 | 服务器获取配置参数 |
| 58 | 串口参数 | | 0x58 | 串口参数 |
| 59 | 通道配置参数 | | 0x59 | 通道配置参数 |
| 60 | Apn设置 | | 0x60 | Apn设置 |
| 61 | GPIO设置 | | 0x61 | GPIO设置 |
| 62 | OTA | | 0x62 | GPS |
| 63 | 参数设置 | | 0x63 | 数据流 |
| 255 | 复位指令 | | 0x64 | 预警 |
| 0x65 | 任务 |
| 0xfd | 协议终止指令 |
| 0xfe | DTU启动中无法接收指令 |
| 0xff | 复位指令 |
# 4 查询指令 ## 查询指令
### 4.1.1 查询IMEI ### 查询IMEI
**说明:** **说明:**
DTU的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 | | data | str | 返回IMEI |
| success | int | 0 失败 1成功 | | success | int | 0 失败 1成功 |
### 4.1.2 查询本机号码 ### 查询本机号码
**说明:** **说明:**
查询SIM卡的号码 查询SIM卡的号码
功能码: 1 功能码: 0x01
返回的数据内容: 返回的数据内容:
`{"code": 1 , "data": "17201593988" , "success":1}` `{"code": 0x01 , "data": "17201593988" , "success":1}`
| **字段** | **类型** | **含义** | | **字段** | **类型** | **含义** |
| --- | --- | --- | | --- | --- | --- |
@ -134,7 +142,7 @@ DTU的IMEI号
| data | str | SIM卡的手机号码 | | data | str | SIM卡的手机号码 |
| success | int | 0 失败 1成功 | | success | int | 0 失败 1成功 |
### 4.1.3 查询固件版本号 ### 查询固件版本号
**说明:** **说明:**
@ -142,11 +150,11 @@ DTU的IMEI号
固件版本号格式为: v 1 固件版本号格式为: 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 | 固件版本号 | | data | str | 固件版本号 |
| success | int | 0 失败 1成功 | | success | int | 0 失败 1成功 |
### 4.1.4 查询信号强度 ### 查询信号强度
**说明:** **说明:**
网络信号强度值范围0~31值越大表示信号强度越好。 网络信号强度值范围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 | | data | str | CSQ1~CSQ31 |
| success | int | 0 失败 1成功 | | success | int | 0 失败 1成功 |
### 4.1.5 查询当前配置参数 ### 查询当前配置参数
功能码: 4 功能码: 0x04
数据内容: 数据内容:
``` ```
{"password": "012345", { "password": "012345",
"cmd_code": 4,
"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 | | data | str | req config |
| success | int | 0 失败 1成功 | | success | int | 0 失败 1成功 |
### 4.1.6 诊断查询 ### 诊断查询
说明: 查询当前DTU运行的错误上报信息 说明: 查询当前DTU运行的错误上报信息
功能码: 5 功能码: 0x05
返回的数据内容: 返回的数据内容:
``` ```
{"code":5, {"code":0x05,
"data":[{"func_code": "5" , "error_code": " 6001"}], "data":[{"func_code": "0x01" , "error_code": " 6001"}],
"success":1} "success":1}
``` ```
@ -214,15 +224,15 @@ DTU的IMEI号
| error_code | str | 错误码 | | error_code | str | 错误码 |
| success | int | 0 失败 1成功 | | success | int | 0 失败 1成功 |
### 4.1.7 iccid查询 ### iccid查询
说明: 查询iccid 说明: 查询iccid
功能码: 6 功能码: 0x06
返回的数据内容: 返回的数据内容:
``` ```
{"code":6, {"code":0x06,
"data": "12456465486561516515153", "data": "12456465486561516515153",
@ -235,15 +245,15 @@ DTU的IMEI号
| data | str | 功能码 | | data | str | 功能码 |
| status | str | 0 失败 1成功 | | status | str | 0 失败 1成功 |
### 4.1.8 adc查询 ### adc查询
说明: 查询adc 说明: 查询adc
功能码: 7 功能码: 0x07
返回的数据内容: 返回的数据内容:
``` ```
{"code":7, {"code":0x07,
"data": "3.7", "data": "3.7",
@ -255,15 +265,15 @@ DTU的IMEI号
| data | str | adc电压 | | data | str | adc电压 |
| status | str | 0 失败 1成功 | | status | str | 0 失败 1成功 |
### 4.1.9 gpio查询 ### gpio查询
说明: 查询gpio 说明: 查询gpio
功能码: 8 功能码: 0x08
返回的数据内容: 返回的数据内容:
``` ```
{"code":8, {"code":0x08,
"data": "gpio_msg", "data": "gpio_msg",
@ -276,36 +286,15 @@ DTU的IMEI号
| data | str | gpio获取的信息 | | data | str | gpio获取的信息 |
| status | str | 0 失败 1成功 | | 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}, "data": {"temperature": 26.0, "humidity": 60.0},
"status":1} "status":1}
``` ```
@ -313,18 +302,18 @@ DTU的IMEI号
| **字段** | **类型** | **含义** | | **字段** | **类型** | **含义** |
| --- | --- | --- | | --- | --- | --- |
| code | int | 状态码 | | code | int | 状态码 |
| data | dict | 温湿度信息{"temperature": temp, 'humidity': humid} | | data | dict | 温湿度信息{"temperature": temp, &##39;humidity&##39;: humid} |
| status | str | 0 失败 1成功 | | status | str | 0 失败 1成功 |
### 4.1.11 查询网络连接信息 ### 查询网络连接信息
说明: 查询网络连接信息,每种连接类型返回对应连接状态 说明: 查询网络连接信息,每种连接类型返回对应连接状态
功能码: 11 功能码: 0x11
返回的数据内容: 返回的数据内容:
``` ```
{"code":11, {"code":0x11,
"data": "200", "data": "200",
"status":1} "status":1}
``` ```
@ -335,100 +324,36 @@ DTU的IMEI号
| data | str | 网络连接状态 | | data | str | 网络连接状态 |
| status | str | 0 失败 1成功 | | 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} "status":1}
``` ```
| **字段** | **类型** | **含义** | | **字段** | **类型** | **含义** |
| --- | --- |---------------------------------------| | --- | --- | --- |
| code | int | 状态码 | | code | int | 状态码 |
| data | turple | voice_state:语音连接状态, data_state:数据连接状态 | | data | turple | 基站连接状态 |
| status | str | 0 失败 1成功 | | 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) , "data": (117.1138, 31.82279, 550) ,
@ -441,16 +366,14 @@ quecthing连接状态表
| data | str | 基站定位信息 | | data | str | 基站定位信息 |
| status | str | 0 失败 1成功 | | status | str | 0 失败 1成功 |
# 5 复位指令 ## 复位指令
功能码: 255 功能码: 0xff
数据内容: 数据内容:
``` ```
{ Password: "012345", { Password: "012345",
"code":255,
"data":{} "data":{}
} }
@ -458,7 +381,7 @@ quecthing连接状态表
返回的数据内容: 返回的数据内容:
`{"code": 0x06 , "data": " reset dtu " , "success":1}`
| **字段** | **类型** | **含义** | | **字段** | **类型** | **含义** |
| --- | --- | --- | | --- | --- | --- |
@ -466,13 +389,13 @@ quecthing连接状态表
| data | str | reset dtu | | data | str | reset dtu |
| success | int | 0 失败 1成功 | | success | int | 0 失败 1成功 |
# 6 设置指令 ## 设置指令
## 6.1 基础设置 ### 基础设置
### 6.1.1 协议短信(SMS)透传 message #### 协议短信(SMS)透传 message
功能码: 50 功能码: 0x50
数据内容: 数据内容:
@ -487,7 +410,7 @@ quecthing连接状态表
message: {"number":"12123123", -- 目标号码 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 | 接收的短信 | | data | str | 接收的短信 |
| success | int | 0 失败 1成功 | | success | int | 0 失败 1成功 |
### 6.1.2 配置密码 password #### 配置密码 password
**说明:** **说明:**
@ -514,13 +437,13 @@ message: {"number":"12123123", -- 目标号码
是否开启自动更新需要密码 是否开启自动更新需要密码
功能码: 51 功能码: 0x51
数据内容: 数据内容:
``` ```
{ {
"password":" ", "password":" ",
"data":{"new_password": "012345"} "data":{ "password": "012345"}
} }
``` ```
说明初始密码为固件IMEI的后六位 说明初始密码为固件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成功 | | 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 | | data | str | send reg |
| success | int | 0 失败 1成功 | | success | int | 0 失败 1成功 |
### 6.1.4 固件版本号 version #### 固件版本号 version
**说明:** **说明:**
修改固件版本号用于fota升级当开启fota升级版本号小于服务器端的固件版本号就会进行fota升级 修改固件版本号用于fota升级当开启fota升级版本号小于服务器端的固件版本号就会进行fota升级
固件版本号仅支持整数 功能码: 0x54
功能码: 54
数据内容: 数据内容:
``` ```
{ {
"password":"", "password":"",
"data":{ "data":{
"version ": "100" --- 版本号(使用数字字符串) " version ": "100" --- 版本号(使用数字字符串)
} }
} }
``` ```
返回的数据内容: 返回的数据内容:
`{"code": 54 , "data": " " , "success":1}` `{"code": 0x54 , "data": " " , "success":1}`
| **字段** | **类型** | **含义** | | **字段** | **类型** | **含义** |
| --- | --- | --- | | --- | --- | --- |
@ -605,13 +526,13 @@ message: {"number":"12123123", -- 目标号码
| data | str | 固件版本号 | | data | str | 固件版本号 |
| success | int | 0 失败 1成功 | | success | int | 0 失败 1成功 |
### 6.1.5 是否启用自动更新 fota #### 是否启用自动更新 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 | | data | str | fota |
| success | int | 0 失败 1成功 | | success | int | 0 失败 1成功 |
### 6.1.6 日志输出 nolog #### 日志输出 nolog
**说明:** **说明:**
串口打印日志记录,目前不支持。日志输出连接Debug口 串口打印日志记录,目前不支持。日志输出连接Debug口
功能码: 56 功能码: 0x56
数据内容: 数据内容:
``` ```
@ -659,9 +580,9 @@ Fota升级开关
| data | str | log | | data | str | log |
| success | int | 0 失败 1成功 | | success | int | 0 失败 1成功 |
### 6.1.7 服务器获取配置参数 #### 服务器获取配置参数
功能码: 57 功能码: 0x57
数据内容: 数据内容:
``` ```
@ -688,11 +609,9 @@ Fota升级开关
| data | str | service acquire | | data | str | service acquire |
| success | int | 0 失败 1成功 | | success | int | 0 失败 1成功 |
### 6.1.8 串口参数 uconf #### 串口参数 uconf
功能码: 58 功能码: 0x58
**在透传模式下无法设置串口参数**
数据内容: 数据内容:
``` ```
@ -718,32 +637,29 @@ Fota升级开关
| data | str | uconf | | data | str | uconf |
| success | int | 0 失败 1成功 | | success | int | 0 失败 1成功 |
### 6.1.9 通道配置参数 conf #### 通道配置参数 conf
功能码: 59 功能码: 0x59
**在透传模式下无法设置串口参数**
数据内容: 数据内容:
``` ```
{"password":"", {"password":"",
"data":{ "data":{
"conf":{ "conf":"1": {
"1": { "protocol": "aliyun",
"protocol": "aliyun", "type": "mos",
"type": "mos", "keepAlive": "",
"keepAlive": "", "clientID": "0",
"clientID": "0", "Devicename": "ec600n",
"Devicename": "ec600n", "ProductKey": "gbh26bFEA4M",
"ProductKey": "gbh26bFEA4M", "DeviceSecret": "b7ff5acc0671d40adfd0eff57e7605f6",
"DeviceSecret": "b7ff5acc0671d40adfd0eff57e7605f6", "ProductSecret": "",
"ProductSecret": "", "cleanSession": true,
"cleanSession": true, "qos": "1",
"qos": "1", "subscribe": {"0": "/gbh26bFEA4M/ec600n/user/subtest"},
"subscribe": {"0": "/gbh26bFEA4M/ec600n/user/subtest"}, "publish": {"0": "/gbh26bFEA4M/ec600n/user/pubtest"},
"publish": {"0": "/gbh26bFEA4M/ec600n/user/pubtest"}, "serialID": "0"}
"serialID": "0"} }}
}}}
``` ```
**对应通道的配置参数详见6.1.10.1的通道配置详解 ** **对应通道的配置参数详见6.1.10.1的通道配置详解 **
@ -757,9 +673,9 @@ Fota升级开关
| data | str | conf | | data | str | conf |
| success | int | 0 失败 1成功 | | success | int | 0 失败 1成功 |
#### 6.1.9.1 通道配置详解 ##### 通道配置详解
##### 6.1.9.1.1 HTTP参数 ###### HTTP参数
``` ```
{ {
"protocol": "http", "protocol": "http",
@ -778,7 +694,7 @@ Fota升级开关
| timeout | int | HTTP请求最长等待时间 | | timeout | int | HTTP请求最长等待时间 |
| serialD | int | HTTP绑定的串口号1~2 | | serialD | int | HTTP绑定的串口号1~2 |
##### 6.1.9.1.2 SOCKET tcp参数 ###### SOCKET tcp参数
``` ```
{ {
"protocol": "tcp", "protocol": "tcp",
@ -800,10 +716,10 @@ Fota升级开关
| KeepAlive | int | 链接超时最大时间单位秒,默认300秒 | | KeepAlive | int | 链接超时最大时间单位秒,默认300秒 |
| serialD | int | tcp/udp绑定的串口号(1~2) | | serialD | int | tcp/udp绑定的串口号(1~2) |
##### 6.1.9.1.3 SOCKET udp 参数 ###### SOCKET udp 参数
``` ```
{ {
"protocol": "udp", "protocol": "tcp",
"ping": "", "ping": "",
"heartbeat": 30, "heartbeat": 30,
"url": "220.180.239.212", "url": "220.180.239.212",
@ -822,7 +738,7 @@ Fota升级开关
| KeepAlive | int | 链接超时最大时间单位秒,默认300秒 (60~600) | | KeepAlive | int | 链接超时最大时间单位秒,默认300秒 (60~600) |
| serialD | int | tcp/udp绑定的串口号(1~2) | | serialD | int | tcp/udp绑定的串口号(1~2) |
##### 6.1.9.1.4 MQTT参数 ###### MQTT参数
``` ```
{ {
"protocol": "mqtt", "protocol": "mqtt",
@ -852,7 +768,7 @@ Fota升级开关
| retain | int | MQTT的publish参数retain默认0 | | retain | int | MQTT的publish参数retain默认0 |
| serialD | int | MQTT通道捆绑的串口ID (1~3) | | serialD | int | MQTT通道捆绑的串口ID (1~3) |
##### 6.1.9.1.5 阿里云参数 ###### 阿里云参数
``` ```
{ {
"protocol": "aliyun", "protocol": "aliyun",
@ -886,7 +802,7 @@ Fota升级开关
| pubTopic | str | 发布主题 | | pubTopic | str | 发布主题 |
| serialD | int | MQTT通道捆绑的串口ID (1~3) | | serialD | int | MQTT通道捆绑的串口ID (1~3) |
##### 6.1.9.1.6 腾讯云参数 ###### 腾讯云参数
``` ```
{ {
"protocol": "txyun", "protocol": "txyun",
@ -911,7 +827,8 @@ Fota升级开关
| keepAlive | int | 通信之间允许的最长时间段(以秒为单位),默认为300范围60-1200使用默认值就填""或者" "。 | | keepAlive | int | 通信之间允许的最长时间段(以秒为单位),默认为300范围60-1200使用默认值就填""或者" "。 |
| clientID | str | clientID ,自定义字符不超过64 | | clientID | str | clientID ,自定义字符不超过64 |
| Devicename | str | 设备名称 | | Devicename | str | 设备名称 |
| ProductKey | str |产品密钥| | ProductKey | str |
|
| DeviceSecret | str | 设备密钥(使用一型一密认证此参数传入"") | | DeviceSecret | str | 设备密钥(使用一型一密认证此参数传入"") |
| ProductSecret | str | 产品密钥(使用一机一密认证时此参数传入"") | | ProductSecret | str | 产品密钥(使用一机一密认证时此参数传入"") |
| cleanSession | int | MQTT 保存会话标志位( 0则客户端是持久客户端当客户端断开连接时订阅信息和排队消息将被保留, 1代理将在其断开连接时删除有关此客户端的所有信息 ) | | cleanSession | int | MQTT 保存会话标志位( 0则客户端是持久客户端当客户端断开连接时订阅信息和排队消息将被保留, 1代理将在其断开连接时删除有关此客户端的所有信息 ) |
@ -920,44 +837,11 @@ Fota升级开关
| pubTopic | str | 发布主题 | | pubTopic | str | 发布主题 |
| serialD | int | MQTT通道捆绑的串口ID (1~3) | | serialD | int | MQTT通道捆绑的串口ID (1~3) |
## 设置APN
##### 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或10发送者只发送一次消息不进行重试 1发送者最少发送一次消息确保消息到达Broker |
| SessionFlag | bool | 配置与云平台通信的数据是否采用session加密默认值为FalseTrue加密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
说明:这个指令只适合配置和使用不是同一张卡的场景 说明:这个指令只适合配置和使用不是同一张卡的场景
**在透传模式下无法设置串口参数** 功能码: 0x60
功能码: 60
数据内容: 数据内容:
``` ```
@ -976,7 +860,7 @@ apn对应列表说明:
返回的数据内容: 返回的数据内容:
`{"code": 60 , "status":1}` `{"code": 0x60 , "status":1}`
| **字段** | **类型** | **含义** | | **字段** | **类型** | **含义** |
| --- | --- | --- | | --- | --- | --- |
@ -984,26 +868,22 @@ apn对应列表说明:
| data | str | set apn | | data | str | set apn |
| success | int | 0 失败 1成功 | | success | int | 0 失败 1成功 |
# 8 GPIO pins ## GPIO pins
功能码: 61 功能码: 0x61
**在透传模式下无法设置串口参数**
pins的长度必须为3
数据内容: 数据内容:
``` ```
{"password": " ", {"password": " ",
"data":{"pins":[ "data":{"pins":[
"1", -- 网路指示灯的GPIO (pio1~pio128) "pio2", -- 网路指示灯的GPIO (pio1~pio128)
"2", -- 与服务器连上后通知GPIO (pio1~pio128) "pio4", -- 与服务器连上后通知GPIO (pio1~pio128)
"3" -- 重置DTU参数的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 | | data | str | set gpio pins |
| success | int | 0 失败 1成功 | | 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 | 状态码 | | code | Str | 状态码 |
| data | str | OTA状态 | | data | str | OTA状态 |
| status | int | 0 失败 1成功 | | success | int | 0 失败 1成功 |
## 参数设置
# 10 参数设置 功能码: 0x63
功能码: 63
数据内容: 数据内容:
``` ```
{"password": " ", {"password": " ",
"data":{"dtu_config":{完整配置文件内容} "data":{ 完整配置文件(省略)
} }
``` ```
完整配置文件参照《DTU上手说明》
返回的数据内容: 返回的数据内容:
`{"code": 63 , "status":1}` `{"code": 0x63 ,"status":1}`
| **字段** | **类型** | **含义** | | **字段** | **类型** | **含义** |
| --- | --- | --- | | --- | --- | --- |
| code | Str | 状态码 | | code | Str | 状态码 |
| status | int | 0 失败 1成功 | | data | dict | 完整的配置文件 |
| status | int | 0 失败 1成功 |

525
docs/DTU_User_Guides.md Normal file
View File

@ -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字段可以对通道与串口进行绑定每个串口均支持绑定多个通道。在发送数据时需要传入通道idDTU会向指定的通道发送数据。
在命令模式与modbus模式下接受到的报文会先进行命令解析如果解析失败才会向串口传输数据。
数据格式说明:
#### HTTP/TCP/UDP
- 上行数据报文格式:
`"<channel_id>,<msg_len>"[,"<crc32>",”<msg_data>”]`
- 下行数据报文格式:
`"<channel_id>,<msg_len>"[,"<crc32>",”<msg_data>”]`
- 字段说明:
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>,<topic_id>,<msg_len>","<crc32>",<msg_data>"`
- 下行数据报文格式:
`"<channel_id>,<topic_id>,<msg_len>","<crc32>",<msg_data>"`
- 字段说明:
channel_id通道id配置文件中通道id
topic_idmqtt通道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&amp;串口2透传模式每个串口仅支持绑定一个通道可在配置文件中配置serialID对通道和串口进行绑定。透传模式如果串口配置了多个通道只会选择第一个通道配置后面的配置都会被忽略。
透传模式传输时无需在数据格式上传入channel\_idDTU会自动向串口绑定通道发送数据。
数据格式说明:
#### HTTP/TCP/UDP
- 上行数据报文格式:
`"<msg_len>"[,"<crc32>",”<msg_data>”]"`
- 下行数据报文格式:
`"<msg_len>"[,"<crc32>",”<msg_data>”]"`
- 字段说明:
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>,<msg_len>,<crc32>,<msg_data>`
- 下行数据报文格式:
`<topic_id>,<msg_len>,<crc32>,<msg_data>`
- 字段说明:
topic_idmqtt通道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的TXRX和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)

View File

@ -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
- LCDILI9225、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

View File

@ -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字段可以对通道与串口进行绑定每个串口均支持绑定多个通道。在发送数据时需要传入通道idDTU会向指定的通道发送数据。
在命令模式与modbus模式下接受到的报文会先进行命令解析如果解析失败才会向串口传输数据。
#### 5.1.1 HTTP/TCP/UDP
- 上行数据报文格式:
`"<channel_id>,<msg_len>"[,"<crc32>",”<msg_data>”]`
- 下行数据报文格式:
`"<channel_id>,<msg_len>"[,"<crc32>",”<msg_data>”]`
- 字段说明:
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>,<topic_id>,<msg_len>","<crc32>",<msg_data>"`
- 下行数据报文格式:
`"<channel_id>,<topic_id>,<msg_len>","<crc32>",<msg_data>"`
- 字段说明:
channel_id通道id配置文件中通道id
topic_idmqtt通道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>,<pkgid>,<msg_len>","<crc32>",<msg_data>"`
- 下行数据报文格式:
`"<channel_id>,<pkgid>,<msg_len>","<crc32>",<msg_data>"`
- 字段说明:
channel_id通道id配置文件中通道id
pkgidquecthing物模型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>,<msg_len>","<crc32>",<msg_data>"`
- 下行命令报文格式:
`"<msg_len>","<crc32>",<msg_data>"`
- 字段说明:
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&amp;串口2透传模式每个串口仅支持绑定一个通道可在配置文件中配置serialID对通道和串口进行绑定。透传模式如果串口配置了多个通道只会选择第一个通道配置后面的配置都会被忽略。
透传模式传输时无需在数据格式上传入channel\_idDTU会自动向串口绑定通道发送数据。
#### 5.2.1 HTTP/TCP/UDP
- 上行数据报文格式:
`"<msg_len>"[,"<crc32>",”<msg_data>”]"`
- 下行数据报文格式:
`"<msg_len>"[,"<crc32>",”<msg_data>”]"`
- 字段说明:
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>,<msg_len>,<crc32>,<msg_data>`
- 下行数据报文格式:
`<topic_id>,<msg_len>,<crc32>,<msg_data>`
- 字段说明:
topic_idmqtt通道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>,<msg_len>","<crc32>",<msg_data>"`
- 下行数据报文格式:
`"<pkgid>,<msg_len>","<crc32>",<msg_data>"`
- 字段说明:
pkgidquecthing物模型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的TXRX和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)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

View File

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

View File

Before

Width:  |  Height:  |  Size: 139 KiB

After

Width:  |  Height:  |  Size: 139 KiB

View File

Before

Width:  |  Height:  |  Size: 141 KiB

After

Width:  |  Height:  |  Size: 141 KiB

View File

Before

Width:  |  Height:  |  Size: 41 KiB

After

Width:  |  Height:  |  Size: 41 KiB

BIN
docs/media/QPYCom_V1.8.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

View File

Before

Width:  |  Height:  |  Size: 33 KiB

After

Width:  |  Height:  |  Size: 33 KiB

View File

Before

Width:  |  Height:  |  Size: 40 KiB

After

Width:  |  Height:  |  Size: 40 KiB

View File

Before

Width:  |  Height:  |  Size: 93 KiB

After

Width:  |  Height:  |  Size: 93 KiB

View File

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 26 KiB

View File

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 28 KiB

View File

Before

Width:  |  Height:  |  Size: 36 KiB

After

Width:  |  Height:  |  Size: 36 KiB

View File

Before

Width:  |  Height:  |  Size: 84 KiB

After

Width:  |  Height:  |  Size: 84 KiB

BIN
docs/media/aptu_01.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

BIN
docs/media/aptu_02.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

View File

Before

Width:  |  Height:  |  Size: 2.4 MiB

After

Width:  |  Height:  |  Size: 2.4 MiB

View File

Before

Width:  |  Height:  |  Size: 7.9 KiB

After

Width:  |  Height:  |  Size: 7.9 KiB

View File

Before

Width:  |  Height:  |  Size: 73 KiB

After

Width:  |  Height:  |  Size: 73 KiB

View File

Before

Width:  |  Height:  |  Size: 53 KiB

After

Width:  |  Height:  |  Size: 53 KiB

View File

Before

Width:  |  Height:  |  Size: 65 KiB

After

Width:  |  Height:  |  Size: 65 KiB

View File

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 22 KiB

View File

Before

Width:  |  Height:  |  Size: 38 KiB

After

Width:  |  Height:  |  Size: 38 KiB

View File

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 30 KiB

View File

Before

Width:  |  Height:  |  Size: 34 KiB

After

Width:  |  Height:  |  Size: 34 KiB

View File

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 32 KiB

View File

Before

Width:  |  Height:  |  Size: 37 KiB

After

Width:  |  Height:  |  Size: 37 KiB

View File

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 30 KiB

View File

Before

Width:  |  Height:  |  Size: 38 KiB

After

Width:  |  Height:  |  Size: 38 KiB

View File

Before

Width:  |  Height:  |  Size: 24 KiB

After

Width:  |  Height:  |  Size: 24 KiB

View File

Before

Width:  |  Height:  |  Size: 29 KiB

After

Width:  |  Height:  |  Size: 29 KiB

View File

Before

Width:  |  Height:  |  Size: 29 KiB

After

Width:  |  Height:  |  Size: 29 KiB

View File

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 26 KiB

View File

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 30 KiB

View File

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 28 KiB

View File

Before

Width:  |  Height:  |  Size: 44 KiB

After

Width:  |  Height:  |  Size: 44 KiB

View File

Before

Width:  |  Height:  |  Size: 50 KiB

After

Width:  |  Height:  |  Size: 50 KiB

View File

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 26 KiB

View File

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 28 KiB

BIN
docs/media/gui_rtu.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

View File

Before

Width:  |  Height:  |  Size: 9.7 KiB

After

Width:  |  Height:  |  Size: 9.7 KiB

View File

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 28 KiB

View File

Before

Width:  |  Height:  |  Size: 44 KiB

After

Width:  |  Height:  |  Size: 44 KiB

View File

Before

Width:  |  Height:  |  Size: 29 KiB

After

Width:  |  Height:  |  Size: 29 KiB

View File

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

View File

Before

Width:  |  Height:  |  Size: 99 KiB

After

Width:  |  Height:  |  Size: 99 KiB

View File

Before

Width:  |  Height:  |  Size: 38 KiB

After

Width:  |  Height:  |  Size: 38 KiB

View File

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 30 KiB

View File

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 32 KiB

View File

Before

Width:  |  Height:  |  Size: 914 B

After

Width:  |  Height:  |  Size: 914 B

View File

Before

Width:  |  Height:  |  Size: 43 KiB

After

Width:  |  Height:  |  Size: 43 KiB

View File

Before

Width:  |  Height:  |  Size: 49 KiB

After

Width:  |  Height:  |  Size: 49 KiB

View File

Before

Width:  |  Height:  |  Size: 43 KiB

After

Width:  |  Height:  |  Size: 43 KiB

View File

Before

Width:  |  Height:  |  Size: 46 KiB

After

Width:  |  Height:  |  Size: 46 KiB

View File

Before

Width:  |  Height:  |  Size: 47 KiB

After

Width:  |  Height:  |  Size: 47 KiB

View File

Before

Width:  |  Height:  |  Size: 68 KiB

After

Width:  |  Height:  |  Size: 68 KiB

View File

Before

Width:  |  Height:  |  Size: 75 KiB

After

Width:  |  Height:  |  Size: 75 KiB

View File

Before

Width:  |  Height:  |  Size: 72 KiB

After

Width:  |  Height:  |  Size: 72 KiB

View File

Before

Width:  |  Height:  |  Size: 79 KiB

After

Width:  |  Height:  |  Size: 79 KiB

View File

Before

Width:  |  Height:  |  Size: 91 KiB

After

Width:  |  Height:  |  Size: 91 KiB

View File

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 13 KiB

View File

Before

Width:  |  Height:  |  Size: 360 KiB

After

Width:  |  Height:  |  Size: 360 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB