鸿蒙开发(NEXT/API 12)【网络连接管理】 网络篇
简介
网络连接管理提供管理网络一些基础能力,包括WiFi/蜂窝/Ethernet等多网络连接优先级管理、网络质量评估、订阅默认/指定网络连接状态变化、查询网络连接信息、DNS解析等功能。
说明
为了保证应用的运行效率,大部分API调用都是异步的,对于异步调用的API均提供了callback和Promise两种方式,以下示例均采用promise函数。
基本概念
- 网络生产者:数据网络的提供方,比如WiFi、蜂窝、Ethernet等。
- 网络消费者:数据网络的使用方,比如应用或系统服务。
- 网络探测:检测网络有效性,避免将网络从可用网络切换到不可用网络。内容包括绑定网络探测、DNS探测、HTTP探测及HTTPS探测。
- 网络优选:处理多网络共存时选择最优网络。在网络状态、网络信息及评分发生变化时被触发。
约束
- 开发语言:JS
- 本模块首批接口从API version 8开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。
场景介绍
网络连接管理的典型场景有:
- 接收指定网络的状态变化通知
- 获取所有注册的网络
- 根据数据网络查询网络的连接信息
- 使用对应网络解析域名,获取所有IP
以下分别介绍具体开发方式。
接口说明
| 接口名 | 描述 |
|---|---|
| getDefaultNet(callback: AsyncCallback): void; | 获取一个含有默认网络的netId的NetHandle对象,使用callback回调 |
| getGlobalHttpProxy(callback: AsyncCallback): void; | 获取网络的全局代理设置,使用callback回调 |
| setGlobalHttpProxy(httpProxy: HttpProxy, callback: AsyncCallback): void; | 设置网络全局Http代理配置信息,使用callback回调 |
| setAppHttpProxy(httpProxy: HttpProxy): void; | 设置网络应用级Http代理配置信息 |
| getAppNet(callback: AsyncCallback): void; | 获取一个App绑定的包含了网络netId的NetHandle对象,使用callback回调 |
| setAppNet(netHandle: NetHandle, callback: AsyncCallback): void; | 绑定App到指定网络,绑定后的App只能通过指定网络访问外网。使用callback回调 |
| getDefaultNetSync(): NetHandle; | 使用同步方法获取默认激活的数据网络。可以使用getNetCapabilities去获取网络的类型、拥有的能力等信息。 |
| hasDefaultNet(callback: AsyncCallback): void; | 检查默认数据网络是否被激活,使用callback回调 |
| getAllNets(callback: AsyncCallback<Array>): void; | 获取所处于连接状态的网络的NetHandle对象列表,使用callback回调 |
| getConnectionProperties(netHandle: NetHandle, callback: AsyncCallback): void; | 查询netHandle对应的网络的连接信息,使用callback回调 |
| getNetCapabilities(netHandle: NetHandle, callback: AsyncCallback): void; | 获取netHandle对应的网络的能力信息,使用callback回调 |
| isDefaultNetMetered(callback: AsyncCallback): void; | 检查当前网络上的数据流量使用是否被计量,使用callback方式作为异步方法 |
| reportNetConnected(netHandle: NetHandle, callback: AsyncCallback): void; | 向网络管理报告网络处于可用状态,调用此接口说明应用程序认为网络的可用性(ohos.net.connection.NetCap.NET_CAPABILITY_VAILDATED)与网络管理不一致。使用callback回调 |
| reportNetDisconnected(netHandle: NetHandle, callback: AsyncCallback): void; | 向网络管理报告网络处于不可用状态,调用此接口说明应用程序认为网络的可用性(ohos.net.connection.NetCap.NET_CAPABILITY_VAILDATED)与网络管理不一致。使用callback回调 |
| getAddressesByName(host: string, callback: AsyncCallback<Array>): void; | 使用对应网络解析域名,获取所有IP,使用callback回调 |
| enableAirplaneMode(callback: AsyncCallback): void; | 设置网络为飞行模式,使用callback回调 |
| disableAirplaneMode(callback: AsyncCallback): void; | 关闭网络飞行模式,使用callback回调 |
| createNetConnection(netSpecifier?: NetSpecifier, timeout?: number): NetConnection; | 返回一个NetConnection对象,netSpecifier指定关注的网络的各项特征,timeout是超时时间(单位是毫秒),netSpecifier是timeout的必要条件,两者都没有则表示关注默认网络 |
| bindSocket(socketParam: TCPSocket | UDPSocket, callback: AsyncCallback): void; |
| getAddressesByName(host: string, callback: AsyncCallback<Array>): void; | 使用对应网络解析域名,获取所有IP,使用callback回调 |
| getAddressByName(host: string, callback: AsyncCallback): void; | 使用对应网络解析域名,获取一个IP,调用callbac |
| on(type: ‘netAvailable’, callback: Callback): void; | 订阅网络可用事件 |
| on(type: ‘netCapabilitiesChange’, callback: Callback): void; | 订阅网络能力变化事件 |
| on(type: ‘netConnectionPropertiesChange’, callback: Callback<{ netHandle: NetHandle, connectionProperties: ConnectionProperties }>): void; | 订阅网络连接信息变化事件 |
| on(type: ‘netBlockStatusChange’, callback: Callback<{ netHandle: NetHandle, blocked: boolean }>): void; | 订阅网络阻塞状态事件,使用callback方式作为异步方法 |
| on(type: ‘netLost’, callback: Callback): void; | 订阅网络丢失事件 |
| on(type: ‘netUnavailable’, callback: Callback): void; | 订阅网络不可用事件 |
| register(callback: AsyncCallback): void; | 订阅指定网络状态变化的通知 |
| unregister(callback: AsyncCallback): void; | 取消订阅默认网络状态变化的通知 |
接收指定网络的状态变化通知
-
声明接口调用所需要的权限:ohos.permission.GET_NETWORK_INFO。
此权限级别为normal,在申请权限前,请保证符合[权限使用的基本原则]
-
从@kit.NetworkKit中导入connection命名空间。
-
调用createNetConnection方法,指定网络能力、网络类型和超时时间(可选,如不传入代表默认网络;创建不同于默认网络时可通过指定这些参数完成),创建一个NetConnection对象。
-
调用该对象的on()方法,传入type和callback,订阅关心的事件。
-
调用该对象的register()方法,订阅指定网络状态变化的通知。
-
当网络可用时,会收到netAvailable事件的回调;当网络不可用时,会收到netUnavailable事件的回调。
-
当不使用该网络时,可以调用该对象的unregister()方法,取消订阅。
// 引入包名
import { connection } from '@kit.NetworkKit';
import { BusinessError } from '@kit.BasicServicesKit';let netSpecifier: connection.NetSpecifier = {netCapabilities: {// 假设当前默认网络是WiFi,需要创建蜂窝网络连接,可指定网络类型为蜂窝网bearerTypes: [connection.NetBearType.BEARER_CELLULAR],// 指定网络能力为InternetnetworkCap: [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) => {
});
获取所有注册的网络
-
声明接口调用所需要的权限:ohos.permission.GET_NETWORK_INFO。
此权限级别为normal,在申请权限前,请保证符合[权限使用的基本原则]
-
从@kit.NetworkKit中导入connection命名空间。
-
调用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;}
});
根据数据网络查询网络的能力信息及连接信息
-
声明接口调用所需要的权限:ohos.permission.GET_NETWORK_INFO。
此权限级别为normal,在申请权限前,请保证符合[权限使用的基本原则]
-
从@kit.NetworkKit中导入connection命名空间。
-
通过调用getDefaultNet方法,获取默认的数据网络(NetHandle);或者通过调用getAllNets方法,获取所有处于连接状态的网络列表(Array)。
-
调用getNetCapabilities方法,获取NetHandle对应网络的能力信息。能力信息包含了网络类型(蜂窝网络、Wi-Fi网络、以太网网络等)、网络具体能力等网络信息。
-
调用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));})}}
})
使用对应网络解析域名,获取所有IP
-
声明接口调用所需要的权限:ohos.permission.INTERNET
此权限级别为normal,在申请权限前,请保证符合[权限使用的基本原则]
-
从@kit.NetworkKit中导入connection命名空间。
-
调用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));
});
最后呢
很多开发朋友不知道需要学习那些鸿蒙技术?鸿蒙开发岗位需要掌握那些核心技术点?为此鸿蒙的开发学习必须要系统性的进行。
而网上有关鸿蒙的开发资料非常的少,假如你想学好鸿蒙的应用开发与系统底层开发。你可以参考这份资料,少走很多弯路,节省没必要的麻烦。由两位前阿里高级研发工程师联合打造的《鸿蒙NEXT星河版OpenHarmony开发文档》里面内容包含了(ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、Harmony南向开发、鸿蒙项目实战等等)鸿蒙(Harmony NEXT)技术知识点
如果你是一名Android、Java、前端等等开发人员,想要转入鸿蒙方向发展。可以直接领取这份资料辅助你的学习。下面是鸿蒙开发的学习路线图。

