如果你也对鸿蒙开发感兴趣,加入“Harmony自习室”吧!扫描下方名片,关注公众号,公众号更新更快,同时也有更多学习资料和技术讨论群。
1、概述
HarmonyOS供了基于物理网络的数据流量统计能力,支持基于网卡/UID 的流量统计。主要实现的功能如下:
-
-
支持基于网卡/UID 的实时流量统计。
-
支持基于网卡/UID 的历史流量统计。
-
支持基于网卡/UID 的流量变化订阅。
-
数据流量统计能力由 statistics 模块提供。目前HarmonyOS提供的数据流量统计的能力有9种,我们分别讨论。
2、数据流量统计接口
👉🏻 获取指定网卡实时下行流量数据
针对异步场景HarmonyOS提供两套类似的API,一个是callback形式,另一个是promise形式(后文所有接口都按照此规律,不再重复说明)。
// 异步callback类型
getIfaceRxBytes(nic: string, callback: AsyncCallback<number>): void;
// 异步promise类型
getIfaceRxBytes(nic: string): Promise<number>;
参数 nic 表示的是网卡名,callback或Promise返回值表示获取到的实时下行流量,单位(byte)。针对callback的示例如下:
import { BusinessError } from '@kit.BasicServicesKit';
import { statistics } from '@kit.NetworkKit';
statistics.getIfaceRxBytes("wlan0", (error: BusinessError, stats: number) => {
console.log(JSON.stringify(error));
console.log(JSON.stringify(stats));
});
error表示获取过程出现错误,错误码如下:
错误码 ID | 错误信息 |
401 | 参数错误 |
2100002 | 连接设备错误 |
2100003 | 系统内部错误 |
2103005 | 读取系统map失败。 |
2103011 | 系统map创建失败 |
2103012 | 获取网卡名失败 |
👉🏻 获取指定网卡实时上行流量数据。
接口形式分别为callback形式和promise形式。
// callback形式接口
getIfaceTxBytes(nic: string, callback: AsyncCallback<number>): void;
// promise形式接口
getIfaceTxBytes(nic: string): Promise<number>;
nic参数是网卡名,与下行流量接口类似,callback和Promise的返回值分别是上行流量,单位(byte)。针对Promise接口示例代码如下:
import { statistics } from '@kit.NetworkKit';
statistics.getIfaceRxBytes("wlan0").then((stats: number) => {
console.log(JSON.stringify(stats));
});
【由于接口的使用方法基本相同,后文就不再举例示例代码介绍接口,直接看接口定义即可】
👉🏻 获取蜂窝实时下行流量数据
// callback形式
getCellularRxBytes(callback: AsyncCallback<number>): void;
// promise形式
getCellularRxBytes(): Promise<number>;
👉🏻 获取蜂窝实时上行流量数据
// callback形式
getCellularTxBytes(callback: AsyncCallback<number>): void;
// Promise形式
getCellularTxBytes(): Promise<number>;
👉🏻 获取所有网卡实时下行流量数据
// callback接口
getAllRxBytes(callback: AsyncCallback<number>): void;
// promise接口
getAllRxBytes(): Promise<number>;
👉🏻 获取所有网卡实时上行流量数据
// callback接口形式
getAllTxBytes(callback: AsyncCallback<number>): void;
// Promise接口形式
getAllTxBytes(): Promise<number>;
👉🏻 获取指定应用实时下行流量数据
// callback接口
getUidRxBytes(uid: number, callback: AsyncCallback<number>): void;
// Promise接口
getUidRxBytes(uid: number): Promise<number>;
👉🏻 获取指定应用实时上行流量数据
// callback接口
getUidTxBytes(uid: number, callback: AsyncCallback<number>): void;
// promise接口
getUidTxBytes(uid: number): Promise<number>;
👉🏻 获取Socket实时下行流量数据
// callback接口
getSockfdRxBytes(sockfd: number, callback: AsyncCallback<number>): void;
// Promise接口
getSockfdRxBytes(sockfd: number): Promise<number>;
【SocketFd的获取请参看后文的DEMO】
👉🏻 获取Socket实时上行流量数据
// callback接口
getSockfdTxBytes(sockfd: number, callback: AsyncCallback<number>): void;
// Promise接口
getSockfdTxBytes(sockfd: number): Promise<number>;
3、DEMO
-
获取指定网卡实时流量数据。
-
获取蜂窝实时流量数据。
-
获取所有网卡实时流量数据。
-
获取指定应用实时流量数据。
-
获取指定socket实时流量数据。
// 从@kit.NetworkKit中导入statistics命名空间
import { statistics, socket } from '@kit.NetworkKit';
import { BusinessError } from '@kit.BasicServicesKit';
// 获取指定网卡实时下行流量数据。
statistics.getIfaceRxBytes("wlan0").then((stats: number) => {
console.log(JSON.stringify(stats));
});
// 获取指定网卡实时上行流量数据。
statistics.getIfaceTxBytes("wlan0").then((stats: number) => {
console.log(JSON.stringify(stats));
});
// 获取蜂窝实时下行流量数据。
statistics.getCellularRxBytes().then((stats: number) => {
console.log(JSON.stringify(stats));
});
// 获取蜂窝实时上行流量数据。
statistics.getCellularTxBytes().then((stats: number) => {
console.log(JSON.stringify(stats));
});
// 获取所有网卡实时下行流量数据。
statistics.getAllRxBytes().then((stats: number) => {
console.log(JSON.stringify(stats));
});
// 获取所有网卡实时上行流量数据。
statistics.getAllTxBytes().then((stats: number) => {
console.log(JSON.stringify(stats));
});
// 获取指定应用实时下行流量数据。
let uid = 20010038;
statistics.getUidRxBytes(uid).then((stats: number) => {
console.log(JSON.stringify(stats));
});
// 获取指定应用实时上行流量数据。
let uids = 20010038;
statistics.getUidTxBytes(uids).then((stats: number) => {
console.log(JSON.stringify(stats));
});
// 获取指定socket实时下行流量数据。
let tcp: socket.TCPSocket = socket.constructTCPSocketInstance();
tcp.getSocketFd().then((sockfd: number) => {
statistics.getSockfdRxBytes(sockfd).then((stats: number) => {
console.log(JSON.stringify(stats));
}).catch((err: BusinessError) => {
console.error(JSON.stringify(err));
});
});
// 获取指定socket实时上行流量数据。
tcp.getSocketFd().then((sockfd: number) => {
statistics.getSockfdTxBytes(sockfd).then((stats: number) => {
console.log(JSON.stringify(stats));
}).catch((err: BusinessError) => {
console.error(JSON.stringify(err));
});
});