Kaynağa Gözat

update:更新Air8000新的wlan demo

wjq 2 ay önce
ebeveyn
işleme
dc7e59363d

+ 0 - 52
module/Air8000/demo/wlan/AP/main.lua

@@ -1,52 +0,0 @@
-
--- LuaTools需要PROJECT和VERSION这两个信息
-PROJECT = "air8000_wifi"
-VERSION = "1.0.5"
-
-dnsproxy = require("dnsproxy")
-dhcpsrv = require("dhcpsrv")
-httpplus = require("httpplus")
-
--- 如果无法使用AP功能,可以开启此功能升级WiFi固件版本后再次尝试
--- 升级完毕后最好取消调用,防止后期版本升级过高导致程序使用不稳定
--- require "check_wifi" 
-
-function test_ap()
-    log.info("执行AP创建操作")
-    wlan.createAP("uiot5678", "12345678")
-    netdrv.ipv4(socket.LWIP_AP, "192.168.4.1", "255.255.255.0", "0.0.0.0")
-    while netdrv.ready(socket.LWIP_AP) ~= true do
-        sys.wait(100)
-    end
-    dnsproxy.setup(socket.LWIP_AP, socket.LWIP_GP)
-    dhcpsrv.create({adapter=socket.LWIP_AP})
-    while 1 do
-        if netdrv.ready(socket.LWIP_GP) then
-            netdrv.napt(socket.LWIP_GP)
-            log.info("AP 创建成功,如果无法连接,需要将按照https://docs.openluat.com/air8000/luatos/app/updatwifi/update/ 升级固件")
-            log.info("AP 创建成功,如果无法连接,请升级本仓库的最新core")
-            break
-        end
-        sys.wait(1000)
-    end
-end
-
--- wifi的AP相关事件
-sys.subscribe("WLAN_AP_INC", function(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)
-
-sys.taskInit(function()
-    log.info("开始AP 测试...")
-    wlan.init()
-    test_ap()
-end)
-
-
--- 用户代码已结束---------------------------------------------
--- 结尾总是这一句
-sys.run()
--- sys.run()之后后面不要加任何语句!!!!!

+ 0 - 27
module/Air8000/demo/wlan/Power_Save/check_wifi.lua

@@ -1,27 +0,0 @@
---[[
-@module  check_wifi
-@summary 远程升级wifi固件模块
-@version 1.1
-@date    2025.09.23
-@author  拓毅恒
-@usage
-检查WiFi版本并自动升级
-功能:检查当前Air8000模组的WiFi固件是否为最新版本,若不是则自动启动升级(需插入可联网的SIM卡)。
-注意:升级完毕后最好取消调用,防止后期版本升级过高导致程序使用不稳定。
-
-本文件没有对外接口,直接在main.lua中require "check_wifi"就可以加载运行。
-]]
-
-local exfotawifi = require("exfotawifi")
-
-local function fota_wifi_task()
-    local result = exfotawifi.request()
-    if result then
-        log.info("exfotawifi", "升级任务执行成功")
-    else
-        log.info("exfotawifi", "升级任务执行失败")
-    end
-end
-
--- 在设备启动时检查SIM卡状态
-sys.taskInit(fota_wifi_task)

+ 0 - 151
module/Air8000/demo/wlan/Power_Save/main.lua

@@ -1,151 +0,0 @@
-
--- LuaTools需要PROJECT和VERSION这两个信息
-PROJECT = "power_save"
-VERSION = "1.0.5"
-
-dnsproxy = require("dnsproxy")
-dhcpsrv = require("dhcpsrv")
-
--- 如果无法使用此功能,可以开启此功能升级WiFi固件版本后再次尝试
--- 升级完毕后最好取消调用,防止后期版本升级过高导致程序使用不稳定
--- require "check_wifi" 
-
--- 通过boot按键方便刷Air8000S
-function PWR8000S(val)
-    gpio.set(23, val)
-end
-
-gpio.debounce(0, 1000)
-gpio.setup(0, function()
-    sys.taskInit(function()
-        log.info("复位Air8000S")
-        PWR8000S(0)
-        sys.wait(20)
-        PWR8000S(1)
-    end)
-end, gpio.PULLDOWN)
-
-if airlink.irqmode then
-    log.info("尝试开启IRQ模式", "GPIO20 <--> GPIO140")
-    airlink.irqmode(true, 20, 140)
-end
-
-function test_ap()
-    log.info("执行AP创建操作")
-    wlan.createAP("uiot_5678", "12345678")
-    netdrv.ipv4(socket.LWIP_AP, "192.168.4.1", "255.255.255.0", "0.0.0.0")
-    sys.wait(5000)
-    -- netdrv.ipv4(socket.LWIP_AP, "192.168.4.1", "255.255.255.0", "0.0.0.0")
-    -- log.info("创建dns代理", netdrv.ipv4(socket.LWIP_AP))
-    dnsproxy.setup(socket.LWIP_AP, socket.LWIP_GP)
-    -- log.info('创建DHCP服务器', netdrv.ipv4(socket.LWIP_AP))
-    dhcpsrv.create({adapter=socket.LWIP_AP})
-    while 1 do
-        if netdrv.ready(socket.LWIP_GP) then
-            netdrv.napt(socket.LWIP_GP)
-            break
-        end
-        sys.wait(1000)
-    end
-end
-
--- wifi的STA相关事件
-sys.subscribe("WLAN_STA_INC", function(evt, data)
-    -- evt 可能的值有: "CONNECTED", "DISCONNECTED"
-    -- 当evt=CONNECTED, data是连接的AP的ssid, 字符串类型
-    -- 当evt=DISCONNECTED, data断开的原因, 整数类型
-    log.info("收到STA事件", evt, data)
-end)
-
--- wifi的AP相关事件
-sys.subscribe("WLAN_AP_INC", function(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 test_sta()
-    log.info("执行STA连接操作")
-    wlan.connect("luatos1234", "12341234")
-    -- netdrv.dhcp(socket.LWIP_STA, true)
-    sys.wait(8000)
-    iperf.server(socket.LWIP_STA)
-    -- iperf.client(socket.LWIP_STA, "47.94.236.172")
-
-    local n = 2
-    sys.wait(5000)
-    while n > 0 do
-        log.info("wlan", "info","n=",n ,json.encode(wlan.getInfo()))
-        -- log.info("MAC地址", netdrv.mac(socket.LWIP_STA))
-        -- log.info("IP地址", netdrv.ipv4(socket.LWIP_STA))
-        -- log.info("ready?", netdrv.ready(socket.LWIP_STA))
-        -- sys.wait(1000)
-        -- log.info("执行http请求")
-        -- local code = http.request("GET", "http://192.168.1.15:8000/README.md", nil, nil, {adapter=socket.LWIP_STA,timeout=3000}).wait()
-        local code, headers, body = http.request("GET", "https://httpbin.air32.cn/bytes/2048", nil, nil, {adapter=socket.LWIP_STA,timeout=5000,debug=false}).wait()
-        log.info("http执行结果", code, headers, body and #body)
-        -- socket.sntp(nil, socket.LWIP_STA)
-        sys.wait(2000)
-        n = n - 1
-        -- socket.sntp(nil)
-        -- sys.wait(2000)
-        -- log.info("执行ping操作")
-        -- icmp.ping(socket.LWIP_STA, "183.2.172.177")
-        -- sys.wait(2000)
-    end
-end
-
-sys.subscribe("PING_RESULT", function(id, time, dst)
-    log.info("ping", id, time, dst);
-end)
-
-function test_scan()
-    while 1 do
-        log.info("执行wifi扫描")
-        wlan.scan()
-        sys.wait(30 * 1000)
-    end
-end
-sys.subscribe("WLAN_SCAN_DONE", function ()
-    local results = wlan.scanResult()
-    log.info("scan", "results", #results)
-    for k,v in pairs(results) do
-        log.info("scan", v["ssid"], v["rssi"], (v["bssid"]:toHex()))
-    end
-end)
-
---  每隔6秒打印一次airlink统计数据, 调试用
--- sys.taskInit(function()
---     while 1 do
---         sys.wait(6000)
---         airlink.statistics()
---     end
--- end)
-
-sys.taskInit(function()
-    log.info("新的Air8000脚本...")
-
-    wlan.init()
-    -- sys.wait(5000)
-
-    sys.wait(300)
-    test_ap()
-
-    -- 连接STA测试
-    -- sys.wait(300)
-    -- test_sta()
-
-    -- sys.wait(10000)
-    sys.wait(2000)
-    wlan.powerSave(0)
-    log.info("power save mode 000000")
-
-    -- wifi扫描测试
-    -- test_scan()
-end)
-
--- 用户代码已结束---------------------------------------------
--- 结尾总是这一句
-sys.run()
--- sys.run()之后后面不要加任何语句!!!!!

+ 0 - 27
module/Air8000/demo/wlan/STA/check_wifi.lua

@@ -1,27 +0,0 @@
---[[
-@module  check_wifi
-@summary 远程升级wifi固件模块
-@version 1.1
-@date    2025.09.23
-@author  拓毅恒
-@usage
-检查WiFi版本并自动升级
-功能:检查当前Air8000模组的WiFi固件是否为最新版本,若不是则自动启动升级(需插入可联网的SIM卡)。
-注意:升级完毕后最好取消调用,防止后期版本升级过高导致程序使用不稳定。
-
-本文件没有对外接口,直接在main.lua中require "check_wifi"就可以加载运行。
-]]
-
-local exfotawifi = require("exfotawifi")
-
-local function fota_wifi_task()
-    local result = exfotawifi.request()
-    if result then
-        log.info("exfotawifi", "升级任务执行成功")
-    else
-        log.info("exfotawifi", "升级任务执行失败")
-    end
-end
-
--- 在设备启动时检查SIM卡状态
-sys.taskInit(fota_wifi_task)

+ 0 - 97
module/Air8000/demo/wlan/STA/main.lua

@@ -1,97 +0,0 @@
-
--- LuaTools需要PROJECT和VERSION这两个信息
-PROJECT = "air8000_wifi"
-VERSION = "1.0.5"
-
-dnsproxy = require("dnsproxy")
-dhcpsrv = require("dhcpsrv")
-httpplus = require("httpplus")
-
--- 如果无法使用STA功能,可以开启此功能升级WiFi固件版本后再次尝试
--- 升级完毕后最好取消调用,防止后期版本升级过高导致程序使用不稳定
--- require "check_wifi" 
-
--- wifi的STA相关事件
-sys.subscribe("WLAN_STA_INC", function(evt, data)
-    -- evt 可能的值有: "CONNECTED", "DISCONNECTED"
-    -- 当evt=CONNECTED, data是连接的AP的ssid, 字符串类型
-    -- 当evt=DISCONNECTED, data断开的原因, 整数类型
-    log.info("收到STA事件", evt, data)
-end)
-
-
-function test_sta()
-    log.info("执行STA连接操作")
-    wlan.connect("Xiaomi 13", "15055190176")
-    -- netdrv.dhcp(socket.LWIP_STA, true)
-    sys.wait(8000)
-    -- iperf.server(socket.LWIP_STA)
-    -- iperf.client(socket.LWIP_STA, "47.94.236.172")
-
-    sys.wait(5000)
-    while 1 do
-        -- log.info("MAC地址", netdrv.mac(socket.LWIP_STA))
-        -- log.info("IP地址", netdrv.ipv4(socket.LWIP_STA))
-        -- log.info("ready?", netdrv.ready(socket.LWIP_STA))
-        -- sys.wait(1000)
-        -- log.info("执行http请求")
-        -- local code = http.request("GET", "http://192.168.1.15:8000/README.md", nil, nil, {adapter=socket.LWIP_STA,timeout=3000}).wait()
-        local code, headers, body = http.request("GET", "https://httpbin.air32.cn/bytes/2048", nil, nil, {adapter=socket.LWIP_STA,timeout=5000,debug=false}).wait()
-        log.info("http执行结果", code, headers, body and #body)
-        -- socket.sntp(nil, socket.LWIP_STA)
-        sys.wait(2000)
-
-        -- socket.sntp(nil)
-        -- sys.wait(2000)
-        -- log.info("执行ping操作")
-        -- icmp.ping(socket.LWIP_STA, "183.2.172.177")
-        -- sys.wait(2000)
-    end
-end
-
-sys.subscribe("PING_RESULT", function(id, time, dst)
-    log.info("ping", id, time, dst);
-end)
-
-function test_scan()
-    while 1 do
-        log.info("执行wifi扫描")
-        wlan.scan()
-        sys.wait(30 * 1000)
-    end
-end
-sys.subscribe("WLAN_SCAN_DONE", function ()
-    local results = wlan.scanResult()
-    log.info("scan", "results", #results)
-    for k,v in pairs(results) do
-        log.info("scan", v["ssid"], v["rssi"], (v["bssid"]:toHex()))
-    end
-end)
-
-function ip_ready_handle(ip, adapter)
-    log.info("ip_ready_handle",ip, adapter)
-    if adapter == socket.LWIP_STA then
-        log.info("wifi sta 链接成功")
-    end
-end
-
---  每隔6秒打印一次airlink统计数据, 调试用
--- sys.taskInit(function()
---     while 1 do
---         sys.wait(6000)
---         airlink.statistics()
---     end
--- end)
-
-sys.taskInit(function()
-    log.info("新的Air8000脚本...")
-    wlan.init()
-    test_sta()
-    test_scan()
-end)
-sys.subscribe("IP_READY", ip_ready_handle)
-
--- 用户代码已结束---------------------------------------------
--- 结尾总是这一句
-sys.run()
--- sys.run()之后后面不要加任何语句!!!!!

+ 21 - 30
module/Air8000/demo/wlan/wifi_configuration_network_by_ap/main.lua → module/Air8000/demo/wlan/ap_config_net.lua

@@ -1,32 +1,31 @@
--- LuaTools需要PROJECT和VERSION这两个信息
-PROJECT = "WIFI_AP"
-VERSION = "1.0.0"
-
--- sys库是标配
-_G.sys = require("sys")
-require "sysplus"
-dnsproxy = require("dnsproxy")
+--[[
+@module  ap_config_net
+@summary wifi配网功能模块 
+@version 1.0
+@date    2025.10.20
+@author  魏健强
+@usage 本文为wifi配网功能模块,核心逻辑为
+1、开启wifi_ap热点;
+2、模块开启http服务器;
+3、用户通过手机等设备连接wifi_ap热点,访问http网页进行wifi配网;
+直接使用Air8000开发板硬件测试即可;
+
+本文件没有对外接口,直接在其他功能模块中require "ap_config_net"就可以加载运行;
+]] 
 dhcpsrv = require("dhcpsrv")
-httpplus = require("httpplus")
-
--- 如果无法使用此功能,可以开启此功能升级WiFi固件版本后再次尝试
--- 升级完毕后最好取消调用,防止后期版本升级过高导致程序使用不稳定
--- require "check_wifi" 
 
 -- 初始化LED灯, 这里演示控制Air8000核心板蓝灯,其他开发板请查看硬件原理图自行修改(如果使用整机开发板可以用GPIO146)
 local LEDA = gpio.setup(20, 0, gpio.PULLUP)
-
+local scan_result = {}
 
 function create_ap()
-    log.info("执行AP创建操作", "luatos8888")
-    wlan.createAP("luatos8888", "12345678")
-    sys.wait(1000)
-    netdrv.ipv4(socket.LWIP_AP, "192.168.4.1", "255.255.255.0", "0.0.0.0")
+    log.info("执行AP创建操作", "test2")
+    wlan.createAP("test2", "HZ88888888")
+    netdrv.ipv4(socket.LWIP_AP, "192.168.4.1", "255.255.255.0", "192.168.4.1")
     dhcpsrv.create({adapter=socket.LWIP_AP})
 end
 
 function wifi_networking()
-    sys.wait(3000)
     httpsrv.start(80, handle_http_request, socket.LWIP_AP)
     log.info("web", "pls open url http://192.168.4.1/")
 end
@@ -43,7 +42,7 @@ function handle_http_request(fd, method, uri, headers, body)
         wlan.scan()
         return 200, {}, "ok"
     elseif uri == "/scan/list" then
-        return 200, {["Content-Type"]="application/json"}, (json.encode({data=_G.scan_result, ok=true}))
+        return 200, {["Content-Type"]="application/json"}, (json.encode({data=scan_result, ok=true}))
     elseif uri == "/connect" then
         if method == "POST" and body and #body > 2 then
             local jdata = json.decode(body)
@@ -62,14 +61,13 @@ end
 
 function scan_done_handle()
     local result = wlan.scanResult()
-    _G.scan_result = {}
     for k, v in pairs(result) do
         log.info("scan", (v["ssid"] and #v["ssid"] > 0) and v["ssid"] or "[隐藏SSID]", v["rssi"], (v["bssid"]:toHex()))
         if v["ssid"] and #v["ssid"] > 0 then
-            table.insert(_G.scan_result, v["ssid"])
+            table.insert(scan_result, v["ssid"])
         end
     end
-    log.info("scan", "aplist", json.encode(_G.scan_result))
+    log.info("scan", "aplist", json.encode(scan_result))
 end
 
 function ip_ready_handle(ip, adapter)
@@ -83,17 +81,10 @@ end
 
 function main_task()
     wlan.init()
-    sys.wait(100)
-
     create_ap()
     wifi_networking()
-
-
 end
 
 sys.subscribe("WLAN_SCAN_DONE", scan_done_handle)
 sys.subscribe("IP_READY", ip_ready_handle)
 sys.taskInit(main_task)
-
--- 用户代码已结束---------------------------------------------
-sys.run()

+ 0 - 0
module/Air8000/demo/wlan/AP/check_wifi.lua → module/Air8000/demo/wlan/check_wifi.lua


+ 0 - 0
module/Air8000/demo/wlan/wifi_configuration_network_by_ap/index.html → module/Air8000/demo/wlan/index.html


+ 75 - 0
module/Air8000/demo/wlan/main.lua

@@ -0,0 +1,75 @@
+--[[
+@module  main
+@summary LuatOS用户应用脚本文件入口,总体调度应用逻辑 
+@version 1.0
+@date    2025.10.20
+@author  魏健强
+@usage
+本demo演示的核心功能为:
+1.开启WiFi AP功能
+2.启用wifi STA功能
+3.wifi_ap配网
+4.wifi扫描
+更多说明参考本目录下的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 = "air8000_wifi"
+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)
+
+-- require "wifi_ap"
+require "wifi_sta"
+-- require "ap_config_net"
+-- require "wifi_scan"
+-- require "check_wifi"
+
+-- 用户代码已结束---------------------------------------------
+-- 结尾总是这一句
+sys.run()
+-- sys.run()之后后面不要加任何语句!!!!!

+ 77 - 3
module/Air8000/demo/wlan/readme.md

@@ -1,3 +1,77 @@
-- AP:展示4G网络经过air8000 转为ap 热点,给其他wifi 设备提供上网能力
-- STA:展示air8000 使用wifi 路由器上网能力
-- wifi_configuration_network_by_ap AP方式配网,即通过链接Air8000 wifi 的AP(热点),打开网页配置wifi 路由器账号密码的方法,达到WIFI 使用wifi 路由器上网的目的。
+## 功能模块介绍
+
+1、main.lua:主程序入口;
+
+2、wifi_ap.lua:wifi_ap功能
+
+3、wifi_sta.lua:wifi_sta功能
+
+4、wifi_scan.lua:wifi扫描
+
+5、ap_config_net.lua:wifi_ap配网
+
+6、check_wifi.lua:wifi固件升级
+
+## 演示功能概述
+
+- AP:展示4G网络经过air8000 转为ap 热点,给其他wifi 设备提供上网能力
+- STA:展示air8000:使用wifi 路由器上网能力
+- ap_config_net:AP方式配网,即通过链接Air8000 wifi 的AP(热点),打开网页配置需要连接的wifi名称和密码
+- wifi_scan:扫描周围2.4Gwifi的名称和mac
+
+## 演示硬件环境
+
+![](https://docs.openluat.com/air8000/luatos/app/network_routing/4g_out_ethernet_in_wifi_in/image/ApM9b4W2xoqEuexEyQ6clEOTnjh.png)
+
+1、Air8000开发板一块+可上网的sim卡一张+4g天线一根+wifi天线一根:
+
+- sim卡插入开发板的sim卡槽
+
+- 天线装到开发板上
+
+2、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配置:
+ap_config_net.lua和wifi_ap.lua中的wlan.createAP("test", "HZ88888888"),修改生成wifi热点的名称和密码.
+wifi_sta.lua中的wlan.connect("test", "HZ88888888")修改需要连接的wifi的名称和密码
+
+3、在main.lua中按照自己的网卡需求启用对应的Lua文件
+
+- 如果需要测试wifi_ap功能,打开require "wifi_ap",其余注释掉
+
+- 如果需要测试wifi_sta功能,打开require "wifi_sta",其余注释掉
+
+- 如果需要测试wifi扫描功能,打开require "wifi_scan",其余注释掉
+
+- 如果需要测试wifi_ap配网功能,打开require "ap_config_net",其余注释掉
+
+- 如果需要升级wifi固件,打开require "check_wifi",其余注释掉
+
+4、Luatools烧录内核固件和修改后的demo脚本代码
+
+wifi_ap:电脑连接模块的ap热点,可以ping通模块
+![](https://docs.openluat.com/air8000/luatos/app/wifi/ap/image/wlan_ap.png)
+
+wifi_sta:模块连接wifi成功,http请求测试成功
+![](https://docs.openluat.com/air8000/luatos/app/wifi/ap/image/wlan-sta.png)
+
+wifi_scan:模块扫描附近2.4Gwifi并打印扫描结果
+![](https://docs.openluat.com/air8000/luatos/app/wifi/ap/image/wlan-scan.png)
+
+ap_config_net:电脑连接模块的ap热点,浏览器打开192.168.4.1通过网页配置模块连接对应wifi
+![](https://docs.openluat.com/air8000/luatos/app/wifi/ap/image/wlan-apcfgnet.png)
+
+check_wifi:[详情查看升级WiFi文档](https://docs.openluat.com/air8000/luatos/app/updatwifi/update/)

+ 49 - 0
module/Air8000/demo/wlan/wifi_ap.lua

@@ -0,0 +1,49 @@
+--[[
+@module  wifi_ap
+@summary wifi_ap模块 
+@version 1.0
+@date    2025.10.20
+@author  魏健强
+@usage 本文为wifi_ap功能模块,核心逻辑为
+1、开启wifi_ap热点;
+2、4G作为数据出口,其他需要联网的设备连接模块热点上网;
+直接使用Air8000开发板硬件测试即可;
+
+本文件没有对外接口,直接在其他功能模块中require "wifi_ap"就可以加载运行;
+]] 
+dnsproxy = require("dnsproxy")
+dhcpsrv = require("dhcpsrv")
+
+-- 如果无法使用AP功能,可以开启此功能升级WiFi固件版本后再次尝试
+-- 升级完毕后最好取消调用,防止后期版本升级过高导致程序使用不稳定
+-- require "check_wifi" 
+
+local function test_ap()
+    log.info("开始AP 测试...")
+    wlan.init()
+    log.info("执行AP创建操作")
+    wlan.createAP("test2", "HZ88888888") 
+    netdrv.ipv4(socket.LWIP_AP, "192.168.4.1", "255.255.255.0", "192.168.4.1")
+    while not socket.adapter(socket.LWIP_GP) do
+        -- 在此处阻塞等待wifi连接成功的消息"IP_READY"
+        -- 或者等待1秒超时退出阻塞等待状态;
+        -- 注意:此处的1000毫秒超时不要修改的更长;
+        sys.waitUntil("IP_READY", 1000)
+    end
+    dnsproxy.setup(socket.LWIP_AP, socket.LWIP_GP)
+    -- 创建一个dhcp服务器, 最简单的版本
+    dhcpsrv.create({adapter=socket.LWIP_AP})
+    netdrv.napt(socket.LWIP_GP)
+end
+
+local function ap_event(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
+
+-- wifi的AP相关事件
+sys.subscribe("WLAN_AP_INC", ap_event)
+
+sys.taskInit(test_ap)

+ 0 - 27
module/Air8000/demo/wlan/wifi_configuration_network_by_ap/check_wifi.lua

@@ -1,27 +0,0 @@
---[[
-@module  check_wifi
-@summary 远程升级wifi固件模块
-@version 1.1
-@date    2025.09.23
-@author  拓毅恒
-@usage
-检查WiFi版本并自动升级
-功能:检查当前Air8000模组的WiFi固件是否为最新版本,若不是则自动启动升级(需插入可联网的SIM卡)。
-注意:升级完毕后最好取消调用,防止后期版本升级过高导致程序使用不稳定。
-
-本文件没有对外接口,直接在main.lua中require "check_wifi"就可以加载运行。
-]]
-
-local exfotawifi = require("exfotawifi")
-
-local function fota_wifi_task()
-    local result = exfotawifi.request()
-    if result then
-        log.info("exfotawifi", "升级任务执行成功")
-    else
-        log.info("exfotawifi", "升级任务执行失败")
-    end
-end
-
--- 在设备启动时检查SIM卡状态
-sys.taskInit(fota_wifi_task)

+ 36 - 0
module/Air8000/demo/wlan/wifi_scan.lua

@@ -0,0 +1,36 @@
+--[[
+@module  wifi_scan
+@summary wifi_scan模块 
+@version 1.0
+@date    2025.10.20
+@author  魏健强
+@usage 本文为wifi扫描功能模块,核心逻辑为
+1、开启WiFi扫描;
+2、打印扫描结果;
+
+本文件没有对外接口,直接在其他功能模块中require "wifi_scan"就可以加载运行;
+]] 
+local scan_result = {}
+function test_scan()
+    while true do
+        log.info("10秒后执行wifi扫描")
+        sys.wait(10 * 1000)
+        wlan.scan()
+    end
+end
+
+function scan_done_handle()
+    local result = wlan.scanResult()
+    for k, v in pairs(result) do
+        log.info("scan", (v["ssid"] and #v["ssid"] > 0) and v["ssid"] or "[隐藏SSID]", v["rssi"], (v["bssid"]:toHex()))
+        if v["ssid"] and #v["ssid"] > 0 then
+            table.insert(scan_result, v["ssid"])
+        end
+    end
+    log.info("scan", "aplist", json.encode(scan_result))
+end
+
+
+sys.subscribe("WLAN_SCAN_DONE", scan_done_handle)
+
+sys.taskInit(test_scan)

+ 0 - 27
module/Air8000/demo/wlan/wifi_scan/check_wifi.lua

@@ -1,27 +0,0 @@
---[[
-@module  check_wifi
-@summary 远程升级wifi固件模块
-@version 1.1
-@date    2025.09.23
-@author  拓毅恒
-@usage
-检查WiFi版本并自动升级
-功能:检查当前Air8000模组的WiFi固件是否为最新版本,若不是则自动启动升级(需插入可联网的SIM卡)。
-注意:升级完毕后最好取消调用,防止后期版本升级过高导致程序使用不稳定。
-
-本文件没有对外接口,直接在main.lua中require "check_wifi"就可以加载运行。
-]]
-
-local exfotawifi = require("exfotawifi")
-
-local function fota_wifi_task()
-    local result = exfotawifi.request()
-    if result then
-        log.info("exfotawifi", "升级任务执行成功")
-    else
-        log.info("exfotawifi", "升级任务执行失败")
-    end
-end
-
--- 在设备启动时检查SIM卡状态
-sys.taskInit(fota_wifi_task)

+ 0 - 57
module/Air8000/demo/wlan/wifi_scan/main.lua

@@ -1,57 +0,0 @@
--- LuaTools需要PROJECT和VERSION这两个信息
-PROJECT = "air8000_wifiscan"
-VERSION = "1.0.5"
-
--- sys库是标配
-_G.sys = require("sys")
-require "sysplus"
-
--- 如果无法使用此功能,可以开启此功能升级WiFi固件版本后再次尝试
--- 升级完毕后最好取消调用,防止后期版本升级过高导致程序使用不稳定
--- require "check_wifi" 
-
-function test_scan()
-    while 1 do
-        log.info("执行wifi扫描")
-        wlan.scan()
-        sys.wait(30 * 1000)
-    end
-end
-
-function scan_done_handle()
-    local result = wlan.scanResult()
-    _G.scan_result = {}
-    for k, v in pairs(result) do
-        log.info("scan", (v["ssid"] and #v["ssid"] > 0) and v["ssid"] or "[隐藏SSID]", v["rssi"], (v["bssid"]:toHex()))
-        if v["ssid"] and #v["ssid"] > 0 then
-            table.insert(_G.scan_result, v["ssid"])
-        end
-    end
-    log.info("scan", "aplist", json.encode(_G.scan_result))
-end
-
---  每隔6秒打印一次airlink统计数据, 调试用
--- sys.taskInit(function()
---     while 1 do
---         sys.wait(6000)
---         airlink.statistics()
---     end
--- end)
-
-sys.subscribe("WLAN_SCAN_DONE", scan_done_handle)
-
-sys.taskInit(function()
-    -- 稍微缓一下
-    sys.wait(500)
-    wlan.init()
-    sys.wait(100)
-
-    -- wifi扫描测试
-    test_scan()
-end)
-
-
--- 用户代码已结束---------------------------------------------
--- 结尾总是这一句
-sys.run()
--- sys.run()之后后面不要加任何语句!!!!!

+ 46 - 0
module/Air8000/demo/wlan/wifi_sta.lua

@@ -0,0 +1,46 @@
+--[[
+@module  wifi_sta
+@summary wifi_sta模块 
+@version 1.0
+@date    2025.10.20
+@author  魏健强
+@usage 本文为wifi_sta功能模块,核心逻辑为
+1、模块连接wifi;
+2、发送http请求,测试网络;
+本文件没有对外接口,直接在其他功能模块中require "wifi_sta"就可以加载运行;
+]] 
+-- wifi的STA相关事件
+sys.subscribe("WLAN_STA_INC", function(evt, data)
+    -- evt 可能的值有: "CONNECTED", "DISCONNECTED"
+    -- 当evt=CONNECTED, data是连接的AP的ssid, 字符串类型
+    -- 当evt=DISCONNECTED, data断开的原因, 整数类型
+    log.info("收到STA事件", evt, data)
+end)
+
+
+function test_sta()
+    log.info("执行STA连接操作")
+    wlan.connect("test", "HZ88888888")
+    -- 等待wifi_sta网络连接成功
+    while not socket.adapter(socket.LWIP_STA) do
+        -- 在此处阻塞等待wifi连接成功的消息"IP_READY"
+        -- 或者等待1秒超时退出阻塞等待状态;
+        -- 注意:此处的1000毫秒超时不要修改的更长;
+        sys.waitUntil("IP_READY", 1000)
+    end
+    while true do
+        local code, headers, body = http.request("GET", "https://httpbin.air32.cn/bytes/2048", nil, nil, {adapter=socket.LWIP_STA,timeout=5000,debug=false}).wait()
+        log.info("http执行结果", code, headers, body and #body)
+        sys.wait(2000)
+    end
+end
+
+function ip_ready_handle(ip, adapter)
+    log.info("ip_ready_handle",ip, adapter)
+    if adapter == socket.LWIP_STA then
+        log.info("wifi sta 链接成功")
+    end
+end
+
+sys.taskInit(test_sta)
+sys.subscribe("IP_READY", ip_ready_handle)