鸿蒙NEXT开发网络相关工具类(ArkTs)
import { connection } from '@kit.NetworkKit';
import { BusinessError, Callback } from '@kit.BasicServicesKit';
import { wifiManager } from '@kit.ConnectivityKit';
import { LogUtil } from './LogUtil';
import { data, radio, sim } from '@kit.TelephonyKit';// 网络类型枚举
export enum NetworkType {NETWORK_TYPE_UNKNOWN = 0,NETWORK_TYPE_WIFI = 1,NETWORK_TYPE_2G = 2,NETWORK_TYPE_3G = 3,NETWORK_TYPE_4G = 4,NETWORK_TYPE_5G = 5,
}/*** 网络相关工具类* 需要 ohos.permission.GET_NETWORK_INFO、ohos.permission.GET_WIFI_INFO 权限。* author: CSDN-鸿蒙布道师* since: 2025/04/23*/
export class NetworkUtil {private static netConnection: connection.NetConnection | null = null;/*** 检查默认网络是否按流量计费*/static async isDefaultNetMetered(): Promise<boolean> {try {return await connection.isDefaultNetMetered();} catch (error) {LogUtil.error('Failed to check default network metering:', error);throw new Error(error);}}static isDefaultNetMeteredSync(): boolean {return connection.isDefaultNetMeteredSync();}/*** 检查是否有默认网络*/static async hasDefaultNet(): Promise<boolean> {try {return await connection.hasDefaultNet();} catch (error) {LogUtil.error('Failed to check if there is a default network:', error);// 确保抛出的是 Error 类型throw new Error(error);}}static hasDefaultNetSync(): boolean {return connection.hasDefaultNetSync();}/*** 获取默认网络句柄*/static async getDefaultNet(): Promise<connection.NetHandle> {try {return await connection.getDefaultNet();} catch (error) {LogUtil.error('Failed to get default network handle:', error);throw new Error(error);}}static getDefaultNetSync(): connection.NetHandle {return connection.getDefaultNetSync();}/*** 获取应用当前网络句柄*/static async getAppNet(): Promise<connection.NetHandle> {try {return await connection.getAppNet();} catch (error) {LogUtil.error('Failed to get app network handle:', error);throw new Error(error);}}static getAppNetSync(): connection.NetHandle {return connection.getAppNetSync();}/*** 获取所有可用网络句柄*/static async getAllNets(): Promise<Array<connection.NetHandle>> {try {return await connection.getAllNets();} catch (error) {LogUtil.error('Failed to get all network handles:', error);throw new Error(error);}}static getAllNetsSync(): Array<connection.NetHandle> {return connection.getAllNetsSync();}/*** 检查是否有可用网络*/static isNetworkAvailable(): boolean {const allNets = NetworkUtil.getAllNetsSync();return Array.isArray(allNets) && allNets.length > 0;}/*** 检查是否有指定类型的网络连接*/static hasNetBearType(netType: connection.NetBearType): boolean {const bearTypes = NetworkUtil.getNetBearTypes();return bearTypes.includes(netType);}static hasNetMobile(): boolean {return NetworkUtil.hasNetBearType(connection.NetBearType.BEARER_CELLULAR);}static hasNetWiFi(): boolean {return NetworkUtil.hasNetBearType(connection.NetBearType.BEARER_WIFI);}static hasNetEthernet(): boolean {return NetworkUtil.hasNetBearType(connection.NetBearType.BEARER_ETHERNET);}static hasNetVPN(): boolean {return NetworkUtil.hasNetBearType(connection.NetBearType.BEARER_VPN);}/*** 获取网络承载类型列表*/static getNetBearTypes(): Array<connection.NetBearType> {const netCapabilities = NetworkUtil.getNetCapabilitiesSync(NetworkUtil.getDefaultNetSync());return netCapabilities?.bearerTypes || [];}static getNetBearType(): connection.NetBearType {const bearTypes = NetworkUtil.getNetBearTypes();return bearTypes[0] || connection.NetBearType.BEARER_CELLULAR;}/*** 获取网络能力*/static async getNetCapabilities(netHandle: connection.NetHandle = NetworkUtil.getDefaultNetSync()): Promise<connection.NetCapabilities> {try {return await connection.getNetCapabilities(netHandle);} catch (error) {LogUtil.error('Failed to get network capabilities:', error);throw new Error(error);}}static getNetCapabilitiesSync(netHandle: connection.NetHandle = NetworkUtil.getDefaultNetSync()): connection.NetCapabilities {return connection.getNetCapabilitiesSync(netHandle);}/*** 获取网络连接属性*/static async getConnectionProperties(netHandle: connection.NetHandle = NetworkUtil.getDefaultNetSync()): Promise<connection.ConnectionProperties> {try {return await connection.getConnectionProperties(netHandle);} catch (error) {LogUtil.error('Failed to get connection properties:', error);throw new Error(error);}}static getConnectionPropertiesSync(netHandle: connection.NetHandle = NetworkUtil.getDefaultNetSync()): connection.ConnectionProperties {return connection.getConnectionPropertiesSync(netHandle);}/*** 获取当前设备的IP地址*/static getIpAddress(): string {try {const ipAddress = wifiManager.getIpInfo().ipAddress;return [(ipAddress >>> 24) & 0xFF,(ipAddress >>> 16) & 0xFF,(ipAddress >>> 8) & 0xFF,ipAddress & 0xFF,].join('.');} catch (error) {LogUtil.error('Failed to get IP address:', error);return '0.0.0.0';}}/*** 注册网络事件监听器*/static register(netAvailableCallback?: Callback<connection.NetHandle>,netUnavailableCallback?: Callback<void>,netCapabilitiesChangeCallback?: Callback<connection.NetCapabilityInfo>,netConnectionPropertiesChangeCallback?: Callback<connection.NetConnectionPropertyInfo>,netBlockStatusChangeCallback?: Callback<connection.NetBlockStatusInfo>,netLostCallback?: Callback<connection.NetHandle>): void {if (!NetworkUtil.netConnection) {NetworkUtil.netConnection = connection.createNetConnection();}// 注册默认网络回调connection.getDefaultNet((error: BusinessError, netHandle: connection.NetHandle) => {if (error) {LogUtil.error('Failed to get default network:', error);} else if (netHandle && netAvailableCallback) {netAvailableCallback(netHandle);}});// 注册网络事件监听器NetworkUtil.netConnection.register((error: BusinessError) => {if (error) {LogUtil.error('Failed to register network events:', error);}});if (netAvailableCallback) {NetworkUtil.netConnection.on('netAvailable', netAvailableCallback);}if (netUnavailableCallback) {NetworkUtil.netConnection.on('netUnavailable', netUnavailableCallback);}if (netCapabilitiesChangeCallback) {NetworkUtil.netConnection.on('netCapabilitiesChange', netCapabilitiesChangeCallback);}if (netConnectionPropertiesChangeCallback) {NetworkUtil.netConnection.on('netConnectionPropertiesChange', netConnectionPropertiesChangeCallback);}if (netBlockStatusChangeCallback) {NetworkUtil.netConnection.on('netBlockStatusChange', netBlockStatusChangeCallback);}if (netLostCallback) {NetworkUtil.netConnection.on('netLost', netLostCallback);}}/*** 取消注册网络事件监听器*/static unregister(): void {if (NetworkUtil.netConnection) {NetworkUtil.netConnection.unregister((error: BusinessError) => {if (error) {LogUtil.error('Failed to unregister network events:', error);}});NetworkUtil.netConnection = null;}}/*** 检查是否支持NR(5G)*/static isNRSupported(slotId?: number): boolean {try {return slotId ? radio.isNRSupported(slotId) : radio.isNRSupported();} catch (error) {LogUtil.error('Failed to check NR support:', error);return false;}}/*** 检查无线电是否开启*/static async isRadioOn(slotId?: number): Promise<boolean> {try {return slotId ? await radio.isRadioOn(slotId) : await radio.isRadioOn();} catch (error) {LogUtil.error('Failed to check radio status:', error);return false;}}/*** 获取主卡槽ID*/static async getPrimarySlotId(): Promise<number> {try {return await radio.getPrimarySlotId();} catch (error) {LogUtil.error('Failed to get primary slot ID:', error);throw new Error(error);}}/*** 获取运营商名称*/static async getOperatorName(slotId?: number): Promise<string> {try {slotId = slotId ?? (await NetworkUtil.getPrimarySlotId());return await radio.getOperatorName(slotId);} catch (error) {LogUtil.error('Failed to get operator name:', error);throw new Error(error);}}/*** 获取网络状态*/static async getNetworkState(slotId?: number): Promise<radio.NetworkState> {try {slotId = slotId ?? (await NetworkUtil.getPrimarySlotId());return await radio.getNetworkState(slotId);} catch (error) {LogUtil.error('Failed to get network state:', error);throw new Error(error);}}/*** 获取网络选择模式*/static async getNetworkSelectionMode(slotId?: number): Promise<radio.NetworkSelectionMode> {try {slotId = slotId ?? (await NetworkUtil.getPrimarySlotId());return await radio.getNetworkSelectionMode(slotId);} catch (error) {LogUtil.error('Failed to get network selection mode:', error);throw new Error(error);}}/*** 获取信号信息*/static async getSignalInformation(slotId?: number): Promise<Array<radio.SignalInformation>> {try {slotId = slotId ?? (await NetworkUtil.getPrimarySlotId());return await radio.getSignalInformation(slotId);} catch (error) {LogUtil.error('Failed to get signal information:', error);throw new Error(error);}}/*** 获取当前网络类型*/static async getNetworkType(): Promise<NetworkType> {try {if (NetworkUtil.hasNetWiFi()) {return NetworkType.NETWORK_TYPE_WIFI;}if (NetworkUtil.hasNetMobile()) {const signalInfo = await NetworkUtil.getSignalInformation();for (const item of signalInfo) {switch (item.signalType) {case radio.NetworkType.NETWORK_TYPE_GSM:case radio.NetworkType.NETWORK_TYPE_CDMA:return NetworkType.NETWORK_TYPE_2G;case radio.NetworkType.NETWORK_TYPE_WCDMA:case radio.NetworkType.NETWORK_TYPE_TDSCDMA:return NetworkType.NETWORK_TYPE_3G;case radio.NetworkType.NETWORK_TYPE_LTE:return NetworkType.NETWORK_TYPE_4G;case radio.NetworkType.NETWORK_TYPE_NR:return NetworkType.NETWORK_TYPE_5G;default:break;}}}} catch (error) {LogUtil.error('Failed to determine network type:', error);}return NetworkType.NETWORK_TYPE_UNKNOWN;}/*** 获取当前网络类型字符串*/static async getNetworkTypeStr(): Promise<string> {const networkType = await NetworkUtil.getNetworkType();switch (networkType) {case NetworkType.NETWORK_TYPE_WIFI:return 'Wi-Fi';case NetworkType.NETWORK_TYPE_2G:return '2G';case NetworkType.NETWORK_TYPE_3G:return '3G';case NetworkType.NETWORK_TYPE_4G:return '4G';case NetworkType.NETWORK_TYPE_5G:return '5G';default:return 'UNKNOWN';}}/*** 获取默认蜂窝数据卡槽ID(异步)*/static async getDefaultCellularDataSlotId(): Promise<number> {try {return await data.getDefaultCellularDataSlotId();} catch (error) {LogUtil.error('Failed to get default cellular data slot ID:', error);throw new Error(error);}}/*** 获取默认蜂窝数据卡槽ID(同步)*/static getDefaultCellularDataSlotIdSync(): number {try {return data.getDefaultCellularDataSlotIdSync();} catch (error) {LogUtil.error('Failed to get default cellular data slot ID (sync):', error);throw new Error(error);}}/*** 获取蜂窝数据流量类型*/static async getCellularDataFlowType(): Promise<data.DataFlowType> {try {return await data.getCellularDataFlowType();} catch (error) {LogUtil.error('Failed to get cellular data flow type:', error);throw new Error(error);}}/*** 获取蜂窝数据连接状态*/static async getCellularDataState(): Promise<data.DataConnectState> {try {return await data.getCellularDataState();} catch (error) {LogUtil.error('Failed to get cellular data state:', error);throw new Error(error);}}/*** 检查蜂窝数据是否启用(异步)*/static async isCellularDataEnabled(): Promise<boolean> {try {return await data.isCellularDataEnabled();} catch (error) {LogUtil.error('Failed to check if cellular data is enabled:', error);return false;}}/*** 检查蜂窝数据是否启用(同步)*/static isCellularDataEnabledSync(): boolean {try {return data.isCellularDataEnabledSync();} catch (error) {LogUtil.error('Failed to check if cellular data is enabled (sync):', error);return false;}}/*** 检查漫游是否启用(异步)*/static async isCellularDataRoamingEnabled(slotId?: number): Promise<boolean> {try {slotId = slotId ?? (await NetworkUtil.getDefaultCellularDataSlotId());return await data.isCellularDataRoamingEnabled(slotId);} catch (error) {LogUtil.error('Failed to check if cellular data roaming is enabled:', error);return false;}}/*** 检查漫游是否启用(同步)*/static isCellularDataRoamingEnabledSync(slotId?: number): boolean {try {slotId = slotId ?? NetworkUtil.getDefaultCellularDataSlotIdSync();return data.isCellularDataRoamingEnabledSync(slotId);} catch (error) {LogUtil.error('Failed to check if cellular data roaming is enabled (sync):', error);return false;}}/*** 获取默认蜂窝数据SIM卡ID*/static getDefaultCellularDataSimId(): number {try {return data.getDefaultCellularDataSimId();} catch (error) {LogUtil.error('Failed to get default cellular data SIM ID:', error);throw new Error(error);}}/*** 检查SIM卡是否激活(异步)*/static async isSimActive(slotId: number): Promise<boolean> {try {return await sim.isSimActive(slotId);} catch (error) {LogUtil.error(`Failed to check if SIM card at slot ${slotId} is active:`, error);return false;}}/*** 检查SIM卡是否激活(同步)*/static isSimActiveSync(slotId: number): boolean {try {return sim.isSimActiveSync(slotId);} catch (error) {LogUtil.error(`Failed to check if SIM card at slot ${slotId} is active (sync):`, error);return false;}}/*** 检查是否有SIM卡(异步)*/static async hasSimCard(slotId: number): Promise<boolean> {try {return await sim.hasSimCard(slotId);} catch (error) {LogUtil.error(`Failed to check if SIM card exists at slot ${slotId}:`, error);return false;}}/*** 检查是否有SIM卡(同步)*/static hasSimCardSync(slotId: number): boolean {try {return sim.hasSimCardSync(slotId);} catch (error) {LogUtil.error(`Failed to check if SIM card exists at slot ${slotId} (sync):`, error);return false;}}/*** 获取最大支持的SIM卡数量*/static getMaxSimCount(): number {try {return sim.getMaxSimCount();} catch (error) {LogUtil.error('Failed to get maximum SIM count:', error);throw new Error(error);}}/*** 获取SIM卡运营商编号(异步)*/static async getSimOperatorNumeric(slotId?: number): Promise<string> {try {slotId = slotId ?? (await NetworkUtil.getDefaultCellularDataSlotId());return await sim.getSimOperatorNumeric(slotId);} catch (error) {LogUtil.error('Failed to get SIM operator numeric:', error);throw new Error(error);}}/*** 获取SIM卡运营商编号(同步)*/static getSimOperatorNumericSync(slotId?: number): string {try {slotId = slotId ?? NetworkUtil.getDefaultCellularDataSlotIdSync();return sim.getSimOperatorNumericSync(slotId);} catch (error) {LogUtil.error('Failed to get SIM operator numeric (sync):', error);throw new Error(error);}}/*** 获取SIM卡服务提供商名称(异步)*/static async getSimSpn(slotId?: number): Promise<string> {try {slotId = slotId ?? (await NetworkUtil.getDefaultCellularDataSlotId());return await sim.getSimSpn(slotId);} catch (error) {LogUtil.error('Failed to get SIM SPN:', error);throw new Error(error);}}/*** 获取SIM卡服务提供商名称(同步)*/static getSimSpnSync(slotId?: number): string {try {slotId = slotId ?? NetworkUtil.getDefaultCellularDataSlotIdSync();return sim.getSimSpnSync(slotId);} catch (error) {LogUtil.error('Failed to get SIM SPN (sync):', error);throw new Error(error);}}/*** 获取SIM卡状态(异步)*/static async getSimState(slotId?: number): Promise<sim.SimState> {try {slotId = slotId ?? (await NetworkUtil.getDefaultCellularDataSlotId());return await sim.getSimState(slotId);} catch (error) {LogUtil.error('Failed to get SIM state:', error);throw new Error(error);}}/*** 获取SIM卡状态(同步)*/static getSimStateSync(slotId?: number): sim.SimState {try {slotId = slotId ?? NetworkUtil.getDefaultCellularDataSlotIdSync();return sim.getSimStateSync(slotId);} catch (error) {LogUtil.error('Failed to get SIM state (sync):', error);throw new Error(error);}}/*** 获取SIM卡类型(异步)*/static async getCardType(slotId?: number): Promise<sim.CardType> {try {slotId = slotId ?? (await NetworkUtil.getDefaultCellularDataSlotId());return await sim.getCardType(slotId);} catch (error) {LogUtil.error('Failed to get SIM card type:', error);throw new Error(error);}}/*** 获取SIM卡类型(同步)*/static getCardTypeSync(slotId?: number): sim.CardType {try {slotId = slotId ?? NetworkUtil.getDefaultCellularDataSlotIdSync();return sim.getCardTypeSync(slotId);} catch (error) {LogUtil.error('Failed to get SIM card type (sync):', error);throw new Error(error);}}
}
代码如下:
import { connection } from '@kit.NetworkKit';
import { BusinessError, Callback } from '@kit.BasicServicesKit';
import { wifiManager } from '@kit.ConnectivityKit';
import { LogUtil } from './LogUtil';
import { data, radio, sim } from '@kit.TelephonyKit';// 网络类型枚举
export enum NetworkType {NETWORK_TYPE_UNKNOWN = 0,NETWORK_TYPE_WIFI = 1,NETWORK_TYPE_2G = 2,NETWORK_TYPE_3G = 3,NETWORK_TYPE_4G = 4,NETWORK_TYPE_5G = 5,
}/*** 网络相关工具类* 需要 ohos.permission.GET_NETWORK_INFO、ohos.permission.GET_WIFI_INFO 权限。* author: CSDN-鸿蒙布道师* since: 2025/04/23*/
export class NetworkUtil {private static netConnection: connection.NetConnection | null = null;/*** 检查默认网络是否按流量计费*/static async isDefaultNetMetered(): Promise<boolean> {try {return await connection.isDefaultNetMetered();} catch (error) {LogUtil.error('Failed to check default network metering:', error);throw new Error(error);}}static isDefaultNetMeteredSync(): boolean {return connection.isDefaultNetMeteredSync();}/*** 检查是否有默认网络*/static async hasDefaultNet(): Promise<boolean> {try {return await connection.hasDefaultNet();} catch (error) {LogUtil.error('Failed to check if there is a default network:', error);// 确保抛出的是 Error 类型throw new Error(error);}}static hasDefaultNetSync(): boolean {return connection.hasDefaultNetSync();}/*** 获取默认网络句柄*/static async getDefaultNet(): Promise<connection.NetHandle> {try {return await connection.getDefaultNet();} catch (error) {LogUtil.error('Failed to get default network handle:', error);throw new Error(error);}}static getDefaultNetSync(): connection.NetHandle {return connection.getDefaultNetSync();}/*** 获取应用当前网络句柄*/static async getAppNet(): Promise<connection.NetHandle> {try {return await connection.getAppNet();} catch (error) {LogUtil.error('Failed to get app network handle:', error);throw new Error(error);}}static getAppNetSync(): connection.NetHandle {return connection.getAppNetSync();}/*** 获取所有可用网络句柄*/static async getAllNets(): Promise<Array<connection.NetHandle>> {try {return await connection.getAllNets();} catch (error) {LogUtil.error('Failed to get all network handles:', error);throw new Error(error);}}static getAllNetsSync(): Array<connection.NetHandle> {return connection.getAllNetsSync();}/*** 检查是否有可用网络*/static isNetworkAvailable(): boolean {const allNets = NetworkUtil.getAllNetsSync();return Array.isArray(allNets) && allNets.length > 0;}/*** 检查是否有指定类型的网络连接*/static hasNetBearType(netType: connection.NetBearType): boolean {const bearTypes = NetworkUtil.getNetBearTypes();return bearTypes.includes(netType);}static hasNetMobile(): boolean {return NetworkUtil.hasNetBearType(connection.NetBearType.BEARER_CELLULAR);}static hasNetWiFi(): boolean {return NetworkUtil.hasNetBearType(connection.NetBearType.BEARER_WIFI);}static hasNetEthernet(): boolean {return NetworkUtil.hasNetBearType(connection.NetBearType.BEARER_ETHERNET);}static hasNetVPN(): boolean {return NetworkUtil.hasNetBearType(connection.NetBearType.BEARER_VPN);}/*** 获取网络承载类型列表*/static getNetBearTypes(): Array<connection.NetBearType> {const netCapabilities = NetworkUtil.getNetCapabilitiesSync(NetworkUtil.getDefaultNetSync());return netCapabilities?.bearerTypes || [];}static getNetBearType(): connection.NetBearType {const bearTypes = NetworkUtil.getNetBearTypes();return bearTypes[0] || connection.NetBearType.BEARER_CELLULAR;}/*** 获取网络能力*/static async getNetCapabilities(netHandle: connection.NetHandle = NetworkUtil.getDefaultNetSync()): Promise<connection.NetCapabilities> {try {return await connection.getNetCapabilities(netHandle);} catch (error) {LogUtil.error('Failed to get network capabilities:', error);throw new Error(error);}}static getNetCapabilitiesSync(netHandle: connection.NetHandle = NetworkUtil.getDefaultNetSync()): connection.NetCapabilities {return connection.getNetCapabilitiesSync(netHandle);}/*** 获取网络连接属性*/static async getConnectionProperties(netHandle: connection.NetHandle = NetworkUtil.getDefaultNetSync()): Promise<connection.ConnectionProperties> {try {return await connection.getConnectionProperties(netHandle);} catch (error) {LogUtil.error('Failed to get connection properties:', error);throw new Error(error);}}static getConnectionPropertiesSync(netHandle: connection.NetHandle = NetworkUtil.getDefaultNetSync()): connection.ConnectionProperties {return connection.getConnectionPropertiesSync(netHandle);}/*** 获取当前设备的IP地址*/static getIpAddress(): string {try {const ipAddress = wifiManager.getIpInfo().ipAddress;return [(ipAddress >>> 24) & 0xFF,(ipAddress >>> 16) & 0xFF,(ipAddress >>> 8) & 0xFF,ipAddress & 0xFF,].join('.');} catch (error) {LogUtil.error('Failed to get IP address:', error);return '0.0.0.0';}}/*** 注册网络事件监听器*/static register(netAvailableCallback?: Callback<connection.NetHandle>,netUnavailableCallback?: Callback<void>,netCapabilitiesChangeCallback?: Callback<connection.NetCapabilityInfo>,netConnectionPropertiesChangeCallback?: Callback<connection.NetConnectionPropertyInfo>,netBlockStatusChangeCallback?: Callback<connection.NetBlockStatusInfo>,netLostCallback?: Callback<connection.NetHandle>): void {if (!NetworkUtil.netConnection) {NetworkUtil.netConnection = connection.createNetConnection();}// 注册默认网络回调connection.getDefaultNet((error: BusinessError, netHandle: connection.NetHandle) => {if (error) {LogUtil.error('Failed to get default network:', error);} else if (netHandle && netAvailableCallback) {netAvailableCallback(netHandle);}});// 注册网络事件监听器NetworkUtil.netConnection.register((error: BusinessError) => {if (error) {LogUtil.error('Failed to register network events:', error);}});if (netAvailableCallback) {NetworkUtil.netConnection.on('netAvailable', netAvailableCallback);}if (netUnavailableCallback) {NetworkUtil.netConnection.on('netUnavailable', netUnavailableCallback);}if (netCapabilitiesChangeCallback) {NetworkUtil.netConnection.on('netCapabilitiesChange', netCapabilitiesChangeCallback);}if (netConnectionPropertiesChangeCallback) {NetworkUtil.netConnection.on('netConnectionPropertiesChange', netConnectionPropertiesChangeCallback);}if (netBlockStatusChangeCallback) {NetworkUtil.netConnection.on('netBlockStatusChange', netBlockStatusChangeCallback);}if (netLostCallback) {NetworkUtil.netConnection.on('netLost', netLostCallback);}}/*** 取消注册网络事件监听器*/static unregister(): void {if (NetworkUtil.netConnection) {NetworkUtil.netConnection.unregister((error: BusinessError) => {if (error) {LogUtil.error('Failed to unregister network events:', error);}});NetworkUtil.netConnection = null;}}/*** 检查是否支持NR(5G)*/static isNRSupported(slotId?: number): boolean {try {return slotId ? radio.isNRSupported(slotId) : radio.isNRSupported();} catch (error) {LogUtil.error('Failed to check NR support:', error);return false;}}/*** 检查无线电是否开启*/static async isRadioOn(slotId?: number): Promise<boolean> {try {return slotId ? await radio.isRadioOn(slotId) : await radio.isRadioOn();} catch (error) {LogUtil.error('Failed to check radio status:', error);return false;}}/*** 获取主卡槽ID*/static async getPrimarySlotId(): Promise<number> {try {return await radio.getPrimarySlotId();} catch (error) {LogUtil.error('Failed to get primary slot ID:', error);throw new Error(error);}}/*** 获取运营商名称*/static async getOperatorName(slotId?: number): Promise<string> {try {slotId = slotId ?? (await NetworkUtil.getPrimarySlotId());return await radio.getOperatorName(slotId);} catch (error) {LogUtil.error('Failed to get operator name:', error);throw new Error(error);}}/*** 获取网络状态*/static async getNetworkState(slotId?: number): Promise<radio.NetworkState> {try {slotId = slotId ?? (await NetworkUtil.getPrimarySlotId());return await radio.getNetworkState(slotId);} catch (error) {LogUtil.error('Failed to get network state:', error);throw new Error(error);}}/*** 获取网络选择模式*/static async getNetworkSelectionMode(slotId?: number): Promise<radio.NetworkSelectionMode> {try {slotId = slotId ?? (await NetworkUtil.getPrimarySlotId());return await radio.getNetworkSelectionMode(slotId);} catch (error) {LogUtil.error('Failed to get network selection mode:', error);throw new Error(error);}}/*** 获取信号信息*/static async getSignalInformation(slotId?: number): Promise<Array<radio.SignalInformation>> {try {slotId = slotId ?? (await NetworkUtil.getPrimarySlotId());return await radio.getSignalInformation(slotId);} catch (error) {LogUtil.error('Failed to get signal information:', error);throw new Error(error);}}/*** 获取当前网络类型*/static async getNetworkType(): Promise<NetworkType> {try {if (NetworkUtil.hasNetWiFi()) {return NetworkType.NETWORK_TYPE_WIFI;}if (NetworkUtil.hasNetMobile()) {const signalInfo = await NetworkUtil.getSignalInformation();for (const item of signalInfo) {switch (item.signalType) {case radio.NetworkType.NETWORK_TYPE_GSM:case radio.NetworkType.NETWORK_TYPE_CDMA:return NetworkType.NETWORK_TYPE_2G;case radio.NetworkType.NETWORK_TYPE_WCDMA:case radio.NetworkType.NETWORK_TYPE_TDSCDMA:return NetworkType.NETWORK_TYPE_3G;case radio.NetworkType.NETWORK_TYPE_LTE:return NetworkType.NETWORK_TYPE_4G;case radio.NetworkType.NETWORK_TYPE_NR:return NetworkType.NETWORK_TYPE_5G;default:break;}}}} catch (error) {LogUtil.error('Failed to determine network type:', error);}return NetworkType.NETWORK_TYPE_UNKNOWN;}/*** 获取当前网络类型字符串*/static async getNetworkTypeStr(): Promise<string> {const networkType = await NetworkUtil.getNetworkType();switch (networkType) {case NetworkType.NETWORK_TYPE_WIFI:return 'Wi-Fi';case NetworkType.NETWORK_TYPE_2G:return '2G';case NetworkType.NETWORK_TYPE_3G:return '3G';case NetworkType.NETWORK_TYPE_4G:return '4G';case NetworkType.NETWORK_TYPE_5G:return '5G';default:return 'UNKNOWN';}}/*** 获取默认蜂窝数据卡槽ID(异步)*/static async getDefaultCellularDataSlotId(): Promise<number> {try {return await data.getDefaultCellularDataSlotId();} catch (error) {LogUtil.error('Failed to get default cellular data slot ID:', error);throw new Error(error);}}/*** 获取默认蜂窝数据卡槽ID(同步)*/static getDefaultCellularDataSlotIdSync(): number {try {return data.getDefaultCellularDataSlotIdSync();} catch (error) {LogUtil.error('Failed to get default cellular data slot ID (sync):', error);throw new Error(error);}}/*** 获取蜂窝数据流量类型*/static async getCellularDataFlowType(): Promise<data.DataFlowType> {try {return await data.getCellularDataFlowType();} catch (error) {LogUtil.error('Failed to get cellular data flow type:', error);throw new Error(error);}}/*** 获取蜂窝数据连接状态*/static async getCellularDataState(): Promise<data.DataConnectState> {try {return await data.getCellularDataState();} catch (error) {LogUtil.error('Failed to get cellular data state:', error);throw new Error(error);}}/*** 检查蜂窝数据是否启用(异步)*/static async isCellularDataEnabled(): Promise<boolean> {try {return await data.isCellularDataEnabled();} catch (error) {LogUtil.error('Failed to check if cellular data is enabled:', error);return false;}}/*** 检查蜂窝数据是否启用(同步)*/static isCellularDataEnabledSync(): boolean {try {return data.isCellularDataEnabledSync();} catch (error) {LogUtil.error('Failed to check if cellular data is enabled (sync):', error);return false;}}/*** 检查漫游是否启用(异步)*/static async isCellularDataRoamingEnabled(slotId?: number): Promise<boolean> {try {slotId = slotId ?? (await NetworkUtil.getDefaultCellularDataSlotId());return await data.isCellularDataRoamingEnabled(slotId);} catch (error) {LogUtil.error('Failed to check if cellular data roaming is enabled:', error);return false;}}/*** 检查漫游是否启用(同步)*/static isCellularDataRoamingEnabledSync(slotId?: number): boolean {try {slotId = slotId ?? NetworkUtil.getDefaultCellularDataSlotIdSync();return data.isCellularDataRoamingEnabledSync(slotId);} catch (error) {LogUtil.error('Failed to check if cellular data roaming is enabled (sync):', error);return false;}}/*** 获取默认蜂窝数据SIM卡ID*/static getDefaultCellularDataSimId(): number {try {return data.getDefaultCellularDataSimId();} catch (error) {LogUtil.error('Failed to get default cellular data SIM ID:', error);throw new Error(error);}}/*** 检查SIM卡是否激活(异步)*/static async isSimActive(slotId: number): Promise<boolean> {try {return await sim.isSimActive(slotId);} catch (error) {LogUtil.error(`Failed to check if SIM card at slot ${slotId} is active:`, error);return false;}}/*** 检查SIM卡是否激活(同步)*/static isSimActiveSync(slotId: number): boolean {try {return sim.isSimActiveSync(slotId);} catch (error) {LogUtil.error(`Failed to check if SIM card at slot ${slotId} is active (sync):`, error);return false;}}/*** 检查是否有SIM卡(异步)*/static async hasSimCard(slotId: number): Promise<boolean> {try {return await sim.hasSimCard(slotId);} catch (error) {LogUtil.error(`Failed to check if SIM card exists at slot ${slotId}:`, error);return false;}}/*** 检查是否有SIM卡(同步)*/static hasSimCardSync(slotId: number): boolean {try {return sim.hasSimCardSync(slotId);} catch (error) {LogUtil.error(`Failed to check if SIM card exists at slot ${slotId} (sync):`, error);return false;}}/*** 获取最大支持的SIM卡数量*/static getMaxSimCount(): number {try {return sim.getMaxSimCount();} catch (error) {LogUtil.error('Failed to get maximum SIM count:', error);throw new Error(error);}}/*** 获取SIM卡运营商编号(异步)*/static async getSimOperatorNumeric(slotId?: number): Promise<string> {try {slotId = slotId ?? (await NetworkUtil.getDefaultCellularDataSlotId());return await sim.getSimOperatorNumeric(slotId);} catch (error) {LogUtil.error('Failed to get SIM operator numeric:', error);throw new Error(error);}}/*** 获取SIM卡运营商编号(同步)*/static getSimOperatorNumericSync(slotId?: number): string {try {slotId = slotId ?? NetworkUtil.getDefaultCellularDataSlotIdSync();return sim.getSimOperatorNumericSync(slotId);} catch (error) {LogUtil.error('Failed to get SIM operator numeric (sync):', error);throw new Error(error);}}/*** 获取SIM卡服务提供商名称(异步)*/static async getSimSpn(slotId?: number): Promise<string> {try {slotId = slotId ?? (await NetworkUtil.getDefaultCellularDataSlotId());return await sim.getSimSpn(slotId);} catch (error) {LogUtil.error('Failed to get SIM SPN:', error);throw new Error(error);}}/*** 获取SIM卡服务提供商名称(同步)*/static getSimSpnSync(slotId?: number): string {try {slotId = slotId ?? NetworkUtil.getDefaultCellularDataSlotIdSync();return sim.getSimSpnSync(slotId);} catch (error) {LogUtil.error('Failed to get SIM SPN (sync):', error);throw new Error(error);}}/*** 获取SIM卡状态(异步)*/static async getSimState(slotId?: number): Promise<sim.SimState> {try {slotId = slotId ?? (await NetworkUtil.getDefaultCellularDataSlotId());return await sim.getSimState(slotId);} catch (error) {LogUtil.error('Failed to get SIM state:', error);throw new Error(error);}}/*** 获取SIM卡状态(同步)*/static getSimStateSync(slotId?: number): sim.SimState {try {slotId = slotId ?? NetworkUtil.getDefaultCellularDataSlotIdSync();return sim.getSimStateSync(slotId);} catch (error) {LogUtil.error('Failed to get SIM state (sync):', error);throw new Error(error);}}/*** 获取SIM卡类型(异步)*/static async getCardType(slotId?: number): Promise<sim.CardType> {try {slotId = slotId ?? (await NetworkUtil.getDefaultCellularDataSlotId());return await sim.getCardType(slotId);} catch (error) {LogUtil.error('Failed to get SIM card type:', error);throw new Error(error);}}/*** 获取SIM卡类型(同步)*/static getCardTypeSync(slotId?: number): sim.CardType {try {slotId = slotId ?? NetworkUtil.getDefaultCellularDataSlotIdSync();return sim.getCardTypeSync(slotId);} catch (error) {LogUtil.error('Failed to get SIM card type (sync):', error);throw new Error(error);}}
}
相关文章:
鸿蒙NEXT开发网络相关工具类(ArkTs)
import { connection } from kit.NetworkKit; import { BusinessError, Callback } from kit.BasicServicesKit; import { wifiManager } from kit.ConnectivityKit; import { LogUtil } from ./LogUtil; import { data, radio, sim } from kit.TelephonyKit;// 网络类型枚举 e…...
【上位机——MFC】MFC入门
MFC库中相关类简介 CObject MFC类库中绝大部分类的父类,提供了MFC类库中一些基本的机制。 对运行时类信息的支持。对动态创建的支持。对序列化的支持。 CWinApp 应用程序类,封装了应用程序、线程等信息。 CDocument 文档类,管理数据 F…...
全面介绍AVFilter 的添加和使用
author: hjjdebug date: 2025年 04月 22日 星期二 13:48:19 CST description: 全面介绍AVFilter 的添加和使用 文章目录 1.两个重要的编码思想1. 写代码不再是我们调用别人,而是别人调用我们!2. 面向对象的编程方法. 2. AVFilter 开发流程2.1 编写AVFilter 文件2.1.…...

【UVM项目实战】异步fifo—uvm项目结构以及uvm环境搭建
本文章同步到我的个人博客网站:ElemenX-King:【UVM项目实战】异步fifo—uvm项目结构以及uvm环境搭建 希望大家能使用此网站来进行浏览效果更佳!!! 目录 一、异步FIFO1.1 异步FIFO的定义1.2 亚稳态1.3 异步FIFO关键技术…...

【通关函数的递归】--递归思想的形成与应用
目录 一.递归的概念与思想 1.定义 2.递归的思想 3.递归的限制条件 二.递归举例 1.求n的阶乘 2.顺序打印一个整数的每一位 三.递归与迭代 前言:上篇博文分享了扫雷游戏的实现,这篇文章将会继续分享函数的递归相关知识点,让大家了解并掌握递归的思…...
AI日报 - 2025年04月25日
🌟 今日概览(60秒速览) ▎🤖 AGI突破 | OpenAI o3模型展现行动能力,英国发布RepliBench评估AI自主复制风险,DeepMind CEO担忧AGI协调挑战。 模型能力向行动和自主性演进,安全与协调成为焦点。 ▎💼 商业动向…...

【FAQ】针对于消费级NVIDIA GPU的说明
概述 本文概述 HP Anyware 在配备消费级 NVIDIA GPU 的物理工作站上的关键组件、安装说明和重要注意事项。 注意:本文档适用于 NVIDIA 消费级 GPU。NVIDIA Quadro 和 Tesla GPU 也支持 HP Anyware 在公有云、虚拟化或物理工作站环境中运行。请参阅PCoIP Graphi…...
几种查看PyTorch、cuda 和 Python 版本方法
在检查 PyTorch、cuda 和 Python 版本时,除了直接使用 torch.__version__ 和 sys.version,我们还可以通过其他方式实现相同的功能 方法 1:直接访问属性(原始代码) import torch import sysprint("PyTorch Versi…...
网络安全 | F5 WAF 黑白名单配置实践指南
关注:CodingTechWork 引言 在现代网络安全架构中,F5 Web Application Firewall (WAF) 是保护 Web 应用免受攻击的重要工具。F5 WAF 提供了强大的黑白名单功能,结合 Data Group 和 iRules,可以实现更灵活、更高效的流量控制策略。…...
焊接机排错
焊接机 一、前定位后焊接 两个机台,①极柱定位,相机定位所有极柱点和mark点;②焊接机,相机定位mark点原理:极柱定位在成功定位到所有极柱点和mark点后,可以建立mark点和极柱点的关系。焊接机定位到mark点…...
【AI提示词】艺人顾问
提示说明 专业艺人顾问,专注于为客户提供全面的艺术、娱乐和商业咨询服务,帮助他们在竞争激烈的行业中树立品牌影响力,提升市场竞争力 提示词 # Role: 艺人顾问## Profile - language: 中文 - description: 专业艺人顾问,专注于…...

MyBatis操作数据库---从入门到理解
文章目录 关于MyBatis操作数据库MyBatis⼊⻔(使用)Mybatis操作数据库的步骤:配置数据库连接字符串使⽤MyBatis完成简单的增删改查操作注解xml 单元测试开启驼峰命名(推荐) 打印日志 关于MyBatis操作数据库 在之前的学习,我们了解到web应⽤程…...
本地缓存大杀器-Caffeine
本地缓存大杀器-Caffeine 一、 背景二、 应用三、 实现原理四、 核心设计五、 总结 一、 背景 1、 本地缓存作为一种高效的缓存方式,能够显著减少对远程数据源的访问,从而快速响应请求。而在众多本地缓存工具中,Caffine 凭借其卓越的性能和丰…...

【HFP】蓝牙语音通话控制深度解析:来电拒接与通话终止协议
目录 一、来电拒接的核心流程与信令交互 1.1 拒接场景的分类与触发条件 1.2 HF 端拒接流程 1.3 AG 端拒接流程 二、通话终止流程:主动断开与异常中断 2.1 终止场景的界定 2.2 HF 端终止流程 2.3 AG 端终止流程 三、信令协议的核心要素:AT 命令与…...

使用QML Tumbler 实现时间日期选择器
目录 引言相关阅读项目结构示例实现与代码解析示例一:时间选择器(TimePicker)示例二:日期时间选择器(DateTimePicker) 主窗口整合运行效果总结下载链接 引言 在现代应用程序开发中,时间与日期选…...

智能吸顶灯/摄影补光灯专用!FP7195双通道LED驱动,高效节能省空间 !
一、双路调光技术背景与市场需求 随着LED照明技术的快速发展和智能照明需求的激增,双路调光技术正成为照明行业的重要发展方向。传统单路调光方案只能实现整体亮度的统一调节,而双路调光则能够实现对两个独立通道的精确控制。今天,由我来为大…...
如何解决PyQt从主窗口打开新窗口时出现闪退的问题
在PyQt5中,当从主窗口打开新窗口时,经常会出现闪退现象,这通常是由于对象生命周期管理不当或事件循环错误等所导致。 1. 确保新窗口实例被正确引用 新窗口的实例若未被主窗口引用,可能会被Python的垃圾回收机制销毁。 错误示例&…...
分布式微服务架构,数据库连接池设计策略
在分布式微服务架构中,数据库连接池的设计远比单体应用复杂,涉及资源隔离、连接管理、性能调优和高可用等问题。下面是面向专业软件架构师的系统化分析与策略建议: 一、核心挑战 每个服务独立运行,连接池分散 每个微服务维护自己的…...

YOLOv11改进-双Backbone架构:利用双backbone提高yolo11目标检测的精度
一、引言:为什么我们需要双Backbone? 在目标检测任务中,YOLO系列模型因其高效的端到端检测能力而备受青睐。然而,传统YOLO模型大多采用单一Backbone结构,即利用一个卷积神经网络(CNN)作为特征提…...
redis经典问题
1.缓存雪崩 指缓存同一时间大面积的失效,所以,后面的请求都会落到数据库上,造成数据库短时间内承受大量请求而崩掉。 解决方案: 1)Redis 高可用,主从哨兵,Redis cluster,避免全盘崩…...

《逃离云端束缚,拥抱GPT本地部署》
《逃离云端束缚,拥抱GPT本地部署》 一、GPT 热潮与本地部署的兴起 自 OpenAI 推出 ChatGPT 以来,全球范围内掀起了一股人工智能的热潮,其强大的自然语言处理能力和广泛的应用场景,让人们对人工智能的未来充满了想象。GPT(Generative Pretrained Transformer)作为一种基于…...

头歌之动手学人工智能-机器学习 --- PCA
目录 第1关:维数灾难与降维 第2关:PCA算法流程 任务描述 编程要求 测试说明 第3关:sklearn中的PCA 任务描述 编程要求 测试说明 第1关:维数灾难与降维 第2关:PCA算法流程 任务描述 本关任务:补充…...

研0调研入门
一、Web of Science 使用教程 1. 访问与注册 访问入口:通过高校图书馆官网进入(需IP权限),或直接访问 Web of Science官网。注册/登录:若机构已订阅,用学校账号登录;个人用户可申请试用或付费…...

神经网络基础[ANN网络的搭建]
神经网络 人工神经网络( Artificial Neural Network, 简写为ANN)也简称为神经网络(NN),是一种模仿生物神经网络结构和功能的计算模型。各个神经元传递复杂的电信号,树突接收到输入信号…...

五、web自动化测试01
目录 一、HTML基础1、HTML介绍2、常用标签3、基础案例3.1 前端代码3.2 自动化测试 二、CSS定位1、css介绍2、案例3、代码优化 三、表单自动化1、案例2、元素属性定位 四、后台基础数据自动化1、登录1.1 id与class定位1.2 定位一组元素 2、商品新增 一、HTML基础 可参考学习 链…...

数据库监控 | MongoDB监控全解析
PART 01 MongoDB:灵活、可扩展的文档数据库 MongoDB作为一款开源的NoSQL数据库,凭借其灵活的数据模型(基于BSON的文档存储)、水平扩展能力(分片集群)和高可用性(副本集架构)&#x…...

STM32F407使用ESP8266实现阿里云OTA(中)
文章目录 前言一、程序分析二、程序讲解1. main函数2. Get_Version()函数3. esp_Init()函数4. Check_Updata()函数结语前言 从上一章STM32F407使用ESP8266实现阿里云OTA(上)中我们已经对连接阿里云和从阿里云获取升级包的流程非常的熟悉了。所以本章我们进行STM32的程序开发…...
sql server 与navicat测试后,连接qt
先用Navicat测试和sql的连通性,Navicat和sql连通之后,qt也能和sql连通了。 Navicat和Sqlserver Management 能连上,项目无法连接本地 Navicat 连接SQLServer 数据库 QT国内镜像网站 Navicat连接SqlServer的问题点 Sql Server的基本配置以及使…...
Django 入门实战:从环境搭建到构建你的第一个 Web 应用
Django 入门实战:从环境搭建到构建你的第一个 Web 应用 恭喜你选择 Django 作为你学习 Python Web 开发的起点!Django 是一个强大、成熟且功能齐全的框架,非常适合构建中大型的 Web 应用程序。本篇将通过一个简单的例子,带你走完…...
ROS2---时间戳对齐
一、ROS2时间系统架构 时间模型 仿真时间(Simulation Time):由/clock话题驱动,适用于离线仿真与调试。真实时间(Real Time):基于系统硬件时钟,支持PTP协议(IEEE 1588&…...