Parcourir la source

update:更新Air8000 netdrv demo

wjq il y a 1 mois
Parent
commit
9b472e4b1d

+ 0 - 27
module/Air8000/demo/netdrv/ch390/httpsrv/index.html

@@ -1,27 +0,0 @@
-<!DOCTYPE html>
-<html>
-    <header>
-        <meta charset="utf-8"/>
-        <title>Http Server Get-Start</title>
-        <!-- fetch api-->
-        <script type="text/javascript">
-            function led(key) {
-                fetch("/led/" + key)
-            }
-        </script>
-    </header>
-    <body>
-        <h2>点击按钮, led灯会亮起或熄灭</h2>
-        <div>
-            <div>
-                <button onclick="led(1)">LED亮</button>
-            </div>
-            <div>
-                <button onclick="led(0)">LED灭</button>
-            </div>
-        </div>
-        <div>
-            <h4>Power by <a href="https://docs.openluat.com">LuatOS</a></h4>
-        </div>
-    </body>
-</html>

+ 0 - 78
module/Air8000/demo/netdrv/ch390/httpsrv/lan.lua

@@ -1,78 +0,0 @@
-dhcps = require "dhcpsrv"
-dnsproxy = require "dnsproxy"
-
-local LEDA = gpio.setup(146, 0, gpio.PULLUP)
-sys.taskInit(function()
-    sys.wait(500)
-    log.info("ch390", "打开LDO供电")
-    gpio.setup(140, 1, gpio.PULLUP) -- 打开ch390供电
-    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)
-        httpsrv.start(80, function(client, method, uri, headers, body)
-        -- method 是字符串, 例如 GET POST PUT DELETE
-        -- uri 也是字符串 例如 / /api/abc
-        -- headers table类型
-        -- body 字符串
-        log.info("httpsrv", method, uri, json.encode(headers), body)
-        -- meminfo()
-        if uri == "/led/1" then
-            LEDA(1)
-            return 200, {}, "ok"
-        elseif uri == "/led/0" then
-            LEDA(0)
-            return 200, {}, "ok"
-        end
-        return 404, {}, "Not Found" .. uri
-        -- 返回值的约定 code, headers, body
-        -- 若没有返回值, 则默认 404, {} ,""
-    end, socket.LWIP_ETH)
-    if iperf then
-        log.info("启动iperf服务器端")
-        iperf.server(socket.LWIP_ETH)
-    end
-end)
-
-sys.taskInit(function()
-    while 1 do
-        sys.wait(300000)
-        log.info("lua", rtos.meminfo())
-        log.info("sys", rtos.meminfo("sys"))
-    end
-end)

+ 0 - 18
module/Air8000/demo/netdrv/ch390/httpsrv/main.lua

@@ -1,18 +0,0 @@
--- 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")
-
-require "lan"
--- require "wan"
-
--- 用户代码已结束---------------------------------------------
--- 结尾总是这一句
-sys.run()
--- sys.run()之后后面不要加任何语句!!!!!

+ 0 - 73
module/Air8000/demo/netdrv/ch390/httpsrv/wan.lua

