鸿蒙网络管理模块04——网络连接管理

news2024/11/29 12:38:03

如果你也对鸿蒙开发感兴趣,加入“Harmony自习室”吧!扫描下方名片,关注公众号,公众号更新更快,同时也有更多学习资料和技术讨论群。

1、概述

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

需要注意的是,由于API是对网络管理,因此大部分API都是异步的(如果对异步场景不熟悉,可以参考同时推送的另一篇文章【异步场景: promise、async函数与await命令介绍】)。

针对网络连接管理有一些基本概念我们需要了解:

  • 网络生产者:数据网络的提供方,比如WiFi、蜂窝、Ethernet等。

  • 网络消费者:数据网络的使用方,比如应用或系统服务。

  • 网络探测:检测网络有效性,避免将网络从可用网络切换到不可用网络。内容包括绑定网络探测、DNS探测、HTTP探测及HTTPS探测。

  • 网络优选:处理多网络共存时选择最优网络。在网络状态、网络信息及评分发生变化时被触发。

网络连接管理的典型场景有:

  1. 接收指定网络的状态变化通知
  2. 获取所有注册的网络

  3. 根据数据网络查询网络的连接信息

  4. 使用对应网络解析域名,获取所有IP

下面针对这四种场景做简单介绍。

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

开发步骤一般是:

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

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

  3. 调用createNetConnection方法,指定网络能力、网络类型和超时时间(可选,如不传入代表默认网络;创建不同于默认网络时可通过指定这些参数完成),创建一个NetConnection对象。

  4. 调用该对象的on()方法,传入type和callback,订阅关心的事件。

  5. 调用该对象的register()方法,订阅指定网络状态变化的通知。

  6. 当网络可用时,会收到netAvailable事件的回调;当网络不可用时,会收到netUnavailable事件的回调。

  7. 当不使用该网络时,可以调用该对象的unregister()方法,取消订阅。

示例代码如下:

// 引入包名import { connection } from '@kit.NetworkKit';import { BusinessError } from '@kit.BasicServicesKit';let netSpecifier: connection.NetSpecifier = {  netCapabilities: {    // 假设当前默认网络是WiFi,需要创建蜂窝网络连接,可指定网络类型为蜂窝网    bearerTypes: [connection.NetBearType.BEARER_CELLULAR],    // 指定网络能力为Internet    networkCap: [connection.NetCap.NET_CAPABILITY_INTERNET]  },};// 指定超时时间为10s(默认值为0)let timeout = 10 * 1000;// 创建NetConnection对象let conn = connection.createNetConnection(netSpecifier, timeout);// 订阅指定网络状态变化的通知conn.register((err: BusinessError, data: void) => {  console.log(JSON.stringify(err));});// 订阅事件,如果当前指定网络可用,通过on_netAvailable通知用户conn.on('netAvailable', ((data: connection.NetHandle) => {  console.log("net is available, netId is " + data.netId);}));// 订阅事件,如果当前指定网络不可用,通过on_netUnavailable通知用户conn.on('netUnavailable', ((data: void) => {  console.log("net is unavailable, data is " + JSON.stringify(data));}));// 当不使用该网络时,可以调用该对象的unregister()方法,取消订阅conn.unregister((err: BusinessError, data: void) => {});

3、获取所有注册的网络

开发步骤一般是:

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

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

  3. 调用getAllNets方法,获取所有处于连接状态的网络列表。

示例代码如下:​​​​​​​

// 引入包名import { connection } from '@kit.NetworkKit';import { BusinessError } from '@kit.BasicServicesKit';// 构造单例对象export class GlobalContext {  public netList: connection.NetHandle[] = [];  private constructor() {}  private static instance: GlobalContext;  private _objects = new Map<string, Object>();  public static getContext(): GlobalContext {    if (!GlobalContext.instance) {      GlobalContext.instance = new GlobalContext();    }    return GlobalContext.instance;  }  getObject(value: string): Object | undefined {    return this._objects.get(value);  }  setObject(key: string, objectClass: Object): void {    this._objects.set(key, objectClass);  }}// 获取所有处于连接状态的网络列表connection.getAllNets().then((data: connection.NetHandle[]) => {  console.info("Succeeded to get data: " + JSON.stringify(data));  if (data) {    GlobalContext.getContext().netList = data;  }});

