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

相关推荐
SoraLuna5 小时前
「Mac畅玩鸿蒙与硬件46」UI互动应用篇23 - 自定义天气预报组件
开发语言·算法·macos·ui·华为·harmonyos
SuperHeroWu75 小时前
【HarmonyOS】HarmonyOS 和 Flutter混合开发 (一)之鸿蒙Flutter环境安装
flutter·华为·jdk·harmonyos·鸿蒙·环境安装·混合开发
特立独行的猫a5 小时前
HarmonyOS ArkTS中视频播放Video组件实现竖屏到横屏切换
华为·音视频·harmonyos
青瓷看世界6 小时前
华为HarmonyOS帮助应用实现在线认证服务 -- 2 FIDO免密身份认证
华为·harmonyos·在线认证
GY-937 小时前
Harmonyos多线程之Worker基本使用
harmonyos
Freerain997 小时前
鸿蒙Next页面和自定义组件生命周期
华为·harmonyos
枫叶丹49 小时前
【HarmonyOS之旅】HarmonyOS开发基础知识(一)
华为od·华为·华为云·harmonyos
play_big_knife1 天前
鸿蒙项目云捐助第四讲鸿蒙App应用的登陆注册页实现
华为·华为云·harmonyos·鸿蒙·云开发·鸿蒙开发·鸿蒙next
AI鸿蒙1 天前
鸿蒙Next之har工程依赖库接口二次导出
前端·harmonyos