HarmonyOS 实时监听与获取 Wi-Fi 信息
文章目录
- 摘要
- 项目功能概述
- 代码模块详细说明
- 创建 Wi-Fi 状态保存对象
- Wi-Fi 状态监听模块
- 获取当前 Wi-Fi 信息
- 整合主模块
- 运行效果展示
- 性能分析
- 总结
摘要
本文展示了如何使用 HarmonyOS 框架开发一个 Demo,用于监听手机的 Wi-Fi 状态变化并实时获取连接的 Wi-Fi 信息。通过订阅 Wi-Fi 状态事件,我们实现了 Wi-Fi 状态的动态监听,并在状态变化时调用方法刷新 Wi-Fi 详情。
项目功能概述
本 Demo 主要实现以下功能:
- Wi-Fi 状态监听:实时监测 Wi-Fi 连接状态的变化(如连接中、已连接、断开连接等)。
- Wi-Fi 信息获取:动态获取当前连接 Wi-Fi 的 SSID 和 MAC 地址。
- 事件驱动回调:通过事件订阅机制,在 Wi-Fi 状态变化时触发回调并更新 UI。
代码模块详细说明
创建 Wi-Fi 状态保存对象
CommonEventBean
是一个简单的类,用于保存 Wi-Fi 的当前状态以及订阅者对象。
export class CommonEventBean {/*** Wi-Fi 当前状态的描述。*/state: string = '初始化状态';/*** 保存事件订阅者对象。*/subscriber: any = null;
}
Wi-Fi 状态监听模块
通过 CommonEventManager.createSubscriber
创建订阅者,监听 Wi-Fi 状态的变化事件。
核心功能包括:
- 根据状态变化更新
CommonEventBean
的state
属性。 - 当状态为“已连接”时,触发后续 Wi-Fi 信息获取方法。
代码实现如下:
export class WifiStatusListener {subscribe(commonEventItem: CommonEventBean, callback: Function): void {const subscribeInfo = { events: ['CommonConstants.CONN_STATE'] };let toastMsg: string;CommonEventManager.createSubscriber(subscribeInfo, (err, subscriber) => {if (err || subscriber === null) {toastMsg = '创建订阅失败';callback(commonEventItem, toastMsg);return;}commonEventItem.subscriber = subscriber;CommonEventManager.subscribe(subscriber, (err, data) => {if (err) {toastMsg = '订阅失败';callback(commonEventItem, toastMsg);return;}const connState = data?.data;if (connState) {switch (connState) {case 'connecting':commonEventItem.state = 'Wi-Fi 连接中';break;case 'connected':commonEventItem.state = 'Wi-Fi 已连接';break;case 'disconnected':commonEventItem.state = 'Wi-Fi 已断开';break;default:commonEventItem.state = '未知状态';}}callback(commonEventItem);});toastMsg = '订阅成功';callback(commonEventItem, toastMsg);});}unsubscribe(commonEventItem: CommonEventBean, callback: Function): void {if (commonEventItem.subscriber) {CommonEventManager.unsubscribe(commonEventItem.subscriber, () => {callback('已成功退订');});}}
}
获取当前 Wi-Fi 信息
该模块通过 wifiManager
获取设备当前连接的 Wi-Fi 信息。
主要功能包括:
- 检测 Wi-Fi 是否已激活。
- 获取 Wi-Fi 的
SSID
和MAC
地址并进行格式化处理。
代码如下:
export class WifiInfoHandler {wifiViewUpdates(): void {try {const isWifiActive: boolean = wifiManager.isWifiActive();if (isWifiActive) {this.showLinkedInfo();} else {console.info('Wi-Fi 未激活');}} catch (error) {console.error(`Wi-Fi 状态检查失败,错误码: ${(error as BusinessError).code}`);}}showLinkedInfo(): void {wifiManager.getLinkedInfo().then((linkedInfo) => {const ssid = linkedInfo.ssid.replace(/^"|"$/g, '');const bssid = linkedInfo.macAddress;console.info(`当前连接的 Wi-Fi SSID: ${ssid}`);console.info(`Wi-Fi MAC 地址: ${bssid}`);}).catch((err) => {console.error(`获取 Wi-Fi 信息失败: ${err}`);});}
}
整合主模块
将 Wi-Fi 状态监听和信息获取功能整合到主程序中:
const commonEventBean = new CommonEventBean();
const wifiListener = new WifiStatusListener();
const wifiHandler = new WifiInfoHandler();wifiListener.subscribe(commonEventBean, (event, msg) => {console.info(`状态: ${event.state}`);if (msg) {console.info(`消息: ${msg}`);}if (event.state === 'Wi-Fi 已连接') {wifiHandler.wifiViewUpdates();}
});
运行效果展示
示例输出 1(Wi-Fi 连接中):
状态: Wi-Fi 连接中
示例输出 2(Wi-Fi 已连接):
状态: Wi-Fi 已连接
当前连接的 Wi-Fi SSID: MyHomeWiFi
Wi-Fi MAC 地址: 00:1A:2B:3C:4D:5E
示例输出 3(Wi-Fi 已断开):
状态: Wi-Fi 已断开
性能分析
-
时间复杂度:
- Wi-Fi 状态监听:实时事件触发,复杂度为 (O(1))。
- Wi-Fi 信息获取:
getLinkedInfo
为同步操作,复杂度为 (O(1))。
-
空间复杂度:
- 使用少量对象和事件订阅,复杂度为 (O(1))。
总结
通过本文的代码实现,开发者可以:
- 动态监听 Wi-Fi 的连接状态并实时更新。
- 获取当前连接的 Wi-Fi 信息,为应用提供更智能的网络交互功能。
此 Demo 结构清晰,模块化设计方便扩展,适用于需要实时监控网络状态的场景。
相关文章:

