文档管理中心
开发与测试开放能力API系统网络Network Kit(网络服务)连接网络管理网络连接

管理网络连接

简介

网络连接管理提供管理网络的一些基础能力,包括Wi-Fi/蜂窝/Ethernet等多网络连接优先级管理、网络质量评估、订阅默认/指定网络连接状态变化、查询网络连接信息、DNS解析等功能。

说明

为了保证应用的运行效率,大部分API调用都是异步的,对于异步调用的API,均提供了callback和Promise两种方式,以下示例均采用promise函数,更多方式可以查阅@ohos.net.connection (网络连接管理)

基本概念

  • 网络生产者:数据网络的提供方。例如WiFi、蜂窝、Ethernet等。
  • 网络消费者:数据网络的使用方。例如应用或系统服务。
  • 网络探测:检测网络有效性,避免将网络从可用网络切换到不可用网络。包括绑定网络探测、DNS探测、HTTP探测及HTTPS探测。
  • 网络优选:处理多网络共存时选择最优网络。在网络状态、网络信息及评分发生变化时被触发。
  • 默认网络:系统默认使用的网络。由系统决定,与应用是否指定网络无关,通常为Wi-Fi/蜂窝/以太网/蓝牙其中之一。
  • 网络句柄:网络的唯一标识。

场景介绍

网络连接管理的典型场景如下所示。

  • 接收指定网络的状态变化通知。
  • 获取所有注册的网络。
  • 查询默认网络或者指定网络的连接信息。
  • 使用默认网络解析域名,获取所有IP。

具体开发方式介绍如下。

接收指定网络的状态变化通知

  1. 声明接口调用所需要的权限:ohos.permission.GET_NETWORK_INFO。

    此权限级别为normal,在申请权限前,请保证符合权限使用的基本原则。然后参考访问控制-声明权限声明对应权限。

  2. 从@kit.NetworkKit中导入connection命名空间。

    收起
    自动换行
    深色代码主题
    复制
    1. // 引入包名。
    2. import { connection } from '@kit.NetworkKit';
    3. import { BusinessError } from '@kit.BasicServicesKit';
    4. import { hilog } from '@kit.PerformanceAnalysisKit';
  3. 调用createNetConnection方法,指定网络能力、网络类型和超时时间(可选,如不传入代表默认网络;创建不同于默认网络时可通过指定这些参数完成),创建一个NetConnection对象。

    收起
    自动换行
    深色代码主题
    复制
    1. let netSpecifier: connection.NetSpecifier = {
    2. netCapabilities: {
    3. // 假设当前默认网络是蜂窝网络连接,需要创建WIFI网络连接,可指定网络类型为WIFI
    4. bearerTypes: [connection.NetBearType.BEARER_WIFI],
    5. // 指定网络能力为Internet
    6. networkCap: [connection.NetCap.NET_CAPABILITY_INTERNET],
    7. }
    8. };
    9. // 指定超时时间为10s(默认值为0)
    10. let TIMEOUT = 10 * NETWORK_CONNECTION_TIMEOUT;
    11. // 创建NetConnection对象
    12. let conn = connection.createNetConnection(netSpecifier, TIMEOUT);
  4. 调用该对象的on()方法,传入type和callback,订阅关心的事件。

    收起
    自动换行
    深色代码主题
    复制
    1. // 订阅事件,如果当前指定网络可用,通过on_netAvailable通知用户
    2. conn.on('netAvailable', (data: connection.NetHandle) => {
    3. hilog.info(0x0000, 'testTag', 'Network available, NetId is ' + data.netId);
    4. // ...
    5. });
    6. // 订阅事件,如果当前指定网络不可用,通过on_netUnavailable通知用户
    7. conn.on('netUnavailable', (data: void) => {
    8. hilog.info(0x0000, 'testTag', 'Network unavailable, data is ' + JSON.stringify(data));
    9. // ...
    10. });
    11. // 订阅网络能力变化事件,如果当前指定网络的能力发生变化,通过on_netCapabilitiesChange通知用户
    12. conn.on('netCapabilitiesChange', (data: connection.NetCapabilityInfo) => {
    13. hilog.info(0x0000, 'testTag', 'Network netCapabilitiesChange, data is ' + JSON.stringify(data));
    14. // ...
    15. });
    16. // 订阅网络连接信息变化事件,如果当前指定网络的连接信息发生变化,通过on_netConnectionPropertiesChange通知用户
    17. conn.on('netConnectionPropertiesChange', (data: connection.NetConnectionPropertyInfo) => {
    18. hilog.info(0x0000, 'testTag', 'Network netConnectionPropertiesChange, data is ' + JSON.stringify(data));
    19. // ...
    20. });
    21. // 订阅网络丢失事件,如果当前处于连接状态的指定网络断开,通过on_netLost通知用户
    22. conn.on('netLost', (data: connection.NetHandle) => {
    23. hilog.info(0x0000, 'testTag', 'Network netLost, data is ' + JSON.stringify(data));
    24. // ...
    25. });
  5. 调用该对象的register()方法,订阅指定网络状态变化的通知。当网络可用时,会触发netAvailable事件的回调;当网络从连接到断开时,会触发netLost事件的回调;当网络连接信息变化时(例如linkAddresses增加V6地址),会触发netConnectionPropertiesChange事件回调;当网络能力发生变化时(例如网络的连通性发生变化),会触发netCapabilitiesChange回调。

    收起
    自动换行
    深色代码主题
    复制
    1. // 订阅连接状态变化
    2. conn.register((err: BusinessError, data: void) => {
    3. // ...
    4. hilog.error(0x0000, 'testTag', 'Error occurred during connection:', JSON.stringify(err));
    5. // ...
    6. });
  6. 当不使用该网络时,可以调用该对象的unregister()方法,取消订阅。

    收起
    自动换行
    深色代码主题
    复制
    1. // 当不使用该网络时,可以调用该对象的unregister()方法,取消订阅。
    2. conn.unregister((err: BusinessError, data: void) => {
    3. if (err) {
    4. hilog.error(0x0000, 'testTag', 'Error occurred during unsubscription:', JSON.stringify(err));
    5. } else {
    6. // ...
    7. hilog.info(0x0000, 'testTag', 'Network connection disconnected.');
    8. }
    9. });