@@ -1,73 +0,0 @@
-
-sys = require("sys")
-sysplus = require("sysplus")
-sys.taskInit(function ()
-    log.info("ch390", "打开LDO供电")
-    gpio.setup(140, 1, gpio.PULLUP)     --打开ch390供电
-    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.setup(socket.LWIP_ETH, netdrv.CH390, {spi=1,cs=12})
-    netdrv.dhcp(socket.LWIP_ETH, true)
-end)
-
-local LEDA = gpio.setup(146, 0, gpio.PULLUP)
-
-sys.taskInit(function()
-    -- 等以太网就绪
-    while 1 do
-        local result, ip, adapter = sys.waitUntil("IP_READY", 3000)
-        log.info("ready?", result, ip, adapter)
-        if adapter and adapter ==  socket.LWIP_ETH then
-            break
-        end
-    end
-    
-    sys.wait(200)
-    httpsrv.start(80, function(client, method, uri, headers, body)
-        -- method 是字符串, 例如 GET POST PUT DELETE
-        -- uri 也是字符串 例如 / /api/abc
-        -- headers table类型
-        -- body 字符串
-        log.info("httpsrv", method, uri, json.encode(headers), body)
-        -- meminfo()
-        if uri == "/led/1" then
-            LEDA(1)
-            return 200, {}, "ok"
-        elseif uri == "/led/0" then
-            LEDA(0)
-            return 200, {}, "ok"
-        end
-        return 404, {}, "Not Found" .. uri
-        -- 返回值的约定 code, headers, body
-        -- 若没有返回值, 则默认 404, {} ,""
-    end, socket.LWIP_ETH)
-    iperf.server(socket.LWIP_ETH)
-    while 1 do
-        sys.wait(6000)
-        local code, headers, body = http.request("GET", "http://httpbin.air32.cn/bytes/4096", nil, nil, {adapter=socket.LWIP_ETH}).wait()
-        log.info("http", code, headers, body and #body)
-        log.info("lua", rtos.meminfo())
-        log.info("sys", rtos.meminfo("sys"))
-    end
-end)
-
--- 用户代码已结束---------------------------------------------
--- 结尾总是这一句
-sys.run()
--- sys.run()之后后面不要加任何语句!!!!!

+ 0 - 64
module/Air8000/demo/netdrv/ch390/lan/lan.lua

@@ -1,64 +0,0 @@
-
-
-
-dhcps = require "dhcpsrv"
-dnsproxy = require "dnsproxy"
-
-
-sys.taskInit(function ()
-    sys.wait(500)
-    log.info("ch390", "打开LDO供电")
-    gpio.setup(140, 1, gpio.PULLUP)     --打开ch390供电
-    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)

+ 0 - 22
module/Air8000/demo/netdrv/ch390/lan/main.lua

@@ -1,22 +0,0 @@
--- 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.3V
-
-require "lan"
--- require "wan"
-
--- 用户代码已结束---------------------------------------------
--- 结尾总是这一句
-sys.run()
--- sys.run()之后后面不要加任何语句!!!!!
-

+ 0 - 183
module/Air8000/demo/netdrv/ch390/lan_TCP/main.lua

@@ -1,183 +0,0 @@
--- main.lua文件
-
--- LuaTools需要PROJECT和VERSION这两个信息
-PROJECT = "lan_tcp"
-VERSION = "1.0.0"
-
-log.info("main", PROJECT, VERSION)
-
-local taskName = "TCP_TASK"             -- sysplus库用到的任务名称,也作为任务id
-
-dhcps = require "dhcpsrv"
-dnsproxy = require "dnsproxy"
-if wdt then
-    --添加硬狗防止程序卡死,在支持的设备上启用这个功能
-    wdt.init(9000)--初始化watchdog设置为9s
-    sys.timerLoopStart(wdt.feed, 3000)--3s喂一次狗
-end
-
-local uartid = 1 -- 根据实际设备选取不同的uartid
-local uart_rx_buff = zbuff.create(1024)     -- 串口接收到的数据
-
-local libnet = require "libnet"         -- libnet库,支持tcp、udp协议所用的同步阻塞接口
-local ip = "192.168.4.100"               -- 连接tcp服务器的ip地址
-local port = 777            -- 连接tcp服务器的端口
-local netCB = nil                       -- socket服务的回调函数
-local connect_state = false             -- 连接状态 true:已连接   false:未连接
-local protocol = false                  -- 通讯协议 true:UDP协议  false:TCP协议
-local ssl = false                     -- 加密传输 true:加密     false:不加密
-local tx_buff = zbuff.create(1024)      -- 发送至tcp服务器的数据
-local rx_buff = zbuff.create(1024)      -- 从tcp服务器接收到的数据
-
---初始化
-uart.setup(
-    uartid,--串口id
-    115200,--波特率
-    8,--数据位
-    1--停止位
-)
-
-sys.taskInit(function ()
-    sys.wait(500)
-    log.info("ch390", "打开LDO供电")
-    gpio.setup(140, 1, gpio.PULLUP)     --打开ch390供电
-    sys.wait(3000)
-    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)
-
-function TCP_TASK()
-    sys.waitUntil("IP_READY")                -- 等待联网成功
-    -- 打印一下连接的目标ip和端口号
-    log.info("connect ip: ", ip, "port:", port)
-    
-    netCB = socket.create(socket.LWIP_ETH, taskName)     -- 创建socket对象
-    socket.debug(netCB, true)                -- 打开调试日志
-    socket.config(netCB, nil, protocol, ssl)      -- 此配置为TCP连接,无SSL加密
-
-    -- 收取数据会触发回调, 这里的"receive" 是固定值不要修改。
-    uart.on(uartid, "receive", function(id, len)
-        while true do
-            local len = uart.rx(id, uart_rx_buff)   -- 接收串口收到的数据,并赋值到uart_rx_buff
-            if len <= 0 then    -- 接收到的字节长度为0 则退出
-                break
-            end
-            -- 如果已经在线了,则发送socket.EVENT消息来打断任务里的阻塞等待状态,让任务循环继续
-            if connect_state then
-                sys_send(taskName, socket.EVENT, 0)
-            end
-        end
-    end)
-
-    -- 串口和TCP服务器的交互逻辑
-    while true do
-        -- 连接服务器,返回是否连接成功
-        result = libnet.connect(taskName, 15000, netCB, ip, port)
-
-        -- 如果连接成功,则改变连接状态参数,并且随便发一条数据到服务器,看服务器能不能收到
-        if result then
-            connect_state = true
-            libnet.tx(taskName, 0, netCB, "TCP  CONNECT")
-        end
-
-        -- 连接上服务器后,等待处理接收服务器下行至模块的数据 和 发送串口的数据到服务器
-        while result do
-            succ, param, _, _ = socket.rx(netCB, rx_buff)   -- 接收数据
-            if not succ then
-                log.info("服务器断开了", succ, param, ip, port)
-                break
-            end
-
-            if rx_buff:used() > 0 then
-                log.info("收到服务器数据,长度", rx_buff:used())
-
-                uart.tx(uartid, rx_buff)    -- 从服务器收到的数据转发 从串口输出
-                rx_buff:del()
-            end
-
-            tx_buff:copy(nil, uart_rx_buff)         -- 将串口数据赋值给tcp待发送数据的buff中
-            uart_rx_buff:del()                      -- 清除串口buff的数据长度
-            if tx_buff:used() > 0 then
-                log.info("发送到服务器数据,长度", tx_buff:used())
-                local result = libnet.tx(taskName, 0, netCB, tx_buff)   -- 发送数据
-                if not result then
-                    log.info("发送失败了", result, param)
-                    break
-                end
-            end
-            tx_buff:del()
-
-            -- 如果zbuff对象长度超出,需要重新分配下空间
-            if uart_rx_buff:len() > 1024 then
-                uart_rx_buff:resize(1024)
-            end
-            if tx_buff:len() > 1024 then
-                tx_buff:resize(1024)
-            end
-            if rx_buff:len() > 1024 then
-                rx_buff:resize(1024)
-            end
-            log.info(rtos.meminfo("sys"))   -- 打印系统内存
-
-            -- 阻塞等待新的消息到来,比如服务器下发,串口接收到数据
-            result, param = libnet.wait(taskName, 15000, netCB)
-            if not result then
-                log.info("服务器断开了", result, param)
-                break
-            end
-        end
-
-        -- 服务器断开后的行动,由于while true的影响,所以会再次重新执行进行 重新连接。
-        connect_state = false
-        libnet.close(d1Name, 5000, netCB)
-        tx_buff:clear(0)
-        rx_buff:clear(0)
-        sys.wait(1000)
-    end
-
-end
-
--- libnet库依赖于sysplus,所以只能通过sysplus.taskInitEx创建的任务函数中运行
-sysplus.taskInitEx(TCP_TASK, taskName, netCB)
-
--- 用户代码已结束---------------------------------------------
--- 结尾总是这一句
-sys.run()
--- sys.run()之后后面不要加任何语句!!!!!

+ 0 - 22
module/Air8000/demo/netdrv/ch390/wan/main.lua

@@ -1,22 +0,0 @@
--- 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.3V
-
--- require "lan"
-require "wan"
-
--- 用户代码已结束---------------------------------------------
--- 结尾总是这一句
-sys.run()
--- sys.run()之后后面不要加任何语句!!!!!
-

+ 0 - 39
module/Air8000/demo/netdrv/ch390/wan/wan.lua

@@ -1,39 +0,0 @@
-
-sys.taskInit(function ()
-    sys.wait(500)
-    log.info("ch390", "打开LDO供电")
-    gpio.setup(140, 1, gpio.PULLUP)     --打开ch390供电
-    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()) --adapter指定为以太网联网方式
-        log.info("lua", rtos.meminfo())
-        log.info("sys", rtos.meminfo("sys"))
-    end
-end)

