OpenHarmony 小鸿 AI 开发实战 09:从 SoftAP 到家庭 Wi-Fi 的中文配网链路

发布时间:2026/7/29 14:07:05
OpenHarmony 小鸿 AI 开发实战 09:从 SoftAP 到家庭 Wi-Fi 的中文配网链路 一台没有键盘的小型语音终端怎样加入家庭 Wi‑Fi当前小鸿的答案是启动时先读取已保存的 SSID 和密码尝试 STA 连接没有配置或用户长按中键 5 秒时切换到开放 SoftAP手机访问 192.168.1.1在中文页面中选择附近网络并提交凭据设备先验证连接成功再把配置写入持久化存储。这个流程跨越 LiteOS-M 任务、WS63 Wi‑Fi API、lwIP DHCP、HTTP 表单和 settings 持久化。本文只写当前源码能够确认的行为并主动隐藏源码中的本地网页登录密码。当前方案适合开发演示但开放热点、明文 HTTP 和固件内硬编码登录凭据都不满足正式产品的安全要求。开机先读持久化配置不是每次都开热点net_wifi_task.c创建WiFiTask。任务从 settings 读取 SSID 与密码只有读取成功且 SSID 非空时才调用connect_to_hotspot()。连接成功后向 Main/Agent 链路报告 Wi‑Fi 已连接失败则进入清理和重新配网分支。这样正常用户重启设备时无需重新连接手机热点。char strSSID[WIFI_SSID_LEN_MAX1] {0}; char strPSWD[WIFI_PSWD_LEN_MAX1] {0}; ret get_wifi_config(strSSID, WIFI_SSID_LEN_MAX, strPSWD, WIFI_PSWD_LEN_MAX); if ((ret ERRCODE_SUCC) (strlen(strSSID) 0)) { set_wifi_status(eWifi_St_AutoConnecting); ret connect_to_hotspot(strSSID, strPSWD); }正文没有展示具体家庭 SSID也没有展示任何真实密码。真实代码摘录保留接口、缓冲长度和判断关系即可把设备当前凭据粘进公开文章既没有教学价值也会把配置泄露当成“真实性”。STA 连接包含扫描、匹配、连接与 DHCP 四步connect_to_hotspot()先启用wlan0最多执行 3 轮扫描。扫描结果上限来自 SDK 的接口容量代码按 SSID 长度和内容匹配目标 BSS再复制 BSSID、SSID 和 pre-shared key指定动态 DHCP。连接成功后还不能立即认为网络可用必须启动 DHCP client并等待接口取得地址。wifi_sta_enable - wifi_sta_scan - wifi_sta_get_scan_info - 按 SSID 匹配 BSS - wifi_sta_connect - netifapi_dhcp_start - 等待 IP / DHCP / gateway当前实现还提供wait_tcp_ready()同时观察 IP、DHCP bound 和 gateway避免 Wi‑Fi association 刚成功就让 OTA 或 WebSocket 抢先发请求。无线“已关联”、DHCP“已绑定”和业务“可访问公网”是三个不同信号。进入配网时先断开 STA再扫描附近 SSIDWiFiReConfgTask启动时先调用disconnect_with_hotspot()再分配 SSID 列表缓冲。扫描代码等待 4 秒最多收集配置限定数量的非空 SSID把它们编码为 JavaScript 可用的字符串列表随后启动 SoftAP 和 HTTP server。扫描结果不是长期缓存。HTTP 页面使用完成后会释放scan_ssid_list任务结束时再次检查并释放避免一次配网失败后留下堆内存。若扫描失败页面仍可以保留手动输入路径附近网络下拉只是减少输入错误不是连接的唯一入口。SoftAP 固定使用 192.168.1.1 并启动 DHCP servernet_wifi_hotspot.c把 gateway 和自身 IP 都设为 192.168.1.1掩码为 /24。热点安全类型明确为WIFI_SEC_TYPE_OPENpre-shared key 的复制代码被注释因此手机连接热点时没有 Wi‑Fi 层密码。热点启用后找到ap0netif设置地址并启动 DHCP server。IP4_ADDR(st_gw, 192, 168, 1, 1); IP4_ADDR(st_ipaddr, 192, 168, 1, 1); IP4_ADDR(st_netmask, 255, 255, 255, 0); ap_base_config.security_type WIFI_SEC_TYPE_OPEN; while (wifi_softap_enable(ap_base_config) ! ERRCODE_SUCC) { osal_msleep(100); } if (netifapi_dhcps_start(netif_p, NULL, 0) ! ERRCODE_SUCC) { wifi_softap_disable(); return ERRCODE_FAIL; }开放热点不是漏洞扫描结论而是当前源码的确定事实。它能降低现场演示的连接门槛却意味着同一空间内的其他人也能加入热点并访问明文页面。正式产品至少应启用随机 SoftAP 密码、短时有效的一次性码或设备绑定流程。中文页面把扫描结果注入 SSID 下拉框net_http_server.c内置 HTML/CSS/JavaScript页面响应由静态前缀、扫描列表脚本和静态后缀组成。表单包含本地登录、家庭 Wi‑Fi SSID、密码和可选 OTA 地址。SSID 下拉来自设备刚才的扫描结果用户也可以手动输入。公开文章不会复制完整内嵌 HTML因为那会掩盖主流程也会把当前本地登录信息一并暴露。更合适的代码摘录是表单解析边界对 URL 编码字段做解码复制到固定长度缓冲再由事件通知配网任务。form_copy_field_url_decoded( strSSID, WIFI_SSID_LEN_MAX, v_ssid, e_ssid); form_copy_field_url_decoded( strPSWD, WIFI_PSWD_LEN_MAX, v_pswd, e_pswd); osEventFlagsSet( net_cfg_evt_id, WIFI_CONFIG_INITIATE_EVENT);网页登录是第二层校验但当前凭据仍硬编码源码在 HTTP server 中定义本地登录用户名和密码并用字符串比较判断。本文有意不展示具体值。即使 SoftAP 开放网页登录仍能挡住不知道凭据的人但固定凭据一旦随固件或文章泄露所有同版本设备都会受影响。正确的产品化方案应把网页登录改成每设备随机凭据或首次配对一次性码存放在受控配置区页面提交后还要限制重试次数和有效时间。当前实现没有 TLS热点内的 HTTP 请求可被同网段观察因此不能仅靠网页登录把它描述成安全配网。提交成功不等于凭据正确设备会临时尝试 STAHTTP server 收到表单后设置WIFI_CONFIG_INITIATE_EVENT。配网任务最多执行 3 轮设置 connecting 状态等待 800 ms 让 POST 长连接就绪再调用connect_to_hotspot(strSSID, strPSWD)。连接成功后主动断开 STA等待 1000 ms 恢复 SoftAP并向手机返回成功结果。#define WIFI_CONFIG_INITIATE_RETRY (3) #define WIFI_CONFIG_STA_CONNECT_DELAY_MS (800) #define WIFI_CONFIG_STA_RESTORE_AP_MS (1000) #define WIFI_CONFIG_NOTIFY_WAIT_TIMEOUT (10 * 1000)为什么连接成功后还要恢复 SoftAP因为手机仍在等待 HTTP 响应。如果设备一取得家庭 Wi‑Fi 就立刻永久关闭热点手机可能只看到连接被重置不知道配置是否成功。当前代码给 HTTP 回写最多 10 秒再关闭 SoftAP。只有验证成功后才写入 settings当connect_to_hotspot()成功任务才调用set_wifi_config()保存 SSID 和密码失败则保留失败状态并允许下一轮。settings 层检查参数、长度和记录是否存在读写使用项目现有持久化机制。下次启动由get_wifi_config()恢复。if (net_ok) { set_wifi_config(strSSID, WIFI_SSID_LEN_MAX, strPSWD, WIFI_PSWD_LEN_MAX); set_wifi_status(eWifi_St_Connected); } else { set_wifi_status(eWifi_St_DisConnected); }这种“先试连、后保存”避免把拼错的密码写成新的默认配置。不过源码中仍会把 SSID 打到部分日志密码也以明文缓冲存在发布固件时应审计日志和内存生命周期不能把“settings 持久化”自动等同于“安全存储”。配网与 Agent 状态需要相互隔离中键 5 秒事件进入AGENT_STATE_WIFI_CONFIGURING。配网期间不应继续建立语音 WebSocket或上传 CI1302 音频Wi‑Fi 连接/断开事件再推动 Agent 返回 IDLE。配网页、STA 验证和 Agent 会话使用不同任务与事件标志避免 HTTP handler 里直接做长时间扫描和连接。这也是 LiteOS-M 项目里常见的边界HTTP 回调只解析输入并发事件真正的 Wi‑Fi 状态切换由专门任务执行。否则一个表单请求就可能阻塞网络轮询、显示刷新或 Agent 队列。当前实现的安全边界必须写清楚已确认的现实边界包括SoftAP 开放HTTP 明文网页登录凭据硬编码家庭 Wi‑Fi 密码会被设备持久化没有证明使用 HUKS 或等价安全硬件保护没有逐设备随机身份。文章不能用“安全配网”作为标题或结论。本轮源码核对通过但没有重新拿手机连接热点、选择 SSID、输入错误密码、重试、成功回写、断电重启和长按清除配置。可以确认“当前 OpenHarmony WS63 工程实现了 SoftAP 中文配网页、临时 STA 验证和成功后持久化”不能声称“所有路由器兼容性与正式安全要求已经通过”。