监控默认网络变化并主动重建网络连接

根据当前网络状态及网络质量情况,默认网络可能会发生变化,如下所示。

  1. 在Wi-Fi弱信号的情况下,默认网络可能会切换到蜂窝网络。
  2. 在蜂窝网络状态差的情况下,默认网络可能会切换到Wi-Fi。
  3. 关闭Wi-Fi后,默认网络可能会切换到蜂窝网络。
  4. 关闭蜂窝网络后,默认网络可能会切换到Wi-Fi。
  5. 在Wi-Fi弱信号的情况下,默认网络可能会切换到其他Wi-Fi(存在跨网情况)。
  6. 在蜂窝网络状态差的情况下,默认网络可能会切换到其他蜂窝(存在跨网情况)。

本节旨在介绍监控默认网络的变化后,应用报文能够快速迁移到新默认网络上,具体做法如下。

导入connection命名空间

收起
自动换行
深色代码主题
复制
  1. import { connection, socket } from '@kit.NetworkKit';
  2. import { BusinessError } from '@kit.BasicServicesKit';
  3. import { hilog } from '@kit.PerformanceAnalysisKit';

监控默认网络变化

收起
自动换行
深色代码主题
复制
  1. const netConnection = connection.createNetConnection();
  2. /* 监听默认网络改变 */
  3. netConnection.on('netAvailable', (data: connection.NetHandle) => {
  4. hilog.info(0x0000, 'testTag', JSON.stringify(data));
  5. });

默认网络变化后重新建立网络连接

原网络连接使用Socket模块建立连接