+ 0 - 164
module/Air8000/demo/netdrv/ch390/wan_TCP/main.lua

@@ -1,164 +0,0 @@
--- main.lua文件
-
--- LuaTools需要PROJECT和VERSION这两个信息
-PROJECT = "wan_tcp"
-VERSION = "1.0.0"
-
-log.info("main", PROJECT, VERSION)
-
-local taskName = "TCP_TASK"             -- sysplus库用到的任务名称,也作为任务id
-
-if wdt then
-    --添加硬狗防止程序卡死,在支持的设备上启用这个功能
-    wdt.init(9000)--初始化watchdog设置为9s
-    sys.timerLoopStart(wdt.feed, 3000)--3s喂一次狗
-end
-
-local uartid = 1 -- 根据实际设备选取不同的uartid
-local uart_rx_buff = zbuff.create(1024)     -- 串口接收到的数据
-
-local libnet = require "libnet"         -- libnet库,支持tcp、udp协议所用的同步阻塞接口
-local ip = "112.125.89.8"               -- 连接tcp服务器的ip地址
-local port = 46319            -- 连接tcp服务器的端口
-local netCB = nil                       -- socket服务的回调函数
-local connect_state = false             -- 连接状态 true:已连接   false:未连接
-local protocol = false                  -- 通讯协议 true:UDP协议  false:TCP协议
-local ssl = false                     -- 加密传输 true:加密     false:不加密
-local tx_buff = zbuff.create(1024)      -- 发送至tcp服务器的数据
-local rx_buff = zbuff.create(1024)      -- 从tcp服务器接收到的数据
-
---初始化
-uart.setup(
-    uartid,--串口id
-    115200,--波特率
-    8,--数据位
-    1--停止位
-)
-
-sys.taskInit(function ()
-    sys.wait(500)
-    log.info("ch390", "打开LDO供电")
-    gpio.setup(140, 1, gpio.PULLUP)     --打开ch390供电
-    sys.wait(3000)
-    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)
-
-function TCP_TASK()
-    sys.waitUntil("IP_READY")                -- 等待联网成功
-    -- 打印一下连接的目标ip和端口号
-    log.info("connect ip: ", ip, "port:", port)
-    
-    netCB = socket.create(socket.LWIP_ETH, taskName)     -- 创建socket对象
-    socket.debug(netCB, true)                -- 打开调试日志
-    socket.config(netCB, nil, protocol, ssl)      -- 此配置为TCP连接,无SSL加密
-
-    -- 收取数据会触发回调, 这里的"receive" 是固定值不要修改。
-    uart.on(uartid, "receive", function(id, len)
-        while true do
-            local len = uart.rx(id, uart_rx_buff)   -- 接收串口收到的数据,并赋值到uart_rx_buff
-            if len <= 0 then    -- 接收到的字节长度为0 则退出
-                break
-            end
-            -- 如果已经在线了,则发送socket.EVENT消息来打断任务里的阻塞等待状态,让任务循环继续
-            if connect_state then
-                sys_send(taskName, socket.EVENT, 0)
-            end
-        end
-    end)
-
-    -- 串口和TCP服务器的交互逻辑
-    while true do
-        -- 连接服务器,返回是否连接成功
-        result = libnet.connect(taskName, 15000, netCB, ip, port)
-
-        -- 如果连接成功,则改变连接状态参数,并且随便发一条数据到服务器,看服务器能不能收到
-        if result then
-            connect_state = true
-            libnet.tx(taskName, 0, netCB, "TCP  CONNECT")
-        end
-
-        -- 连接上服务器后,等待处理接收服务器下行至模块的数据 和 发送串口的数据到服务器
-        while result do
-            succ, param, _, _ = socket.rx(netCB, rx_buff)   -- 接收数据
-            if not succ then
-                log.info("服务器断开了", succ, param, ip, port)
-                break
-            end
-
-            if rx_buff:used() > 0 then
-                log.info("收到服务器数据,长度", rx_buff:used())
-
-                uart.tx(uartid, rx_buff)    -- 从服务器收到的数据转发 从串口输出
-                rx_buff:del()
-            end
-
-            tx_buff:copy(nil, uart_rx_buff)         -- 将串口数据赋值给tcp待发送数据的buff中
-            uart_rx_buff:del()                      -- 清除串口buff的数据长度
-            if tx_buff:used() > 0 then
-                log.info("发送到服务器数据,长度", tx_buff:used())
-                local result = libnet.tx(taskName, 0, netCB, tx_buff)   -- 发送数据
-                if not result then
-                    log.info("发送失败了", result, param)
-                    break
-                end
-            end
-            tx_buff:del()
-
-            -- 如果zbuff对象长度超出,需要重新分配下空间
-            if uart_rx_buff:len() > 1024 then
-                uart_rx_buff:resize(1024)
-            end
-            if tx_buff:len() > 1024 then
-                tx_buff:resize(1024)
-            end
-            if rx_buff:len() > 1024 then
-                rx_buff:resize(1024)
-            end
-            log.info(rtos.meminfo("sys"))   -- 打印系统内存
-
-            -- 阻塞等待新的消息到来,比如服务器下发,串口接收到数据
-            result, param = libnet.wait(taskName, 15000, netCB)
-            if not result then
-                log.info("服务器断开了", result, param)
-                break
-            end
-        end
-
-        -- 服务器断开后的行动,由于while true的影响,所以会再次重新执行进行 重新连接。
-        connect_state = false
-        libnet.close(d1Name, 5000, netCB)
-        tx_buff:clear(0)
-        rx_buff:clear(0)
-        sys.wait(1000)
-    end
-
-end
-
--- libnet库依赖于sysplus,所以只能通过sysplus.taskInitEx创建的任务函数中运行
-sysplus.taskInitEx(TCP_TASK, taskName, netCB)
-
--- 用户代码已结束---------------------------------------------
--- 结尾总是这一句
-sys.run()
--- sys.run()之后后面不要加任何语句!!!!!

