合宙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 的相关文章

  • 播放 UDP 数据包中收到的原始 PCM 音频

    远程设备正在 UDP 数据包中发送实时原始 PCM 音频 不包含标头 我需要在 java 中实现一个程序来接收这些数据包并在 PC 上实时播放它们 据我所知 原始 PCM 的属性是 16 位 单声道 采样率 24KHz 因此我尝试向该原始
  • UDP 数据包在交付时是否保证是完整的、具有实际意义的?

    众所周知 UDP 用户数据报协议 并不安全 因为用它发送的数据包的顺序可能不按顺序传送 甚至根本不按顺序传送 但是 如果发送了 UDP 数据包 该数据包中的信息在实际意义上 99 99 及以上 是否保证正确 在实际意义上 99 99 及以上
  • Android udp 多播与以太网

    大家好 我正在开发一个使用 udp 多播的项目 我有一台服务器通过以太网电缆发送多播 udp 数据包 我花了几周的时间阅读有关 android 上多播的所有帖子 但我仍然无法在我的 Asus Transformer Tablet 4 1 上
  • UDP 服务器套接字缓冲区溢出

    我正在 Linux 上编写 C 应用程序 我的应用程序有一个 UDP 服务器 它在某些事件上向客户端发送数据 UDP 服务器还接收来自客户端的一些反馈 确认 为了实现这个应用程序 我使用了一个 UDP 套接字 例如int fdSocket
  • Spark Scala UDP 在侦听端口上接收

    中提到的例子http spark apache org docs latest streaming programming guide html http spark apache org docs latest streaming pro
  • Android 上的 UDP 视频流

    我有一个 Android 项目 需要构建一个客户端应用程序来接收 UDP 或 RTP 单播视频流并播放它们 不幸的是 我似乎无法使其正常工作 并且已经广泛搜索了解决方案 我已经在 Xoom Android 3 2 和 Nexus S And
  • C++ 反序列化通过 UDP 从 C# 应用程序发送的对象

    我有一个申请c 它连接到另一个应用程序 编写为c 通过UDP 我更喜欢高性能的解决方案 因为我希望测量事件客户端 某些处理服务器端和客户端处理完成的响应之间的时间 本质上是 往返延迟 我有一个 C 对象 例如 public class Pa
  • 当网络上的所有计算机都具有相同的公共IP地址时,如何向特定计算机发送UDP数据包? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 这就是问题 它非常简单 理解 我家里有 2 台电脑 它们都有相同的公共 IP 地址 例如 1 2 3 4 我在咖啡馆有一台计算机 不同的网络 因此它具
  • 如何监听任意端口的广播包?

    使用 NET 如何在任何端口上侦听发送到 255的udp广播数据包 而不需要绑定到特定端口 我自己找到了办法 它是这样工作的 mainSocket new Socket AddressFamily InterNetwork SocketTy
  • 互联网上的 UDP 多播?

    我不确定如何最好地解决我的问题 我有一个在远程计算机上运行的服务 用于接收和处理 UDP 数据包 我希望该服务能够将这些数据包重新发送给任何需要它们的人 可能是任何人 通常是一台机器 但也可能更多 我认为 UDP 多播将是理想的 该服务可以
  • 为什么我们可以将 sockaddr 转换为 sockaddr_in

    我明白为什么强制转换很有用sockaddr to sockaddr in 但我不明白这怎么可能 据我所知 它们的大小相同sockaddr in添加了sin zero使其大小相同 我想知道编译器如何知道从哪里获取信息sockaddr in如果
  • 使用 STUN 打孔

    我目前正在尝试通过 Internet 发送 UDP 消息 并且必须为端点 A 和 B 都位于 NAT 后面 设置防火墙 为此 我想使用 STUN 服务器进行打孔 当 A 创建对 STUN 服务器的请求 例如 私有 85 1 1 12 600
  • 您可以bind()和connect() UDP连接的两端吗

    我正在编写一个点对点消息队列系统 它必须能够通过 UDP 运行 我可以任意选择一侧或另一侧作为 服务器 但这似乎不太正确 因为两端都从另一端发送和接收相同类型的数据 是否可以绑定 和连接 两端 以便它们只能彼此发送 接收 这似乎是一种非常对
  • 在 PowerShell 中通过 UDP 发送和接收数据

    我正在尝试编写一个脚本来使用 PowerShell 进行测试和应用 测试应包括通过 UDP 向远程服务器发送字符串 然后读取该服务器的响应并对结果执行某些操作 我需要的唯一帮助是脚本的中间两个步骤 发送字符串 然后 接收响应 在端口 UDP
  • 视频流上的 TCP 与 UDP

    我刚从网络编程考试回来 他们问我们的问题之一是 如果您要传输视频 您会使用 TCP 还是 UDP 请解释一下存储视频和实时视频流 对于这个问题 他们只是希望得到一个简短的答案 TCP 用于存储视频 UDP 用于实时视频 但我在回家的路上想到
  • 为什么 SNMP 通常在 UDP 上运行而不是 TCP/IP 上?

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

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

    我在过去的两天里阅读了每一篇StackOverflow问题和答案 以及googling当然 关于印地TCP and UDP协议 以便决定在我的用户应用程序和 Windows 服务之间的通信方法中应该使用哪一种 从我目前所看到的来看 UDP是
  • 为什么SOCKS5需要通过UDP中继UDP?

    The SOCKS5 https en wikipedia org wiki SOCKS SOCKS5协议 描述为RFC1928 https www rfc editor org rfc rfc1928提供对 UDP 的支持 总而言之 希望
  • UDP接收和发送Matlab

    我目前正在努力从外部设备接收数据包 然后将数据发送到另一个设备 我有一个工作 Simulink 模型 但我不知道如何在 Matlab 中对其进行编码 Matlab 中 UDP 接收块的参数如下图所示UDP 接收参数 https i stac

随机推荐

  • 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内