| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289 |
- --[[
- @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
|