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

相关推荐
数字新视界5 小时前
机房动环监控系统是什么?其智能化管理功能有何独特优势?
物联网·数据中心·dcim·动环监控·新人首发
星恒讯工业路由器7 小时前
SDN:让网络变得更智能、更灵活、更可编程
网络·物联网·信息与通信·sdn
沫儿笙8 小时前
弧焊机器人混合气节气设备
人工智能·物联网·机器人
砍材农夫11 小时前
物联网 基于netty编解码器机制与自定义协议
物联网·netty
星恒讯工业路由器12 小时前
5G SA+NSA 灵活组网:如何助力行业数字化转型?——以星恒讯工业5G方案为例
网络·物联网·智能路由器·信息与通信
BY组态1 天前
Ricon组态系统:告别传统组态软件的痛点,开启Web可视化新时代
物联网·信息可视化·iot·web组态·组态
RFID科技的魅力1 天前
国产RFID资产管理系统推荐:信创兼容、稳定可靠、服务响应快
物联网·rfid
星恒讯工业路由器1 天前
星恒讯5G工业级通信模组选型指南:接口配置、工业防护与应用场景详解
网络·物联网·5g·信息与通信
独自归家的兔1 天前
OCPP 1.6 协议详解:GetLocalListVersion 获取本地列表版本指令
java·后端·物联网·spring·ocpp1.6