针对鸿蒙成长路线打造的鸿蒙学习文档。话不多说,我们直接看详细鸿蒙(OpenHarmony )手册(共计1236页)与鸿蒙(OpenHarmony )开发入门视频,帮助大家在技术的道路上更进一步。
- 《鸿蒙 (OpenHarmony)开发学习视频》
- 《鸿蒙生态应用开发V2.0白皮书》
- 《鸿蒙 (OpenHarmony)开发基础到实战手册》
- OpenHarmony北向、南向开发环境搭建
- 《鸿蒙开发基础》
- 《鸿蒙开发进阶》
- 《鸿蒙开发实战》

总结
鸿蒙—作为国家主力推送的国产操作系统。部分的高校已经取消了安卓课程,从而开设鸿蒙课程;企业纷纷跟进启动了鸿蒙研发。
并且鸿蒙是完全具备无与伦比的机遇和潜力的;预计到年底将有 5,000 款的应用完成原生鸿蒙开发,未来将会支持 50 万款的应用。那么这么多的应用需要开发,也就意味着需要有更多的鸿蒙人才。鸿蒙开发工程师也将会迎来爆发式的增长,学习鸿蒙势在必行! 自↓↓↓拿

相关文章:
鸿蒙开发(NEXT/API 12)【网络连接管理】 网络篇
简介 网络连接管理提供管理网络一些基础能力,包括WiFi/蜂窝/Ethernet等多网络连接优先级管理、网络质量评估、订阅默认/指定网络连接状态变化、查询网络连接信息、DNS解析等功能。 说明 为了保证应用的运行效率,大部分API调用都是异步的,对…...
VMware Fusion虚拟机Mac版 安装Ubuntu操作系统教程
Mac分享吧 文章目录 下载镜像地址:[www.macfxb.cn](http://www.macfxb.cn)一、CentOS安装完成,软件打开效果二、Mac中安装Ubuntu虚拟机1️⃣:下载镜像2️⃣:创建虚拟机3️⃣:虚拟机设置4️⃣:虚拟机安装5️…...
基于SpringBoot+Vue+MySQL的房屋租赁管理系统
系统展示 用户前台界面 管理员后台界面 系统背景 二十一世纪互联网的出现,改变了几千年以来人们的生活,不仅仅是生活物资的丰富,还有精神层次的丰富。在互联网诞生之前,地域位置往往是人们思想上不可跨域的鸿沟,信息的…...
虚拟机器配置固定IP地址
新安装的虚拟机,如何配置固定的ip地址,废话少说直接上干货 第一步:在VMarea中 选中你要固定IP的虚拟机器,点击上面的“编辑”按钮,然后找到“虚拟网络编辑器”,选中你要修改的ip VMnet8,然后是…...
用python实现基于形态学的方法,如开运算和闭运算,来去除pcd格式激光点云中的植被
在Python中,你可以使用open3d库来读取和处理pcd格式的点云数据。下面是一个示例代码,展示如何使用形态学操作来去除植被。 首先,确保你已经安装了open3d库,可以使用以下命令进行安装: pip install open3d接下来&…...
QT 绘制简易时钟
原文件 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);this->startTimer(1000); }Widget::~Widget() {delete ui; }//时钟底座 void Widget::paintEvent(Q…...
为控制器的方法添加必要参数
前言:做这个系统时,要求每次调用接口时要传操作人、操作人电脑ip、菜单id,然后计入log。本来前端读取到然后加入请求头,后端写入log即可。但是老大要求后端也要把控必传参数,避免前端忘记。所以就写了这个。IOperation…...
(计算机网络)应用层
1.为什么需要应用层 应用层提供使用tcp,udp使用的方式 协议就是制定的规则 2.域名服务器概述 域名是唯一的 新增域名,大家都要修改这个文本文件,所以要进行集中管理这个文本文件,而不是使用本地的hosts文件 hosts文件在Windows系统…...
使用3DUNet训练自己的数据集(pytorch)— 医疗影像分割
代码:lee-zq/3DUNet-Pytorch: 3DUNet implemented with pytorch (github.com) 文章<cicek16miccai.pdf (uni-freiburg.de)3D U-Net: Learning Dense Volumetric Segmentation...
【python】—— Python爬虫实战:爬取珠海市2011-2023年天气数据并保存为CSV文件
目录 目标 准备工作 爬取数据的开始时间和结束时间 爬取数据并解析 将数据转换为DataFrame并保存为CSV文件 本文将介绍如何使用Python编写一个简单的爬虫程序,以爬取珠海市2011年至2023年的天气数据,并将这些数据保存为CSV文件。我们将涉及到以下知识点: 使用r…...
U盘文件及文件夹带锁修复
磁盘管理修复工具Disks磁盘管理–针对U盘文件及文件夹带锁修复 本文章只针对统信系统 文章目录 功能概述一、安装工具二、数据备份三、检查文件系统1. 通过启动栏中的“磁盘”或者桌面的“磁盘”启动文件来启动应用:2. 选择U盘设备3. 点击“检查文件系统”按钮(如果无此按钮…...
AnyChart 数据可视化框架
AnyChart 数据可视化框架 AnyChart 是一个灵活的 JavaScript(HTML5、SVG、VML)图表框架,适合任何需要数据可视化的解决方案。 目录 下载并安装开始插件将 AnyChart 与 TypeScript 结合使用将 AnyChart 与 ECMAScript 6 结合使用技术集成贡献…...
ARM base instruction -- br
BR Branch to Register branches unconditionally to an address in a register, with a hint that this is not a subroutine return. 无条件地分支到寄存器中的一个地址,并提示这不是子例程返回。 BR <Xn> BR 跳转到reg内容地址,不会将返回地址…...
编译原理/软件工程核心概念-问题理解
目录 1.程序的编译执行过程 2.指针和引用的区别 3.堆和栈的区别 4.最熟悉的编程语言- Python:介绍PyTorch和TensorFlow框架 5.C与C的区别 6.软件工程是什么? 7.简述瀑布模型 8.敏捷开发方法是什么?它与瀑布模型相比有哪些优势和劣势 1…...
学习pyqt5相关知识回顾
1. 模块 1.1 import导入 1) 模块:是一系列功能的集合体,模块名.功能名,就可以使用模块的功能 2) 首次导入模块,就会立即执行模块里面的内容 3) 当前名称空间会产生一个名字module,指向module.py产生的名称空间.我们可以使用module.name/函数名,来调用module.py里面的内容. …...
OPENAIGC开发者大赛高校组银奖 | LonAC中小学编程学习平台
在第二届拯救者杯OPENAIGC开发者大赛中,涌现出一批技术突出、创意卓越的作品。为了让这些优秀项目被更多人看到,我们特意开设了优秀作品报道专栏,旨在展示其独特之处和开发者的精彩故事。 无论您是技术专家还是爱好者,希望能带给您…...
oneclick 命令:快速筛选控制变量的利器
目录 1. 命令语法2. 结果输出3. 使用示例4. 总结 在进行回归分析时,选择合适的控制变量对于确保模型的稳健性至关重要。然而,手动筛选变量组合不仅费时费力,还容易出错。为此,Stata 中的 oneclick 命令提供了一个高效的解决方案&a…...
Kotlin 代替Java接口回调,就这么简单
假如你使用旧的接口回调: 通常三步:1 定义接口和方法;2 使用接口中方法;3 继承接口并实现方法; 例: class XXXAdapter{public var mClickCollBack: clickCollBack? null //1定义interface clickColl…...
Codeforces Round 971 (Div. 4)——C题题解
本题的大意是一个青蛙从原点开始跳格子(0,0),最终要跳到点(x,y)去,并且每一步的步长不能超过k,问最短几步可以跳到终点 分析: 本题利用贪心思想,肯定是先跳最大的步长这样总体用的步数最长 代码演示: #inc…...
【论文阅读笔记】Tackling the Generative Learning Trilemma with Denoising Diffusion GANs
【论文阅读笔记】Tackling the Generative Learning Trilemma with Denoising Diffusion GANs Introduction方法 使用传统GANS建模去噪分布理解模式覆盖率 Paper:https://arxiv.org/abs/2112.07804 Code:https://github.com/NVlabs/denoising-diffusion-…...
TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...
阿里云ACP云计算备考笔记 (5)——弹性伸缩
目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序
一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...
3-11单元格区域边界定位(End属性)学习笔记
返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...
优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...
Fabric V2.5 通用溯源系统——增加图片上传与下载功能
fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...
JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...
AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别
【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而,传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案,能够实现大范围覆盖并远程采集数据。尽管具备这些优势…...