收起
自动换行
深色代码主题
复制
  1. // 创建socket对象。
  2. let sock: socket.TCPSocket = socket.constructTCPSocketInstance();
  3. // 原网络连接使用Socket模块建立连接
  4. function useSocket() {
  5. let netAddress: socket.NetAddress = {
  6. address: '192.168.xx.xxx',
  7. port: 8080 // 端口号,默认设置为8080
  8. };
  9. let tcpConnectOptions: socket.TCPConnectOptions = {
  10. address: netAddress,
  11. timeout: 6000 // 连接超时时间
  12. };
  13. // 建立socket连接
  14. sock.connect(tcpConnectOptions, (err: BusinessError) => {
  15. if (err) {
  16. hilog.error(0x0000, 'testTag', 'connect fail: '+JSON.stringify(err));
  17. // ···
  18. return;
  19. }
  20. hilog.info(0x0000, 'testTag', 'connect success');
  21. // 通过socket发送数据
  22. let tcpSendOptions: socket.TCPSendOptions = {
  23. data: 'Hello, server!'
  24. };
  25. socketSend(tcpSendOptions);
  26. });
  27. }
  28. // 通过socket发送数据。
  29. function socketSend(tcpSendOptions: socket.TCPSendOptions) {
  30. sock.send(tcpSendOptions).then(() => {
  31. hilog.info(0x0000, 'testTag', 'send success');
  32. // ···
  33. }).catch((err: BusinessError) => {
  34. hilog.error(0x0000, 'testTag', 'send fail');
  35. // ···
  36. });
  37. }
  38. function socketTest() {
  39. const netConnection = connection.createNetConnection();
  40. // 网络切换会导致网络发生中断,原socket失效,故需重新建立socket。
  41. netConnection.on('netAvailable', (netHandle: connection.NetHandle) => {
  42. hilog.info(0x0000, 'testTag', 'default network changed: ' + JSON.stringify(netHandle));
  43. sock.close();
  44. sock = socket.constructTCPSocketInstance();
  45. // 通过socket发送数据。
  46. useSocket();
  47. });
  48. // ···
  49. // 订阅指定网络状态变化的通知。
  50. netConnection.register((error: BusinessError) => {
  51. if (error) {
  52. hilog.error(0x0000, 'testTag', 'register fail: ' + JSON.stringify(error));
  53. } else {
  54. hilog.info(0x0000, 'testTag', 'register success');
  55. }
  56. });
  57. // ···
  58. }

原网络连接使用Socket Library建立网络连接

监控到默认网络变化后关闭原有Socket并重新建立Socket连接。

获取所有注册的网络

  1. 声明接口调用所需要的权限:ohos.permission.GET_NETWORK_INFO。

    此权限级别为normal,在申请权限前,请保证符合权限使用的基本原则。然后参考访问控制-声明权限声明对应权限。

  2. 示例代码

    收起
    自动换行
    深色代码主题
    复制
    1. // 从@kit.NetworkKit中导入connection命名空间。
    2. import { connection } from '@kit.NetworkKit';
    3. import { hilog } from '@kit.PerformanceAnalysisKit';
    4. // ...
    5. // 调用getAllNets,获取所有处于连接状态的网络列表(Array<NetHandle>)
    6. connection.getAllNets().then((data: connection.NetHandle[]) => {
    7. hilog.info(0x0000, 'testTag', 'getAllNets get data: ' + JSON.stringify(data));
    8. if (data) {
    9. // ...
    10. GlobalContext.getContext().netList = data;
    11. // ...
    12. }
    13. });

