/**
|
* Network Module based on native network_bridge C library.
|
* This module provides a singleton interface to network management.
|
* Can be used across threads, but `on` and `loop` functions need to be called in the same thread.
|
* Features:
|
* - Initialize/deinitialize network stack
|
* - Connect/disconnect to Ethernet/WiFi/4G
|
* - Query network status, local IP, RSSI
|
* - Scan WiFi hotspots
|
* - Register event callbacks (status change, WiFi scan complete)
|
*
|
* Usage:
|
* - Call `init()` once to initialize.
|
* - Use connect/disconnect/getStatus/isConnected/getLocalIP/getRSSI/scanWifi as needed.
|
* - Use `on` to register event handlers.
|
* - Call loop() periodically to process events (e.g. in setInterval).
|
*
|
* Doc/Demo: https://github.com/DejaOS/DejaOS
|
*/
|
import { netClass } from './libvbar-m-dxnetwork.so'
|
|
/**
|
* @typedef {object} NetOption
|
* @property {string} ip - Static IP address.
|
* @property {string} gateway - Static gateway address.
|
* @property {string} netmask - Static netmask.
|
* @property {string} [dns] - Static DNS server address.
|
*/
|
|
const dxnetwork = {};
|
|
// 常量与枚举
|
dxnetwork.NET_TYPE = { ETH: 1, WIFI: 2, MODEM: 4 }; // 4 = 4G Modem
|
dxnetwork.IP_MODE = { DHCP: 0, STATIC: 1 };
|
|
const net = new netClass();
|
let _callbacks = {};
|
|
/**
|
* Initializes the network.
|
* @returns {void}
|
*/
|
dxnetwork.init = function () {
|
net.init();
|
}
|
|
/**
|
* Deinitializes the network stack and releases resources.
|
* @returns {void}
|
*/
|
dxnetwork.deinit = function () {
|
net.deinit();
|
}
|
|
/**
|
* Connects to a network (Ethernet/WiFi/4G).
|
* @param {object} options - Connection options.
|
* @param {number} options.netType - Network type:
|
* 1 = Ethernet,
|
* 2 = WiFi,
|
* 4 = 4G Modem.
|
* @param {number} [options.ipMode] - IP mode: 0 = DHCP, 1 = Static.
|
* @param {string} [options.ssid] - WiFi SSID (for WiFi only).
|
* @param {string} [options.psk] - WiFi password (for WiFi only).
|
* @param {string} [options.apn] - APN for 4G connection.
|
* @param {string} [options.user] - Username for 4G APN.
|
* @param {string} [options.password] - Password for 4G APN.
|
* @param {string} [options.ip] - Static IP address (for static mode).
|
* @param {string} [options.gateway] - Static gateway (for static mode).
|
* @param {string} [options.netmask] - Static netmask (for static mode).
|
* @param {string} [options.dns] - Static DNS (for static mode).
|
* @param {string} [options.macaddr] - Custom MAC address (for Ethernet only).
|
* @returns {void}
|
* @example
|
* dxnetwork.connect({ netType: 2, ssid: 'MyWiFi', psk: 'password' });
|
*/
|
dxnetwork.connect = function (options) {
|
return net.connect(options);
|
}
|
|
/**
|
* Connects to Ethernet with DHCP.
|
* @param {string} [macaddr] - Optional custom MAC address.Usually not needed.
|
* @returns {void}
|
* @example
|
* dxnetwork.connectEthWithDHCP();
|
* dxnetwork.connectEthWithDHCP('00:11:22:33:44:55');
|
*/
|
dxnetwork.connectEthWithDHCP = function (macaddr) {
|
const options = {
|
netType: 1, // Ethernet
|
ipMode: 0 // DHCP
|
};
|
if (macaddr) {
|
options.macaddr = macaddr;
|
}
|
return net.connect(options);
|
};
|
|
/**
|
* Connects to Ethernet with a static IP configuration.
|
* @param {NetOption} netOption - The static IP configuration.
|
* @param {string} [macaddr] - Optional custom MAC address. Usually not needed.
|
* @returns {void}
|
* @example
|
* dxnetwork.connectEth({
|
* ip: '192.168.1.100',
|
* gateway: '192.168.1.1',
|
* netmask: '255.255.255.0',
|
* dns: '8.8.8.8'
|
* });
|
*/
|
dxnetwork.connectEth = function (netOption, macaddr) {
|
if (!netOption || !netOption.ip || !netOption.gateway || !netOption.netmask) {
|
throw new Error('Static IP configuration (ip, gateway, netmask) is required for connectEth.');
|
}
|
const options = {
|
netType: 1, // Ethernet
|
ipMode: 1, // Static
|
ip: netOption.ip,
|
gateway: netOption.gateway,
|
netmask: netOption.netmask,
|
dns: netOption.dns
|
};
|
if (macaddr) {
|
options.macaddr = macaddr;
|
}
|
return net.connect(options);
|
};
|
|
/**
|
* Connects to a WiFi network with DHCP.
|
* @param {string} ssid - The SSID of the WiFi network.
|
* @param {string} psk - The password (Pre-Shared Key) of the WiFi network.
|
* @returns {void}
|
* @example
|
* dxnetwork.connectWifiWithDHCP('MyWiFi', 'MyPassword');
|
*/
|
dxnetwork.connectWifiWithDHCP = function (ssid, psk) {
|
if (!ssid) {
|
throw new Error('SSID is required for connectWifiWithDHCP.');
|
}
|
const options = {
|
netType: 2, // WiFi
|
ipMode: 0, // DHCP
|
ssid: ssid,
|
psk: psk
|
};
|
return net.connect(options);
|
};
|
|
/**
|
* Connects to a WiFi network with a static IP configuration.
|
* @param {string} ssid - The SSID of the WiFi network.
|
* @param {string} psk - The password (Pre-Shared Key) of the WiFi network.
|
* @param {NetOption} netOption - The static IP configuration.
|
* @returns {void}
|
* @example
|
* dxnetwork.connectWifi('MyWiFi', 'MyPassword', {
|
* ip: '192.168.1.101',
|
* gateway: '192.168.1.1',
|
* netmask: '255.255.255.0'
|
* });
|
*/
|
dxnetwork.connectWifi = function (ssid, psk, netOption) {
|
if (!netOption || !netOption.ip || !netOption.gateway || !netOption.netmask) {
|
throw new Error('Static IP configuration (ip, gateway, netmask) is required for connectWifi with static IP.');
|
}
|
if (!ssid) {
|
throw new Error('SSID is required for connectWifi with static IP.');
|
}
|
const options = {
|
netType: 2, // WiFi
|
ipMode: 1, // Static
|
ssid: ssid,
|
psk: psk,
|
ip: netOption.ip,
|
gateway: netOption.gateway,
|
netmask: netOption.netmask,
|
dns: netOption.dns
|
};
|
return net.connect(options);
|
};
|
|
/**
|
* Connects to a 4G mobile network with default settings.
|
* @returns {void}
|
* @example
|
* dxnetwork.connect4G();
|
*/
|
dxnetwork.connect4G = function () {
|
const options = {
|
netType: 4, // 4G Modem
|
};
|
return net.connect(options);
|
};
|
|
/**
|
* Disconnects from the current network.
|
* @returns {void}
|
*/
|
dxnetwork.disconnect = function () {
|
net.disconnect();
|
}
|
|
/**
|
* Gets the current network status.
|
* @returns {number} Network status code.
|
*/
|
dxnetwork.getStatus = function () {
|
return net.getStatus();
|
}
|
|
/**
|
* Gets the current network type
|
* @returns {number} Network type code.
|
*/
|
dxnetwork.getType = function () {
|
return net.getType();
|
}
|
|
/**
|
* Checks if the network is currently connected.
|
* @returns {boolean} True if connected, false otherwise.
|
*/
|
dxnetwork.isConnected = function () {
|
return net.isConnected();
|
}
|
|
/**
|
* Gets the local IP address.
|
* @returns {string} ip address.
|
* @returns {string} gateway address.
|
* @returns {string} netmask address.
|
* @returns {string} dns address.
|
*/
|
dxnetwork.getNetParam = function () {
|
return net.getNetParam();
|
}
|
|
/**
|
* Gets the current signal strength (RSSI).
|
* @returns {number} RSSI value.
|
*/
|
dxnetwork.getRSSI = function () {
|
return net.getRSSI();
|
}
|
|
/**
|
* Gets the current network MAC address.
|
* @returns {string} MAC address.
|
*/
|
dxnetwork.getNetMac = function () {
|
return net.getNetMac();
|
}
|
|
/**
|
* Scans for available WiFi hotspots.
|
* @param {number} [timeout=2500] - Timeout in milliseconds.
|
* @param {number} [interval=100] - Scan interval in milliseconds.
|
* @returns {Array} List of WiFi hotspots.
|
*/
|
dxnetwork.scanWifi = function (timeout, interval) {
|
return net.scanWifi(timeout, interval);
|
};
|
|
/**
|
* Sets callback handlers for network events.
|
* Current only support status change event.
|
* @param {object} callbacks - Callback functions.
|
* @param {function(netType:number, status:number)} [callbacks.onStatusChange] - Called when network status changes.
|
* @example
|
* dxnetwork.setCallbacks({
|
* onStatusChange: function(netType, status) {
|
* }
|
* });
|
* @returns {void}
|
*/
|
|
dxnetwork.setCallbacks = function (callbacks) {
|
_callbacks = callbacks;
|
}
|
|
/**
|
* Processes events from the network event queue. Should be called periodically (e.g. in setInterval).
|
* Handles status change event.
|
* @example
|
* setInterval(() => {
|
* try{
|
* dxnetwork.loop();
|
* } catch (e) {
|
* log.error('Error in network loop:', e);
|
* }
|
* }, 50); // Process events every 50ms
|
*/
|
dxnetwork.loop = function () {
|
let ev = net.getEvent()
|
if (ev && ev.type === 0 && _callbacks.onStatusChange) {
|
_callbacks.onStatusChange(ev.netType, ev.netStatus);
|
}
|
}
|
|
/**
|
* Gets the native network client object.
|
* @returns {Object|null} The native client object, or null if not initialized.
|
*/
|
dxnetwork.getNative = function () {
|
return net;
|
}
|
|
export default dxnetwork;
|