Air8000多网通信-Wlan

一、概述

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 源码及固件

  1. 本demo开发测试时使用的固件为LuatOS-SoC_V2016_Air8000_1.soc,本demo对固件版本没有什么特殊要求,所以你如果要测试本demo时,可以直接使用最新版本的内核固件;如果发现最新版本的内核固件测试有问题,可以使用我们开发本demo时使用的内核固件版本来对比测试;
  2. Air8000 开发板脚本文件参考:https://gitee.com/openLuat/LuatOS/tree/master/module/Air8000/demo/wlan
  3. 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 配网功能已经结束。如果大家在实际操作中遇到技术难题,欢迎联系合宙技术人员。

相关推荐
老梁agent1 天前
MCP 协议实战:用标准化方式让 Agent 调用工业工具
物联网·agent·mcp
老梁agent4 天前
一个 Agent 不够用?工业场景下的多 Agent 路由模式实战
物联网·agent
老梁agent5 天前
从 0 到 22 篇:工业 Agent 的六大设计原则
物联网·agent
老梁agent7 天前
Agent 如何看懂时序数据?时间序列查询的 Tool 设计模式
物联网·agent
Inhand陈工13 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
大鱼>13 天前
大语言模型+物联网:LLM理解物理世界
物联网·struts·语言模型·多模态·aiot
果丁智能13 天前
物联网智能锁赋能集中式住宿:身份核验与远程权限管控的全链路技术实践
大数据·人工智能·物联网·智能家居
国产化创客13 天前
ESP32 CameraWebServer 原生摄像头项目全解析
物联网·开源·嵌入式·实时音视频·智能硬件
谁似人间西林客13 天前
数据智能怎么赋能工业制造?物联网场景落地方法解析
物联网·制造
InHand云飞小白13 天前
无人值守站点网络困境?工业级路由器IR315破解连接难题
网络·物联网·4g·工业路由器·4g路由器·iiot·蜂窝路由器