QuecPython-最简单实现“DTU”Socket-TCP&UART数传

引言:

移远无线通信模组让万物互联成为现实,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学习心得,欢迎各位看官沟通交流

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值