4、查询网络的能力信息及连接信息

开发步骤一般如下:

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

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

  3. 通过调用getDefaultNet方法,获取默认的数据网络(NetHandle);或者通过调用getAllNets方法,获取所有处于连接状态的网络列表(Array<NetHandle>)。

  4. 调用getNetCapabilities方法,获取NetHandle对应网络的能力信息。能力信息包含了网络类型(蜂窝网络、Wi-Fi网络、以太网网络等)、网络具体能力等网络信息。

  5. 调用getConnectionProperties方法,获取NetHandle对应网络的连接信息。

代码如下:​​​​​​​

import { connection } from '@kit.NetworkKit';import { BusinessError } from '@kit.BasicServicesKit';// 构造单例对象export class GlobalContext {  public netList: connection.NetHandle[] = [];  public netHandle: connection.NetHandle|null = null;  private constructor() {}  private static instance: GlobalContext;  private _objects = new Map<string, Object>();  public static getContext(): GlobalContext {    if (!GlobalContext.instance) {      GlobalContext.instance = new GlobalContext();    }    return GlobalContext.instance;  }  getObject(value: string): Object | undefined {    return this._objects.get(value);  }  setObject(key: string, objectClass: Object): void {    this._objects.set(key, objectClass);  }}// 调用getDefaultNet方法,获取默认的数据网络(NetHandle)connection.getDefaultNet().then((data:connection.NetHandle) => {  if (data.netId == 0) {    // 当前无默认网络时,获取的netHandler的netid为0,属于异常情况,需要额外处理    return;  }  if (data) {    console.info("getDefaultNet get data: " + JSON.stringify(data));    GlobalContext.getContext().netHandle = data;    // 获取netHandle对应网络的能力信息。能力信息包含了网络类型、网络具体能力等网络信息   connection.getNetCapabilities(GlobalContext.getContext().netHandle).then(      (data: connection.NetCapabilities) => {      console.info("getNetCapabilities get data: " + JSON.stringify(data));      // 获取网络类型(bearerTypes)      let bearerTypes: Set<number> = new Set(data.bearerTypes);      let bearerTypesNum = Array.from(bearerTypes.values());      for (let item of bearerTypesNum) {        if (item == 0) {          // 蜂窝网          console.log(JSON.stringify("BEARER_CELLULAR"));        } else if (item == 1) {          // Wi-Fi网络          console.log(JSON.stringify("BEARER_WIFI"));        } else if (item == 3) {          // 以太网网络          console.log(JSON.stringify("BEARER_ETHERNET"));        }      }            // 获取网络具体能力(networkCap)      let itemNumber : Set<number> = new Set(data.networkCap);      let dataNumber = Array.from(itemNumber.values());      for (let item of dataNumber) {        if (item == 0) {          // 表示网络可以访问运营商的MMSC(Multimedia Message Service,多媒体短信服务)发送和接收彩信          console.log(JSON.stringify("NET_CAPABILITY_MMS"));        } else if (item == 11) {          // 表示网络流量未被计费          console.log(JSON.stringify("NET_CAPABILITY_NOT_METERED"));        } else if (item == 12) {          // 表示该网络应具有访问Internet的能力,该能力由网络提供者设置          console.log(JSON.stringify("NET_CAPABILITY_INTERNET"));        } else if (item == 15) {          // 表示网络不使用VPN(Virtual Private Network,虚拟专用网络)          console.log(JSON.stringify("NET_CAPABILITY_NOT_VPN"));        } else if (item == 16) {          // 表示该网络访问Internet的能力被网络管理成功验证,该能力由网络管理模块设置          console.log(JSON.stringify("NET_CAPABILITY_VALIDATED"));        }      }    })  }})// 获取netHandle对应网络的连接信息。连接信息包含了链路信息、路由信息等connection.getConnectionProperties(GlobalContext.getContext().netHandle).then((data: connection.ConnectionProperties) => {  console.info("getConnectionProperties get data: " + JSON.stringify(data));})// 调用getAllNets,获取所有处于连接状态的网络列表(Array<NetHandle>)connection.getAllNets().then((data: connection.NetHandle[]) => {  console.info("getAllNets get data: " + JSON.stringify(data));  if (data) {    GlobalContext.getContext().netList = data;    let itemNumber : Set<connection.NetHandle> = new Set(GlobalContext.getContext().netList);    let dataNumber = Array.from(itemNumber.values());    for (let item of dataNumber) {      // 循环获取网络列表每个netHandle对应网络的能力信息      connection.getNetCapabilities(item).then((data: connection.NetCapabilities) => {        console.info("getNetCapabilities get data: " + JSON.stringify(data));      })      // 循环获取网络列表每个netHandle对应的网络的连接信息      connection.getConnectionProperties(item).then((data: connection.ConnectionProperties) => {        console.info("getConnectionProperties get data: " + JSON.stringify(data));      })    }  }})