+ 79 - 0
module/Air8000/demo/netdrv/main.lua

@@ -0,0 +1,79 @@
+--[[
+@module  main
+@summary LuatOS用户应用脚本文件入口,总体调度应用逻辑 
+@version 1.0
+@date    2025.10.20
+@author  魏健强
+@usage
+本demo演示的核心功能为:
+1.开启以太网功能
+2.开启多网融合功能
+更多说明参考本目录下的readme.md文件
+]]
+--[[
+必须定义PROJECT和VERSION变量,Luatools工具会用到这两个变量,远程升级功能也会用到这两个变量
+PROJECT:项目名,ascii string类型
+        可以随便定义,只要不使用,就行
+VERSION:项目版本号,ascii string类型
+        如果使用合宙iot.openluat.com进行远程升级,必须按照"XXX.YYY.ZZZ"三段格式定义:
+            X、Y、Z各表示1位数字,三个X表示的数字可以相同,也可以不同,同理三个Y和三个Z表示的数字也是可以相同,可以不同
+            因为历史原因,YYY这三位数字必须存在,但是没有任何用处,可以一直写为000
+        如果不使用合宙iot.openluat.com进行远程升级,根据自己项目的需求,自定义格式即可
+]]
+PROJECT = "netdrv"
+VERSION = "001.000.000"
+
+
+-- 在日志中打印项目名和项目版本号
+log.info("main", PROJECT, VERSION)
+
+
+-- 如果内核固件支持wdt看门狗功能,此处对看门狗进行初始化和定时喂狗处理
+-- 如果脚本程序死循环卡死,就会无法及时喂狗,最终会自动重启
+if wdt then
+    --配置喂狗超时时间为9秒钟
+    wdt.init(9000)
+    --启动一个循环定时器,每隔3秒钟喂一次狗
+    sys.timerLoopStart(wdt.feed, 3000)
+end
+
+
+-- 如果内核固件支持errDump功能,此处进行配置,【强烈建议打开此处的注释】
+-- 因为此功能模块可以记录并且上传脚本在运行过程中出现的语法错误或者其他自定义的错误信息,可以初步分析一些设备运行异常的问题
+-- 以下代码是最基本的用法,更复杂的用法可以详细阅读API说明文档
+-- 启动errDump日志存储并且上传功能,600秒上传一次
+-- if errDump then
+--     errDump.config(true, 600)
+-- end
+
+
+-- 使用LuatOS开发的任何一个项目,都强烈建议使用远程升级FOTA功能
+-- 可以使用合宙的iot.openluat.com平台进行远程升级
+-- 也可以使用客户自己搭建的平台进行远程升级
+-- 远程升级的详细用法,可以参考fota的demo进行使用
+
+
+-- 启动一个循环定时器
+-- 每隔3秒钟打印一次总内存,实时的已使用内存,历史最高的已使用内存情况
+-- 方便分析内存使用是否有异常
+-- sys.timerLoopStart(function()
+--     log.info("mem.lua", rtos.meminfo())
+--     log.info("mem.sys", rtos.meminfo("sys"))
+-- end, 3000)
+
+
+-- 开启以太网wan
+require "netdrv_eth_wan"
+-- 开启以太网lan
+-- require "netdrv_eth_lan"
+-- 4G连接外部网络,生成WiFi热点为WiFi终端设备提供接入,支持以太网lan模式为其他以太网设备提供接入 
+-- require "netdrv_4g_multiple"
+-- 以太网连接外部网络,生成WiFi热点为WiFi终端设备提供接入 
+-- require "netdrv_eth_multiple"
+-- WIFI连接外部网络,支持以太网lan模式为其他以太网设备提供接入,支持生成WiFi热点为WiFi终端设备提供接入
+-- require "netdrv_wifi_multiple"
+
+-- 用户代码已结束---------------------------------------------
+-- 结尾总是这一句
+sys.run()
+-- sys.run()之后后面不要加任何语句!!!!!

+ 93 - 0
module/Air8000/demo/netdrv/netdrv_4g_multiple.lua

