欢迎访问 生活随笔!

生活随笔

当前位置: 首页 >

合宙Air105|Socket|UDP |TCP/IP|W5500|Serial 串口|透传|DTU|网络测试助手|双机互联|内网测试|官方demo|学习(8-3):Socket网络接口-双机互联透传

发布时间:2023/12/20 47 豆豆

 基础资料

基于Air105开发板:Air105 - LuatOS 文档

上手:开发上手 - LuatOS 文档

探讨重点

对官方Socket网络接口demo中DTU连接示例(dtu_demo.lua)进行复现及分析,进行用阻塞方式做串口透传DTU内容的学习及探讨。

基本连接步骤及说明

合宙Air105|Socket|UDP |TCP/IP|W5500|TCP&UDP测试|服务器|客户端|官方demo|学习(8-2):Socket网络接口- UDP |TCP/IP连接示例_Medlar_CN的博客-CSDN博客

实现功能

不通过交换机或路由器等设备,双机互联条件下,进行内网透传|DTU|基于UDP |TCP/IP的实现的网络接口测试及学习;

硬件准备

Air105开发板1块,面包板1块,W5500网络模块,CH340G串口模块,双机互联线(交叉线,RJ45接口),导线若干。

接线

W5500模块是标准SPI设备,可参考

合宙Air105|摄像头|capture|SPI|Serial 串口|TFTLCD|Micro SD卡|GC032A|USB转TTL|官方demo|学习(2-1):摄像头camera-capture_Medlar_CN的博客

中SPI接口外置sd卡的接线及串口模块的接线方式。

W5500接线说明:

W5500管脚功能

air105对应管脚

air105管脚功能

MOSI

pin.PB04

SPI_2_MOSI

MISO

pin.PB05

SPI_2_MISO

SCLK

pin.PB02

SPI_2_CLK

SCS

pin.PB03

SPI_2_CSN

INT

pin.PC00

GPIO32

RST

pin.PE10

GPIO74

GND

GND

GND

VCC

3V3

3V3

PIN口设置:

w5500.init(spi.SPI_2, 24000000, pin.PB03, pin.PC00, pin.PE10)。

W5500.config() --默认是DHCP模式

UART3串口设置:

uart.setup(3,115200,8,1) --使用串口3

软件版本

AIR105:LuatOS@AIR105 base 22.10 bsp V0013

LLCOM串口调试工具

TCP&UDP测试工具

网络调试助手

例程

"main.lua.lua” (根据官方demo修改)

"dtu_demo_tcp.lua" (根据官方demo修改)

"dtu_demo_udp.lua" (根据官方demo修改)

软件使用

W5500模块数据手册V1.3版

接口文档可参考:socket网络接口

w5500以太网驱动 - LuatOS 文档

双机互联线(交叉线的做法)

平常电脑主机与路由器相连,均采用RJ45接口,直连线(两端线序相同,均为568A或568B线序)。而当采用电脑主机与AIR105+W5500模块直接相连时,需采用交叉线序,即一端为568A或568B。

568A标准线序:

1、白绿、2、绿、3、白橙、4、蓝、5、白蓝、6、橙、7、白棕、8、棕,

568B标准线序:

1、白橙,2、橙,3、白绿,4、蓝,5、白蓝,6、绿,7、白棕,8、棕

两种线序的主要区别:

8根线中的1号和3号线,2号和6号线互换,即1-3、2-6交叉,类似于串口的TX,RX对接方式,进行数据的收发。

IP地址的设置

由于未接入路由器等网络设备,无DHCP功能,模块及主机均需采用手动设置静态IP地址(使用内网网段)。

W5500模块IP设置:

--设置静态IP和DNS后,log输出中显示手工设定IP,速度忧于DHCPw5500.config("192.168.1.210","255.255.255.0","192.168.1.1",string.fromHex("d1f17f7f97ae6bea"))  --本地双机互连TCP serverw5500.bind(socket.ETH0)

提醒

设置完成插入网线后,一定要在电脑主机上ping一下模块,再进行后续操作。

DTU设备是什么?

dtu设备也就是无线终端设备,指专门用于将串口数据与IP数据之间进行来回转换的,然后通过无线通信网络进行传送的无线终端设备。

注意

为方便调试和区分,将官方demo的dtu_demo.lua根据server和client端、收发送原理和所用的协议,进行了代码调整,修改后的源文件为: "dtu_demo_tcp" , "dtu_demo_udp",“main.lua” 见附件。

具体修改如下文分析所述:

DTU透传(AIR105+W5500作为TCP 服务器)

端口无限制,注意避免冲突。内网测试,无需接入互联网,建议关闭防火墙或其他杀毒软件,避免端口限制。端口选择无限制,但应注意避免冲突。

Main.lua:

require "dtu_demo_tcp" --W5500+AIR105作为tcp服务器时启用 dtuDemo(3, 14000) -- --本地双机互连,对绞线,W5500+AIR105作为tcp服务器时启用--采用UART3,TCP服务端口设置为14000

dtu_demo_tcp.lua主要代码分析:

