# Wi-Fi始终连接，如何感知Wi-Fi本身从无网络到有网络的状态

#### 问题现象

手机连接到未认证的Wi-Fi，认证后无法感知到认证成功，即网络连接成功。

#### 背景知识

*   设备从无网络到有网络会触发netAvailable事件、netCapabilitiesChange事件和netConnectionPropertiesChange事件。
*   设备从有网络到无网络状态会触发netLost事件。
*   设备从Wi-Fi到蜂窝会触发netLost事件（Wi-Fi丢失）之后触发netAvailable事件（蜂窝可用）。

#### 解决方案

*   实测该场景不会发送netAvailable或netLost事件。
*   需要监听netCapabilitiesChange事件，判断connection.NetCapabilityInfo中的NetCap类型。若包含NET\_CAPABILITY\_PORTAL=17（还没有认证时会返回），则表示还没有进行认证，当前网络不可用。

先在module.json5文件中配置网络权限ohos.permission.INTERNET和允许应用获取数据网络信息ohos.permission.GET\_NETWORK\_INFO。

完整示例参考如下：

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

let netCon: connection.NetConnection = connection.createNetConnection();

@Entry
@Component
struct Connection {
  aboutToAppear(): void {
    // 先使用register接口注册订阅事件
    netCon.register((error: BusinessError) => {
      console.error(JSON.stringify(error));
    });
  }

  build() {
    Column() {
      Text('开始检测网络状态')
        .onClick(() => {
          // 订阅网络丢失事件
          netCon.on('netLost', (data: connection.NetHandle) => {
            console.info(`网络丢失: ${data.netId}`);
          });
          // 订阅网络能力变化事件
          netCon.on('netCapabilitiesChange', (data: connection.NetCapabilityInfo) => {
            console.info(`订阅网络能力变化: ${data.netCap.bearerTypes}`);
          });

          // 订阅网络可用事件
          netCon.on('netAvailable', (data: connection.NetHandle) => {
            console.info(`网络可用: ${data.netId}`);
          });
        })
    }
  }
}
```

#### 常见FAQ

Q：开发预下载的功能，需要判断当前app的网络请求为闲时进行下载，是否有相关API可以进行判断？

A：可以使用connection模块的on('netBlockStatusChange')监听事件判断当前网络的阻塞状态。