Wi-Fi 扫码连接使用速查

如果你说的是 Wi-Fi 扫码连接部分,可以单独整理成下面这样:

Wi-Fi 扫码连接使用速查

扫码连接主要分为:

1. 打开 Wi-Fi 扫描
2. 打开系统扫码页面
3. 解析二维码内容
4. 获取 SSID、密码和加密类型
5. 再次 startScan()
6. 调用连接 Wi-Fi API
7. 等待 Wi-Fi 和相机网关准备完成

1. 打开扫码页面

项目使用鸿蒙扫码能力:

import { scanBarcode, scanCore } from '@kit.ScanKit';

const options: scanBarcode.ScanOptions = {
  scanTypes: [
    scanCore.ScanType.ALL
  ],
  enableMultiMode: true,
  enableAlbum: false
};

const result =
  await scanBarcode.startScanForResult(
    getContext(this),
    options
  );

扫码前先调用一次 Wi-Fi 扫描:

WifiManager.startScan();

const result =
  await scanBarcode.startScanForResult(
    getContext(this),
    options
  );

2. 解析二维码内容

项目二维码内容格式:

加密类型#Wi-Fi名称#Wi-Fi密码

例如:

3#CAMERA_WIFI_SSID#CAMERA_WIFI_PASSWORD

解析代码:

const value = result.originalValue;
const parts = value.split('#');

if (parts.length < 3) {
  ToastUtil.showToast('二维码格式不正确');
  return;
}

const securityType = Number(parts[0]);
const ssid = parts[1];
const password = parts[2];

解析后要检查字段:

if (
  !ssid ||
  !password ||
  Number.isNaN(securityType)
) {
  ToastUtil.showToast('Wi-Fi 信息不完整');
  return;
}

不要直接使用扫码结果:

// 不建议
WifiManager.connect(
  parts[1],
  parts[2],
  Number(parts[0]),
  callback
);

3. 扫码后再次调用 startScan

扫码成功不代表系统当前已经准备好连接环境。

扫码拿到 Wi-Fi 信息后,再调用一次:

WifiManager.startScan();

然后延迟连接:

WifiManager.startScan();

setTimeout(() => {
  WifiManager.connect(
    ssid,
    password,
    securityType,
    callback
  );
}, 1000);

推荐完整顺序:

扫码前 startScan
  -> 打开扫码页面
  -> 获取二维码
  -> 校验二维码格式
  -> 扫码后再次 startScan
  -> 延迟 1 秒连接

4. 完整扫码连接代码

import {
  scanBarcode,
  scanCore
} from '@kit.ScanKit';

async function scanAndConnectWifi(): Promise<void> {
  if (!WifiManager.isWifiActive()) {
    ToastUtil.showToast('请先打开 Wi-Fi');
    return;
  }

  // 扫码前先打开 Wi-Fi 扫描
  WifiManager.startScan();

  const options: scanBarcode.ScanOptions = {
    scanTypes: [
      scanCore.ScanType.ALL
    ],
    enableMultiMode: true,
    enableAlbum: false
  };

  try {
    const result =
      await scanBarcode.startScanForResult(
        getContext(this),
        options
      );

    const value = result.originalValue;
    const parts = value.split('#');

    if (parts.length < 3) {
      ToastUtil.showToast('二维码格式不正确');
      return;
    }

    const securityType = Number(parts[0]);
    const ssid = parts[1];
    const password = parts[2];

    if (
      !ssid ||
      !password ||
      Number.isNaN(securityType)
    ) {
      ToastUtil.showToast('Wi-Fi 信息不完整');
      return;
    }

    // 扫码成功后再次扫描
    WifiManager.startScan();

    setTimeout(() => {
      WifiManager.connect(
        ssid,
        password,
        securityType,
        async (connectResult) => {
          if (
            connectResult !==
            WifiConnectErrorCode.WIFI_CONNECT_SUCCESS
          ) {
            ToastUtil.showToast('Wi-Fi 连接失败');
            return;
          }

          // 等待系统完成 DHCP
          setTimeout(async () => {
            if (!WifiManager.isWifiConnected()) {
              ToastUtil.showToast(
                'Wi-Fi 尚未完全连接'
              );
              return;
            }

            await WifiManager.bindToCameraWifi();

            ToastUtil.showToast(
              'Wi-Fi 连接成功'
            );
          }, 2000);
        }
      );
    }, 1000);
  } catch (error) {
    LogUtils.error(
      TAG,
      `扫码失败: ${JSON.stringify(error)}`
    );
  }
}

5. 扫码内容不是固定格式时

如果二维码内容可能包含 #,不要直接使用固定下标解析:

const parts = value.split('#');

可以限制只拆分前两个分隔符:

const firstIndex = value.indexOf('#');
const secondIndex = value.indexOf(
  '#',
  firstIndex + 1
);

if (
  firstIndex < 0 ||
  secondIndex < 0
) {
  ToastUtil.showToast('二维码格式错误');
  return;
}

const securityType =
  Number(value.substring(0, firstIndex));

const ssid =
  value.substring(
    firstIndex + 1,
    secondIndex
  );

const password =
  value.substring(secondIndex + 1);

这样密码中包含 # 时不会被截断。

6. 扫码取消和失败

用户取消扫码时不要当成 Wi-Fi 连接失败:

try {
  const result =
    await scanBarcode.startScanForResult(
      getContext(this),
      options
    );
} catch (error) {
  LogUtils.info(TAG, '用户取消扫码');
}

可以根据错误码区分:

try {
  await scanBarcode.startScanForResult(
    getContext(this),
    options
  );
} catch (error) {
  const code = (error as BusinessError).code;

  if (code === 1000500002) {
    LogUtils.info(TAG, '用户拒绝扫码权限');
  } else {
    LogUtils.error(
      TAG,
      `扫码失败 code=${code}`
    );
  }
}

7. 扫码连接失败排查顺序

1. Wi-Fi 是否打开
2. 扫码前是否调用 startScan
3. 二维码格式是否正确
4. SSID 是否为空
5. 密码是否为空
6. securityType 是否正确
7. 扫码后是否再次调用 startScan
8. 是否等待了 1 秒再连接
9. 高版本是否弹出了用户确认
10. 连接后是否等待 DHCP
11. 是否绑定了 App 网络

最常见问题是:

// 错误
扫码完成 -> 直接 connect

应该改为:

// 正确
扫码完成
  -> startScan()
  -> 延迟 1 秒
  -> connect()
  -> 等待网关
  -> bindToCameraWifi()

8. 二维码中的隐私信息

文档和日志中不要打印真实密码:

LogUtils.info(
  TAG,
  `ssid=${ssid}, securityType=${securityType}`
);

不要这样打印:

// 不要输出真实密码
LogUtils.info(
  TAG,
  `ssid=${ssid}, password=${password}`
);

示例统一使用:

CAMERA_WIFI_SSID
CAMERA_WIFI_PASSWORD
CAMERA_GATEWAY
DEVICE_SERIAL
posted @ 2026-09-01 18:15  带头大哥d小弟  阅读(16)  评论(0)    收藏  举报