@@ -0,0 +1,93 @@
+--[[
+@module  netdrv_4g_multiple
+@summary 多网卡(4G网卡、WIFI STA网卡、通过SPI外挂CH390H芯片的以太网卡)驱动模块 
+@version 1.0
+@date    2025.10.20
+@author  魏健强
+@usage
+本文件为多网卡驱动模块 ,核心业务逻辑为:
+1、4G连接外部网络,生成WiFi热点为WiFi终端设备提供接入,支持以太网lan模式为其他以太网设备提供接入 ;
+
+直接使用Air8000开发板硬件测试即可;
+
+本文件没有对外接口,直接在其他功能模块中require "netdrv_4g_multiple"就可以加载运行;
+]] 
+dhcpsrv = require "dhcpsrv"
+dnsproxy = require "dnsproxy"
+
+local function lte_eth_setup()
+    log.info("ch390", "打开LDO供电")
+    gpio.setup(140, 1, gpio.PULLUP) -- 打开ch390供电
+    local result = spi.setup(1, -- spi_id
+    nil, 0, -- CPHA
+    0, -- CPOL
+    8, -- 数据宽度
+    25600000 -- ,--频率
+    )
+    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
+    })
+    -- 确保ch390初始化完成,否则会出现netdrv.ipv4设置失败的情况
+    sys.wait(1000)
+    -- 设置ip, 子网掩码,网关
+    local ipv4, mark, gw = netdrv.ipv4(socket.LWIP_ETH, "192.168.4.1", "255.255.255.0", "192.168.4.1")
+    log.info("LWIP_ETH", ipv4, mark, gw)
+    -- 开启dhcp服务器
+    dhcpsrv.create({adapter = socket.LWIP_ETH})
+    -- 设置dns转发
+    dnsproxy.setup(socket.LWIP_ETH, socket.LWIP_GP)
+end
+
+local function lte_wifi_setup()
+    log.info("执行AP创建操作")
+    -- 创建wifi_ap热点
+    wlan.createAP("test2", "HZ88888888")
+    -- 设置ip, 子网掩码,网关
+    local ipv4, mark, gw = netdrv.ipv4(socket.LWIP_AP, "192.168.5.1", "255.255.255.0", "192.168.5.1")
+    log.info("LWIP_AP", ipv4, mark, gw)
+    -- 详细的版本
+    -- 创建一个dhcp服务器
+    local dhcpsrv_opts = {
+        adapter = socket.LWIP_AP, -- 监听哪个网卡, 必须填写
+        mark = {255, 255, 255, 0}, -- 网络掩码, 默认 255.255.255.0
+        gw = {192, 168, 5, 1}, -- 网关, 默认自动获取网卡IP,如果获取失败则使用 192.168.4.1
+        ip_start = 100, -- ip起始地址, 默认100
+        ip_end = 200, -- ip结束地址, 默认200
+        ack_cb = function(ip, mac)
+            log.info("ack_cb", "new client", ip, mac)
+        end -- ack回调, 有客户端连接上来时触发, ip和mac地址会传进来
+    }
+    dhcpsrv.create(dhcpsrv_opts)
+    -- 设置dns转发
+    dnsproxy.setup(socket.LWIP_AP, socket.LWIP_GP)
+end
+
+
+local function netdrv_multiple_task_func()
+    -- 等待4G网络连接成功
+    while not socket.adapter() do
+        -- 在此处阻塞等待4G网卡连接成功的消息"IP_READY"
+        -- 或者等待1秒超时退出阻塞等待状态;
+        -- 注意:此处的1000毫秒超时不要修改的更长;
+        sys.waitUntil("IP_READY", 1000)
+    end
+    -- 开启4G->以太网的多网融合
+    lte_eth_setup()
+    -- 开启4G->wifi的多网融合
+    lte_wifi_setup()
+    -- 设置4G为数据出口
+    netdrv.napt(socket.LWIP_GP)
+end
+
+-- 启动一个task,task的处理函数为netdrv_multiple_task_func
+sys.taskInit(netdrv_multiple_task_func)

+ 55 - 0
module/Air8000/demo/netdrv/netdrv_eth_lan.lua

@@ -0,0 +1,55 @@
+--[[
+@module  netdrv_eth_lan
+@summary “通过SPI外挂CH390H芯片的以太网卡”驱动模块 
+@version 1.0
+@date    2025.10.20
+@author  魏健强
+@usage
+本文件为“通过SPI外挂CH390H芯片的以太网卡”驱动模块 ,核心业务逻辑为:
+1、开启以太网lan;
+
+直接使用Air8000开发板硬件测试即可;
+
+本文件没有对外接口,直接在其他功能模块中require "netdrv_eth_lan"就可以加载运行;
+]] 
+dhcps = require "dhcpsrv"
+
+local function eth_lan_setup()
+    -- 本demo使用Air8000开发板测试,开发板上的硬件配置为:
+    -- GPIO140为CH390H以太网芯片的供电使能控制引脚
+    -- 使用spi1,片选引脚使用GPIO12
+    -- 如果使用的硬件不是Air8000开发板,根据自己的硬件配置修改以下参数
+    log.info("ch390", "打开LDO供电")
+    gpio.setup(140, 1, gpio.PULLUP) -- 打开ch390供电
+    local result = spi.setup(1, -- spi_id
+    nil, 0, -- CPHA
+    0, -- CPOL
+    8, -- 数据宽度
+    25600000 -- ,--频率
+    )
+    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
+    })
+    -- 确保ch390初始化完成,否则会出现netdrv.ipv4设置失败的情况
+    sys.wait(1000)
+    -- 设置ip, 子网掩码,网关
+    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)
+    -- 开启dhcp服务器
+    dhcps.create({
+        adapter = socket.LWIP_ETH
+    })
+end
+
+sys.taskInit(eth_lan_setup)

+ 96 - 0
module/Air8000/demo/netdrv/netdrv_eth_multiple.lua

