一、概述
wifi 操作:主要介绍模组支持的 wifi 相关功能(对于仅支持 wifiscan 的模块, 仅 init/scan/scanResult 函数是可用的。例如: Air780EXXX 等仅支持 wifiscan)。
AP 应用:AP 是 Access Point 的缩写,即无线接入点,它是一个无线网络的中心节点,可以看成是一个服务器。它作为一个网络的中心节点,提供无线接入服务,其他的无线设备允许接入该节点,所有接入该节点设备的无线信号数据都要通过它才能进行交换和互相访问。一般的无线路由器、网关、热点就是工作在 AP 模式下,AP 节点和 AP 节点之间允许相互连接;
STA 应用:STA 是 Station 的缩写,它是无线网络中的一个终端站点设备,可以看成是一个客户端,一般来说,处在 STA 模式下的设备本身不接受无线的接入,该设备连接到 AP 节点进行网络访问,STA 模式下的设备之间的通信可以通过 AP 进行转发实现;
扫描 应用:WiFiSCAN 是指通过无线设备(如智能手机、路由器、物联网设备等)主动扫描周围可用的 WiFi 网络,以获取其基本信息(如 SSID、信号强度、加密方式、频段等)的过程。它是无线通信领域中一项基础且重要的功能,广泛应用于网络配置、设备连接、信号优化及安全检测等场景;
二、演示功能概述
本示例将演示如何使用 Air8000 工业引擎的 AP 应用,STA 应用和扫描应用。
三、准备硬件环境
3.1 Air8000 开发板

1、Air8000 开发板一块 + 可上网的 sim 卡一张 +4g 天线一根 +wifi 天线一根:
- sim 卡插入开发板的 sim 卡槽
- 天线装到开发板上
3.2 PC 电脑
WIN10 以及以上版本的 WINDOWS 系统;
3.3 数据通信线
USB 数据线(其一端为 Type-C 接口,用于连接 Air8000)。
四、准备软件环境
4.1 下载调试工具
使用说明参考:Luatools 下载和详细使用
五、软硬件资料
5.1 源码及固件
- 本demo开发测试时使用的固件为LuatOS-SoC_V2016_Air8000_1.soc,本demo对固件版本没有什么特殊要求,所以你如果要测试本demo时,可以直接使用最新版本的内核固件;如果发现最新版本的内核固件测试有问题,可以使用我们开发本demo时使用的内核固件版本来对比测试;
- Air8000 开发板脚本文件参考:https://gitee.com/openLuat/LuatOS/tree/master/module/Air8000/demo/wlan
- LuatOS 运行所需要的 lib 文件:使用 Luatools 烧录时,勾选 添加默认 lib 选项,使用默认 lib 脚本文件。准备好软件环境之后,接下来查看 Air8000 开发板使用说明将本篇文章中演示使用的项目文件烧录到 Air8000 开发板中。
5.2 demo 使用 api 介绍
本教程使用 api 接口为:
https://docs.openluat.com/osapi/core/wlan/
https://docs.openluat.com/osapi/core/netdrv/
https://docs.openluat.com/osapi/ext/dhcpsrv/
https://docs.openluat.com/osapi/core/httpsrv/
六、代码示例介绍
6.1 作为 STA 连接 wifi
lua
--[[
@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)
6.2 Air8000 开启 AP 热点
lua
--[[
@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)
6.3 开启一次 wifi 扫描,并注册获取 wifi 扫描结果的回调函数
lua
--[[
@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)
6.4 ap 配网
lua
--[[
@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")
-- 初始化LED灯, 这里演示控制Air8000核心板蓝灯,其他开发板请查看硬件原理图自行修改(如果使用整机开发板可以用GPIO146)
local LEDA = gpio.setup(20, 0, gpio.PULLUP)
local scan_result = {}
function create_ap()
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()
httpsrv.start(80, handle_http_request, socket.LWIP_AP)
log.info("web", "pls open url http://192.168.4.1/")
end
function handle_http_request(fd, method, uri, headers, body)
log.info("httpsrv", method, uri, json.encode(headers), body)
if uri == "/led/1" then
LEDA(1)
return 200, {}, "ok"
elseif uri == "/led/0" then
LEDA(0)
return 200, {}, "ok"
elseif uri == "/scan/go" then
wlan.scan()
return 200, {}, "ok"
elseif uri == "/scan/list" then
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)
if jdata and jdata.ssid then
sys.timerStart(wlan.connect, 500, jdata.ssid, jdata.passwd)
return 200, {}, "ok"
end
end
return 400, {}, "ok"
elseif uri == "/connok" then
log.info("connok", json.encode({ip=socket.localIP(2)}))
return 200, {["Content-Type"]="application/json"}, json.encode({ip=socket.localIP(2)})
end
return 404, {}, "Not Found" .. uri
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
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
function main_task()
wlan.init()
create_ap()
wifi_networking()
end
sys.subscribe("WLAN_SCAN_DONE", scan_done_handle)
sys.subscribe("IP_READY", ip_ready_handle)
sys.taskInit(main_task)
6.5 升级 wifi 固件
lua
--[[
@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)
七、结果验证
7.1 AP 结果示例

7.2 STA 结果示例

7.3 wifi 扫描结果示例

7.4 AP 配网结果示例

7.5 升级 wifi 固件 详情查看升级 WiFi 文档
八、总结
至此,使用 wlan 核心库演示的 AP、STA、wifi 扫描和 wifi 配网功能已经结束。如果大家在实际操作中遇到技术难题,欢迎联系合宙技术人员。