引言:
移远无线通信模组让万物互联成为现实,QuecPython开启全新的模组开发方式,用最简单易用的编程语言开发最前沿的无线通信产品。
作为物联网核心部件之一的模组,其主要使命就是将本地数据上传至云端。以往受限于复杂的网络协议及信号并网传输,如今移远模组为您提供全套的解决方案。让物联网开发变得难以想象的简单。
本文将演示使用QuecPython语言如何实现”DTU”-Socket-TCP&UART数传功能。实际演示数据上云在QuecPython的加持下竟能如此简单。
硬件准备
本实验硬件需求不多:一块入网正常的QuecPython开发板;一个USB转TTL串口小板;Type-C连接线及杜邦线若干即可。
这边主要介绍下USB转TTL串口小板与QuecPython开发板(以EC800M开发板_V 1.1为例)硬件连接:
| 串口小板 | 开发板 | 开发板 |
|---|---|---|
| GND | GND | 共地,确保基准电平统一 |
| RX | TX | 数据,交叉连接TX/RX |
| TX | RX | 数据,交叉连接TX/RX |
软件说明
宣传中QuecPython很简单,到底怎么个简单?相信不少新入手的都有这样的疑问。下面我们从0开始手撸一个”DTU”的代码让充满疑问的您彻底明确。
说明:开始QuecPython开发之前确保开发板已经烧录Python固件。此部分有疑问的看官请自行至QuecPython官网-文档中心(网站:
https://developer.quectel.com/doc/quecpython/Application_guide/zh/ 进行了解。
UART串口功能
首先实现UART的基础收发数据功能:
from machine import UART # 加载UART模块
uart = UART(UART.UART2, 115200, 8, 0, 1, 0) # 定义UART主题并确认通信参数
uart.write('1234567890') # 发送数据
uart.read(10) # 接收10字节数据
可以看到四行代码实现串口数据收发,我们将脚本进行简单封装,以便用于整体工程。
from machine import UART # 加载UART模块
uart = UART(UART.UART2, 115200, 8, 0, 1, 0) # 定义UART主题并确认通信参数
def uart_cb(para): # UART回调函数
msg = uart.read(para[2]) # 读取数据
utf8_msg = msg.decode() # 初始数据是字节类型(bytes), 将字节类型数据进行编码
uart.write("{}".format(utf8_msg)) # 自发自收
print("{}".format(utf8_msg)) # 交互口数据打印
uart.set_callback(uart_cb) # 设置回调函数
Socket-TCP功能
【注!!!】进行Socket-TCP通信前需保证模块网络功能已经正常,确认方法:判断dataCall.getInfo(1, 0)接口已经获取到网络分配IP。
如UART功能,首先实现Socket-TCP的基础收发数据功能:
注:以下代码中使用的TCP服务器为本次实验测试使用,实际情况下需替换为自己使用的TCP服务器。
import usocket # 加载usocket模块
socket = usocket.socket(usocket.AF_INET, usocket.SOCK_STREAM) # 创建一个Socket实例
sockinfo = usocket.getaddrinfo('122.114.122.174', 35985)[0][-1] # 解析域名
socket.connect(sockinfo) # 连接平台
socket.send('1234567890') # 发送注册包信息连接设备
data = socket.recv(10) # 接收10字节数据
如上、Socket-TCP数据收发功能QuecPython也是6行代码便轻松实现。我们也对Socket-TCP部分代码进行封装,便于整体工程使用。
这里有一点需要注意:Socket没有回调函数,需要单独起一个线程来监听Socket接收数据。
import usocket # 加载usocket模块
import _thread # 加载线程创建模块
socket = usocket.socket(usocket.AF_INET, usocket.SOCK_STREAM) # 创建一个Socket实例
sockinfo = usocket.getaddrinfo('122.114.122.174', 35985)[0][-1] # 解析域名
socket.connect(sockinfo) # 连接平台
def socket_cb(): # Socket-TCP数据接收线程
while True: # 不同于回调, 线程需要循环运行
data = socket.recv(1024) # 单次读取1024字节
socket.send(data.decode()) # 自发自收
print(data.decode()) # 交互口数据打印
thread.startnew_thread(socket_cb, ()) # 创建一个线程
功能整合
本实验的基石Socket-TCP与UART的数据收发功能我们均已实现,整合工作就将这两块基石组合在一起。对于代码来说也只是将接收的数据交叉发送出去罢了。
from machine import UART # 加载UART模块
import usocket # 加载usocket模块
import _thread # 加载线程创建模块
uart = UART(UART.UART2, 115200, 8, 0, 1, 0) # 定义UART主题并确认通信参数
socket = usocket.socket(usocket.AF_INET, usocket.SOCK_STREAM) # 创建一个Socket实例
sockinfo = usocket.getaddrinfo('122.114.122.174', 33362)[0][-1] # 解析域名
socket.connect(sockinfo) # 连接平台
def uart_cb(para): # UART回调函数
msg = uart.read(para[2]) # 读取数据
utf8_msg = msg.decode() # 初始数据是字节类型(bytes),将字节类型数据进行编码
socket.send("{}".format(utf8_msg)) # 自发自收
print("USRT_Recv: {}".format(utf8_msg)) # 交互口数据打印
def socket_cb(): # Socket-TCP数据接收线程
while True: # 不同于回调, 线程需要循环运行
data = socket.recv(1024) # 单次读取1024字节
uart.write(data.decode()) # 自发自收
print("Socket_Recv: {}".format((data.decode()))) # 交互口数据打印
uart.set_callback(uart_cb) # 设置回调函数
thread.startnew_thread(socket_cb, ()) # 创建一个线程
至此Socket-TCP与UART的透传功能便已实现完成,除去代码中为了美观而添加的空行,以及运行直观而添加的打印,整体代码不到20行便实现了功能。不知道这样的简易程度能否令阁下满意。
总结:
当然就项目而言, 这样的脚本还是过于简单了。实际项目中要考虑的因素比较多,比如网络异常的断线重连;服务器参数的批量写入等、、、作为推广文章,这边不做过于复杂的介绍。官方也为大家准备完整功能的DTU-Solution源码及配套的GUI_Tool参数配置工具供大家使用,内部更具有文档介绍使用,有兴趣的小伙伴可自行参考。连接如下:
完整版DTU源码(可搭配DTU_Tool配置工具使用):
https://github.com/QuecPython/solution-DTU
DTU_Tool工具及源码:
https://github.com/QuecPython/DTU-tool
简易版DTU源码(适合萌新使用):