local function dtuTask(uart_id, port)d1Online = falselocal tx_buff = zbuff.create(1024)local rx_buff = zbuff.create(1024)local netclocal result, param, is_err, rIP, rPortresult = uart.setup(uart_id,115200,8,1)uart.write(uart_id, 'uart init OK!')--[[注册串口事件回调 给UART3注册一个接收事件回调,在Air105 UART3接收到数据的时候进行读取和打印 接收string类型的数据 代码如下 uart.on(1, "receive", function(id, len)local data = uart.read(id, len) --string 读取到的数据 / 传入zbuff时,返回读到的长度,并把zbuff指针后移log.info(PROJECT .. ".receive-" .. id, data) end) ]]uart.on(uart_id, "receive", function(id, len)--[[uart.rx(id, buff)buff形式读串口,一次读出全部数据存入buff中,如果buff空间不够会自动扩展,目前只有air105支持这个操作传入值类型 解释int 串口id, uart0写0, uart1写1zbuff zbuff对象返回值类型 解释int 返回读到的长度,并把zbuff指针后移]]uart.rx(id, com_buff)if d1Online thensys_send(d1Name, socket.EVENT, 0)endend)netc = socket.create(socket.ETH0, d1Name) --d1Name:taskName-- socket.debug(netc, true)--socket.config(netc,port,true,false) --本地双机互连UDPsocket.config(netc,port) --本地双机互连TCP

通讯部分:

netc = socket.create(socket.ETH0, d1Name) --d1Name:taskNamesocket.config(netc,port) --本地双机互连TCPwhile true dolog.info(rtos.meminfo("sys"))result = libnet.waitLink(d1Name, 0, netc)result = libnet.listen(d1Name, 0, netc)d1Online = resultif result thenresult,_ = socket.accept(netc, nil) --W5500的硬件协议栈不支持一对多,关键确认环节if result thenlog.info("服务器连上了")libnet.tx(d1Name, 0, netc, "helloworld")endend

协程:

function dtuDemo(uart_id, port)--[[--- 创建一个任务线程,在模块最末行调用该函数并注册模块中的任务函数,main.lua导入该模块即可 -- @param fun 任务函数名,用于resume唤醒时调用 -- @param taskName 任务名称,用于唤醒任务的id -- @param cbFun 接收到非目标消息时的回调函数 -- @param ... 任务函数fun的可变参数 -- @return co 返回该任务的线程号 ]]sysplus.taskInitEx(dtuTask, d1Name, netCB, uart_id, port) end

主机开启服务器后,显示服务器连接状态,log信息:

[2022-12-20 16:39:59.063] w5500_ip_state 1115:ip 0 -> 1 [2022-12-20 16:39:59.109] w5500_ip_state 1115:ip 0 -> 1 [2022-12-20 16:39:59.201] w5500_link_state 1074:link 0 -> 1 [2022-12-20 16:39:59.201] w5500_nw_state 980:network ready [2022-12-20 16:39:59.201] I/?:0服务器连上了 [2022-12-20 16:39:59.201] I/?:04021206985671032

DTU透传(采用UDP方式连接)

main.lua:

require "dtu_demo_udp" --采用udp协议时时启用 dtuDemo(3, "192.168.1.117", 14000) --本地双机互连,对绞线,采用udp协议时时启用。--本例电脑主机IP地址设置为:192.168.1.117

通讯部分:      

netc = socket.create(socket.ETH0, d1Name) --d1Name:taskName socket.config(netc,8080, true,false) --本地双机互连,为了区别端口设置为8080,可以自订while true do log.info(rtos.meminfo("sys")) result = libnet.waitLink(d1Name, 0, netc) result = libnet.connect(d1Name, 5000, netc, ip, port) d1Online = result if result then log.info("服务器连上了") libnet.tx(d1Name, 0, netc, "helloworld") end

UDP协议下的透传实例 :

连接过程中的log文件:

[2022-12-22 07:17:18.812] D/main loadlibs luavm 204792 15344 15344 [2022-12-22 07:17:18.812] D/main loadlibs sys 402120 51112 51616 [2022-12-22 07:17:18.813] I/?:11 402120 69888 69888 [2022-12-22 07:17:18.859] w5500_ip_state 1115:ip 0 -> 1 [2022-12-22 07:17:18.864] w5500_ip_state 1115:ip 0 -> 1 [2022-12-22 07:17:18.967] w5500_link_state 1074:link 0 -> 1 [2022-12-22 07:17:18.967] w5500_nw_state 980:network ready [2022-12-22 07:17:18.967] I/?:0 服务器连上了 [2022-12-22 07:17:18.967] I/?:0 402120 69856 71032 [2022-12-22 07:17:23.984] I/?:0 402120 69888 71032[2022-12-22 07:21:23.968] I/?:0 402120 69888 71032 [2022-12-22 07:21:27.700] I/?:-1071709759 收到服务器数据,长度 18 [2022-12-22 07:21:27.700] I/?:0 402120 73976 73976

总结

以上是生活随笔为你收集整理的合宙Air105|Socket|UDP |TCP/IP|W5500|Serial 串口|透传|DTU|网络测试助手|双机互联|内网测试|官方demo|学习(8-3):Socket网络接口-双机互联透传的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。