HarmonyOS 鸿蒙Next中WifiEapConfig实例

HarmonyOS 鸿蒙Next中WifiEapConfig实例 有没有wifiEapConfig的使用实例啊,想实现鸿蒙手机下,通过证书的方式连接wifi,实现wifi准入的功能。

4 回复

开发者您好,您可以参考添加候选网络连接候选网络的流程来实现wifiEapConfig的使用实例,相关代码实现如下:

try {
      let eapConfig: wifiManager.WifiEapConfig = {
        eapMethod: wifiManager.EapMethod.EAP_NONE,
        phase2Method: wifiManager.Phase2Method.PHASE2_NONE,
        identity: '',
        anonymousIdentity: '',
        password: '',
        caCertAlias: '',
        caPath: '',
        clientCertAlias: '',
        certEntry: new Uint8Array(),
        certPassword: '',
        altSubjectMatch: '',
        domainSuffixMatch: '',
        realm: '',
        plmn: '',
        eapSubId: 0
      }
      let config:wifiManager.WifiDeviceConfig = {
        ssid : "****",
        preSharedKey : "****",
        securityType : 5,
        eapConfig: eapConfig
      }
      // 添加候选网络
      wifiManager.addCandidateConfig(config).then(result => {
        console.info("result:" + JSON.stringify(result));
        // 连接候选网络
        try {
          wifiManager.connectToCandidateConfig(result);
        }catch(error){
          console.error("failed:" + JSON.stringify(error));
        }
      }).catch((err:number) => {
        console.error("failed:" + JSON.stringify(err));
      });
    }catch(error){
      console.error("failed:" + JSON.stringify(error));
    }

wifiEapConfig的参考配置可以参考这个文档:wifiEapConfig。开发者可以看下上诉的方案是否可以解决您的问题,如果仍未解决,请及时反馈一下问题详情。

更多关于HarmonyOS 鸿蒙Next中WifiEapConfig实例的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


试试这个例子,证书放:/certs,

准备证书配置

const certConfig = {
  caCertPath: 'ca_cert.pem',
  clientCertPath: 'client_cert.p12',
  clientCertPassword: '123456',
  identity: 'user001',
  anonymousIdentity: 'anonymous@company.com'
};

cke_31815.png

import wifiManager from '@ohos.wifiManager';
import { BusinessError } from '@ohos.base';
import fs from '@ohos.file.fs';
import common from '@ohos.app.ability.common';

interface EapCertConfig {
  caCertPath: string;
  clientCertPath: string;
  clientCertPassword: string;
  identity?: string;
  anonymousIdentity?: string;
}

interface WifiEapResult {
  success: boolean;
  networkId?: number;
  errorCode?: number;
  errorMessage?: string;
}

class WifiEapConnector {
  private context: common.UIAbilityContext;

  constructor() {
    this.context = getContext() as common.UIAbilityContext;
  }

  private getAppFilesDir(): string {
    return this.context.filesDir;
  }

  private async getCertDirectory(): Promise<string> {
    const certDir = `${this.getAppFilesDir()}/certs`;
    try {
      const stats = await fs.stat(certDir);
      if (!stats.isDirectory()) {
        await fs.mkdir(certDir);
      }
    } catch {
      await fs.mkdir(certDir);
    }
    return certDir;
  }

  async copyCertToAppDirectory(sourcePath: string, targetFileName: string): Promise<boolean> {
    try {
      const certDir = await this.getCertDirectory();
      const targetPath = `${certDir}/${targetFileName}`;
      await fs.copyFile(sourcePath, targetPath);
      console.info(`证书已复制到: ${targetPath}`);
      return true;
    } catch (error) {
      const err = error as BusinessError;
      console.error(`复制证书失败: ${err.code} - ${err.message}`);
      return false;
    }
  }

