# 统计网络流量消耗

## 简介

流量管理提供了基于物理网络的数据流量统计能力，支持基于网卡/UID的流量统计。

流量管理主要实现功能有：

* 支持基于网卡的流量统计。
* 支持基于应用UID的流量统计。

  > **说明：** > > - 为了保证应用的运行效率，大部分API调用都是异步的，对于异步调用的API均提供了callback和Promise两种方式，以下示例均采用Promise函数，更多方式可以查阅[@ohos.net.statistics (流量管理)](../reference/apis-network-kit/js-apis-net-statistics.md)。 > - 上行流量是指由终端设备向网络侧发送的数据量，下行流量是指由网络侧向终端设备发起传输的数据量。

以下分别介绍具体开发方式。

## 开发步骤

1. 导入[statistics](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-net-statistics)、[socket](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-socket)以及错误码模块。

   ```TypeScript
   import { socket, statistics } from '@kit.NetworkKit';
   import { BusinessError } from '@kit.BasicServicesKit';
   import { hilog } from '@kit.PerformanceAnalysisKit';
   ```

2. 获取指定网卡流量数据。

   分别调用[getIfaceRxBytes](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-net-statistics#statisticsgetifacerxbytes-1)和[getIfaceTxBytes](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-net-statistics#statisticsgetifacetxbytes-1)接口传入网卡名获取指定网卡从最近一次开机至今的下行和上行流量数据。

   ```TypeScript
     // wlan0为主WiFi网卡名，获取主WiFi实时下行流量数据。
     statistics.getIfaceRxBytes('wlan0').then((stats: number) => {
       hilog.info(0x0000, 'testTag', JSON.stringify(stats));
       // ...
     })
     .catch((err: BusinessError) => {
       hilog.error(0x0000, 'testTag', JSON.stringify(err));
       // ...
     });
     // ...
     // wlan0为主WiFi网卡名，获取主WiFi实时上行流量数据。
     statistics.getIfaceTxBytes('wlan0').then((stats: number) => {
       hilog.info(0x0000, 'testTag', JSON.stringify(stats));
       // ...
     })
     .catch((err: BusinessError) => {
       hilog.error(0x0000, 'testTag', JSON.stringify(err));
       // ...
     });
   // ...
   ```

3. 获取蜂窝流量数据。

   分别调用[getCellularRxBytes](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-net-statistics#statisticsgetcellularrxbytes-1)和[getCellularTxBytes](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-net-statistics#statisticsgetcellulartxbytes-1)接口获取从最近一次开机至今的蜂窝下行和上行流量数据。

   ```TypeScript
   // 获取蜂窝实时下行流量数据。
   statistics.getCellularRxBytes().then((stats: number) => {
     hilog.info(0x0000, 'testTag', JSON.stringify(stats));
     // ...
   })
   // ...
   // 获取蜂窝实时上行流量数据。
   statistics.getCellularTxBytes().then((stats: number) => {
     hilog.info(0x0000, 'testTag', JSON.stringify(stats));
     // ...
   })
   // ...
   ```

4. 获取所有网卡流量数据。

   分别调用[getAllRxBytes](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-net-statistics#statisticsgetallrxbytes-1)和[getAllTxBytes](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-net-statistics#statisticsgetalltxbytes-1)接口获取所有网卡从最近一次开机到现在的下行和上行流量数据。

   ```TypeScript
   // 获取所有网卡实时下行流量数据。
   statistics.getAllRxBytes().then((stats: number) => {
     hilog.info(0x0000, 'testTag', JSON.stringify(stats));
     // ...
   })
   // ...
   // 获取所有网卡实时上行流量数据。
   statistics.getAllTxBytes().then((stats: number) => {
     hilog.info(0x0000, 'testTag', JSON.stringify(stats));
     // ...
   })
   // ...
   ```

5. 获取指定应用流量数据。

   分别调用[getUidRxBytes](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-net-statistics#statisticsgetuidrxbytes-1)和[getUidTxBytes](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-net-statistics#statisticsgetuidtxbytes-1)接口，传入UID获取指定应用从最近一次开机至今的下行和上行流量数据。

   此处仅以应用UID为20010038为例，实际调用时需修改为真实UID。

   ```ts
    let UID = 20010038;
   ```

   ```TypeScript
   // 获取指定应用实时下行流量数据。
   // ...
   statistics.getUidRxBytes(UID).then((stats: number) => {
     hilog.info(0x0000, 'testTag', JSON.stringify(stats));
     // ...
   })
   // ...
   // 获取指定应用实时上行流量数据。
   // ...
   statistics.getUidTxBytes(UID).then((stats: number) => {
     hilog.info(0x0000, 'testTag', JSON.stringify(stats));
     // ...
   })
   // ...
   ```

6. 获取指定Socket流量数据。

   分别调用[getSockfdRxBytes](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-net-statistics#statisticsgetsockfdrxbytes11-1)和[getSockfdTxBytes](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-net-statistics#statisticsgetsockfdtxbytes11-1)接口，传入Socket FD获取指定Socket的下行和上行流量数据。

   ```TypeScript
   // 获取指定socket实时下行流量数据。
   let tcp: socket.TCPSocket = socket.constructTCPSocketInstance();
   // ...
   tcp.getSocketFd().then((sockfd: number) => {
     statistics.getSockfdRxBytes(sockfd).then((stats: number) => {
       hilog.info(0x0000, 'testTag', JSON.stringify(stats));
       // ...
     }).catch((err: BusinessError) => {
       hilog.error(0x0000, 'testTag', JSON.stringify(err));
       // ...
     });
   })
   // ...
   // 获取指定socket实时上行流量数据。
   tcp.getSocketFd().then((sockfd: number) => {
     statistics.getSockfdTxBytes(sockfd).then((stats: number) => {
       hilog.info(0x0000, 'testTag', JSON.stringify(stats));
       // ...
     }).catch((err: BusinessError) => {
       hilog.error(0x0000, 'testTag', JSON.stringify(err));
       // ...
     });
   })
   // ...
   ```

