文章目录
- 摘要
- 项目功能概述
- 代码模块详细说明
- 创建 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 结构清晰,模块化设计方便扩展,适用于需要实时监控网络状态的场景。