net_manager.lua 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289
  1. --[[
  2. @module net_manager
  3. @summary 网络连接管理器
  4. @version 1.0
  5. @date 2026.05.07
  6. @author Wei Jianqiang
  7. @usage 管理WiFi和4G网络切换
  8. 功能说明:
  9. 1. 默认状态下自动使用4G联网
  10. 2. WiFi连接成功后自动断开4G(进入飞行模式)
  11. 3. 关闭WiFi时自动恢复4G(退出飞行模式)
  12. ]]
  13. -- 网络状态枚举
  14. local NET_STATE = {
  15. DISCONNECTED = "disconnected", -- 未连接
  16. MOBILE_CONNECTED = "mobile_connected", -- 4G连接
  17. WIFI_CONNECTED = "wifi_connected" -- WiFi连接
  18. }
  19. -- 当前网络状态
  20. local current_state = NET_STATE.DISCONNECTED
  21. -- WiFi连接信息
  22. local wifi_info = {
  23. ssid = "",
  24. password = ""
  25. }
  26. -- 网络状态回调函数(供UI注册)
  27. local status_callback = nil
  28. -- 设置状态回调
  29. local function set_status_callback(callback)
  30. status_callback = callback
  31. end
  32. -- 通知状态变化
  33. local function notify_status_change(new_state)
  34. current_state = new_state
  35. log.info("net_manager", "网络状态变化:", new_state)
  36. if status_callback then
  37. status_callback(new_state)
  38. end
  39. -- 发布系统事件
  40. sys.publish("NET_STATE_CHANGED", new_state)
  41. end
  42. -- 初始化网络(默认4G)
  43. local function init_network()
  44. log.info("net_manager", "初始化网络,默认使用4G")
  45. -- 确保4G处于非飞行模式
  46. if mobile then
  47. local result = mobile.flymode(0, false) -- 退出飞行模式
  48. log.info("net_manager", "4G退出飞行模式,原状态:", result)
  49. end
  50. -- 等待4G网络就绪
  51. sys.taskInit(function()
  52. log.info("net_manager", "等待4G网络就绪...")
  53. local ready = sys.waitUntil("IP_READY", 30000)
  54. if ready then
  55. notify_status_change(NET_STATE.MOBILE_CONNECTED)
  56. log.info("net_manager", "4G网络连接成功")
  57. else
  58. log.info("net_manager", "4G网络就绪超时")
  59. end
  60. end)
  61. end
  62. -- 连接WiFi
  63. local function connect_wifi(ssid, password)
  64. if not ssid or password == "" then
  65. log.info("net_manager", "WiFi名称为空")
  66. return false
  67. end
  68. log.info("net_manager", "准备连接WiFi:", ssid)
  69. -- 保存WiFi信息
  70. wifi_info.ssid = ssid
  71. wifi_info.password = password or ""
  72. -- 启动连接任务
  73. sys.taskInit(function()
  74. -- 连接WiFi
  75. wlan.connect(ssid, password)
  76. -- 等待连接成功
  77. local success = sys.waitUntil("IP_READY", 15000)
  78. if success then
  79. log.info("net_manager", "WiFi连接成功:", ssid)
  80. -- WiFi连接成功,断开4G(进入飞行模式)
  81. if mobile then
  82. local result = mobile.flymode(0, true)
  83. log.info("net_manager", "4G进入飞行模式,原状态:", result)
  84. end
  85. notify_status_change(NET_STATE.WIFI_CONNECTED)
  86. else
  87. log.info("net_manager", "WiFi连接失败或超时")
  88. notify_status_change(NET_STATE.DISCONNECTED)
  89. end
  90. end)
  91. return true
  92. end
  93. -- 断开WiFi
  94. local function disconnect_wifi()
  95. log.info("net_manager", "断开WiFi")
  96. -- 断开WiFi连接
  97. wlan.disconnect()
  98. -- 恢复4G(退出飞行模式)
  99. if mobile then
  100. local result = mobile.flymode(0, false)
  101. log.info("net_manager", "4G退出飞行模式,原状态:", result)
  102. end
  103. -- 等待4G恢复
  104. sys.taskInit(function()
  105. local ready = sys.waitUntil("IP_READY", 30000)
  106. if ready then
  107. notify_status_change(NET_STATE.MOBILE_CONNECTED)
  108. log.info("net_manager", "4G网络恢复成功")
  109. else
  110. log.info("net_manager", "4G网络恢复超时")
  111. notify_status_change(NET_STATE.DISCONNECTED)
  112. end
  113. end)
  114. end
  115. -- 开启4G(如果WiFi正在连接,先断开WiFi)
  116. local function enable_mobile()
  117. log.info("net_manager", "开启4G")
  118. -- 如果当前是WiFi连接状态,先断开WiFi
  119. if current_state == NET_STATE.WIFI_CONNECTED then
  120. log.info("net_manager", "当前为WiFi模式,先断开WiFi")
  121. end
  122. -- 退出4G飞行模式
  123. if mobile then
  124. local result = mobile.flymode(0, false)
  125. log.info("net_manager", "4G退出飞行模式,原状态:", result)
  126. end
  127. -- 等待4G连接
  128. sys.taskInit(function()
  129. local ready = sys.waitUntil("IP_READY", 30000)
  130. if ready then
  131. log.info("net_manager", "4G连接成功")
  132. notify_status_change(NET_STATE.MOBILE_CONNECTED)
  133. -- 4G连接成功后,确保WiFi已断开
  134. local wlan_info = wlan.getInfo()
  135. if wlan_info and wlan_info.ssid then
  136. log.info("net_manager", "4G连接成功,断开WiFi")
  137. wlan.disconnect()
  138. end
  139. else
  140. log.info("net_manager", "4G连接失败")
  141. -- 4G连接失败,保持原有状态
  142. if current_state == NET_STATE.WIFI_CONNECTED then
  143. log.info("net_manager", "保持WiFi连接状态")
  144. end
  145. end
  146. end)
  147. return true
  148. end
  149. -- 关闭4G(进入飞行模式)
  150. local function disable_mobile()
  151. log.info("net_manager", "关闭4G")
  152. if mobile then
  153. local result = mobile.flymode(0, true)
  154. log.info("net_manager", "4G进入飞行模式,原状态:", result)
  155. end
  156. notify_status_change(NET_STATE.DISCONNECTED)
  157. return true
  158. end
  159. -- 获取当前网络状态
  160. local function get_status()
  161. -- 状态文字映射表
  162. local state_map = {
  163. [NET_STATE.DISCONNECTED] = "未连接",
  164. [NET_STATE.MOBILE_CONNECTED] = "4G连接",
  165. [NET_STATE.WIFI_CONNECTED] = "WiFi连接"
  166. }
  167. -- 创建状态表
  168. local status = {}
  169. status.state = current_state
  170. status.state_text = state_map[current_state] or "未知"
  171. status.wifi_ssid = wifi_info.ssid
  172. status.is_wifi_connected = (current_state == NET_STATE.WIFI_CONNECTED)
  173. status.is_mobile_connected = (current_state == NET_STATE.MOBILE_CONNECTED)
  174. -- 添加4G信号信息
  175. if mobile then
  176. status.mobile_info = {}
  177. status.mobile_info.csq = mobile.csq()
  178. status.mobile_info.rssi = mobile.rssi()
  179. status.mobile_info.imei = mobile.imei()
  180. end
  181. -- 添加WiFi信息
  182. local wlan_info = wlan.getInfo()
  183. if wlan_info then
  184. status.wifi_info = wlan_info
  185. end
  186. return status
  187. end
  188. -- WiFi状态事件监听
  189. sys.subscribe("WLAN_STA_INC", function(evt, data)
  190. log.info("net_manager", "WiFi事件:", evt, data)
  191. if evt == "DISCONNECTED" then
  192. -- WiFi断开,自动恢复4G
  193. if current_state == NET_STATE.WIFI_CONNECTED then
  194. log.info("net_manager", "WiFi意外断开,恢复4G")
  195. disconnect_wifi()
  196. end
  197. end
  198. end)
  199. -- 对外接口
  200. local exports = {
  201. -- 网络状态常量
  202. STATE = NET_STATE,
  203. -- 初始化网络(默认4G)
  204. init = init_network,
  205. -- WiFi操作
  206. connect_wifi = connect_wifi,
  207. disconnect_wifi = disconnect_wifi,
  208. -- 4G操作
  209. enable_mobile = enable_mobile,
  210. disable_mobile = disable_mobile,
  211. -- 获取状态
  212. get_status = get_status,
  213. -- 设置状态回调
  214. set_status_callback = set_status_callback
  215. }
  216. -- 模块加载时自动初始化网络(上电即执行)
  217. sys.taskInit(function()
  218. log.info("net_manager", "模块加载,自动初始化网络")
  219. -- 等待IP就绪(可能已经就绪)
  220. local ready = sys.waitUntil("IP_READY", 30000)
  221. if ready then
  222. log.info("net_manager", "IP已就绪,当前为4G模式")
  223. current_state = NET_STATE.MOBILE_CONNECTED
  224. sys.publish("NET_STATE_CHANGED", current_state)
  225. else
  226. log.info("net_manager", "等待IP就绪超时")
  227. end
  228. -- 启动定时检查网络状态
  229. sys.timerLoopStart(function()
  230. local status = get_status()
  231. if status.is_mobile_connected and current_state ~= NET_STATE.MOBILE_CONNECTED then
  232. current_state = NET_STATE.MOBILE_CONNECTED
  233. sys.publish("NET_STATE_CHANGED", current_state)
  234. elseif status.is_wifi_connected and current_state ~= NET_STATE.WIFI_CONNECTED then
  235. current_state = NET_STATE.WIFI_CONNECTED
  236. sys.publish("NET_STATE_CHANGED", current_state)
  237. end
  238. end, 30000) -- 每30秒检查一次
  239. end)
  240. return exports