OpenHarmony 小鸿 AI 开发实战 09:从 SoftAP 到家庭 Wi-Fi 的中文配网链路
2026/7/29 14:06:58 网站建设 项目流程

一台没有键盘的小型语音终端怎样加入家庭 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_MAX+1] = {0}; char strPSWD[WIFI_PSWD_LEN_MAX+1] = {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,再扫描附近 SSID

WiFiReConfgTask启动时先调用disconnect_with_hotspot(),再分配 SSID 列表缓冲。扫描代码等待 4 秒,最多收集配置限定数量的非空 SSID,把它们编码为 JavaScript 可用的字符串列表,随后启动 SoftAP 和 HTTP server。

扫描结果不是长期缓存。HTTP 页面使用完成后会释放scan_ssid_list,任务结束时再次检查并释放,避免一次配网失败后留下堆内存。若扫描失败,页面仍可以保留手动输入路径;附近网络下拉只是减少输入错误,不是连接的唯一入口。

SoftAP 固定使用 192.168.1.1 并启动 DHCP server

net_wifi_hotspot.c把 gateway 和自身 IP 都设为 192.168.1.1,掩码为 /24。热点安全类型明确为WIFI_SEC_TYPE_OPEN,pre-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 请求可被同网段观察,因此不能仅靠网页登录把它描述成安全配网。

提交成功不等于凭据正确,设备会临时尝试 STA

HTTP 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 验证和成功后持久化”,不能声称“所有路由器兼容性与正式安全要求已经通过”。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询