HarmonyOS 鸿蒙Next中怎么做局域网测速
HarmonyOS 鸿蒙Next中怎么做局域网测速 Android,iOS这边都是使用iperf3做的,鸿蒙这边好像不行,不能runtime运行iperf程序
尊敬的开发者,您好:
实现局域网测速可以采用以下方式:
- 可以通过订阅网络质量Qos评估,在订阅Qos后,系统按照一定的周期或Qos变化后回调给应用。回调的Qos信息包括数据传输的链路类型、上下行空口实时带宽、上下行空口实时速率、RTT时延等。可参考文档:网络质量评估-网络质量-Network Boost Kit(网络加速服务)-网络-系统 - 华为HarmonyOS开发者
- 可参考当前社区中已经实现的测速工具(如果满足需求):网络测速工具
- 如果您一定需要使用iperf3工具的功能,也可参考1楼提供的方案,将iperf3源码下载至本地后通过HarmonyOS NDK编译为可用native库,然后在工程中引用来使用iperf3的功能
更多关于HarmonyOS 鸿蒙Next中怎么做局域网测速的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
鸿蒙侧不建议按 Android/iOS 那样 runtime 拉起 iperf3 可执行文件;应用沙箱和上架审核也不适合依赖外部二进制。可以选两条路:
- 只需要局域网测速:在应用内用 Network Kit 的 TCP/UDP Socket 自己做 client/server。一端持续发送固定大小数据,另一端统计 bytes/耗时,分别测 TCP 吞吐、UDP 丢包/抖动;延迟可用小包往返测。
- 必须沿用 iperf3 算法:把 iperf3 相关 C/C++ 源码裁剪后通过 HarmonyOS NDK 编译成 native 库,由 ArkTS/Native 调用,而不是运行下载或内置的独立可执行文件。
注意申请 ohos.permission.INTERNET,并处理同一 Wi-Fi、热点隔离、IPv4/IPv6、前后台限制等情况。测速结果建议固定包大小、测试时长、并发连接数,多次取平均,同时标注上/下行、TCP/UDP 和当前网络类型,否则波动会比较大。
在HarmonyOS Next中,可使用 @ohos.net.socket 创建TCP/UDP连接,通过传输指定大小数据块并计时计算吞吐量实现局域网测速。也可借助 @ohos.net.http 下载局域网内文件测速。核心是调用网络API获取收发包时间差与字节数。
鸿蒙Next目前确实无法像Android/iOS那样直接通过runtime执行iperf3二进制文件,但这不意味着无法实现局域网测速。可以利用HarmonyOS提供的Socket API(TCP或UDP),自行编写测速逻辑,效果与iperf类似。以下是一个基于TCP的简易测速实现思路及核心代码。
原理:一端作为Server监听端口,另一端作为Client连接后,持续发送固定大小的数据块(如1MB),Server接收并统计时间与数据量,计算瞬时/平均吞吐率。测试时长可预设(如10秒),结束后上报结果。
Server端(ArkTS):
import socket from '@ohos.net.socket';
let tcpServer = socket.constructTCPSocketInstance();
tcpServer.bind({ address: '0.0.0.0', port: 5201, family: 1 }, (err) => {
if (err) return;
tcpServer.listen();
});
tcpServer.on('connect', (client: socket.TCPSocketConnection) => {
let totalBytes = 0;
let startTime = Date.now();
client.on('message', (value: { message: ArrayBuffer }) => {
totalBytes += value.message.byteLength;
let elapsed = (Date.now() - startTime) / 1000;
if (elapsed >= 10) { // 测试10秒
let speedMbps = (totalBytes * 8) / (elapsed * 1024 * 1024);
console.info(`Average speed: ${speedMbps.toFixed(2)} Mbps`);
client.close();
}
});
});
Client端:
import socket from '@ohos.net.socket';
let tcpClient = socket.constructTCPSocketInstance();
tcpClient.connect({ address: '192.168.1.x', port: 5201, family: 1 }, (err) => {
if (err) return;
let block = new ArrayBuffer(1024 * 1024); // 1MB块
let view = new Uint8Array(block);
// 填充随机数据避免压缩干扰
for (let i = 0; i < view.length; i++) view[i] = Math.floor(Math.random() * 256);
let endTime = Date.now() + 10000; // 10秒后停止
function sendLoop() {
if (Date.now() < endTime) {
tcpClient.send({ data: block }, (err) => {
if (!err) sendLoop();
});
} else {
tcpClient.close();
}
}
sendLoop();
});
注意事项:
- 需在
module.json5中申请ohos.permission.INTERNET权限。 - 建议使用Wi-Fi局域网,避免移动网络干扰。
- 如需要双向测速(类似iperf3的
-d),可同时运行上传/下载线程。 - 若需UDP测速,使用
@ohos.net.socket中的UDP实例,并考虑丢包控制逻辑。
该方案轻量且不依赖第三方库,完全基于鸿蒙原生API,可满足绝大多数局域网测速需求。

