HarmonyOS 实时监听与获取 Wi-Fi 信息

文章目录

摘要

本文展示了如何使用 HarmonyOS 框架开发一个 Demo,用于监听手机的 Wi-Fi 状态变化并实时获取连接的 Wi-Fi 信息。通过订阅 Wi-Fi 状态事件,我们实现了 Wi-Fi 状态的动态监听,并在状态变化时调用方法刷新 Wi-Fi 详情。

项目功能概述

本 Demo 主要实现以下功能:

  1. Wi-Fi 状态监听:实时监测 Wi-Fi 连接状态的变化(如连接中、已连接、断开连接等)。
  2. Wi-Fi 信息获取:动态获取当前连接 Wi-Fi 的 SSID 和 MAC 地址。
  3. 事件驱动回调:通过事件订阅机制,在 Wi-Fi 状态变化时触发回调并更新 UI。

代码模块详细说明

创建 Wi-Fi 状态保存对象

CommonEventBean 是一个简单的类,用于保存 Wi-Fi 的当前状态以及订阅者对象。

typescript 复制代码
export class CommonEventBean {
  /**
   * Wi-Fi 当前状态的描述。
   */
  state: string = '初始化状态';

  /**
   * 保存事件订阅者对象。
   */
  subscriber: any = null;
}

Wi-Fi 状态监听模块

通过 CommonEventManager.createSubscriber 创建订阅者,监听 Wi-Fi 状态的变化事件。

核心功能包括:

  1. 根据状态变化更新 CommonEventBeanstate 属性。
  2. 当状态为"已连接"时,触发后续 Wi-Fi 信息获取方法。

代码实现如下:

typescript 复制代码
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 信息。

主要功能包括:

  1. 检测 Wi-Fi 是否已激活。
  2. 获取 Wi-Fi 的 SSIDMAC 地址并进行格式化处理。

代码如下:

typescript 复制代码
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 状态监听和信息获取功能整合到主程序中:

typescript 复制代码
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 连接中):

text 复制代码
状态: Wi-Fi 连接中

示例输出 2(Wi-Fi 已连接):

text 复制代码
状态: Wi-Fi 已连接  
当前连接的 Wi-Fi SSID: MyHomeWiFi  
Wi-Fi MAC 地址: 00:1A:2B:3C:4D:5E  

示例输出 3(Wi-Fi 已断开):

text 复制代码
状态: Wi-Fi 已断开  

性能分析

  • 时间复杂度

    • Wi-Fi 状态监听:实时事件触发,复杂度为 (O(1))。
    • Wi-Fi 信息获取:getLinkedInfo 为同步操作,复杂度为 (O(1))。
  • 空间复杂度

    • 使用少量对象和事件订阅,复杂度为 (O(1))。

总结

通过本文的代码实现,开发者可以:

  1. 动态监听 Wi-Fi 的连接状态并实时更新。
  2. 获取当前连接的 Wi-Fi 信息,为应用提供更智能的网络交互功能。

此 Demo 结构清晰,模块化设计方便扩展,适用于需要实时监控网络状态的场景。

相关推荐
世人万千丶8 小时前
鸿蒙日志体系高级应用:HiLog分级输出/隐私脱敏/远程日志采集/线上问题精准溯源方案
学习·harmonyos·鸿蒙
程序员黑豆14 小时前
鸿蒙应用开发:AttributeModifier 使用教程
前端·harmonyos
HarmonyOS_SDK15 小时前
基于人体骨骼点识别与跟踪,实现低时延体感游戏
harmonyos
世人万千丶16 小时前
鸿蒙Crash高级捕获与异常监控:全局异常兜底/崩溃栈解析/符号表还原/智能聚类/闭环修复
学习·机器学习·华为·数据挖掘·harmonyos·鸿蒙·聚类
云端漫步198717 小时前
HarmonyOS NEXT AI 智能生活助手:创建企业级 AI 工程与目录结构
人工智能·生活·harmonyos
程序员黑豆20 小时前
鸿蒙应用开发 @Extend 装饰器使用教程
前端·harmonyos
超爱西西鸭21 小时前
鸿蒙大型项目高级模块化拆分:高内聚低耦合架构设计/HSP动态交付/接口契约/依赖倒置落地规范
学习·华为·harmonyos·鸿蒙
云端漫步198721 小时前
HarmonyOS NEXT AI 智能生活助手:PromptManager 设计与实现
人工智能·生活·harmonyos
yuanlaile1 天前
Flutter 开发鸿蒙 App 踩坑总结,一套完整实战学习方案分享
flutter·harmonyos·flutter开发鸿蒙·flutter开发鸿蒙实战·flutter ai实战·鸿蒙 ai实战