查询默认网络或者指定网络的连接信息

  1. 声明接口调用所需要的权限:ohos.permission.GET_NETWORK_INFO。

    此权限级别为normal,在申请权限前,请保证符合权限使用的基本原则。然后参考访问控制-声明权限声明对应权限。

  2. 查询默认网络或指定网络连接信息代码示例

    通过调用getDefaultNet方法,获取默认的数据网络(NetHandle);调用getNetCapabilities方法,获取该NetHandle对应网络的能力信息。能力信息包含了网络类型(蜂窝网络、Wi-Fi网络、以太网网络等)、网络具体能力等网络信息。也可以调用getConnectionProperties方法,获取该NetHandle对应网络的连接信息。

    收起
    自动换行
    深色代码主题
    复制
    1. // 从@kit.NetworkKit中导入connection命名空间。
    2. import { connection } from '@kit.NetworkKit';
    3. import { hilog } from '@kit.PerformanceAnalysisKit';
    4. // ···
    5. let netHandleInfo:connection.NetHandle|null = null;
    6. // 调用getDefaultNet方法,获取默认的数据网络(NetHandle)
    7. connection.getDefaultNet().then((data: connection.NetHandle) => {
    8. if (data.netId == 0) {
    9. hilog.info(0x0000, 'testTag', `don't have defaultNet`);
    10. // 当前无默认网络时,获取的netHandler的netid为0,属于异常情况,需要额外处理
    11. return;
    12. }
    13. if (data) {
    14. // ···
    15. hilog.info(0x0000, 'testTag', 'getDefaultNet get data: ' + JSON.stringify(data));
    16. // 获取netHandle对应网络的能力信息。能力信息包含了网络类型、网络具体能力等网络信息
    17. netHandleInfo = data;
    18. connection.getNetCapabilities(netHandleInfo).then(
    19. (data: connection.NetCapabilities) => {
    20. hilog.info(0x0000, 'testTag', 'getNetCapabilities get data: ' + JSON.stringify(data));
    21. // 获取网络类型(bearerTypes)
    22. let bearerTypes: Set<number> = new Set(data.bearerTypes);
    23. let bearerTypesNum = Array.from(bearerTypes.values());
    24. for (let item of bearerTypesNum) {
    25. if (item == 0) {
    26. // 蜂窝网络
    27. hilog.info(0x0000, 'testTag', JSON.stringify('BEARER_CELLULAR'));
    28. } else if (item == 1) {
    29. // Wi-Fi网络
    30. hilog.info(0x0000, 'testTag', JSON.stringify('BEARER_WIFI'));
    31. } else if (item == 3) {
    32. // 以太网网络
    33. hilog.info(0x0000, 'testTag', JSON.stringify('BEARER_ETHERNET'));
    34. }
    35. }
    36. // 获取网络具体能力(networkCap)
    37. let itemNumber: Set<number> = new Set(data.networkCap);
    38. let dataNumber = Array.from(itemNumber.values());
    39. for (let item of dataNumber) {
    40. if (item == 0) {
    41. // 表示网络可以访问运营商的MMSC(Multimedia Message Service,多媒体短信服务)发送和接收彩信
    42. hilog.info(0x0000, 'testTag', JSON.stringify('NET_CAPABILITY_MMS'));
    43. } else if (item == 11) {
    44. // 表示网络流量未被计费
    45. hilog.info(0x0000, 'testTag', JSON.stringify('NET_CAPABILITY_NOT_METERED'));
    46. } else if (item == 12) {
    47. // 表示该网络应具有访问Internet的能力,该能力由网络提供者设置
    48. hilog.info(0x0000, 'testTag', JSON.stringify('NET_CAPABILITY_INTERNET'));
    49. } else if (item == 15) {
    50. // 表示网络不使用VPN(Virtual Private Network,虚拟专用网络)
    51. hilog.info(0x0000, 'testTag', JSON.stringify('NET_CAPABILITY_NOT_VPN'));
    52. } else if (item == 16) {
    53. // 表示该网络访问Internet的能力被网络管理成功验证,该能力由网络管理模块设置
    54. hilog.info(0x0000, 'testTag', JSON.stringify('NET_CAPABILITY_VALIDATED'));
    55. }
    56. }
    57. });
    58. }
    59. });
    60. // 获取netHandle对应的网络的连接信息。
    61. connection.getConnectionProperties(netHandleInfo).then((data: connection.ConnectionProperties) => {
    62. hilog.info(0x0000, 'testTag', 'getConnectionProperties get data: ' + JSON.stringify(data));
    63. })
    64. // ···
  3. 查询所有网络连接信息代码示例

    通过调用getAllNets方法,获取所有处于连接状态的网络列表(Array<NetHandle>)。然后遍历获取到的NetHandle数组,分别调用getNetCapabilities方法,获取该NetHandle对应网络的能力信息,能力信息包含了网络类型(蜂窝网络、Wi-Fi网络、以太网网络等)、网络具体能力等网络信息。也可以调用getConnectionProperties方法,获取该NetHandle对应网络的连接信息。

    收起
    自动换行
    深色代码主题
    复制
    1. // 从@kit.NetworkKit中导入connection命名空间。
    2. import { connection } from '@kit.NetworkKit';
    3. import { hilog } from '@kit.PerformanceAnalysisKit';
    4. // ...
    5. getAllNetworks() {
    6. // 调用getAllNets,获取所有处于连接状态的网络列表(Array<NetHandle>)。
    7. connection.getAllNets().then((data: connection.NetHandle[]) => {
    8. hilog.info(0x0000, 'testTag', 'getAllNets get data: ' + JSON.stringify(data));
    9. if (data) {
    10. // ...
    11. let itemNumber: Set<connection.NetHandle> = new Set(data);
    12. let dataNumber = Array.from(itemNumber.values());
    13. for (let item of dataNumber) {
    14. // 循环获取网络列表每个netHandle对应网络的能力信息
    15. connection.getNetCapabilities(item).then((data: connection.NetCapabilities) => {
    16. hilog.info(0x0000, 'testTag', 'getNetCapabilities get data: ' + JSON.stringify(data));
    17. });
    18. // 循环获取网络列表每个netHandle对应的网络的连接信息
    19. connection.getConnectionProperties(item).then((data: connection.ConnectionProperties) => {
    20. hilog.info(0x0000, 'testTag', 'getConnectionProperties get data: ' + JSON.stringify(data));
    21. });
    22. }
    23. }
    24. });
    25. }

