跳转至

一、多网融合概述

Air8000 开发板通过多网融合技术实现以太网、4G 与 WiFi 网络的协同工作,构建高效、稳定的物联网通信与定位系统。本篇以以太网作为主供网链路,为 Air8000 提供可靠的有线网络接入,同时通过内置 WiFi 模组开启 AP 热点功能,允许其他终端设备(如移动终端、传感器节点)无线接入,形成覆盖范围广、部署灵活的混合网络架构。

二、准备硬件环境

参考:Air8000 硬件环境清单,准备好硬件环境。

2.1 Air8000 整机开发板

三、准备软件环境

3.1 文章内容应用

1. 烧录工具:Luatools 工具

2. Air8000 烧录需要的固件和脚本文件:

内核固件:https://gitee.com/openLuat/LuatOS/tree/master/module/Air8000/core

脚本文件:https://gitee.com/openLuat/LuatOS/tree/master/module/Air8000/demo/multi-network/Air8000_wifi_networking_by_eth

3. LuatOS 运行所需要的 lib 文件:使用 Luatools 烧录时,勾选 添加默认 lib 选项,使用默认 lib 脚本文件。

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

3.2 API 介绍

这里仅介绍本篇文档所使用的 API,详情请查看:API 索引 - luatos@air8000 - 合宙模组资料中心

wlan.init()

初始化

wlan.createAP(ssid, passwd, gateway, netmask, channel, opts)

启动 AP

netdrv.ipv4(id, addr, mark, gw)

设置或读取 ipv4 地址

netdrv.napt(id)

开启或关闭 NAPT

netdrv.link(id)

获取 netdrv 的物理连接状态

四、实现功能概述

本小节教你怎么通过以太网和 WIFI 网络,实现 Air8000 工业引擎的配网系统。

4.1 本教程实现的功能定义是:

1. 初始化以太网模块,并通过硬件连接上网。

2. 启用 WiFi 的 AP 模式,使其他设备可以连接。

3. 配置网络共享,将以太网的网络共享给 WiFi。

4. 实现网络状态的监控和维护。

4.2 运行流程图

4.3 代码示例

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

--[[
本demo演示的功能是:
1. 初始化以太网模块,并通过硬件连接上网。
2. 启用 WiFi 的 AP 模式,使其他设备可以连接。
3. 配置网络共享,将以太网的网络共享给 WiFi。
4. 实现网络状态的监控和维护。
]]

-- 加载必要的模块
_G.sys = require("sys")
dhcpsrv = require("dhcpsrv")
dnsproxy = require("dnsproxy")

-- 以太网初始化
function init_eth()
    log.info("初始化以太网")
    -- 打开CH390供电
    gpio.setup(140, 1, gpio.PULLUP)
    sys.wait(100)

    -- 配置SPI和初始化网络驱动
    local result = spi.setup(
        1,--spi id
        nil,
        0,--CPHA
        0,--CPOL
        8,--数据宽度
        51200000--,--波特率
    )
    log.info("main", "open spi",result)
    if result ~= 0 then--返回值为0,表示打开成功
        log.info("main", "spi open error",result)
        return
    end

    local success = netdrv.setup(socket.LWIP_ETH, netdrv.CH390, {spi=1,cs=12})
    if not success then
        log.error("以太网初始化失败")
        return false
    end
    netdrv.dhcp(socket.LWIP_ETH, true)

    while 1 do
        local ip = netdrv.ipv4(socket.LWIP_ETH)
        if ip and ip ~= "0.0.0.0" then
            break
        end
        sys.wait(100)
    end
    iperf.server(socket.LWIP_ETH)

    log.info("以太网初始化完成")
    return true
end

-- WiFi AP初始化
function init_ap()
    log.info("初始化WiFi AP")
    wlan.init()
    sys.wait(300)

    -- 创建AP
    local success = wlan.createAP("Air8000_AP", "12345678")
    if not success then
        log.error("创建WiFi AP失败")
        return false
    end

    -- 配置AP的IP
    netdrv.ipv4(socket.LWIP_AP, "192.168.4.1", "255.255.255.0", "0.0.0.0")
    sys.wait(5000)

    -- 启用AP的DHCP服务
    dhcpsrv.create({adapter=socket.LWIP_AP})

    -- 设置DNS代理,将AP流量通过以太网转发
    dnsproxy.setup(socket.LWIP_AP, socket.LWIP_ETH)

    log.info("WiFi AP初始化完成")

    while 1 do
        if netdrv.ready(socket.LWIP_ETH) then
            log.info("以太网作为网关")
            netdrv.napt(socket.LWIP_ETH)
            break
        end
        sys.wait(1000)
    end
    icmp.setup(socket.LWIP_ETH)
    while 1 do
        -- 持续ping网关
        local ip,mark,gw = netdrv.ipv4(socket.LWIP_ETH)
        if gw then
            log.info("ping", gw)
            icmp.ping(socket.LWIP_ETH, gw)
        end
        sys.wait(10000)
    end

    return true
end

function ping_handle(id, time, dst)
    log.info("ping.result", id, time, dst);
end

-- wifi的AP相关事件
function ap_event_handle(evt, data)
    -- evt 可能的值有: "CONNECTED", "DISCONNECTED"
    -- 当evt=CONNECTED, data是连接的AP的新STA的MAC地址
    -- 当evt=DISCONNECTED, data是断开与AP连接的STA的MAC地址
    log.info("收到AP事件", evt, data and data:toHex())
end

-- 主任务
function main_task()
    -- 初始化以太网
    if not init_eth() then
        log.error("以太网初始化失败,退出")
        return
    end
    sys.wait(100)

    -- 初始化WiFi AP
    if not init_ap() then
        log.error("WiFi AP初始化失败,退出")
        return
    end
    sys.wait(100)

    -- 检查以太网链路状态
    while true do
        if netdrv.link(socket.LWIP_ETH) then
            log.info("以太网已连接")
            break
        else
            log.info("等待以太网连接...")
            sys.wait(1000)
        end
    end
    sys.wait(100)

    -- 循环保持任务运行
    while true do
        sys.wait(1000)
    end
end

sys.subscribe("PING_RESULT", ping_handle)
sys.subscribe("WLAN_AP_INC", ap_event_handle)
sys.taskInit(main_task)

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

五、功能演示

5.1 Air8000 开发板连接以太网

实现功能前,首先需要将 Air8000 通过网线连接到路由器 LAN 口。

硬件连接完毕后开始烧录代码,在 luatools 日志打印中我们可以看到以太网的相关打印,当日志输出以太网初始化完毕,则说明以太网准备就绪。

5.2 设备连接 Air8000 WIFI 热点

以太网连接上之后,我们可以用设备来连接 Air8000 的 WiFi 了。

这里用手机来演示,在手机的联网界面可以看到我们 Air8000 的热点,热点名称为:Air8000_AP,密码为:12345678

连接上之后,能看到我们成功使用 Air8000 的 WiFi 热点在网页上搜索到信息。

六、总结

至此,我们已使用 Air800 开发板 演示了多网融合-以太网供网给 Air8000 WiFi 上网功能。