@@ -0,0 +1,96 @@
+--[[
+@module  netdrv_eth_multiple
+@summary 多网卡(4G网卡、WIFI STA网卡、通过SPI外挂CH390H芯片的以太网卡)驱动模块 
+@version 1.0
+@date    2025.10.20
+@author  魏健强
+@usage
+本文件为多网卡驱动模块 ,核心业务逻辑为:
+1、以太网连接外部网络,生成WiFi热点为WiFi终端设备提供接入 ;
+
+直接使用Air8000开发板硬件测试即可;
+
+本文件没有对外接口,直接在其他功能模块中require "netdrv_eth_multiple"就可以加载运行;
+]] 
+dhcpsrv = require "dhcpsrv"
+dnsproxy = require "dnsproxy"
+
+local static_ip = false
+
+local function netdrv_multiple_task_func()
+    -- 配置SPI外接以太网芯片CH390H的单网卡,exnetif.set_priority_order使用的网卡编号为socket.LWIP_ETH
+    -- 本demo使用Air8000开发板测试,开发板上的硬件配置为:
+    -- GPIO140为CH390H以太网芯片的供电使能控制引脚
+    -- 使用spi1,片选引脚使用GPIO12
+    -- 如果使用的硬件不是Air8000开发板,根据自己的硬件配置修改以下参数
+    log.info("ch390", "打开LDO供电")
+    gpio.setup(140, 1, gpio.PULLUP) -- 打开ch390供电
+    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(1000) -- 等待以太网模块初始化完成,去掉会导致以太网初始化失败
+    if static_ip then
+        -- 手动静态ip配置
+        log.info("静态ip", netdrv.ipv4(socket.LWIP_ETH, "192.168.4.100", "255.255.255.0", "192.168.4.1"))
+    else
+        -- 使用dhcp动态获取ip地址
+        netdrv.dhcp(socket.LWIP_ETH, true)
+    end
+
+    -- 等待eth_wan网络连接成功
+    while not socket.adapter(socket.LWIP_ETH) do
+        -- 在此处阻塞等待wifi连接成功的消息"IP_READY"
+        -- 或者等待1秒超时退出阻塞等待状态;
+        -- 注意:此处的1000毫秒超时不要修改的更长;
+        sys.waitUntil("IP_READY", 1000)
+    end
+    -- eth_wan -> wifi_ap
+    log.info("执行AP创建操作")
+    -- 开启wifi_ap热点
+    wlan.createAP("test2", "HZ88888888")
+    -- 设置ip, 子网掩码,网关
+    local ipv4, mark, gw = netdrv.ipv4(socket.LWIP_AP, "192.168.5.1", "255.255.255.0", "192.168.5.1")
+    log.info("LWIP_AP", ipv4, mark, gw)
+    while netdrv.ready(socket.LWIP_AP) ~= true do
+        sys.wait(100)
+    end
+    -- 设置dns转发
+    dnsproxy.setup(socket.LWIP_AP, socket.LWIP_ETH)
+    -- 详细的版本
+    -- 创建一个dhcp服务器
+    local dhcpsrv_opts = {
+        adapter = socket.LWIP_AP, -- 监听哪个网卡, 必须填写
+        mark = {255, 255, 255, 0}, -- 网络掩码, 默认 255.255.255.0
+        gw = {192, 168, 5, 1}, -- 网关, 默认自动获取网卡IP,如果获取失败则使用 192.168.4.1
+        ip_start = 100, -- ip起始地址, 默认100
+        ip_end = 200, -- ip结束地址, 默认200
+        ack_cb = function(ip, mac)
+            log.info("ack_cb", "new client", ip, mac)
+        end -- ack回调, 有客户端连接上来时触发, ip和mac地址会传进来
+    }
+    dhcpsrv.create(dhcpsrv_opts)
+    -- 设置以太网为数据出口
+    netdrv.napt(socket.LWIP_ETH)
+end
+
+-- 启动一个task,task的处理函数为netdrv_multiple_task_func
+sys.taskInit(netdrv_multiple_task_func)

+ 123 - 0
module/Air8000/demo/netdrv/netdrv_eth_wan.lua

@@ -0,0 +1,123 @@
+--[[
+@module  netdrv_eth_wan
+@summary “通过SPI外挂CH390H芯片的以太网卡”驱动模块 
+@version 1.0
+@date    2025.10.20
+@author  魏健强
+@usage
+本文件为“通过SPI外挂CH390H芯片的以太网卡”驱动模块 ,核心业务逻辑为:
+1、开启以太网wan;
+
+直接使用Air8000开发板硬件测试即可;
+
+本文件没有对外接口,直接在其他功能模块中require "netdrv_eth_wan"就可以加载运行;
+]] 
+local static_ip = false
+
+local function ip_ready_func(ip, adapter)
+    if adapter == socket.LWIP_ETH then
+        -- 在位置1和2设置自定义的DNS服务器ip地址:
+        -- "223.5.5.5",这个DNS服务器IP地址是阿里云提供的DNS服务器IP地址;
+        -- "114.114.114.114",这个DNS服务器IP地址是国内通用的DNS服务器IP地址;
+        -- 可以加上以下两行代码,在自动获取的DNS服务器工作不稳定的情况下,这两个新增的DNS服务器会使DNS服务更加稳定可靠;
+        -- 如果使用专网卡,不要使用这两行代码;
+        -- 如果使用国外的网络,不要使用这两行代码;
+        socket.setDNS(adapter, 1, "223.5.5.5")
+        socket.setDNS(adapter, 2, "114.114.114.114")
+
+        log.info("netdrv_eth_wan.ip_ready_func", "IP_READY", socket.localIP(socket.LWIP_ETH))
+    end
+end
+
+local function ip_lose_func(adapter)
+    if adapter == socket.LWIP_ETH then
+        log.warn("netdrv_eth_wan.ip_lose_func", "IP_LOSE")
+    end
+end
+
+-- 本功能在2025.9.3新增
+local function ping_test()
+    -- 要等联网了才能ping
+    sys.waitUntil("IP_READY")
+    while 1 do
+        -- 必须指定使用哪个网卡
+        netdrv.ping(socket.LWIP_ETH, "112.125.89.8")
+        sys.waitUntil("PING_RESULT", 3000)
+        sys.wait(3000)
+    end
+end
+local function ping_res(id, time, dst)
+    log.info("ping", id, time, dst); -- 获取到响应结果
+end
+
+-- 以太网联网成功(成功连接路由器,并且获取到了IP地址)后,内核固件会产生一个"IP_READY"消息
+-- 各个功能模块可以订阅"IP_READY"消息实时处理以太网联网成功的事件
+-- 也可以在任何时刻调用socket.adapter(socket.LWIP_ETH)来获取以太网是否连接成功
+
+-- 以太网断网后,内核固件会产生一个"IP_LOSE"消息
+-- 各个功能模块可以订阅"IP_LOSE"消息实时处理以太网断网的事件
+-- 也可以在任何时刻调用socket.adapter(socket.LWIP_ETH)来获取以太网是否连接成功
+
+-- 此处订阅"IP_READY"和"IP_LOSE"两种消息
+-- 在消息的处理函数中,仅仅打印了一些信息,便于实时观察“通过SPI外挂CH390H芯片的以太网卡”的连接状态
+-- 也可以根据自己的项目需求,在消息处理函数中增加自己的业务逻辑控制,例如可以在连网状态发生改变时更新网络图标
+sys.subscribe("IP_READY", ip_ready_func)
+sys.subscribe("IP_LOSE", ip_lose_func)
+
+local function eth_wan_setup()
+    -- 本demo使用Air8000开发板测试,开发板上的硬件配置为:
+    -- GPIO140为CH390H以太网芯片的供电使能控制引脚
+    -- 使用spi1,片选引脚使用GPIO12
+    -- 如果使用的硬件不是Air8000开发板,根据自己的硬件配置修改以下参数
+    log.info("ch390", "打开LDO供电")
+    gpio.setup(140, 1, gpio.PULLUP) -- 打开ch390供电
+    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(1000) -- 等待以太网模块初始化完成,去掉会导致以太网初始化失败
+    if static_ip then
+        -- 静态ip配置
+        log.info("静态ip", netdrv.ipv4(socket.LWIP_ETH, "192.168.4.100", "255.255.255.0", "192.168.4.1"))
+    else
+        -- 使用dhcp动态获取ip地址
+        netdrv.dhcp(socket.LWIP_ETH, true)
+    end
+    log.info("LWIP_ETH", "mac addr", netdrv.mac(socket.LWIP_ETH))
+    sys.taskInit(ping_test)
+    sys.subscribe("PING_RESULT", ping_res)
+end
+
+local function http_test()
+    -- 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()) -- adapter指定为以太网联网方式
+        log.info("lua", rtos.meminfo())
+        log.info("sys", rtos.meminfo("sys"))
+    end
+end
+sys.taskInit(eth_wan_setup)
+sys.taskInit(http_test)
+
+

