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. 根据状态变化更新 CommonEventBean 的 state 属性。
  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 的 SSID 和 MAC 地址并进行格式化处理。

代码如下:

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

相关推荐
懿路向前1 小时前
HarmonyOS 粒子特效实战:马赛克切块提速 17.6×~38×:desiredRegion 重复读盘与一次解码管线(HarmonyOS)
华为·harmonyos
天府云创3 小时前
Agentic开发时代到来——鸿蒙PC三大原生开发工具公测
华为·操作系统·harmonyos·鸿蒙系统·cli·deveco·agentic
程序猿追3 小时前
Fleks 鸿蒙适配:从八个小球看实体和组件的变化
华为·harmonyos
Sunny_GMF3 小时前
Markdown 导出 HTML 实战:2.6MB 编辑器快照如何瘦身 71%(DOM 净化 + CSSOM 运行时裁剪)
编辑器·html·ai编程·harmonyos
m0_738185823 小时前
Flutter 鸿蒙化实战:the_apple_sign_in 适配 OpenHarmony,Apple 登录
flutter·华为·harmonyos·鸿蒙
神奇的代码在哪里3 小时前
原生鸿蒙 GBC 模拟器开发实录:用 Anime4K 把 160×144 画面实时放大到 1080P
harmonyos·鸿蒙·超分辨率·gbc模拟器·anime4k
m0_738185824 小时前
Flutter 鸿蒙化实战:umeng_analytics_plugin 适配 OpenHarmony,友盟统计
flutter·华为·harmonyos·鸿蒙
todoitbo4 小时前
把 XAMPP 搬到鸿蒙 PC:在鸿蒙 PC 上跑 Apache httpd 2.4.69实战项目
华为·apache·harmonyos·鸿蒙·开源鸿蒙·鸿蒙pc
JoyCong19984 小时前
即插即用,组合键可用:ToDesk 4820版本强化鸿蒙远控键鼠能力
华为·智能手机·harmonyos·远程工作·ipad
程序猿追4 小时前
漏字、换词序、空查询:用 FuzzyKot 做一次鸿蒙搜索交互排查
华为·交互·harmonyos