/** * 网络工作模块 (netWorker.js) * * 功能说明: * - 管理网络连接(以太网、WiFi、4G) * - 支持DHCP和静态IP配置 * - 自动重连机制 * - 网络状态监控和事件通知 * - WiFi扫描功能 * * 网络类型: * - type=1: 以太网 * - type=2: WiFi * - type=4: 4G * * 网络状态: * - status=4: 已连接 * - 其他状态: 未连接或连接中 */ import net from '../../dxmodules/dxNetwork.js' import std from '../../dxmodules/dxStd.js' import bus from '../../dxmodules/dxEventBus.js' import config from '../../dxmodules/dxConfig.js' import logger from '../../dxmodules/dxLogger.js' import map from '../../dxmodules/dxMap.js' import driver from '../driver.js' import netUtils from '../common/utils/netUtils.js' import * as os from "os" // 网络状态跟踪变量 let lastConnected = false // 上次连接状态 let shouldReconnect = false const net_map = map.get("NET") /** * 根据配置建立网络连接 * * 支持的连接方式: * 1. 以太网 - DHCP或静态IP * 2. WiFi - DHCP或静态IP * 3. 4G - 自动连接 */ function connect() { try { let res = 0; // 获取网络配置 let dhcp = config.get("net.dhcp") == 2 // DHCP启用标志 let type = config.get("net.type") // 网络类型 // 如果未配置网络类型,使用默认的以太网 if (!type) { logger.warn("Network type not configured, using default"); type = 1; // 默认使用以太网 } switch (type) { case 1: // 以太网连接 if (dhcp) { // 使用DHCP自动获取IP res = net.connectEthWithDHCP() } else { // 使用静态IP配置 const ip = config.get("net.ip") const gateway = config.get("net.gateway") const netmask = config.get("net.mask") const dns = config.get("net.dns") logger.info(ip, gateway, netmask, dns); // 验证静态IP配置的完整性 if (!ip || !gateway || !netmask) { logger.error("Ethernet static IP configuration incomplete"); return; } // 建立以太网连接 res = net.connectEth({ ip, gateway, netmask, dns }) } break; case 2: // WiFi连接 let ssid = config.get("net.ssid") let psk = config.get("net.psk") if (!ssid) { psk = "" } logger.info(ssid, psk); if (dhcp) { // 使用DHCP自动获取IP res = net.connectWifiWithDHCP(ssid, psk) } else { // 使用静态IP配置 const ip = config.get("net.ip") const gateway = config.get("net.gateway") const netmask = config.get("net.mask") // 验证静态IP配置的完整性 if (!ip || !gateway || !netmask) { logger.error("WiFi static IP configuration incomplete"); return; } // 建立WiFi连接 res = net.connectWifi(ssid, psk, { ip, gateway, netmask }) } break; case 4: // 4G连接 - 自动配置 res = net.connect4G() break; default: logger.warn(`Unknown network type: ${type}`); break; } logger.info("NET connect res:", res); if (res < 0) { //小于0并不是表示网络连接失败,而是一个特殊的错误,可以重试一次就可以 shouldReconnect = true } return res; } catch (error) { logger.error("Error in connect function:", error); } } /** * 网络重连函数 */ function reconnect() { logger.info("NET reconnect"); shouldReconnect = true } /** * 注册事件监听器 * * 监听的事件: * - RECONNECT: 手动触发重连 * - SCAN_WIFI: 扫描WiFi网络 */ function events() { // 监听重连事件 bus.on(driver.net.RECONNECT, () => { lastConnected = false reconnect() }) // 监听WiFi扫描事件 bus.on(driver.net.SCAN_WIFI, () => { // 扫描WiFi网络并返回结果 // 参数:超时时间2500ms,扫描间隔200ms let wifiList = net.scanWifi(2500, 200) if (wifiList) { let ssidList = wifiList.map(v => v.ssid) let cleaned = netUtils.filterWifiList(ssidList, { maxLen: 64 }); bus.fire(driver.net.WIFI_LIST, cleaned) } }) } /** * 网络初始化主函数 * * 执行步骤: * 1. 初始化网络模块 * 2. 设置网络状态回调 * 3. 建立网络连接 * 4. 创建必要的定时器 */ function run() { // 初始化网络模块 net.init(); shouldReconnect = true } let lastConnectedIp // 网络状态监听器 function listener() { std.setInterval(() => { try { if (net.getNative()) { net.loop(); // 执行网络循环处理 } if (shouldReconnect) { logger.info("NET shouldReconnect"); shouldReconnect = false connect() } } catch (error) { logger.error(error) } if (net.isConnected()) { let param = driver.net.getNetParam() if (!lastConnected || lastConnectedIp != param.ip) { bus.fire(driver.net.CONNECTED_CHANGED, "connected") lastConnected = true net_map.put("NET_STATUS", "connected") lastConnectedIp = param.ip } } else { if (lastConnected) { bus.fire(driver.net.CONNECTED_CHANGED, "disconnected") lastConnected = false net_map.put("NET_STATUS", "disconnected") } } }, 5000) } // 模块初始化 try { events() // 注册事件监听器 run() // 初始化网络 listener() } catch (error) { logger.error(error); }