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 配网功能已经结束。如果大家在实际操作中遇到技术难题,欢迎联系合宙技术人员。

相关推荐
玩转4G物联网11 小时前
FS800DTU 新品上线|免费使用 DMP 设备管理平台,支持远程批量配置 & OTA 升级
物联网·网络协议·tcp/ip·云平台·核心板·fs800dtu·iot管理平台
鉴生Eric12 小时前
IoT基础设施产品商的未来:回归本质的三层能力
物联网
MetrixAeroCore13 小时前
畜牧牛羊定位耳标物联网卡纽扣电池供电与休眠唤醒策略优化
物联网
智圣新创0113 小时前
存量团学系统效能跃升:智圣新创“青春科大”智慧团学平台二期升级的全周期建设参考
大数据·人工智能·物联网
liguojun202514 小时前
智慧文体旅系统选哪家?豆米跳跳十年技术沉淀支持源码交付
java·大数据·人工智能·物联网·1024程序员节
乐橙开放平台15 小时前
明厨亮灶笔记:乐橙轻应用 H5 + 小程序插件,一套 BFF 出两张播放凭证
人工智能·笔记·物联网·小程序·音视频·notepad++
李永奉15 小时前
杰理可视化SDK开发-配置ANC主动降噪功能模块教程
单片机·嵌入式硬件·物联网
绿蕉16 小时前
“十五五”5 万亿电网投资落地:新型电力系统带动电力物联网通信模组产业爆发
物联网·5g redcap·新型电力系统·十五五·电力物联网模组·v2g 车网互动 #配网智能化
乐橙开放平台17 小时前
养殖 SaaS 笔记:乐橙 IoT 物模型管环境,视频 OpenAPI 管回看
数据库·笔记·物联网·mysql·音视频
会周易的程序员1 天前
Libnodave S7 通信库:架构设计与实现解析
linux·c++·物联网·架构·c·s7·工业协议