判断默认网络是否可以访问互联网

如果应用需要检查当前连接的网络是否可以访问互联网,可参考以下步骤进行判断:

  1. 声明接口调用所需要的权限:ohos.permission.GET_NETWORK_INFO

    此权限级别为normal,在申请权限前,请保证符合权限使用的基本原则。然后参考访问控制-声明权限声明对应权限。

  2. 代码示例

    调用getDefaultNetSync方法,获取当前默认网络的netHandle,netHandle有效的情况下,调用getNetCapabilitiesSync方法,获取NetHandle对应网络的能力信息,根据获取到的能力信息,判断networkCap数组中的值判断网络是否可用。

    NET_CAPABILITY_CHECKING_CONNECTIVITY表示在进行连通性判断的过程中,当不处于连通性判断过程中,且networkCap数组中包含NET_CAPABILITY_VALIDATED表示网络连通性校验通过,可以访问互联网。

    收起
    自动换行
    深色代码主题
    复制
    1. // 从@kit.NetworkKit中导入connection命名空间。
    2. import { connection } from '@kit.NetworkKit';
    3. import { hilog } from '@kit.PerformanceAnalysisKit';
    4. // ...
    5. // 获取默认激活的数据网络。
    6. let netHandle = connection.getDefaultNetSync();
    7. if (!netHandle || netHandle.netId === 0) {
    8. hilog.error(0x0000, 'testTag', 'getDefaultNetSync fail');
    9. // ...
    10. } else {
    11. hilog.info(0x0000, 'testTag', 'default network: ' + JSON.stringify(netHandle));
    12. // 获取netHandle对应网络的能力信息。
    13. let netCapabilities = connection.getNetCapabilitiesSync(netHandle);
    14. let cap = netCapabilities.networkCap;
    15. hilog.info(0x0000, 'testTag', 'network capabilities: ' + JSON.stringify(netCapabilities));
    16. // 判断网络是否可以访问互联网。
    17. if (cap?.includes(connection.NetCap.NET_CAPABILITY_CHECKING_CONNECTIVITY)) {
    18. // 正在验证网络连通性,请稍后重试。
    19. hilog.info(0x0000, 'testTag', 'default network is checking, please try again later');
    20. } else {
    21. if (cap?.includes(connection.NetCap.NET_CAPABILITY_VALIDATED)) {
    22. // 网络连通性验证成功,当前默认网络可以访问互联网。
    23. hilog.info(0x0000, 'testTag', 'default network is validated');
    24. // ...
    25. } else {
    26. // 网络连通性验证失败,当前默认网络不可以访问互联网。
    27. hilog.info(0x0000, 'testTag', 'default network is not validated');
    28. // ...
    29. }
    30. }
    31. }

使用默认网络解析域名,获取所有IP

  1. 声明接口调用所需要的权限:ohos.permission.GET_NETWORK_INFO

    此权限级别为normal,在申请权限前,请保证符合权限使用的基本原则。然后参考访问控制-声明权限声明对应权限。

  2. 代码示例

    调用getAddressesByName方法,使用默认网络解析主机名以获取所有IP地址。

    收起
    自动换行
    深色代码主题
    复制
    1. // 从@kit.NetworkKit中导入connection命名空间。
    2. import { connection } from '@kit.NetworkKit';
    3. import { BusinessError } from '@kit.BasicServicesKit';
    4. import { hilog } from '@kit.PerformanceAnalysisKit';
    5. // ...
    6. // 使用默认网络解析主机名以获取所有IP地址
    7. connection.getAddressesByName('xxxx').then((data: connection.NetAddress[]) => {
    8. hilog.info(0x0000, 'testTag', 'Successfully retrieved default network IP address: ' + JSON.stringify(data));
    9. // ...
    10. })
在 开发与测试 开放能力API 中进行搜索
请输入您想要搜索的关键词