5、解析域名, 获取所有IP

一般情况下开发步骤如下:

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

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

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

// 引入包名import { connection } from '@kit.NetworkKit';import { BusinessError } from '@kit.BasicServicesKit';// 使用默认网络解析主机名以获取所有IP地址connection.getAddressesByName("xxxx").then((data: connection.NetAddress[]) => {  console.info("Succeeded to get data: " + JSON.stringify(data));});

one more thing..

网络连接管理API比较庞大,为了观看方便,我将所有API及其关系用类图整理如下,需要的朋友点开看大图。

图片

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2189103.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据库概述(1)

课程主页&#xff1a;Guoliang Li Tsinghua 数据库在计算机系统中的位置 首先&#xff0c;数据库是在设计有大量数据存储需求的软件时必不可少可的基础。 最常见的是&#xff1a;我们通过app或者是浏览器来实现一些特定需求——比如转账、订车票。即引出背后的CS和BS两种网…

如何用深度神经网络预测潜在消费者

1. 模型架构 本项目采用的是DeepFM模型&#xff0c;其结构结合了FM&#xff08;因子分解机&#xff09;与深度神经网络&#xff08;DNN&#xff09;&#xff0c;实现了低阶与高阶特征交互的有效建模。模型分为以下几层&#xff1a; 1.1 FM部分&#xff08;因子分解机层&#…

Epoch、Batch与Iteration简答理解

揭秘神经网络训练的三大神秘要素:Epoch、Batch与Iteration 在探索深度学习的奇妙世界时,你是否曾被Epoch、Batch和Iteration这三个术语搞得晕头转向?别担心,今天我们就来揭开它们的神秘面纱,带你深入了解神经网络训练的奥秘! 一、Epoch:时间的轮回,数据的洗礼 Epoch…

Python | Leetcode Python题解之第454题四数相加II

题目&#xff1a; 题解&#xff1a; class Solution:def fourSumCount(self, A: List[int], B: List[int], C: List[int], D: List[int]) -> int:countAB collections.Counter(u v for u in A for v in B)ans 0for u in C:for v in D:if -u - v in countAB:ans countAB…

《深度学习》OpenCV 图像拼接 原理、参数解析、案例实现

目录 一、图像拼接 1、直接看案例 图1与图2展示&#xff1a; 合并完结果&#xff1a; 2、什么是图像拼接 3、图像拼接步骤 1&#xff09;加载图像 2&#xff09;特征点检测与描述 3&#xff09;特征点匹配 4&#xff09;图像配准 5&#xff09;图像变换和拼接 6&am…

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-03

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-03 目录 文章目录 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-03目录1. A Scalable Data-Driven Framework for Systematic Analysis of SEC 10-K Filings Using Large Language Models摘要研…

centos72009源码编译R语言

./dev/make-distribution.sh --name custom-spark --pip --r --tgz -Pconnect -Psparkr -Phive -Phive-thriftserver -Pmesos -Pyarn -Dhadoop.version3.4.0 -Pkubernetes spark3.5.3 源码版本 ./dev/make-distribution.sh --name custom-spark --pip --r --tgz -Pconnect -P…

有符号整型和无符号整型比较大小,整型提升{9.28下午}

有符号整型和无符号整型比较大小时&#xff0c;会先把有符号整型先转变成无符号整型 -1的补码是32个1&#xff0c;当成无符号整型来处理时&#xff0c;补码就是源码&#xff0c;所以是一个超级大的数 在C语言中&#xff0c;当有符号整型&#xff08;如int&#xff09;和无符号…

MATLAB|电气互联系统有功-无功协同优化模型

