HarmonyOS 鸿蒙Next中如何通过接口获取本机的热点IP

HarmonyOS 鸿蒙Next中如何通过接口获取本机的热点IP 在本机开启热点后,应用如何才能获取到本机的热点IP,用于局域网传输文件定位设备

9 回复

首先添加权限 ohos.permission.GET_WIFI_INFO

然后通过 wifiManager.getIpInfo() 获取wifi信息

import { wifiManager } from '@kit.ConnectivityKit';

@Entry
@Component
struct TestPage {
    @State hotspotIP: string = '';

    build() {
        Column() {
            Button('获取IP')
                .onClick(() => {
                    this.getHotspotIP();
                })
            Text('IP: ' + this.hotspotIP)
                .visibility(this.hotspotIP ? Visibility.Visible : Visibility.None)
        }
    }

    getHotspotIP() {
        // 可选:检查Wi-Fi是否激活
        if (wifiManager.isWifiActive()) {
            let ipInfo = wifiManager.getIpInfo();
            if (ipInfo && ipInfo.ipAddress) {
                let ipNum = ipInfo.ipAddress;
                this.hotspotIP = (ipNum >>> 24) + "." + (ipNum >> 16 & 0xFF) + "." + (ipNum >> 8 & 0xFF) + "." + (ipNum & 0xFF);
            } else {
                console.error('未获取到IP信息');
            }
        } else {
            console.error('Wi-Fi未开启');
        }
    }
}

更多关于HarmonyOS 鸿蒙Next中如何通过接口获取本机的热点IP的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


使用wifiManager模块获取ipInfo,然后转换为IP常用格式,注意wifiManager.getIpInfo()接口需要权限ohos.permission.GET_WIFI_INFO。

参考代码如下:

import { wifiManager } from '@kit.ConnectivityKit';
let ipAddress = wifiManager.getIpInfo().ipAddress;
let ip = (ipAddress >>> 24) + "." + (ipAddress >> 16 & 0xFF) + "." + (ipAddress >> 8 & 0xFF) + "." + (ipAddress & 0xFF);
import socket from '@ohos.net.socket';

async function getHotspotIp(): Promise<string> {
    try {
        // 获取所有网络接口
        const networkInterfaces = await socket.getNetworkInterfaces();
        for (const iface of networkInterfaces) {
            // 根据经验判断,热点对应的接口名可能包含特定后缀,例如 'wlan1'
            // 这个名称可能因设备而异,需要根据实际情况调整判断逻辑
            if (iface.name.includes('wlan') && iface.index > 0) {
                for (const addrInfo of iface.addressInfos) {
                    // 寻找IPv4地址
                    if (addrInfo.family === 'inet') {
                        return addrInfo.address;
                    }
                }
            }
        }
    } catch (error) {
        console.error('Failed to get hotspot IP:', error);
    }
    return '';
}

本机开热点获取本机热点IP,ArkTS编程直接获取不到的。
让其他人连你热点,最后一位换成1就是开热点手机的IP。
PS:苹果手机固定 172.20.10.1
鸿蒙手机(P和mate试的):192.168.43.1

我没看到“直接获取本机热点 IP”的公开专用 API。公开能力是用 connection.getDefaultNet() 取默认网络,再 getConnectionProperties() 查看 linkAddresses;但热点开启时默认网络可能是蜂窝/上游网络,不一定是 AP 侧网关地址。做局域网文件传输更稳的是 socket 监听 0.0.0.0,枚举可用 IPv4 后展示或用局域网发现。 依据: https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-net-connection https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-wifiManager

你好,参考怎样获取本机的IP地址, 配置权限:

"requestPermissions": [
      {
        "name": "ohos.permission.INTERNET",
      },
      {
        "name": "ohos.permission.GET_NETWORK_INFO",
        "reason": "$string:webserver_get_network_info"  //配置"用于获取本机的IP地址,局域网内传输文件"
      }
    ]
  }

获取本机IP方法: 

 import { connection, socket } from '@kit.NetworkKit';
 
 /**
   * 获取本地IP地址
   * @returns IP地址字符串
   */
  getLocalIP(): string {
    try {
      const netHandle = connection.getDefaultNetSync();
      if (netHandle.netId === 0) {
        // 当前没有已连接的网络时,获取的netHandler的netid为0
        return '';
      }
      const connectionproperties = connection.getConnectionPropertiesSync(netHandle);
      return connectionproperties.linkAddresses[0].address.address;
    } catch (e) {
      return '';
    }
  }

可以,但是需要先明确一点:

HarmonyOS 目前没有直接公开“获取热点IP”的专用 API。

但:

热点本质也是一个网络接口(AP)

所以可以通过:

  • WiFi热点接口
  • 网络接口枚举
  • IP地址遍历

