鸿蒙获取设备信息的一些方法分两篇(其二)

139 阅读3分钟

分享一下鸿蒙获取设备信息的方法(下篇)

获取网络类型

声明接口调用所需要的权限:ohos.permission.GET_NETWORK_INFO

常见错误
1
写错文件
a
src/ohosTest/module.json5b
src/main/module.json52
写错权限
a
 ohos.permission.INTERNETb
 ohos.permission.GET_NETWORK_INFO
{
  "module": {
    "requestPermissions": [
      {
        // 允许应用获取数据网络信息
        "name": "ohos.permission.GET_NETWORK_INFO"
      }
    ],
  }
}

检查是否有默认连接的网络

// 获取网络类型
getConnection() {
  // 检测是否有默认连接的网络
  const hasDefaultNet = connection.hasDefaultNetSync()
  // 没有网络
  if (!hasDefaultNet) {
    this.netWorkType = '无网络'
  } else {
    this.netWorkType = '有网络'
  }
}

注意:检测是否有默认连接的网络,需要添加权限,忘记开启权限编辑器中会有警告。

网络权限提示.png

有网络获取网络类型

// 获取网络类型
getConnection() {
  // 检测是否有默认连接的网络
  const hasDefaultNet = connection.hasDefaultNetSync()
  // 没有网络
  if (!hasDefaultNet) {
    this.netWorkType = '无网络'
  } else {
    // this.netWorkType = '有网络'
    // 获取网络类型
    this.getConnectionNetBearType()
  }
}

// 获取网络类型
getConnectionNetBearType() {
  // 有网络的情况下,获取默认激活的数据网络
  const defaultNet = connection.getDefaultNetSync()
  // 获取网络类型
  const netCapabilities = connection.getNetCapabilitiesSync(defaultNet)
 // 查询网络类型
  if (netCapabilities.bearerTypes.includes(connection.NetBearType.BEARER_WIFI)) {
    this.netBearType = 'WIFI网络'
  } else if (netCapabilities.bearerTypes.includes(connection.NetBearType.BEARER_CELLULAR)) {
    this.netBearType = '蜂窝网络'
  } else if (netCapabilities.bearerTypes.includes(connection.NetBearType.BEARER_ETHERNET)) {
    // 温馨提示:模拟器为以太网网络(网线)
    this.netBearType = '以太网网络'
  }
}

获取IP地址

// 获取网络类型
getConnection() {
  // 检测是否有默认连接的网络
  const hasDefaultNet = connection.hasDefaultNetSync()
  // 没有网络
  if (!hasDefaultNet) {
    this.netWorkType = '无网络'
  } else {
    // 获取网络类型
    this.getConnectionNetBearType()
    // 获取链路信息
    this.getConnectionProperties()
  }
}

// 获取链路信息
getConnectionProperties() {
  // 获取默认网络
  const netHandle = connection.getDefaultNetSync()
  // 获取默认网络的链路信息
  const connectionProperties = connection.getConnectionPropertiesSync(netHandle)
  // 提取链路信息
  const linkAddress = connectionProperties.linkAddresses[0]
  if (linkAddress) {
    // 获取 IP 地址
    this.IPAddress = linkAddress.address.address
  }
}

补充

计算机子网掩码、计算广播地址

/**
 * 计算子网掩码
 * @param prefixLength 前缀长度
 * @returns 子网掩码字符串
 */
function calculateSubnetMask(prefixLength: number): string {
  // 计算每个字节的子网掩码部分
  let subnetMask = '';
  for (let i = 0; i < 4; i++) {
    // 每个字节中的有效位数
    const bits = Math.min(prefixLength, 8);
    // 计算子网掩码字节的值并添加到结果字符串
    subnetMask += (256 - Math.pow(2, 8 - bits)) + '.';
    // 更新剩余的位数
    prefixLength -= bits;
  }
  // 去除末尾的点并返回子网掩码字符串
  return subnetMask.slice(0, -1);
}

/**
 * 计算广播地址
 * @param ipAddress IP地址字符串,例如 "192.168.2.13"
 * @param subnetMask 子网掩码字符串,例如 "255.255.255.0"
 * @returns 广播地址字符串
 */
function calculateBroadcastAddress(ipAddress: string, subnetMask: string): string {
  // 将IP地址字符串转换为数字数组
  const ipParts: number[] = ipAddress.split('.')
    .map(Number);
  // 将子网掩码字符串转换为数字数组
  const subnetParts: number[] = subnetMask.split('.')
    .map(Number);
  // 计算每个字节的广播地址部分
  const broadcastParts: number[] = [];
  for (let i = 0; i < 4; i++) {
    // 计算每个字节的广播地址值并添加到结果数组
    broadcastParts.push(ipParts[i] | (255 - subnetParts[i]));
  }
  // 将结果数组转换为字符串并使用点分隔
  return broadcastParts.join('.');
}


// 获取链路信息
getConnectionProperties() {
  // 获取默认网络的链路信息
  const connectionProperties = connection.getConnectionPropertiesSync(connection.getDefaultNetSync())
  // 提取链路信息
  const linkAddress = connectionProperties.linkAddresses[0]
  if (linkAddress) {
    // 获取 IP 地址
    this.IPAddress = linkAddress.address.address
    // 计算子网掩码
    this.subnetMask = calculateSubnetMask(linkAddress.prefixLength)
    // 计算广播地址
    this.broadcastAddress = calculateBroadcastAddress(this.IPAddress, this.subnetMask)
  }
}

获取屏幕分辨率

import { display } from '@kit.ArkUI'

// 屏幕分辨率(像素)
@State displayHeight: number = 0
@State displayWidth: number = 0
// 屏幕刷新率(Hz)
@State displayRefreshRate: number = 0
// 像素密度(PPI)
@State displayDensityDPI: number = 0

// 获取屏幕分辨率
getDisplayInfo() {
  // 获取默认屏幕
  const defaultDisplay = display.getDefaultDisplaySync()
  // 屏幕分辨率(像素)
  this.displayWidth = defaultDisplay.width
  this.displayHeight = defaultDisplay.height
  // 屏幕刷新率(HZ)
  this.displayRefreshRate = defaultDisplay.refreshRate
  // 像素密度(PPI)
  this.displayDensityDPI = defaultDisplay.densityDPI
}