目录 1 主要内容 模型示意图 目标函数 程序亮点 2 部分程序 3 程序结果 4 下载链接 1 主要内容 本程序基本复现《“碳中和”目标下电气互联系统有功-无功协同优化模型》&#xff0c;文献模型提供了一个很好的创新思路&#xff0c;把常规电气互联系统的调度和有功无功优化…

Jmeter中有关属性的获取的问题

Jmeter中有3个方法用来获取属性值&#xff1a; props.getProperty(propName), ${__property(propName)} ${__P(propName)} 试验了下&#xff0c;在JSR223 Sampler中使用以上3个方法获取属性值的情况 1. 返回结果如下&#xff1a; 这里看到&#xff0c;在jmeter属性列表里…

QT学习笔记3.2(建立项目、执行_打包、生成执行文件exe)

QT学习笔记3.2&#xff08;建立项目、执行_打包、生成执行文件exe) 目录 windeployqt打包过程中&#xff1a; enigma virtual box把所有文件打包成.exe文件 资料 mingw还没有编译成功过&#xff0c;这里说明使用msvc的过程。 使用msvc可以编译生成 1.生成执行文件、库文件…

【玩转 JS 函数式编程_006】2.2 小试牛刀:用函数式编程(FP)实现事件只触发一次

文章目录 2.2 该问题的函数式解 A functional solution to our problem1. 高阶函数解 A higher-order solution2. 高阶函数解的手动测试 Testing the solution manually3. 高阶函数解的自动测试 Testing the solution automatically4. 更好的解决方案 Producing an even better…

计算机毕业设计 基于Python的程序员薪资分析系统的设计与实现 Python+Django+Vue 前后端分离 附源码 讲解 文档

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

1000题-操作系统概述

特性微内核&#xff08;Microkernel&#xff09;宏内核&#xff08;Monolithic Kernel&#xff09;设计哲学精简内核&#xff0c;将非核心功能移至用户空间将所有核心功能集成到单一内核空间中功能集成仅包含最基本的操作系统功能&#xff08;如进程间通信、内存管理基础&#…

[Meachines] [Easy] Sea WonderCMS-XSS-RCE+System Monitor 命令注入

信息收集 IP AddressOpening Ports10.10.11.28TCP:22&#xff0c;80 $ nmap -p- 10.10.11.28 --min-rate 1000 -sC -sV PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.11 (Ubuntu Linux; protocol 2.0) | ssh-hostkey: | 3072 e3:54:…

SkyWalking监控SQL参数

前言 SkyWalking可以记录每个请求中执行的所有SQL&#xff0c;但是默认情况下&#xff0c;SkyWalking不记录SQL参数导致使用起来不是很方便&#xff0c;每次都得看日志才能知道具体的参数。不过SkyWalking提供了一个配置参数&#xff0c;开启后&#xff0c;便可记录SQL执行的参…

【AI学习】Mamba学习(一):总体架构

论文&#xff1a;《Mamba: Linear-Time Sequence Modeling with Selective State Spaces》 作者1&#xff1a;Albert Gu&#xff0c;现在是CMU(卡内基梅隆大学)助理教授&#xff0c;曾在DeepMind 工作。多年来一直推动SSM架构发展。 作者2&#xff1a;Tri Dao&#xff0c;现为…

青少年科普教学系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;基础数据管理&#xff0c;作品信息管理&#xff0c;通知公告管理&#xff0c;视频信息管理&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;视频信息&…

免费神器!PDF 秒变图片在线转换软件大揭秘

现在电子设备使用的频繁&#xff0c;会收到各种不同格式的文件&#xff0c;为了统一或者使用方便转寒格式就成为了我们日常的需求。今天我们来探讨PDF和图片之间的转换需求&#xff0c;探索pdf转图片在线转换免费工具有哪些。 1.福昕PDF转换大师 链接直通&#xff1a;https:/…

RabbitMQ(死信队列)

一、本文抒写背景 前面我也在延迟队列篇章提到过死信队列&#xff0c;也提到过一些应用场景&#xff01; 今天呢&#xff0c;这篇文章&#xff0c;主要就是实战一个业务场景的小Demo流程&#xff0c;哈哈&#xff0c;那就是延迟关闭订单。 二、开始啦&#xff01;letgo! 首…