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 小时前
【鸿蒙开发】HMRouter一款和好用的管理路由三方工具
前端·harmonyos
chenyingjian9 小时前
鸿蒙|性能优化-渲染丢帧优化
harmonyos
ujainu11 小时前
在 HarmonyOS PC 上实现自定义窗口样式的 Electron 应用详解
华为·electron·harmonyos
ujainu11 小时前
Electron 极简时钟应用开发全解析:托盘驻留、精准北京时间与 HarmonyOS PC 适配实战
javascript·electron·harmonyos
盐焗西兰花11 小时前
鸿蒙学习实战之路-Share Kit系列(10/17)-目标应用接收分享(应用内处理)
学习·华为·harmonyos
大雷神13 小时前
HarmonyOS APP<玩转React>开源教程八:主题系统实现
react.js·开源·harmonyos
fei_sun13 小时前
【鸿蒙智能硬件】(六)使用鸿蒙app展示环境监测数据
华为·harmonyos
懒洋洋在睡觉14 小时前
鸿蒙 6.0横屏显示时画面旋转错误
华为·图形渲染·harmonyos
键盘鼓手苏苏15 小时前
Flutter 组件 reaxdb_dart 适配鸿蒙 HarmonyOS 实战:响应式 NoSQL 数据库,构建高性能本地持久化与分布式状态同步架构
flutter·harmonyos·鸿蒙·openharmony·reaxdb_dart
亚历克斯神15 小时前
Flutter for OpenHarmony: Flutter 三方库 mongo_dart 助力鸿蒙应用直连 NoSQL 数据库构建高效的数据流转系统(纯 Dart 驱动方案)
android·数据库·flutter·华为·nosql·harmonyos