  async connectEapWifi(ssid: string, eapMethod: wifiManager.EapMethod,
    certConfig: EapCertConfig): Promise<WifiEapResult> {
    try {
      const isWifiEnabled = await wifiManager.isWifiActive();
      if (!isWifiEnabled) {
        console.info('WiFi未开启,正在开启...');
        await wifiManager.enableWifi();
        await this.sleep(2000);
      }

      const certDir = await this.getCertDirectory();
      const eapConfig: wifiManager.WifiEapConfig = {
        eapMethod: eapMethod,
        phase2Method: 0,
        identity: certConfig.identity || '',
        anonymousIdentity: certConfig.anonymousIdentity || '',
        password: certConfig.clientCertPassword,
        caCertAlias: 'ca_cert',
        caPath: `${certDir}/${certConfig.caCertPath}`,
        clientCertAlias: 'client_cert',
        certEntry: new Uint8Array(),
        certPassword: certConfig.clientCertPassword,
        altSubjectMatch: '',
        domainSuffixMatch: '',
        realm: '',
        plmn: '',
        eapSubId: 0
      };

      const wifiConfig: wifiManager.WifiDeviceConfig = {
        ssid: ssid,
        preSharedKey: '',
        isHiddenSsid: false,
        securityType: wifiManager.WifiSecurityType.WIFI_SEC_TYPE_EAP,
        eapConfig: eapConfig
      };

      console.info(`开始连接EAP WiFi: ${ssid}`);
      const networkId = await wifiManager.addDeviceConfig(wifiConfig);
      await wifiManager.connectToNetwork(networkId);

      const connected = await this.waitForConnection(ssid, 10000);
      if (connected) {
        console.info(`✅ 成功连接EAP WiFi: ${ssid}`);
        return { success: true, networkId: networkId };
      } else {
        return { success: false, errorCode: -1, errorMessage: '连接超时' };
      }
    } catch (error) {
      const err = error as BusinessError;
      console.error(`EAP WiFi连接失败: ${err.code} - ${err.message}`);
      return { success: false, errorCode: err.code, errorMessage: err.message };
    }
  }

  async disconnectWifi(): Promise<void> {
    try {
      const connectedInfo = await wifiManager.getLinkedInfo();
      if (connectedInfo.connState === wifiManager.ConnState.CONNECTED) {
        await wifiManager.disconnect();
        console.info('WiFi已断开连接');
      }
    } catch (error) {
      const err = error as BusinessError;
      console.error(`断开WiFi失败: ${err.code} - ${err.message}`);
    }
  }

  async getWifiConnectionState(): Promise<wifiManager.ConnState> {
    try {
      const connectedInfo = await wifiManager.getLinkedInfo();
      return connectedInfo.connState;
    } catch {
      return wifiManager.ConnState.DISCONNECTED;
    }
  }

  async isConnectedToNetwork(ssid: string): Promise<boolean> {
    try {
      const connectedInfo = await wifiManager.getLinkedInfo();
      return connectedInfo.ssid === ssid && connectedInfo.connState === wifiManager.ConnState.CONNECTED;
    } catch {
      return false;
    }
  }

  private async waitForConnection(targetSsid: string, timeout: number): Promise<boolean> {
    const startTime = Date.now();
    while (Date.now() - startTime < timeout) {
      try {
        const connectedInfo = await wifiManager.getLinkedInfo();
        if (connectedInfo.ssid === targetSsid && connectedInfo.connState === wifiManager.ConnState.CONNECTED) {
          return true;
        }
      } catch {
        // 忽略错误,继续等待
      }
      await this.sleep(500);
    }
    return false;
  }

  private sleep(ms: number): Promise<void> {
    return new Promise(resolve => setTimeout(resolve, ms));
  }
}

@Entry
@Component
struct WifiEapConnectPage {
  private eapConnector: WifiEapConnector = new WifiEapConnector();
  @State connectionStatus: string = '未连接';
  @State isConnecting: boolean = false;
  @State logs: string[] = [];

  build() {
    Column() {
      Text('WiFi EAP证书认证')
        .fontSize(24)
        .fontWeight(FontWeight.Bold)
        .margin({ top: 20, bottom: 20 });

      Text(`连接状态: ${this.connectionStatus}`)
        .fontSize(16)
        .margin({ bottom: 20 });

      Button('连接企业WiFi (EAP-TLS)')
        .width('80%')
        .height(50)
        .fontSize(18)
        .enabled(!this.isConnecting)
        .onClick(async () => {
          await this.connectToEnterpriseWifi();
        });

      Button('断开WiFi')
        .width('80%')
        .height(50)
        .fontSize(18)
        .margin({ top: 10 })
        .enabled(this.connectionStatus === '已连接')
        .onClick(async () => {
          await this.eapConnector.disconnectWifi();
          this.connectionStatus = '未连接';
          this.addLog('WiFi已断开');
        });

      Button('检查连接状态')
        .width('80%')
        .height(50)
        .fontSize(18)
        .margin({ top: 10 })
        .onClick(async () => {
          const state = await this.eapConnector.getWifiConnectionState();
          const stateText = state === wifiManager.ConnState.CONNECTED ? '已连接' :
            state === wifiManager.ConnState.CONNECTING ? '连接中' : '未连接';
          this.connectionStatus = stateText;
          this.addLog(`当前连接状态: ${stateText}`);
        });

      Scroll() {
        Column() {
          Text('操作日志:')
            .fontSize(14)
            .fontWeight(FontWeight.Bold)
            .margin({ top: 20, bottom: 10 });

          ForEach(this.logs.slice(-20), (log: string, index: number) => {
            Text(log)
              .fontSize(12)
              .margin({ bottom: 2 })
              .width('100%')
          }, (log: string, index: number) => `${index}-${log}`);
        }
        .width('90%')
        .alignItems(HorizontalAlign.Start)
      }
      .height(200)
      .margin({ top: 20 })
      .border({ width: 1, color: '#CCCCCC' })
      .padding(10)
    }
    .width('100%')
    .height('100%')
    .padding(20)
  }

