基础资料
基于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