引言:
移远无线通信模组让万物互联成为现实,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://python.quectel.com/doc/)进行了解。
UART串口功能
首先实现UART的基础收发数据功能:
1 2 3 4 | from machine import UART # 加载UART模块 uart = UART(UART.UART2, 115200, 8, 0, 1, 0) # 定义UART主题并确认通信参数 uart.write('1234567890') # 发送数据 uart.read(10) # 接收10字节数据 |
可以看到四行代码实现串口数据收发,我们将脚本进行简单封装,以便用于整体工程。
1 2 3 4 5 6 7 8 | 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服务器。
1 2 2 3 4 5 6 | 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接收数据。
1 2 3 3 4 5 6 7 8 9 10 11 | 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.start_new_thread(socket_cb, ()) # 创建一个线程 |
功能整合
本实验的基石Socket-TCP与UART的数据收发功能我们均已实现,整合工作就将这两块基石组合在一起。对于代码来说也只是将接收的数据交叉发送出去罢了。
1 2 3 4 5 5 6 7 8 9 10 10 11 12 13 14 15 16 17 18 19 | 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.start_new_thread(socket_cb, ()) # 创建一个线程 |
至此Socket-TCP与UART的透传功能便已实现完成,除去代码中为了美观而添加的空行,以及运行直观而添加的打印,整体代码不到20行便实现了功能。不知道这样的简易程度能否令阁下满意。
总结:
当然就项目而言, 这样的脚本还是过于简单了。实际项目中要考虑的因素比较多,比如网络异常的断线重连;服务器参数的批量写入等、、、作为推广文章,这边不做过于复杂的介绍。官方也为大家准备完整功能的DTU-Solution源码及配套的GUI_Tool参数配置工具供大家使用,内部更具有文档介绍使用,有兴趣的小伙伴可自行参考。连接如下:
完整版DTU源码(可搭配DTU_Tool配置工具使用):
GitHub - QuecPython/solution-DTU: DTU solution based on QuecPython
DTU_Tool工具及源码:
GitHub - QuecPython/DTU-tool: Tool for DTU.
简易版DTU源码(适合萌新使用):
GitHub - QuecPython/solution-simple-DTU: A minimal DTU with simple software implementation.
附言:
后期小Q也会陆续分享其他QuecPython学习心得,欢迎各位看官沟通交流