+ 98 - 0
module/Air8000/demo/netdrv/netdrv_wifi_multiple.lua

@@ -0,0 +1,98 @@
+--[[
+@module  netdrv_wifi_multiple
+@summary 多网卡(4G网卡、WIFI STA网卡、通过SPI外挂CH390H芯片的以太网卡)驱动模块 
+@version 1.0
+@date    2025.10.20
+@author  魏健强
+@usage
+本文件为多网卡驱动模块 ,核心业务逻辑为:
+1、WIFI连接外部网络,支持以太网lan模式为其他以太网设备提供接入,支持生成WiFi热点为WiFi终端设备提供接入;
+
+直接使用Air8000开发板硬件测试即可;
+
+本文件没有对外接口,直接在其他功能模块中require "netdrv_wifi_multiple"就可以加载运行;
+]] 
+dhcpsrv = require "dhcpsrv"
+dnsproxy = require "dnsproxy"
+
+local function wifi_eth_setup()
+    log.info("ch390", "打开LDO供电")
+    gpio.setup(140, 1, gpio.PULLUP) -- 打开ch390供电
+    local result = spi.setup(1, -- spi_id
+    nil, 0, -- CPHA
+    0, -- CPOL
+    8, -- 数据宽度
+    25600000 -- ,--频率
+    )
+    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
+    })
+    -- 确保ch390初始化完成,否则会出现netdrv.ipv4设置失败的情况
+    sys.wait(1000)
+    -- 设置ip, 子网掩码,网关
+    local ipv4, mark, gw = netdrv.ipv4(socket.LWIP_ETH, "192.168.4.1", "255.255.255.0", "192.168.4.1")
+    log.info("LWIP_ETH", ipv4, mark, gw)
+    -- 开启dhcp服务器
+    dhcpsrv.create({
+        adapter = socket.LWIP_ETH
+    })
+    -- 设置dns转发
+    dnsproxy.setup(socket.LWIP_ETH, socket.LWIP_STA)
+end
+
+local function wifi_sta_ap_setup()
+    log.info("执行AP创建操作")
+    wlan.createAP("test2", "HZ88888888")
+    -- 设置ip, 子网掩码,网关
+    local ipv4, mark, gw = netdrv.ipv4(socket.LWIP_AP, "192.168.5.1", "255.255.255.0", "0.0.0.0")
+    log.info("LWIP_AP", ipv4, mark, gw)
+    -- 详细的版本
+    -- 创建一个dhcp服务器
+    local dhcpsrv_opts = {
+        adapter = socket.LWIP_AP, -- 监听哪个网卡, 必须填写
+        mark = {255, 255, 255, 0}, -- 网络掩码, 默认 255.255.255.0
+        gw = {192, 168, 5, 1}, -- 网关, 默认自动获取网卡IP,如果获取失败则使用 192.168.4.1
+        ip_start = 100, -- ip起始地址, 默认100
+        ip_end = 200, -- ip结束地址, 默认200
+        ack_cb = function(ip, mac)
+            log.info("ack_cb", "new client", ip, mac)
+        end -- ack回调, 有客户端连接上来时触发, ip和mac地址会传进来
+    }
+    -- 开启dhcp服务器
+    dhcpsrv.create(dhcpsrv_opts)
+    -- 设置dns转发
+    dnsproxy.setup(socket.LWIP_AP, socket.LWIP_STA)
+end
+
+local function netdrv_multiple_task_func()
+    -- 设置wifi工作模式为STA+AP模式
+    wlan.setMode(wlan.STATIONAP)
+    -- 连接wifi
+    wlan.connect("茶室-降功耗,找合宙!", "Air123456")
+    -- 等待wifi_sta网络连接成功
+    while not socket.adapter(socket.LWIP_STA) do
+        -- 在此处阻塞等待wifi连接成功的消息"IP_READY"
+        -- 或者等待1秒超时退出阻塞等待状态;
+        -- 注意:此处的1000毫秒超时不要修改的更长;
+        sys.waitUntil("IP_READY", 1000)
+    end
+    -- 开启wifi->以太网的多网融合
+    wifi_eth_setup()
+    -- 开启wifi sta->ap的多网融合
+    wifi_sta_ap_setup()
+    -- 设置wifi_sta为数据出口
+    netdrv.napt(socket.LWIP_STA)
+end
+
+-- 启动一个task,task的处理函数为netdrv_multiple_task_func
+sys.taskInit(netdrv_multiple_task_func)

