摘要
本文展示了如何使用 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 结构清晰,模块化设计方便扩展,适用于需要实时监控网络状态的场景。