合宙Air105

2023-11-06

 基础资料

基于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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

合宙Air105 的相关文章

  • Python-UDP客户端

    我目前正在阅读Pythonbook https www nostarch com blackhatpython并遇到了以下示例 import socket target host 127 0 0 1 target port 80 creat
  • UdpClient 在广播地址上接收

    在 c 中 我使用 UdpClient Receive 函数 public void StartUdpListener Object state try udpServer new UdpClient new IPEndPoint IPAd
  • Java:使用多个 DatagramSocket 接收 UDP 数据报包

    我正在尝试实现一种将 UDP 数据包发送到多个接收者的方法 我认为这应该是可行的设置setReuseAddress true 在接收 DatagramSocket 实例上 我的问题是 在某些情况下 我需要限制与本地计算机的通信 因此限制本地
  • udp数据包被tcpdump捕获,但没有被套接字接收[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我编写了一个 rawudp 程序 通过原始套接字发送 udp 数据包 按照网页http www tenouk com Module43a html h
  • 为什么UDP服务器上的UDP客户端端口会改变

    我一直在关注一个简 单的 UDP 服务器 客户端教程 发现here http www binarytides com udp socket programming in winsock 我有一个关于客户端连接到服务器的端口的快速问题 仅从代
  • 将 Docker 容器连接到网络接口/设备而不是 IP 地址

    经过仔细的研究 测试和摆弄 我只能找到通过从 IP 端口转发来将 Docker 容器连接到给定接口的方法 这可以通过添加来完成 p Host IP Host Port Container Port to a docker run命令 我有一
  • Go:如何接收整个 UDP 数据报

    我的问题 使用 net Read 方法仅复制给定字节数组或切片大小的字节数 当然 我不想每次都分配最大 64 kB 的 UDP 数据报 有没有go如何确定数据报的大小 位于数据报头中 或再次读取直到数据报完全读取 Try 从UDP读取 ht
  • 什么是消息边界?

    什么是 消息边界 在以下情况下 TCP 和 UDP 之间的区别之一是 UDP 保留消息 边界 我理解之间的区别TCP and UDP 但我不确定的定义 消息边界 由于 UDP 在每个单独的数据包中包含目的地和端口信息 因此是否可以为消息提供
  • 自 2012 年以来,WinSock 注册 IO 性能是否有所下降?

    我最近使用 MS 为该 API 提供的稍微可接受的文档编写了基于 WinSock Registered IO RIO 的 UDP 接收 最终的性能非常令人失望 单套接字性能有些稳定 约为每秒 180k 数据包 使用多个 RSS 队列 即多个
  • Python UDP广播不发送

    我正在尝试从 Python 程序到两个 LabView 程序进行 UDP 广播 我似乎无法发送广播 我不确定我的套接字初始化错误在哪里 广播似乎足够简单 据我所知 其他电脑没有收到任何数据 另外 我将来还需要这个程序来接收来自其他电脑的数据
  • Rails 是否支持侦听 UDP 套接字的简洁方式?

    在 Rails 中 集成更新模型某些元素的 UDP 侦听过程的最佳方式是什么 特别是向其中一个表添加行 简单的答案似乎是在同一进程中使用 UDP 套接字对象启动一个线程 但不清楚我应该在哪里执行适合 Rails 方式的操作 有没有一种巧妙的
  • 为什么 SNMP 通常在 UDP 上运行而不是 TCP/IP 上?

    今天早上 工作中出现了大问题 因为 SNMP 陷阱没有 通过 因为 SNMP 是通过 UDP 运行的 我记得在大学网络课上 UDP 不能像 TCP IP 那样保证传输 维基百科说 SNMP 可以在 TCP IP 上运行 但 UDP 更常见
  • P2P网络游戏/应用程序:类似“战网”匹配服务器的不错选择

    我正在制作一个网络游戏 1v1 游戏中是 p2p 不需要游戏服务器 然而 为了让玩家能够 找到彼此 而不需要在另一种媒介中协调并输入IP地址 类似于网络游戏的现代时代 我需要有一个协调 匹配服务器 我无法使用常规网络托管 因为 客户端将使用
  • 为什么 UDP 服务器中只有一个套接字?

    我正在准备考试 发现了这个问题 典型的 UDP 服务器可以使用单个套接字来实现 解释一下为什么 对于 TCP 驱动的服务器 我发现创建了两个套接字 一个用于所有客户端访问服务器 另一个用于每个客户端的特定 套接字 用于服务器和客户端之间的进
  • 为什么 Kademlia 使用 UDP?

    为什么Kademlia 分布式哈希表 http en wikipedia org wiki Kademlia使用 UDP 作为其网络传输协议 即使它不可靠 主要原因是您快速查询了许多以前从未建立过联系并且可能在查找过程中永远不会再看到的节点
  • 用 C 语言进行非阻塞 udp 套接字编程:我能得到什么?

    我在理解从非阻塞 UDP 套接字返回什么recv recvfrom 时遇到问题 与 TCP 相比更具体一点 如果我错了 请纠正我 阻塞套接字 TCP 或 UDP 在缓冲区中有一些数据之前不会从 recv 返回 这可以是一定数量的字节 TCP
  • 使用多个 NIC 广播 UDP 数据包

    我正在 Linux 中为相机控制器构建嵌入式系统 非实时 我在让网络做我想做的事情时遇到问题 该系统有 3 个 NIC 1 个 100base T 和 2 个千兆端口 我将较慢的连接到相机 这就是它支持的全部 而较快的连接是与其他机器的点对
  • C# 套接字数据报溢出

    我是 C 新手 我有一个关于udp套接字的小问题 我有一个聊天服务器 它接收特定结构的数据包 udp 数据报 为什么程序在套接字缓冲区已满时才接收数据 难道以后的一切就不应该失去吗 也许会出现数据包碎片 数据包结构 udp headers
  • 通过 UDP 从服务器向 iPhone 发送大量实时处理的数据

    我正在实施一个远程应用程序 服务器将实时处理和渲染数据作为动画 准确地说 是一系列图像 每次渲染图像时 都会通过 UDP 将图像传输到接收 iPhone 客户端 我研究了一些UDP 我知道以下几点 UDP 的最大大小约为 65k 不过 iP
  • UDP打洞

    我有一些关于 UDP 打洞的问题 基于维基百科http en wikipedia org wiki UDP hole punching http en wikipedia org wiki UDP hole punching 1 要在两方

随机推荐

  • vi笔记附录1--vi之配置一个强大的c语言、python IED

    vi笔记附录1 vi之配置一个强大的c语言 python IED 2020 11 07 更新 三 vim特殊使用方法 12 NERDTree NERDTreeDirArrowExpandable 报错 一 vim效果图 话不多说 想知道vi
  • cocos2d-x学习笔记—图片按钮

    cpp view plain copy button cpp buttontest include MyButtonScene h include SimpleAudioEngine h using namespace cocos2d us
  • 【TinyHttpd学习笔记】500行的纯C语言Http服务器(含注释和webbench测试结果)

    目录 从main函数开始 初始化函数startup port 请求处理accept request client sock 请求行的处理 本地处理 测试结果 服务器功能测试 使用webbench测试 Tinyhttpd是一个小型的http服
  • 【PTA】数字黑洞123

    任意给定一个整数 数出这个数中的偶数个数 奇数个数 及这个数中所包含的所有位数的总数 然后将得到的这三个数按照 偶 奇 总 的位序重新排列 得到一个新的整数 将得到的新的整数重复上面的操作 经过有限次的这样的重复操作后 最终得到123这个整
  • typeScript第三篇tsconfig.json配置文件、namespace命名空间、三斜线指令、声明文件d.ts、Mixins混入、装饰器Decorator、Rollup、webpack构建TS

    一 配置 tsconfig json文件 文件生成 tsc init 命令生成 配置详解 compilerOptions incremental true TS编译器在第一次编译之后会生成一个存储编译信息的文件 第二次编译会在第一次的基础上
  • python面向对象程序设计三大特点:封装、继承、多态、类方法@classmethod、类属性、静态方法@staticmethod、object类

    注意 1 类的私有属性 私有方法 在类的外部 对象 也就是类的实例 是无法访问的 如果要访问 可以在类的内部 再定义一个方法 让它去访问私有属性和私有方法 然后在类的外部 通过调用这个方法 就能轻松访问到类的私有属性和私有方法了 2 当形参
  • esp32添加头文件

    环境 linux idf vsode 前言 在按照官方教程安装完成后 虽然可以编译成功 但是有些函数找不到定义 而且强迫症看到波浪号也非常难受 方法 点击小灯泡 点击第一个选项 如下图所示 拉到底点击advanced settings 让v
  • 代码随想录算法训练营打卡第二天|LC 977, 209, 59

    今天开始感受到题目的难度 特别是59 第一次遇到螺旋矩阵 卡尔的视频看了文字看了还是不懂 后来别的博主的写法看懂了 这2天刷完array 的节奏还是很快的 目测以后完成打卡的时间要增加
  • eNSP静态路由实验

    静态综合作业 将实验思路及配置过程整理后发出 思路 底层 所有节点拥有合法ip地址 R1 R2 R3 R4 R5
  • openGL着色器 (shader)

    着色器 shader 着色器 Shader 就是运行在GPU上的小程序 这些小程序在图形渲染管线的某个特定部分而运行 从基本意义上来说 着色器只是一种把输入转化为输出的程序 着色器也是一种非常独立的程序 因为它们之间不能相互通信 它们之间唯
  • Web前端知识点复习总结

    目录 1 HTML简介 2 CSS 2 1 盒子模型 2 2 float 浮动 3 JavaScript 4 jQuery 5 Bootstrap 1 HTML简介 HTML 超文本标记语言 用于编写网页 超文本 超文本是用超链接的方法 将
  • JAVA基础(JDK+环境变量+首个程序HelloWorld.java)

    Day01 Java开发笔记 1 交互方式 2 键盘基本功能键 3 键盘快捷键 4 常用dos命令 5 java语言平台版本 6 java语言特点 7 java的两大器件 8 第一个java程序 HelloWorld java 9 环境变量
  • 计算机视觉(五):使用SVM分类Cifar-10数据集

    1 引言 之前我们使用了K NN对Cifar 10数据集进行了图片分类 正确率只有不到30 但是还是比10 高的 手动滑稽 这次我们将学习使用SVM分类器来对Cafi 10数据集实现分类 但是正确率应该也不会很高 要想继续提高正确率 就要对
  • 操作系统——存储管理-段式存储组织——2020.11.25

    存储管理 段式存储组织 一丶段式存储 嗟险阻 叹飘零 关山万里作雄行 一丶段式存储 按用户作业中的自然段来划分逻辑空间 然后调入内存 段的长度可以不一样 我们在进行页式存储时 由于页内地址都是一样的 所以我们只需要去需要页号和页帧号就行了
  • 微信小程序:页面或者按钮为什么会抖一下?

    其实不仅仅是小程序 我们再搞前端点击按钮或者切换状态时都会出现页面 抖动 的情况 举个例子我们自己设置一些选项按钮 让用户切换选择对应选项 有的会发现切换这个对应的按钮会发现按钮会 抖动一下 之所以抖动的原因就是 切换 选择 和 未选择 的
  • [视频图像处理]1. 色域基础知识与色域转换公式

    常见色域基础知识与色域转换公式 所谓色域 Color Space 就是一种颜色的表示方法 针对不同的显示设备不同的系统 往往有不同的表示方法 目前被广泛使用的色域可以被分为三大类 RGB YIQ YUV YCrCb CMYK RGB应用最广
  • Linux常用命令_文件处理命令:su root

    文章目录 1 命令格式与目录处理命令ls 1 1 命令格式 1 2 目录处理命令 ls 2 目录处理命令 2 1 目录处理命令 mkdir 2 2 目录处理命令 cd 2 3 目录处理命令 pwd 2 4 目录处理命令 rmdir 2 5
  • 使用arcgis修改行政区划图边界

    打开ArcMap 我的是10 8版本的 1 添加行政区划图数据 文件 添加数据 添加数据 弹出添加数据框 点击红色框中的按钮 连接到数据所在文件夹 选择要处理的数据 添加 不便放入整体规划图 放大后选取部分作为示例 本次处理目的是把红色框中
  • 3d散列点云的曲率的求法

    1 取某个区域内的n个最近邻点根据局部抛物面拟合公式 z x y Ax 2 By 2 Cxy Dx Ey F 用最小二乘法可求出上面的各个系数 即可求得空间曲面函数的系数 2 根据公式 Km A 1 E 2 B 1 D 2 CDE 1 D
  • 合宙Air105

    基础资料 基于Air105开发板 Air105 LuatOS 文档 上手 开发上手 LuatOS 文档 探讨重点 对官方Socket网络接口demo中DTU连接示例 dtu demo lua 进行复现及分析 进行用阻塞方式做串口透传DTU内