跳转至

以太网

一、演示功能概述

本章节用两个示例演示 Air8000 开发板的以太网功能

第一个示例:Air8000 开发板通过 CH390 连接路由器,访问公网获取数据。

第二个示例:Air8000 开发板通过 CH390 连接电脑,使用 4G 转以太网功能,给电脑提供网络。

二、准备硬件环境

参考:硬件环境清单第二章节内容,准备以及组装好硬件环境。

2.1 Air8000 整机开发板

2.2 所需配件

2.3 开发板组合演示

2.3.1 LAN 功能硬件连接

2.3.2 WAN 功能硬件连接

三、准备软件环境

1. 烧录工具 Luatools

2. 内核固件文件(底层 core 固件文件):LuatOS-SoC_V2005_Air8000;此页面有新版本固件的话选用最新版本固件。

3. LuatOS 需要的脚本和资源文件:https://gitee.com/openLuat/LuatOS-Air8000/tree/master/Core_board_demo/netdrv/ch390

4. lib 脚本文件:使用 Luatools 烧录时,勾选 添加默认 lib 选项,使用默认 lib 脚本文件;

准备好软件环境之后,接下来查看如何烧录项目文件到 Air8000 开发板中,将本篇文章中演示使用的项目文件烧录到 Air8000 开发板中。

四、以太网软硬件资料

4.1 API 接口介绍

netdrv - luatos@air8000 - 合宙模组资料中心

4.2 硬件设计介绍

开发板中选用的是沁恒 CH390H 芯片来实现的以太网功能,具体硬件设计和硬件设计注意事项可以参考这篇文档:以太网 RJ45 电路 - luatos@air8000 - 合宙模组资料中心

五、代码示例介绍

5.1 代码介绍

5.1.1 main.lua

-- LuaTools需要PROJECT和VERSION这两个信息
PROJECT = "ch390h"
VERSION = "1.0.0"

-- 使用合宙iot平台时需要这个参数
PRODUCT_KEY = "xxx" -- 到 iot.openluat.com 创建项目,获取正确的项目id

-- 引入必要的库文件(lua编写), 内部库不需要require
sys = require("sys")
sysplus = require("sysplus")

-- pm.ioVol(pm.IOVOL_ALL_GPIO, 3300) -- 所有GPIO高电平输出3.0V

require "lan"
-- require "wan"

-- 用户代码已结束---------------------------------------------
-- 结尾总是这一句
sys.run()
-- sys.run()之后后面不要加任何语句!!!!!

5.1.2 wan.lua

PWR8000S = gpio.setup(23, 0, gpio.PULLUP) -- 关闭Air8000S的LDO供电

sys.taskInit(function()
    -- 稍微缓一下
    sys.wait(10)
    -- 初始化airlink
    airlink.init()
    -- 启动底层线程, 从机模式
    airlink.start(1)
    PWR8000S(1)

    sys.wait(3000)
    gpio.setup(140, 1, gpio.PULLUP)     --打开ch390供电
end)

sys.taskInit(function ()
    sys.wait(6000)
    local result = spi.setup(
        1,--spi_id
        nil,
        0,--CPHA
        0,--CPOL
        8,--数据宽度
        25600000--,--频率
        -- spi.MSB,--高低位顺序    可选,默认高位在前
        -- spi.master,--主模式     可选,默认主
        -- spi.full--全双工       可选,默认全双工
    )
    log.info("main", "open",result)
    if result ~= 0 then--返回值为0,表示打开成功
        log.info("main", "spi open error",result)
        return
    end
    -- 初始化指定netdrv设备,
    -- socket.LWIP_ETH 网络适配器编号
    -- netdrv.CH390外挂CH390
    -- SPI ID 1, 片选 GPIO12
    netdrv.setup(socket.LWIP_ETH, netdrv.CH390, {spi=1,cs=12})
    netdrv.dhcp(socket.LWIP_ETH, true)
end)

sys.taskInit(function()
    -- sys.waitUntil("IP_READY")
    while 1 do
        sys.wait(6000)
        log.info("http", http.request("GET", "http://httpbin.air32.cn/bytes/4096", nil, nil, {adapter=socket.LWIP_ETH}).wait())
        log.info("lua", rtos.meminfo())
        log.info("sys", rtos.meminfo("sys"))
    end
end)

