SSID字节与Unicode:避免非ASCII网络名导致配网失败

SSID应保存为字节与显示标签

手机和嵌入式屏幕显示的网络名称完全一样,提交到无线接口的字节却可能不同。解决办法是建立从扫描到关联的字节保真契约,而不是再试一次密码。应把SSID的原始字节及长度,与界面显示标签分开保存。Linux 6.12的cfg80211使用字节数组和长度描述SSID,Zephyr 3.7.0 Wi-Fi接口定义最大长度为32字节。具体产品仍需核对SDK能表达的范围,不能据此承诺所有字节组合都可用;也不应首先要求用户重命名现有网络。

SSID身份必须跨越每个边界保持不变
显示文本是派生信息,原始字节才是提交依据

定位第一次不可逆转换

画出实际链路:无线扫描、驱动回调、配网服务、手机数据模型、传输编码、设备解析器、持久化配置、关联调用。逐一注明值究竟是字节、UTF-8字符串、平台字符串还是可打印转义文本。扫描解析器可能把无法解码的数据替换成占位字符,如果应用随后从显示标签重新编码,原始SSID已经丢失。用户点选扫描项时,最好提交一个能够定位原始字节的临时记录编号。手动输入是另一条路径,必须明确编码策略,因为普通文本输入无法准确重建任意字节序列。

不要为了整齐而规范化标识

Unicode规范化会主动改变表示形式,使等价文本获得一致的编码。Unicode UAX #15第58修订版定义了这些转换,但并未授权Wi-Fi应用修改现有网络标识。一个构造例子是U+00E9,与U+0065后接U+0301:其UTF-8分别为C3 A9和65 CC 81。它们看起来可能相似,却是不同SSID字节。不要对扫描值执行NFC、大小写折叠、去空格或智能标点替换。产品创建新网络时可以与AP配置约定命名规则,但不能把这种约定静默应用到加入已有网络的流程。

在表示变化处重新校验长度

限制32个字符并不够,因为Unicode字符可能占多个UTF-8字节。发送配置之前检查编码后长度,在设备接收边界再次校验。超长时应拒绝,不得截断以适配缓冲区,因为截断后的名称可能属于另一个网络。字节数组需要独立长度,不能依赖零结尾。若SDK只提供C字符串接口,应测试并说明无法表示的输入,不能声称支持任意SSID字节。AOSP supplicant配置允许十六进制SSID形式,适合受控测试样本;但这种语法属于配置解析器,不能直接当作原始字节传给另一个接口。

约定唯一传输表示并验证往返

如果配网协议采用JSON,可以设计带明确类型标记的base64或十六进制字节字段,并另带显示标签。解析时检查解码长度、32字节边界和格式合法性,失败前不得更改已保存配置;显示标签绝不能覆盖字节字段。手动文本入口可以明确使用UTF-8,并对不支持输入给出具体提示。消息结构需要版本号,避免旧固件把新字节字段误当普通文字。用本地构造样本验证编码、传输、解析、保存及重启加载后逐字节一致。这是建议应用设计,不是Wi-Fi标准规定的配网消息格式。

使用少量但针对性强的边界样本

样本应包含纯ASCII、首尾空格、引号与反斜杠、多字节中文、两种重音表示,以及恰好达到和刚刚超过字节上限的值。例如十个“中”的UTF-8共30字节,加两个ASCII字母为32,再加一个就超限。若底层接口宣称支持字节数组,还要加入零字节和非法UTF-8。预期结果可以是明确的不支持错误,并非所有样本都必须关联成功。点选扫描项与手动输入应分别验证;序列化单元测试通过,只证明该段软件保真,不能代替驱动和AP对实际网络名称的接受验证。

诊断时避免长期收集网络身份

私有实验环境可以逐边界比较长度和受控样本的十六进制值。生产日志应避免上传原始网络名,也不要假定普通哈希已实现匿名化,因为常见SSID可被猜测。更合适的是短期本地关联编号、编码类别、字节数,以及扫描字节与提交字节是否一致的标记。确需详细数据时,应明确告知并限定收集时间,且不能混入凭证。错误报告应定位传输解码、长度校验、SDK表达限制或关联失败中的第一个故障阶段,而不是统称“Wi-Fi密码错误”。

发布门槛是身份没有变化

验收要证明点选扫描项后的字节在重启后仍不变,手动输入遵守声明的编码,不支持情况在覆盖可用配置前被拒绝。还要检查排序与去重逻辑,不能自动合并视觉相同却字节不同的标签。长度超限及无法表达的名称应有清楚的本地化提示。本文样本是可复现的软件测试输入,没有执行手机、AP或板级连接测量,最终兼容范围必须由记录了SDK及整条处理链版本的测试报告确定。

类似文章