合宙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,速度忧于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网络接口-双机互联透传相关推荐
- 合宙Air103|射频读写器|RC522|RDIF|Mifare1 S50|非接触式IC卡|AB密钥|社区库接口|官方demo|学习(9):RC522-射频读写器
基础资料 基于Air103开发板:
- socket跟TCP/IP 的关系,单台服务器上的并发TCP连接数可以有多少
常识一:文件句柄限制 在linux下编写网络服务器程序的朋友肯定都知道每一个tcp连接都要占一个文件描述符,一旦这个文件描述符使用完了,新的连接到来返回给我们的错误是"Socket/File ...
- 转载 Socket与TCP/IP的关系 转(非常好的一篇文章!)
要写网络程序就必须用 Socket ,这是程序员都知道的.而且,面试的时候,我们也会问对方会不会 Socket 编程?一般来说,很多人都会说, Socket 编程基本就是 listen , accep ...
- 聊聊Socket、TCP/IP、HTTP、FTP及网络编程
1 这些都是什么 既然是网络传输,涉及几个系统之间的交互,那么首先要考虑的是如何准确的定位到网络上的一台或几台主机,另一个是如何进行可靠高效的数据传输.这里就要使用到TCP/IP协议. 1.1 TCP ...
- 合宙Air105|摄像头|capture|SPI|Serial 串口|TFTLCD|Micro SD卡|GC032A|USB转TTL|官方demo|学习(2-1):摄像头camera-capture
目录 基础资料 探讨重点 实现功能 硬件准备 软件版本 软件使用 接线示意图 功能1:捕捉图片并存入SPI接口外置SD卡 lcd初始化 摄像头初始化 指定capture按钮 SD卡初始化 图片存储 功 ...
- 合宙AIR105(二): 时钟设置和延迟函数
目录 合宙AIR105(一): Keil MDK开发环境, DAP-Link 烧录和调试 合宙AIR105(二): 时钟设置和延迟函数 合宙AIR105(三): 定时器, 定时器中断和PWM输出 合宙 ...
- 合宙AIR105(四): SPI, MAX7219 8x8LED驱动
目录 合宙AIR105(一): Keil MDK开发环境, DAP-Link 烧录和调试 合宙AIR105(二): 时钟设置和延迟函数 合宙AIR105(三): 定时器, 定时器中断和PWM输出 合宙 ...
- java tcp ip通信_Java中Socket实现TCP/IP协议的通信
TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,是一个工业标准的协议集,它是为广域网(WANs)设计的. Jav ...
- socket、tcp/ip、http三者之间的区别和原理
网络七层模型 OSI 模型(Open System Interconnection model)是计算机和网络在世界范围内实现互联的标准框架.它将计算机网络体系结构划分为七层,每层都可以提供抽象良好的 ...
- socket UDP TCP 的一些用法
UDP 用最通俗的话讲,所谓UDP,就是发送出去就不管的一种网络协议.因此UDP编程的发送端只管发送就可以了,不用检查网络连接状态.下面用例子来说明怎样编写UDP,并会详细解释每个API和数据类型. ...
最新文章
- virtual hust 2013.6.20 数论基础题目 D - Just the Facts
- Log控制台打印设置
- 累计占比_全国ETC用户累计突破1亿!广东占比超过1/10
- SDMemoryCache中的NSMapTable
- 并发新特性—Executor 框架与线程池
- 下列关于linux的进程,描述不正确的是,进程是资源管理的最小单位,2012年7月成人自考网络操作系统考试真题...
- 新建maven(servlet项目) 引入不了HttpServlet
- [Kaggle] Heart Disease Prediction
- 转转集团:二手市场iPhone12夺5G销冠 华为Mate40 Pro最保值
- 【Docker】05 容器数据卷
- clearcase 操作指南
- 线性回归 西瓜数据集 Python--sklearn
- python playsound播放时关闭_python - 使用playsound模块停止音频 - 堆栈内存溢出
- 不如意的人生,才是真实的。
- 全球各大网站的服务器使用什么操作系统和WEB服务器(转)
- echo和narcissus寓意_希腊神话故事(一)Echo 和 Narcissus(得不到的爱)
- Galaxy数据统计平台(二)
- SubShader中的LOD
- BIOS/固件设置中禁用Intel VT-x
- Mysql数据库和navicat
热门文章
- 不忘初心,持之以恒,笔耕不辍,利人利己
- 中学计算机课小课题,信息技术小课题研究题目大全
- VBS 对IBM Notes的常规操作
- 【荐课】10分钟速成课:经济学
- Flowable 流程实例
- 微信怎么收银行卡的消息服务器,微信零钱提现,这样操作,可以免去手续费
- OpenCASCADE:OCCT CSharp 示例
- 电源检测工具OCCT v10.1.6
- 在java中怎么表示三角函数_【Math】三角函数在Java中是怎么表示的?
- 大学计算机基础实训13,东南大学《大学计算机基础》实验13EXCEL图表制作.pdf