记
开发日志
← 返回日志

查了两个月的配对:最后发现是 80 端口被网页占了

大金固件

症状

大金传感器自研固件(基于 HomeSpan)接苹果 HomeKit:家庭 App 里能发现这台设备,点配对,永远回一句「配件不可连接」。与此同时,设备自己的网页后台一直稳定可用,传感器读数全活。

发现得到、连不上、设备不像是坏的——这个组合,后来查了将近两个月。

排查长征:每条都是真试过的

  • 数据库校验警告:审计发现温度服务误放了一个规范明令禁止的特征,设备开机日志里那条 Warnings=1 就是它。修掉(2.1.1),警告清零——配对仍败。
  • 配对残留与码:后台加了配对管理:清残留、查控制器计数(0)、网页重设配对码——仍败。
  • 身份密钥写坏:恢复出厂、换全新身份重新配网——仍败。
  • 广播字段验尸:mDNS 广播逐字段核对 HAP 规范——地址、待配对标志、协议版本、类别全合规;也没有 IPv6 地址捣乱(一度是头号嫌疑)。
  • 网络侧:跨频段路径、家庭中枢状态、新建测试家庭、重启手机——逐项排除。
  • 生产商字段:拿同款硬件的成功案例逐项对表,设备信息六项齐全,没漏。

关键证据:手机压根没连进来

一版诊断固件留下了决定性的一条:配对尝试期间,设备 HAP 服务的日志零入站。

也就是说,失败发生在配对协议开始之前——手机根本没有连上 HAP 的监听口。此前所有围绕「配对协议本身」的努力,方向就错了。

终局:一行没人动过的默认值

2.2.8 的全量审计里,第一次有人去核对广播中 SRV 记录指向的端口到底归谁——此前几轮审计核过文本字段,唯独漏了端口归属:

  • HomeSpan 库的默认设置里,HAP 服务监听 80 端口。这是上游库的出厂默认,多年来原样继承,我方代码从未改过口;
  • 设备的网页后台,监听的也是 80。

两个服务抢同一个端口,先绑定者赢,失败一方不会有任何报错日志;而网页服务在启动时序上系统性地抢先。于是真相是:手机按广播连到 80 端口,敲配对的门——接走它的是网页服务,配对请求只换来一个 404。iOS 报「不可连接」,HAP 侧日志一片空白,网页后台「长年可用」。全部症状,一朝自洽。

修复与同批欠账(2.2.9)

修复只有一行:homeSpan.setPortNum(55555),把 HAP 挪离 80;网页保持 80,用户习惯零影响;配网模式的门户本来就独立,不受扰。

同版顺手补齐审计里发现的其他欠账:

  • 状态徽章:CO₂、甲醛、TVOC 三张卡此前根本没有状态徽章,这次补齐(阈值与固件既有分级同源,甲醛线用国标 0.08 mg/m³);
  • 历史曲线:存储样本从 8 字节扩到 12 字节,补上甲醛、TVOC 两列,曲线页签和 CSV 导出同步;
  • 三路指示灯分路:机身三盏灯改为 CO₂ / PM2.5 / TVOC 各独占一盏(此前甲醛与 TVOC 共用一盏,分不出谁超标),外加 Home Assistant 多一个 eCO2 实体。

体积账照旧 tight:成品 1,834,928 B,距分区上限只剩 80 B。2.2.9 已出包,待刷入做根因的最后验证。

这案子最值钱的教训:查不出的故障,先查最「理所当然」的那一层——端口、地址、归属,往往比协议本身更容易出错,也最容易被所有人默认「肯定没问题」。