间接获取。

——————————

你这个场景:

手机开热点
局域网传文件
其它设备连接手机热点

实际上需要的是:

热点网关IP

通常:

Android / HarmonyOS 热点默认会是:

192.168.43.1

或者:

192.168.x.1

很多机型基本固定。

——————————

最简单方案(推荐)

直接枚举网络接口获取热点IP。

ArkTS 可以通过:

@ohos.net.connection

配合:

network.getAllNets()

以及:

getAddressesByName()

或者 Native 层:

NetworkInterface

来拿。

——————————

更直接一点:

HarmonyOS Native/Node 风格里通常直接:

import socket from '@ohos.net.socket'

或者:

import connection from '@ohos.net.connection'

然后:

枚举本机 IP。

——————————

实际开发里:

最稳的是:

遍历所有 IPv4 地址

找到:

192.168.*

且:

作为热点网关的地址

——————————

因为:

开启热点后:

手机本身会变成:

DHCP Server + Gateway

所以:

热点IP就是手机局域网IP

——————————

你可以重点看:

@ohos.net.connection

里的:

  • getDefaultNet
  • getNetCapabilities
  • getAddressesByName

——————————

不过这里有个坑:

HarmonyOS 当前:

没有像 Android WifiManager 那种完整热点API

所以:

不能直接:

getWifiApIpAddress()

这种。

——————————

现实里很多人直接这么做:

方案1(最推荐)

固定热点IP。

因为华为热点大部分情况下:

192.168.43.1

非常稳定。

客户端直接连接:

192.168.43.1:端口

即可。

很多文件传输 App 都这么干。

——————————

方案2

服务端启动时:

枚举网卡:

过滤:

  • wlan
  • ap
  • hotspot

对应 IP。

——————————

如果你是:

ArkTS 纯应用层

这里给你一个常见思路:

import connection from '@ohos.net.connection';

async function getLocalIp() {
  try {
    let netHandle = await connection.getDefaultNet();
    let properties = await connection.getNetCapabilities(netHandle);

    console.info(JSON.stringify(properties));
  } catch (err) {
    console.error(JSON.stringify(err));
  }
}

——————————

但:

HarmonyOS API 现在对:

热点状态
热点IP
AP接口

开放并不完整。

所以:

很多情况下还是要:

Native C++

或者:

Node-API

去枚举系统网卡。

——————————

真正稳定可靠的方案:

推荐:

不要依赖“获取热点IP”

而是:

服务端主动广播。

例如:

  • UDP广播
  • mDNS
  • NSD
  • Bonjour

客户端自动发现设备。

这样:

不需要关心热点IP。

——————————

尤其你做:

局域网传文件

强烈建议:

UDP广播发现 + TCP传输

而不是手动 IP。

这是成熟方案。

——————————

最终总结:

HarmonyOS 当前:

没有专门公开“获取热点IP”的API

实际可行方案:

固定热点默认IP(最简单)

192.168.43.1

枚举本机网卡 IPv4 地址

Native层获取 NetworkInterface

推荐改为:

UDP/mDNS 自动发现设备

这是最稳定、最跨平台的局域网方案。

在HarmonyOS Next中,可通过 @ohos.net.wifi 模块的 getHotspotIpAddress() 方法获取本机热点IP地址。调用方式:import wifi from '@ohos.net.wifi'; const ip = wifi.getHotspotIpAddress(); 返回值为字符串格式的IP地址。

要获取本机热点IP,可通过系统网络管理接口实现。HarmonyOS NEXT 中,本机开启热点后,热点接口通常命名为 wlan 或类似标识,使用 @kit.NetworkKitgetInterfaceAddresses 可获取所有网络接口地址,筛选即可得到热点IP。

关键代码示例:

import { connection } from '@kit.NetworkKit';
import { BusinessError } from '@kit.BasicServicesKit';

// 获取本机热点IP
connection.getInterfaceAddresses((err: BusinessError, infos: connection.InterfaceAddress[]) => {
  if (err) {
    console.error('获取接口失败:', err.message);
    return;
  }
  for (let info of infos) {
    // 热点接口名通常以 'wlan' 打头,可根据实际调整
    if (info.interfaceName.startsWith('wlan')) {
      console.log('热点IP:', info.address); // 如 192.168.43.1
      break;
    }
  }
});

所需权限:

  • ohos.permission.GET_NETWORK_INFO
  • ohos.permission.INTERNET

说明:

  • getInterfaceAddresses 返回当前设备所有网络接口的信息,包含接口名和IP地址。
  • 若无法匹配到 wlan,可遍历打印所有接口名,确认本机热点对应的接口名称后调整判断逻辑。
回到顶部