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

 基础资料

基于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,速度忧于DHCP

w5500.config("192.168.1.210","255.255.255.0","192.168.1.1",string.fromHex("d1f17f7f97ae6bea"))  --本地双机互连TCP server

w5500.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 = false
 local tx_buff = zbuff.create(1024)
 local rx_buff = zbuff.create(1024)
 local netc
 local result, param, is_err, rIP, rPort
 result = 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写1
            zbuff   zbuff对象
 返回值类型 解释
            int 返回读到的长度,并把zbuff指针后移
            ]]
 uart.rx(id, com_buff)
 if d1Online then
 sys_send(d1Name, socket.EVENT, 0)
 end
 end)
 netc = socket.create(socket.ETH0, d1Name) --d1Name:taskName
 -- socket.debug(netc, true)
 --socket.config(netc,port,true,false)   --本地双机互连UDP
 socket.config(netc,port)   --本地双机互连TCP

通讯部分:

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

协程:

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
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

打酱油的工程师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值