+ 96 - 0
module/Air8000/demo/netdrv/readme.md

@@ -0,0 +1,96 @@
+## 功能模块介绍
+
+1、main.lua:主程序入口;
+
+2、netdrv_eth_wan.lua:以太网wan
+
+3、netdrv_eth_lan.lua:以太网lan
+
+4、netdrv_4g_multiple.lua:4G连接外部网络,生成WiFi热点为WiFi终端设备提供接入,支持以太网lan模式为其他以太网设备提供接入 
+
+5、netdrv_eth_multiple.lua:以太网连接外部网络,生成WiFi热点为WiFi终端设备提供接入 
+
+6、netdrv_wifi_multiple.lua:WIFI连接外部网络,支持以太网lan模式为其他以太网设备提供接入,支持生成WiFi热点为WiFi终端设备提供接入
+
+## 演示功能概述
+
+1、演示 netdrv核心库+dnsproxy扩展库+dhcpsrv扩展库 开启以太网或wifi单网卡,4G,wifi,以太网多网融合功能.
+
+## 演示硬件环境
+
+![](https://docs.openluat.com/air8000/luatos/app/image/netdrv_multi.jpg)
+1、Air8000开发板一块+可上网的sim卡一张+4g天线一根+wifi天线一根+网线一根:
+
+- sim卡插入开发板的sim卡槽
+
+- 天线装到开发板上
+
+2、网线接线说明:
+
+- netdrv_eth_wan 模块以太网口接路由器LAN口或交换机
+
+- netdrv_eth_lan 模块以太网口接电脑或需要上网的设备
+
+- netdrv_4g_multiple 模块以太网口接电脑或需要上网的设备
+
+- netdrv_wifi_multiple 模块以太网口接电脑或需要上网的设备
+
+- netdrv_eth_multiple 模块以太网口接路由器LAN口或交换机
+
+3、TYPE-C USB数据线一根 Air8000开发板和数据线的硬件接线方式为:
+
+- TYPE-C USB数据线直接插到核心板的TYPE-C USB座子,另外一端连接电脑USB口;
+
+## 演示软件环境
+
+1、Luatools下载调试工具
+
+2、[Air8000 V2016版本固件](https://docs.openluat.com/air8000/luatos/firmware/)(理论上,最新发布的固件都可以)
+
+
+## 演示核心步骤
+
+1、搭建好硬件环境,按接线图连接硬件,
+
+2、测试wifi功能时按需修改WiFi配置:
+netdrv_eth_multiple和netdrv_4g_multiple中的wlan.createAP("test", "HZ88888888"),修改生成wifi热点的名称和密码.
+netdrv_wifi_multiple中的wlan.connect("test", "HZ88888888")修改需要连接的wifi的名称和密码
+
+3、在main.lua中按照自己的网卡需求启用对应的Lua文件
+
+- 如果需要开启以太网lan,打开require "netdrv_eth_lan",其余注释掉
+
+- 如果需要开启以太网wan,打开require "netdrv_eth_wan",其余注释掉
+
+- 如果需要开启4G转wifi和以太网的多网融合,打开require "netdrv_4g_multiple",其余注释掉
+
+- 如果需要开启以太网转wifi的多网融合,打开require "netdrv_eth_multiple.lua",其余注释掉
+
+- 如果需要开启wifi转以太网的多网融合,打开require "netdrv_wifi_multiple",其余注释掉
+
+4、Luatools烧录内核固件和修改后的demo脚本代码
+netdrv_eth_lan:
+模块以太网接口接其他设备,这里演示使用电脑连接,可以dhcp获取ip,可以ping通模块
+![](https://docs.openluat.com/air8000/luatos/app/netdrv/image/netdrv-lan1.png)
+![](https://docs.openluat.com/air8000/luatos/app/netdrv/image/netdrv-lan2.png)
+
+netdrv_eth_wan:
+模块以太网口接路由器,模块成功联网并http请求成功
+![](https://docs.openluat.com/air8000/luatos/app/netdrv/image/netdrv-wan.png)
+
+netdrv_4g_multiple:
+4G作为数据出口,这里使用电脑连接模块ap热点或以太网接口上网
+![](https://docs.openluat.com/air8000/luatos/app/netdrv/image/netdrv-4g1.png)
+
+![](https://docs.openluat.com/air8000/luatos/app/netdrv/image/netdrv-4g2.png)
+
+netdrv_eth_multiple:
+模块以太网口接路由器LAN口,并开启wifi_ap热点,这里使用电脑连接模块发出的热点,dhcp获取到ip,测试网络正常
+![](https://docs.openluat.com/air8000/luatos/app/netdrv/image/netdrv-eth.png)
+
+netdrv_wifi_multiple:
+模块连接路由器wifi,并开启以太网LAN口,这里使用电脑连接模块以太网接口,测试网络正常
+![](https://docs.openluat.com/air8000/luatos/app/netdrv/image/netdrv-wifi1.png)
+![](https://docs.openluat.com/air8000/luatos/app/netdrv/image/netdrv-wifi2.png)
+
+