文档管理中心

如何获取手机当前网络连接的子网掩码

问题现象

  1. 如何获取手机当前网络连接的子网掩码?
  2. 如何查看网络的路由信息?

背景知识

  • getConnectionPropertiesSync同步获取NetHandle对应的网络的连接信息。
  • 网络连接管理提供管理网络一些基础能力,包括获取默认激活的数据网络、获取所有激活数据网络列表、开启关闭飞行模式、获取网络能力信息等功能。

解决方案

  1. 系统并未提供直接获取子网掩码的接口,可通过获取网络的连接信息然后计算获得。
    • 在module.json5文件中配置"ohos.permission.GET_NETWORK_INFO"权限。
    • 获取子网掩码代码如下:
      import { connection } from '@kit.NetworkKit';
      
      
      @Entry
      @Component
      struct SubnetMask {
        @State subnetMaskStr: string = '获取子网掩码';
        /**
         * 计算子网掩码
         * @param prefixLength 前缀长度
         * @returns 子网掩码字符串
         */
        calculateSubnetMask(prefixLength: number): string {
          if (!Number.isInteger(prefixLength) || prefixLength > 32 || prefixLength < 0) {
            return '';
          }
          // 计算每个字节的子网掩码部分
          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);
        }
      
      
        build() {
          RelativeContainer() {
            Text(this.subnetMaskStr)
              .id('SubnetMaskHelloWorld')
              .fontSize($r('app.float.page_text_font_size'))
              .fontWeight(FontWeight.Bold)
              .alignRules({
                center: { anchor: '__container__', align: VerticalAlign.Center },
                middle: { anchor: '__container__', align: HorizontalAlign.Center }
              })
              .onClick(()=>{
                try {
                  // 1.获取默认网络
                  const netHandle = connection.getDefaultNetSync();
                  // 2.获取网络连接信息
                  const connectionProperties = connection.getConnectionPropertiesSync(netHandle);
                  // 3.提取链路信息
                  const linkAddress = connectionProperties.linkAddresses?.[0];
                  if (linkAddress) {
                    // 计算子网掩码,参数为链路地址前缀的长度
                    this.subnetMaskStr = this.calculateSubnetMask(linkAddress.prefixLength);
                  }
                } catch (err) {
                  console.error(`errCode is ${err.code}, message is ${err.message}`);
                }
              })
      
      
          }
          .height('100%')
          .width('100%');
        }
      }

      示例效果:

  2. 可以通过connection.getConnectionPropertiesSync接口获取ConnectionProperties网络连接信息,其中就包含routes路由信息。