HarmonyOS 实时监听与获取 Wi-Fi 信息
文章目录 摘要项目功能概述代码模块详细说明创建 Wi-Fi 状态保存对象Wi-Fi 状态监听模块获取当前 Wi-Fi 信息整合主模块 运行效果展示性能分析总结 摘要 本文展示了如何使用 HarmonyOS 框架开发一个 Demo,用于监听手机的 Wi-Fi 状态变化并实时获取连接的 Wi-Fi 信息…...

Unity超优质动态天气插件(含一年四季各种天气变化,可用于单机局域网VR)
效果展示:https://www.bilibili.com/video/BV1CkkcYHENf/?spm_id_from333.1387.homepage.video_card.click 在你的项目中设置enviro真的很容易!导入包裹并按照以下步骤操作开始的步骤! 1. 拖拽“EnviroSky”预制件(“environme…...

1 JVM JDK JRE之间的区别以及使用字节码的好处
JDK jdk是编译java源文件成class文件的,我们使用javac命令把java源文件编译成class文件。 我们在java安装的目录下找到bin文件夹,如下图所示: 遵循着编译原理,把java源文件编译成JVM可识别的机器码。 其中还包括jar打包工具等。主要是针对…...

【网络安全】网站常见安全漏洞—服务端漏洞介绍
文章目录 网站常见安全漏洞—服务端漏洞介绍引言1. 第三方组件漏洞什么是第三方组件漏洞?如何防范? 2. SQL 注入什么是SQL注入?如何防范? 3. 命令执行漏洞什么是命令执行漏洞?如何防范? 4. 越权漏洞什么是越…...

MAPTR:在线矢量化高精地图构建的结构化建模与学习(2208)
MAPTR: STRUCTURED MODELING AND LEARNING FOR ONLINE VECTORIZED HD MAP CONSTRUCTION MAPTR:在线矢量化高精地图构建的结构化建模与学习 ABSTRACT High-definition (HD) map provides abundant and precise environmental information of the driving scene, se…...

基于容器的云原生,让业务更自由地翱翔云端
无论是要构建一个应用或开发一个更庞大的解决方案,在技术选型时,技术的开放性和可移植性已经成为很多企业优先考虑的问题之一。毕竟没人希望自己未来的发展方向和成长速度被自己若干年前选择使用的某项技术所限制或拖累。 那么当你的业务已经上云&#x…...

