以太网
一、以太网概述
以太网外设驱动实现涉及硬件与软件的深度交互,其核心在于通过特定接口连接主处理器与以太网控制器,实现数据的发送、接收以及数据链路层处理等功能,部分控制器还集成了 TCP/IP 协议栈以简化网络应用开发,从而支持多通道通信和高效的网络数据传输。
二、准备硬件环境
“古人云:‘工欲善其事,必先利其器。’在深入介绍本功能示例之前,我们首先需要确保以下硬件环境的准备工作已经完成。”
参考:硬件环境清单,准备以及组装好硬件环境。
注:购买链接:以太网 LAN 8720 网络模块
LAN8720 和 Air8101A 接线图如下图所示
实物连接图如下
三、准备软件环境
“凡事预则立,不预则废。”在详细阐述本功能示例之前,我们需先精心筹备好以下软件环境。
3.1 合宙模组相关工业引擎
3.1.1. Luatools 工具;
3.1.2.内核固件文件(底层 core 固件文件):
LuatOS-SoC_V1002_Air8101.soc;参考:项目使用的内核固件
3.1.3luatos 需要的脚本和资源文件
脚本和资源文件:https://gitee.com/openLuat/LuatOS-Air8101/tree/master/demo/netdrv
lib 脚本文件:使用 Luatools 烧录时,勾选 添加默认 lib 选项,使用默认 lib 脚本文件;
准备好软件环境之后,接下来查看如何烧录项目文件到 Air8101A 开发板,将本篇文章中演示使用的项目文件烧录到 Air8101 开发板中。
四、以太网的概述
本小节教你怎么使用 luatos 脚本语言,就可以让合宙 4G 模组通过 LAN8720 网络模块连接网络并且 GET"http://httpbin.air32.cn/get"。
4.1 文章内容引用
- 以上接口函数不做详细介绍,可通过此链接查看具体介绍:netdrv - 网络设备管理
4.2 核心脚本代码详解
4.2.1 初始化指定 netdrv 设备
netdrv.setup(id, tp, opts)
参数
返回值
例子
-- Air8101初始化内部以太网控制器
netdrv.setup(socket.LWIP_ETH)
-- Air8000/Air780EPM初始化CH390H/D作为LAN口, 单一使用.不含WAN.
netdrv.setup(socket.LWIP_ETH, netdrv.CH390, {spiid=0,cs=8})
netdrv.dhcp(socket.LWIP_ETH, true)
4.2.2 开启或关闭 DHCP
netdrv.dhcp(id, enable)
参数
返回值
例子
netdrv.dhcp(socket.LWIP_ETH, true)
4.2.3 设置或获取设备 MAC
netdrv.mac(id, new_mac, raw_string)
参数
返回值
例子
-- 获取MAC地址
log.info("netdrv", "mac addr", netdrv.mac(socket.LWIP_ETH))
-- 暂不支持设置
4.2.4 设置或读取 ipv4 地址
netdrv.ipv4(id, addr, mark, gw)
参数
返回值
例子
-- 注意, 不是所有netdrv都支持设置的, 尤其4G Cat.1自带的netdrv就不能设置ipv4
-- 注意, 设置ipv4时, DHCP要处于关闭状态!!
4.2.5 开启或关闭 NAPT
netdrv.napt(id)
参数
返回值
例子
-- 使用4G网络作为主网关出口
netdrv.napt(socket.LWIP_GP)
-- 关闭napt功能
netdrv.napt(socket.LWIP_GP)
4.2.5 获取 netdrv 的物理连接状态
netdrv.link(id)
参数
返回值
例子
-- 注意, 本函数仅支持读取, 而且不能ip状态, 即是否能联网
log.info("连接状态:",netdrv.link(socket.LWIP_ETH))
4.2.6 获取 netdrv 的网络状态
netdrv.ready(id)
参数
返回值
例子
-- 注意, 本函数仅支持读取, 而且不能ip状态, 即是否能联网
log.info("网络状态:",netdrv.ready(socket.LWIP_ETH))
4.3 成果演示与深度解析:图文全面展示
4.3.1 成果运行精彩呈现
4.3.2 完整实例深度剖析
-- LuaTools需要PROJECT和VERSION这两个信息
PROJECT = "netdrv"
VERSION = "1.0.4"
-- sys库是标配
_G.sys = require("sys")
--[[特别注意, 使用mqtt库需要下列语句]]
_G.sysplus = require("sysplus")
sys.taskInit(function()
sys.wait(500)
gpio.setup(13, 1, gpio.PULLUP) -- 打开开发板的LDO供电,否则3.3V没电
netdrv.setup(socket.LWIP_ETH)
-- log.info("设置启用DHCP")
netdrv.dhcp(socket.LWIP_ETH, true)
-- log.info("设置静态IPV4")
-- netdrv.ipv4(socket.LWIP_ETH, "192.168.1.129", "255.255.255.0", "192.168.1.1")
-- log.info("ip", socket.localIP(socket.LWIP_ETH))
end)
sys.taskInit(function()
--sys.waitUntil("IP_READY")
while 1 do
sys.wait(6000)
log.info("http", http.request("GET", "http://httpbin.air32.cn/get", nil, nil, {adapter=socket.LWIP_ETH,timeout=3000}).wait())
log.info("lua", rtos.meminfo())
log.info("sys", rtos.meminfo("sys"))
log.info("ip", socket.localIP(socket.LWIP_ETH))
end
end)
-- 用户代码已结束---------------------------------------------
-- 结尾总是这一句
sys.run()
-- sys.run()之后后面不要加任何语句!!!!!
五、总结
合宙的 netdrv 接口提供了一系列网络配置与管理功能,包括通过 netdrv.setup
进行接口初始化与配置,netdrv.dhcp
用于启用或禁用 DHCP 服务,netdrv.mac
允许设置新的 MAC 地址,netdrv.ipv4
配置 IPv4 地址、子网掩码及网关,netdrv.napt
实现网络地址端口转换(NAPT),以及 netdrv.link
用于管理网络连接的建立与状态。这些函数共同构成了强大的网络配置与管理工具集。
六、常见问题
1、以太网模块灯不亮
查看供电是否正常,接线是否正确,参考本文档第二章节。
七、扩展
后续在此补充,敬请期待。