出门取片,不走第三方组网
在外面看家里 NAS 上的片子,常见做法是装一套虚拟局域网软件,或者开系统 VPN、给家里做端口映射。组网软件要常驻一个后台程序;系统 VPN 只有一个槽,公司 VPN 一连上就打架;端口映射把家里的服务直接暴露到公网,安全得自己扛。
泛音把隧道做进了播放器自己:内嵌一块用户态的组网组件,进程在就在,进程退出就断。设置里打开「远程访问」,第一次点一下,浏览器里授权一次;之后开关一开,静默上线。在家时走局域网直连,不绕隧道;只有出门才接管。
节点清单与源清单分两层
家里不止一台机器,一个源该由谁来供?这里有两层清单,来源不同,不能混。
节点清单问组网层:有哪些节点、名字、地址、在不在线、这条链路是直连还是中继。这一层组网组件本来就知道。
源清单组网层不知道——它不知道你的片源在哪。每台节点自己报「我这儿能供哪些源」:一条普通的 HTTP 调用,读它的管理口,客户端把各节点自报的源聚合起来,得到「每个源,哪几台节点能供」。
源的身份是它的地址,不是「谁配的」。在一台 PC 上配了指向 NAS 的 WebDAV 源,真正供它的是能到达那个地址的节点。归属按可信度排:本机就是那台机器 → 同网段的节点 → 家里常开的 NAS 或常驻节点 → 自报配过这个源的 → 只剩一台在线时兜底。这个次序来自一次实机事故:配过该源的手机人也在外面,把在家里的常驻节点顶掉了,连接一直转圈;把常驻节点提到「自报配过」之前才修对,单元测试把这个场景钉住了。
直连、中继与够不着
链路怎么走,打洞还是中继,交给组网组件判;app 只显示结果——每个源标出直连、走中继,还是够不着。
组网组件只负责把两台机器连起来,它不认识片源。片源不是节点,所以每台节点上有一个网关口:把对端的连接落到片源的真实地址。引擎侧只改一处,把 HTTP 代理指向本机这个口,地址一个字不改——两边同时改必撞车。
本地文件夹是另一回事:它连 host:port 都没有。节点在组网上起一个只读文件服务,把配置里的目录端出去,客户端按 WebDAV 源取,复用现成的播放路。
公网源不进隧道。IPTV、直播、公网 URL 本来就在外面,绕回家毫无意义,直连。
一次授权,一条长期身份
状态机重做过一次,起因是设备列表越加越多,老的一台台变灰。
原来的逻辑里,本机上线过、掉线过一阵,就判「身份多半已失效」;设置页把它渲染成一句「点这一项重新授权」。点一下,清状态目录——而在这个组网里,状态目录就是身份。等于每抖一次网,就重新注册一台新设备;新设备撞上旧名字,名字后面加 -1、-2,旧的那台永远灰着。一次网络问题的界面提示,变成了每点一次多一台历史设备。
重做之后有七个状态:未随包、已关闭、未授权、已授权·连接中、已连接、已授权·连不上、身份已失效。「连不上」只给一个动作:重试,不动身份;清身份只在组网控制面明确回「不认识这个节点」时发生,而且要用户二次确认。授权一次之后,重启、升级、换网都复用同一份身份。
手机还顺手改了一处命名:原来所有手机都叫 panvox-localhost,重装一次撞一次名;现在首次启动生成 panvox-iphone-xxxx 这样的名字,落盘后一直沿用;桌面端沿用系统机器名,本来就可读、有区分度。
只在真实网络里才暴露的几处
这套东西的坑,几乎都不在单元测试里。
一条是代理软件:有的代理把组网控制面的域名解析进假地址段,控制面拨号时又把 socket 绑在默认网卡上,路由对不上,连接一直返回不了;隧道停在「连接中」,界面上没有任何错误。这是环境问题,但产品欠用户一条诊断:控制面久拨不通、本机 DNS 又命中假地址段时,该提示把组网域名放进代理的白名单。
一条是时序:网关口地址只有隧道上线后才算得出。冷启动直接点开播,引擎会拿着空代理直拨私网地址,超时。开播链里加了一个判断——私网源、不在本机网段、隧道还没上线,就先等它上线再交给引擎;在家同网段,不白等。
最费劲的是发热。两条独立的根因都是「等待期占着核」:一条在引擎,等待时用 yield 空转,开流卡住就满核烧,修复在开源仓里,见 avox 的提交。另一条在隧道的 mDNS 读循环:应用被系统挂起再恢复后,读失败就立刻重试,没有退避,两条循环正好吃满两核。改法与引擎那条同族——失败退避,关掉的通道不再重试。
后来把判据做成了看门狗。整进程 CPU 当不了判据:引擎解 4K 本来就烧核,分不清「自旋」还是「干活」。改成两把闸:组网侧代码占用的 CPU,和数据面是否真的在搬字节;两个同时异常才落转储。安静时它也在跑,日志里一行写着自己还活着。
边界
已支持 Windows、iOS 与 macOS,Android 在后面。不做「按需唤醒」:机器关着就是关着,能不能取到取决于家里有没有一台常开的节点。也不在产品里自动删旧设备:那需要整张组网的管理凭据,删除又不可逆,这件事留给组网后台。
一条隧道,一次授权。出门在外,打开就是家里的片库。