大屏开源项目go-view二次开发2----半环形控件(C#)
环境搭建参考: 大屏开源项目go-view二次开发1----环境搭建(C#)-CSDN博客 要做的半环形控件最终效果如下图: 步骤如下: 1 在go-view前端项目的\src\packages\components\Charts目录下新增Others目录,并在Others目录下新增PieExt…...

web:pc端企业微信登录-vue版
官方文档:developer.work.weixin.qq.com/document/pa… 不需要调用ww.register,直接调用ww.createWWLoginPanel即可创建企业微信登录面板 - 文档 - 企业微信开发者中心 (qq.com) 引入 //通过 npm 引入 npm install wecom/jssdk import * as ww from we…...

OpenGL ES 01 渲染一个四边形
项目架构 着色器封装 vertex #version 300 es // 接收顶点数据 layout (location 0) in vec3 aPos; // 位置变量的属性位置值为0 layout (location 1) in vec4 aColors; // 位置变量的属性位置值为1 out vec4 vertexColor; // 为片段着色器指定一个颜色输出void main() {gl…...
【ETCD】【源码阅读】深入解析 EtcdServer.applyEntries方法
applyEntries方法的主要作用是接收待应用的 Raft 日志条目,并按顺序将其应用到系统中;确保条目的索引连续,避免丢失或重复应用条目。 一、函数完整代码 func (s *EtcdServer) applyEntries(ep *etcdProgress, apply *apply) {if len(apply.…...

概率论得学习和整理28:用EXCEL画折线图,X轴数据也被当成曲线的解决办法
目录 1 折线图和散点图,对数据的处理差别 1.1 EXCEL画图的一些默认设置 1.2 多于2列的数据,也是如此 2 如果我们非要以第1列数据为X轴,做一个折线图呢?也能 2.1 首先,把第1列,想当成X轴的数据…...

tryhackme-Pre Security-Defensive Security Intro(防御安全简介)
任务一:Introduction to Defensive Security防御安全简介 此room的两个要点: Preventing intrusions from occurring 防止入侵发生Detecting intrusions when they occur and responding properly 检测发生的入侵并正确响应 防御安全还有更多内容。 除上…...
27. 元类
一、什么是元类 在 Python 中,一切皆为对象,即类也是一个对象。type 是内置的元类。我们用 class 关键字定义的所有的类以及内置的类都是由元类 type(内置的元类) 实例化产生的。 class Person:def __init__(self, name, age):se…...

PHP木马编写
一、最简单的一句话木马 <?php eval($_REQUEST[cmd]); ?> 1. <?php 和 ?> <?php 和 ?> 是 PHP 代码的开始和结束标记,表示 PHP 代码块的范围。 2. eval() eval() 是 PHP 中的一个内建函数,用来执行字符串类型的 PHP 代码。…...

游戏AI实现-寻路算法(Dijkstra)
戴克斯特拉算法(英语:Dijkstras algorithm),又称迪杰斯特拉算法、Dijkstra算法,是由荷兰计算机科学家艾兹赫尔戴克斯特拉在1956年发现的算法。 算法过程: 1.首先设置开始节点的成本值为0,并将…...

Android OpenGLES2.0开发(九):图片滤镜
“当你改变想法的时候,记得也要改变你的世界。”——诺曼文森特皮尔 Android OpenGLES开发:EGL环境搭建Android OpenGLES2.0开发(一):艰难的开始Android OpenGLES2.0开发(二):环境搭…...
SQLite Update 语句
SQLite Update 语句 SQLite 的 UPDATE 语句用于更新数据库表中的现有记录。使用 UPDATE 语句,您可以修改一个或多个列的值。本教程将详细介绍如何使用 SQLite UPDATE 语句,包括语法、示例以及一些最佳实践。 语法 SQLite UPDATE 语句的基本语法如下&a…...

Metaploit-永恒之蓝漏洞利用
1:Metaploit介绍 本次测试主要是利用永恒之蓝漏洞对windows7进行控制利用,掌握Metaploit工具的使用,知道永恒之蓝的漏洞利用原理。永恒之蓝是在Windows的SMB服务处理SMB v1请求时发生的漏洞,这个漏洞导致攻击者在目标系统上可…...

机器学习预处理-表格数据的空值处理
机器学习预处理-表格数据的空值处理 机器学习预处理-表格数据的分析与可视化中详细介绍了表格数据的python可视化,可视化能够帮助我们了解数据的构成和分布,是我们进行机器学习的必备步骤。上文中也提及,原始的数据存在部分的缺失࿰…...
数据结构_平衡二叉树
结点类 构造函数分为有参和无参,相同点都是初始化树高为1 class Node { public:int data; // 用于输出int val; // 数据域,用于排序int height; // 树高Node* left;Node* right;Node();Node(int v, int d);static int max(int a, int b); };Node::N…...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...
数据链路层的主要功能是什么
数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...

Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...

GitFlow 工作模式(详解)
今天再学项目的过程中遇到使用gitflow模式管理代码,因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存,无论是github还是gittee,都是一种基于git去保存代码的形式,这样保存代码…...

springboot 日志类切面,接口成功记录日志,失败不记录
springboot 日志类切面,接口成功记录日志,失败不记录 自定义一个注解方法 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;/***…...
git: early EOF
macOS报错: Initialized empty Git repository in /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/.git/ remote: Enumerating objects: 2691797, done. remote: Counting objects: 100% (1760/1760), done. remote: Compressing objects: 100% (636/636…...