lgq
3 天以前 081f12a52906abe6c2d139fdc144135978681009
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
/**
 * 网络工作模块 (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);
}