  private async connectToEnterpriseWifi(): Promise<void> {
    this.isConnecting = true;
    this.connectionStatus = '连接中...';
    this.addLog('开始连接企业WiFi...');

    const certCopied = await this.eapConnector.copyCertToAppDirectory(
      '/sdcard/Download/ca_cert.pem',
      'ca_cert.pem'
    ) && await this.eapConnector.copyCertToAppDirectory(
      '/sdcard/Download/client_cert.p12',
      'client_cert.p12'
    );

    if (!certCopied) {
      this.addLog('❌ 证书复制失败,请检查证书路径');
      this.connectionStatus = '证书错误';
      this.isConnecting = false;
      return;
    }

    const result = await this.eapConnector.connectEapWifi(
      'Enterprise-WiFi',
      wifiManager.EapMethod.EAP_TLS,
      {
        caCertPath: 'ca_cert.pem',
        clientCertPath: 'client_cert.p12',
        clientCertPassword: '123456',
        identity: 'user001',
        anonymousIdentity: 'anonymous@company.com'
      }
    );

    if (result.success) {
      this.addLog('✅ WiFi连接成功');
      this.connectionStatus = '已连接';
    } else {
      this.addLog(`❌ 连接失败: ${result.errorCode} - ${result.errorMessage}`);
      this.connectionStatus = '连接失败';
    }

    this.isConnecting = false;
  }

  private addLog(message: string): void {
    const timestamp = new Date().toLocaleTimeString();
    this.logs = [`[${timestamp}] ${message}`, ...this.logs];
  }
}

export { WifiEapConnector, EapCertConfig, WifiEapResult };

HarmonyOS Next中WifiEapConfig类详解

WifiEapConfig是用于配置WPA/WPA2企业级Wi-Fi认证参数的类,继承自WifiSecurityConfig。它定义了EAP认证方法、阶段2认证方式、身份信息、CA证书等关键属性。

主要属性

  • eapMethod:EAP类型。
  • phase2Method:第二阶段认证。
  • identity:身份标识。
  • anonymousIdentity:匿名身份标识。
  • caCertAliases:CA证书别名。
  • caCertPath:CA证书路径。
  • caCert:CA证书数据。
  • clientCertAlias:客户端证书别名。
  • password:密码。

在HarmonyOS Next中,使用WifiEapConfig进行证书认证的WIFI连接,核心步骤是构建配置并应用。以下是一个关键代码实例:

  1. 导入模块
import { wifiManager } from '@kit.ConnectivityKit';
import { BusinessError } from '@kit.BasicServicesKit';
  1. 构建EAP配置
// 创建WifiEapConfig实例
let eapConfig: wifiManager.WifiEapConfig = {
  eapMethod: wifiManager.EapMethod.EAP_TLS, // 使用TLS方法
  identity: 'your_identity', // 用户标识
  anonymousIdentity: 'anonymous', // 匿名标识(可选)
  password: '', // TLS通常不需要密码
  caCertAliases: ['ca_cert_alias'], // CA证书别名数组
  clientCertAlias: 'client_cert_alias', // 客户端证书别名
  certEntry: wifiManager.CertEntry.UICC, // 证书存储位置
  certPassword: 'your_cert_password', // 证书密码
  phase2Method: wifiManager.Phase2Method.NONE // 第二阶段认证方法
};
  1. 配置WIFI并连接
// 创建WifiDeviceConfig
let config: wifiManager.WifiDeviceConfig = {
  ssid: 'Your_SSID',
  bssid: 'Your_BSSID',
  securityType: wifiManager.SecurityType.EAP,
  eapConfig: eapConfig
};

// 添加配置
wifiManager.addDeviceConfig(config, (err: BusinessError, result: number) => {
  if (err) {
    console.error('Add config failed: ' + JSON.stringify(err));
    return;
  }
  console.log('Config added, networkId: ' + result);
  
  // 连接网络
  wifiManager.connectToNetwork(result, (err: BusinessError) => {
    if (err) {
      console.error('Connect failed: ' + JSON.stringify(err));
      return;
    }
    console.log('Connect successfully');
  });
});

关键点说明

  • eapMethod:证书认证通常选择EAP_TLS
  • caCertAliasesclientCertAlias:需要提前将CA证书和客户端证书导入系统,并获取其别名
  • certEntry:指定证书存储位置,如UICC(通用集成电路卡)或UFS(通用闪存存储)
  • 确保证书已正确安装并具有相应访问权限

此配置适用于需要802.1X证书认证的企业WIFI网络,实现安全的网络准入控制。

回到顶部