基础资料

基于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网络接口-双机互联透传相关推荐

  1. 合宙Air103|射频读写器|RC522|RDIF|Mifare1 S50|非接触式IC卡|AB密钥|社区库接口|官方demo|学习(9):RC522-射频读写器

    基础资料 基于Air103开发板:

  2. socket跟TCP/IP 的关系,单台服务器上的并发TCP连接数可以有多少

    常识一:文件句柄限制 在linux下编写网络服务器程序的朋友肯定都知道每一个tcp连接都要占一个文件描述符,一旦这个文件描述符使用完了,新的连接到来返回给我们的错误是"Socket/File ...

  3. 转载 Socket与TCP/IP的关系 转(非常好的一篇文章!)

    要写网络程序就必须用 Socket ,这是程序员都知道的.而且,面试的时候,我们也会问对方会不会 Socket 编程?一般来说,很多人都会说, Socket 编程基本就是 listen , accep ...

  4. 聊聊Socket、TCP/IP、HTTP、FTP及网络编程

    1 这些都是什么 既然是网络传输,涉及几个系统之间的交互,那么首先要考虑的是如何准确的定位到网络上的一台或几台主机,另一个是如何进行可靠高效的数据传输.这里就要使用到TCP/IP协议. 1.1 TCP ...

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

    目录 基础资料 探讨重点 实现功能 硬件准备 软件版本 软件使用 接线示意图 功能1:捕捉图片并存入SPI接口外置SD卡 lcd初始化 摄像头初始化 指定capture按钮 SD卡初始化 图片存储 功 ...

  6. 合宙AIR105(二): 时钟设置和延迟函数

    目录 合宙AIR105(一): Keil MDK开发环境, DAP-Link 烧录和调试 合宙AIR105(二): 时钟设置和延迟函数 合宙AIR105(三): 定时器, 定时器中断和PWM输出 合宙 ...

  7. 合宙AIR105(四): SPI, MAX7219 8x8LED驱动

    目录 合宙AIR105(一): Keil MDK开发环境, DAP-Link 烧录和调试 合宙AIR105(二): 时钟设置和延迟函数 合宙AIR105(三): 定时器, 定时器中断和PWM输出 合宙 ...

  8. java tcp ip通信_Java中Socket实现TCP/IP协议的通信

    TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,是一个工业标准的协议集,它是为广域网(WANs)设计的. Jav ...

  9. socket、tcp/ip、http三者之间的区别和原理

    网络七层模型 OSI 模型(Open System Interconnection model)是计算机和网络在世界范围内实现互联的标准框架.它将计算机网络体系结构划分为七层,每层都可以提供抽象良好的 ...

  10. socket UDP TCP 的一些用法

    UDP 用最通俗的话讲,所谓UDP,就是发送出去就不管的一种网络协议.因此UDP编程的发送端只管发送就可以了,不用检查网络连接状态.下面用例子来说明怎样编写UDP,并会详细解释每个API和数据类型. ...

最新文章

  1. virtual hust 2013.6.20 数论基础题目 D - Just the Facts
  2. Log控制台打印设置
  3. 累计占比_全国ETC用户累计突破1亿!广东占比超过1/10
  4. SDMemoryCache中的NSMapTable
  5. 并发新特性—Executor 框架与线程池
  6. 下列关于linux的进程,描述不正确的是,进程是资源管理的最小单位,2012年7月成人自考网络操作系统考试真题...
  7. 新建maven(servlet项目) 引入不了HttpServlet
  8. [Kaggle] Heart Disease Prediction
  9. 转转集团:二手市场iPhone12夺5G销冠 华为Mate40 Pro最保值
  10. 【Docker】05 容器数据卷
  11. clearcase 操作指南
  12. 线性回归 西瓜数据集 Python--sklearn
  13. python playsound播放时关闭_python - 使用playsound模块停止音频 - 堆栈内存溢出
  14. 不如意的人生,才是真实的。
  15. 全球各大网站的服务器使用什么操作系统和WEB服务器(转)
  16. echo和narcissus寓意_希腊神话故事(一)Echo 和 Narcissus(得不到的爱)
  17. Galaxy数据统计平台(二)
  18. SubShader中的LOD
  19. BIOS/固件设置中禁用Intel VT-x
  20. Mysql数据库和navicat

热门文章

  1. 不忘初心,持之以恒,笔耕不辍,利人利己
  2. 中学计算机课小课题,信息技术小课题研究题目大全
  3. VBS 对IBM Notes的常规操作
  4. 【荐课】10分钟速成课:经济学
  5. Flowable 流程实例
  6. 微信怎么收银行卡的消息服务器,微信零钱提现,这样操作,可以免去手续费
  7. OpenCASCADE:OCCT CSharp 示例
  8. 电源检测工具OCCT v10.1.6
  9. 在java中怎么表示三角函数_【Math】三角函数在Java中是怎么表示的?
  10. 大学计算机基础实训13,东南大学《大学计算机基础》实验13EXCEL图表制作.pdf