合宙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服務端口設置為14000dtu_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/?:04021206985671032DTU透傳(采用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") endUDP協議下的透傳實例?:
連接過程中的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网络接口-双机互联透传的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 同事关系再好也别表现,学做曾国藩和左宗棠
- 下一篇: STM32F103 16路PWM 配置