--[[ @module net_manager @summary 网络连接管理器 @version 1.0 @date 2026.05.07 @author Wei Jianqiang @usage 管理WiFi和4G网络切换 功能说明: 1. 默认状态下自动使用4G联网 2. WiFi连接成功后自动断开4G(进入飞行模式) 3. 关闭WiFi时自动恢复4G(退出飞行模式) ]] -- 网络状态枚举 local NET_STATE = { DISCONNECTED = "disconnected", -- 未连接 MOBILE_CONNECTED = "mobile_connected", -- 4G连接 WIFI_CONNECTED = "wifi_connected" -- WiFi连接 } -- 当前网络状态 local current_state = NET_STATE.DISCONNECTED -- WiFi连接信息 local wifi_info = { ssid = "", password = "" } -- 网络状态回调函数(供UI注册) local status_callback = nil -- 设置状态回调 local function set_status_callback(callback) status_callback = callback end -- 通知状态变化 local function notify_status_change(new_state) current_state = new_state log.info("net_manager", "网络状态变化:", new_state) if status_callback then status_callback(new_state) end -- 发布系统事件 sys.publish("NET_STATE_CHANGED", new_state) end -- 初始化网络(默认4G) local function init_network() log.info("net_manager", "初始化网络,默认使用4G") -- 确保4G处于非飞行模式 if mobile then local result = mobile.flymode(0, false) -- 退出飞行模式 log.info("net_manager", "4G退出飞行模式,原状态:", result) end -- 等待4G网络就绪 sys.taskInit(function() log.info("net_manager", "等待4G网络就绪...") local ready = sys.waitUntil("IP_READY", 30000) if ready then notify_status_change(NET_STATE.MOBILE_CONNECTED) log.info("net_manager", "4G网络连接成功") else log.info("net_manager", "4G网络就绪超时") end end) end -- 连接WiFi local function connect_wifi(ssid, password) if not ssid or password == "" then log.info("net_manager", "WiFi名称为空") return false end log.info("net_manager", "准备连接WiFi:", ssid) -- 保存WiFi信息 wifi_info.ssid = ssid wifi_info.password = password or "" -- 启动连接任务 sys.taskInit(function() -- 连接WiFi wlan.connect(ssid, password) -- 等待连接成功 local success = sys.waitUntil("IP_READY", 15000) if success then log.info("net_manager", "WiFi连接成功:", ssid) -- WiFi连接成功,断开4G(进入飞行模式) if mobile then local result = mobile.flymode(0, true) log.info("net_manager", "4G进入飞行模式,原状态:", result) end notify_status_change(NET_STATE.WIFI_CONNECTED) else log.info("net_manager", "WiFi连接失败或超时") notify_status_change(NET_STATE.DISCONNECTED) end end) return true end -- 断开WiFi local function disconnect_wifi() log.info("net_manager", "断开WiFi") -- 断开WiFi连接 wlan.disconnect() -- 恢复4G(退出飞行模式) if mobile then local result = mobile.flymode(0, false) log.info("net_manager", "4G退出飞行模式,原状态:", result) end -- 等待4G恢复 sys.taskInit(function() local ready = sys.waitUntil("IP_READY", 30000) if ready then notify_status_change(NET_STATE.MOBILE_CONNECTED) log.info("net_manager", "4G网络恢复成功") else log.info("net_manager", "4G网络恢复超时") notify_status_change(NET_STATE.DISCONNECTED) end end) end -- 开启4G(如果WiFi正在连接,先断开WiFi) local function enable_mobile() log.info("net_manager", "开启4G") -- 如果当前是WiFi连接状态,先断开WiFi if current_state == NET_STATE.WIFI_CONNECTED then log.info("net_manager", "当前为WiFi模式,先断开WiFi") end -- 退出4G飞行模式 if mobile then local result = mobile.flymode(0, false) log.info("net_manager", "4G退出飞行模式,原状态:", result) end -- 等待4G连接 sys.taskInit(function() local ready = sys.waitUntil("IP_READY", 30000) if ready then log.info("net_manager", "4G连接成功") notify_status_change(NET_STATE.MOBILE_CONNECTED) -- 4G连接成功后,确保WiFi已断开 local wlan_info = wlan.getInfo() if wlan_info and wlan_info.ssid then log.info("net_manager", "4G连接成功,断开WiFi") wlan.disconnect() end else log.info("net_manager", "4G连接失败") -- 4G连接失败,保持原有状态 if current_state == NET_STATE.WIFI_CONNECTED then log.info("net_manager", "保持WiFi连接状态") end end end) return true end -- 关闭4G(进入飞行模式) local function disable_mobile() log.info("net_manager", "关闭4G") if mobile then local result = mobile.flymode(0, true) log.info("net_manager", "4G进入飞行模式,原状态:", result) end notify_status_change(NET_STATE.DISCONNECTED) return true end -- 获取当前网络状态 local function get_status() -- 状态文字映射表 local state_map = { [NET_STATE.DISCONNECTED] = "未连接", [NET_STATE.MOBILE_CONNECTED] = "4G连接", [NET_STATE.WIFI_CONNECTED] = "WiFi连接" } -- 创建状态表 local status = {} status.state = current_state status.state_text = state_map[current_state] or "未知" status.wifi_ssid = wifi_info.ssid status.is_wifi_connected = (current_state == NET_STATE.WIFI_CONNECTED) status.is_mobile_connected = (current_state == NET_STATE.MOBILE_CONNECTED) -- 添加4G信号信息 if mobile then status.mobile_info = {} status.mobile_info.csq = mobile.csq() status.mobile_info.rssi = mobile.rssi() status.mobile_info.imei = mobile.imei() end -- 添加WiFi信息 local wlan_info = wlan.getInfo() if wlan_info then status.wifi_info = wlan_info end return status end -- WiFi状态事件监听 sys.subscribe("WLAN_STA_INC", function(evt, data) log.info("net_manager", "WiFi事件:", evt, data) if evt == "DISCONNECTED" then -- WiFi断开,自动恢复4G if current_state == NET_STATE.WIFI_CONNECTED then log.info("net_manager", "WiFi意外断开,恢复4G") disconnect_wifi() end end end) -- 对外接口 local exports = { -- 网络状态常量 STATE = NET_STATE, -- 初始化网络(默认4G) init = init_network, -- WiFi操作 connect_wifi = connect_wifi, disconnect_wifi = disconnect_wifi, -- 4G操作 enable_mobile = enable_mobile, disable_mobile = disable_mobile, -- 获取状态 get_status = get_status, -- 设置状态回调 set_status_callback = set_status_callback } -- 模块加载时自动初始化网络(上电即执行) sys.taskInit(function() log.info("net_manager", "模块加载,自动初始化网络") -- 等待IP就绪(可能已经就绪) local ready = sys.waitUntil("IP_READY", 30000) if ready then log.info("net_manager", "IP已就绪,当前为4G模式") current_state = NET_STATE.MOBILE_CONNECTED sys.publish("NET_STATE_CHANGED", current_state) else log.info("net_manager", "等待IP就绪超时") end -- 启动定时检查网络状态 sys.timerLoopStart(function() local status = get_status() if status.is_mobile_connected and current_state ~= NET_STATE.MOBILE_CONNECTED then current_state = NET_STATE.MOBILE_CONNECTED sys.publish("NET_STATE_CHANGED", current_state) elseif status.is_wifi_connected and current_state ~= NET_STATE.WIFI_CONNECTED then current_state = NET_STATE.WIFI_CONNECTED sys.publish("NET_STATE_CHANGED", current_state) end end, 30000) -- 每30秒检查一次 end) return exports