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
浙公网安备 33010602011771号