5.1.3 lan.lua

dhcps = require "dhcpsrv"
dnsproxy = require "dnsproxy"

log.info("ch390", "打开LDO供电")

PWR8000S = gpio.setup(23, 0, gpio.PULLUP) -- 关闭Air8000S的LDO供电

sys.taskInit(function()
    -- 稍微缓一下
    sys.wait(10)
    -- 初始化airlink
    airlink.init()
    -- 启动底层线程, 从机模式
    airlink.start(1)
    PWR8000S(1)

    sys.wait(3000)
    gpio.setup(140, 1, gpio.PULLUP)     --打开ch390供电
end)

sys.taskInit(function ()
    sys.wait(6000)
    local result = spi.setup(
        1,--spi_id
        nil,
        0,--CPHA
        0,--CPOL
        8,--数据宽度
        25600000--,--频率
        -- spi.MSB,--高低位顺序    可选,默认高位在前
        -- spi.master,--主模式     可选,默认主
        -- spi.full--全双工       可选,默认全双工
    )
    log.info("main", "open",result)
    if result ~= 0 then--返回值为0,表示打开成功
        log.info("main", "spi open error",result)
        return
    end

    -- 初始化指定netdrv设备,
    -- socket.LWIP_ETH 网络适配器编号
    -- netdrv.CH390外挂CH390
    -- SPI ID 1, 片选 GPIO12
    netdrv.setup(socket.LWIP_ETH, netdrv.CH390, {spi=1,cs=12})
    sys.wait(3000)
    local ipv4,mark, gw = netdrv.ipv4(socket.LWIP_ETH, "192.168.4.1", "255.255.255.0", "192.168.4.1")
    log.info("ipv4", ipv4,mark, gw)
    while netdrv.link(socket.LWIP_ETH) ~= true do
        sys.wait(100)
    end
    while netdrv.link(socket.LWIP_GP) ~= true do
        sys.wait(100)
    end
    sys.wait(2000)
    dhcps.create({adapter=socket.LWIP_ETH})
    dnsproxy.setup(socket.LWIP_ETH, socket.LWIP_GP)
    netdrv.napt(socket.LWIP_GP)
    if iperf then
        log.info("启动iperf服务器端")
        iperf.server(socket.LWIP_ETH)
    end
end)

sys.taskInit(function()
    -- sys.waitUntil("IP_READY")
    while 1 do
        sys.wait(300000)
        -- log.info("http", http.request("GET", "http://httpbin.air32.cn/bytes/4096", nil, nil, {adapter=socket.LWIP_ETH}).wait())
        log.info("lua", rtos.meminfo())
        log.info("sys", rtos.meminfo("sys"))
        -- log.info("psram", rtos.meminfo("psram"))
    end
end)

5.2 WAN 功能测试

Air8000 开发板通过 CH390 连接路由器,访问公网获取数据。

将 main.lua 中的 -- require "wan" 注释打开,然后将脚本烧录进开发板,以太网正常 DHCP 后,获得 IP,6 秒一次循环向 http 服务器请求 4K 数据。

在 wan.lua 中,发起 http 请求通过{adapter=socket.LWIP_ETH}来指定通过以太网来联网。

如下图,可以看到运行结果。

5.3 LAN 功能测试

Air8000 开发板通过 CH390 连接电脑,使用 4G 转以太网功能,给电脑提供网络。

将 main.lua 中的 -- require "wan" 注释打开,然后将脚本烧录进开发板,将电脑其他上网途径关掉,仅打开以太网上网方式,通过网线将 Air8000 开发板与电脑相连。

代码烧录成功,网线连接正常,并且 4G 模块正常联网的情况下,运行结果参考下图。

六、总结

本教程演示了 Air8000 以太网功能的两种使用方式,请根据具体场景选择您需要的 demo 即可。

知识点:

关于 WAN :Air8000 作为一个网络设备接到路由器上,通过路由器上网传输数据,Air8000 的 WAN 功能,既支持 DHCP, 也支持静态 IP ;

关于 LAN:即路由器模式,其他需要联网传输数据的设备通过网线接到 Air8000 上,通过 Air8000 上网传输数据,Air8000 的 LAN 功能,自带 DHCP 服务器,DNS 转发服务器,NAPT 功能。