飞利浦摄像头网络协议分析

💡 原文中文,约5800字,阅读约需14分钟。
📝

内容提要

本文分析飞利浦云看看App及FH8626V100平台摄像头的UDP云协议,基于抓包验证了云台、语音对讲、夜视、重启和移动跟踪等功能。协议涉及引导节点、会话握手、可靠传输及控制命令,并提供了本地模拟服务器的实现状态机。未确认字段和跨型号兼容性需注意,不能视为官方规范。

🔎

延伸解读

协议实现要点

摄像头通过引导节点动态获取会话IP和端口,每次启动或重新会合时端点都可能变化,因此实现中不能写死UDP五元组。多字节字段字节序不统一,外层长度、可靠序号和ACK序号使用大端,地址、端口、控制命令等使用小端,需逐字段处理。

离线运行前提

摄像头向硬编码DNS查询p2p2.cloudbirds.cn和p2p3.cloudbirds.cn,并访问备用节点及公网UDP 32100–32102。仅劫持域名不足以保证离线运行,网关还需接管UDP/53和这些端口的流量,才能实现本地模拟服务器。

可靠层与去重

各逻辑通道独立使用16位序号,相同通道和序号再次出现表示重传,接收端应再次ACK但不得重复执行有副作用的命令。ACK中的序号是集合而非连续范围,发送端超时重试时应重发原序号,不应分配新序号。

未确认与兼容性

F1 12中变化字段的算法、会话问候令牌的生成方法、540字节配置包的最小必需项、D1 02/D1 03的媒体前导和双通道关系均未确认。命令仅在固件V30023.1.145.20240716、平台FH8626V100的这台设备上验证,换型号或升级固件后需重新抓包核对。

Q&A

飞利浦摄像头云协议中,摄像头如何确定要连接的媒体服务器?

摄像头不会固定连接某一台媒体服务器。它先访问多个引导节点(如 p2p2.cloudbirds.cn、p2p3.cloudbirds.cn),引导节点再下发动态会话 IP、UDP 端口和 4 字节令牌。摄像头每次启动或重新会合时,本地端口和远端节点都可能变化,因此不能写死最终 UDP 五元组。

飞利浦摄像头云协议中,可靠传输层如何保证数据不丢失?

可靠传输层使用 F1 D0 数据包和 F1 D1 选择确认包。每个逻辑通道有独立的 16 位序号,接收端对收到的包发送 ACK,ACK 中包含被确认的通道和序号集合。发送端超时未收到 ACK 会重传原序号,接收端对相同序号的重复包再次 ACK,但不会重复执行有副作用的命令。

如何通过飞利浦摄像头云协议控制云台转动?

通过 D1 00 控制通道发送命令 0x1001,数据为 8 字节,其中第一个字节 DD 表示方向:00 停止、01 上、02 下、03 左、06 右。按下方向时发送移动帧,松开时发送 DD=00 的停止帧。摄像头收到后返回可靠层 ACK,但没有单独的控制响应。

飞利浦摄像头云协议中,语音对讲是如何实现的?

语音对讲使用 D1 01 通道,服务器先通过 D1 00 发送命令 0x0006 初始化对讲,包含音频参数(如每帧 320 字节)。摄像头响应 0x0006 和 4 字节全零。之后服务器通过 D1 01 发送 G.711 A-law 音频数据,每帧 320 字节,对应 40ms 音频。停止对讲时服务器停止发送即可,没有独立停止命令。

飞利浦摄像头云协议中,如何开启和关闭夜视功能?

通过 D1 00 控制通道发送命令 0x8166,请求数据固定为 8 字节:关闭为 05 00 00 00 00 00 00 00,开启为 04 00 00 00 00 00 00 00。摄像头响应 0x8167,数据为 8 字节全零。

飞利浦摄像头云协议中,重启命令是什么?重启后需要注意什么?

重启命令是 0x8114,请求数据为 4 字节全零,摄像头响应 0x8115。收到请求 ACK 后,服务端应把当前会话标为失效,清除旧对端、媒体时钟和握手去重状态。摄像头重启上线后会使用新的动态端口重新会合。

飞利浦摄像头云协议中,移动跟踪功能如何开启和关闭?

通过 D1 00 控制通道发送命令 0x817C,请求数据固定为 16 字节,仅首字节变化:开启为 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00,关闭为全零。摄像头响应 0x817D,数据为 4 字节全零。该功能是摄像头自身的自动云台跟踪,不要与本地录像程序基于帧差实现的“移动侦测”混淆。

飞利浦摄像头云协议中,视频数据通过哪些通道传输?如何区分?

视频数据通过 D1 02 和 D1 03 通道传输,两者都是视频/媒体通道,不是语音。首批数据都能找到 Annex-B 起始码与 H.264 SPS(NAL type 7)。常见 UDP 负载总长为 1032 字节,即 8 字节可靠层头加 1024 字节媒体片段。两个通道的媒体前导长度不同,包含时间戳、边界或流标识,但目前尚未完整定义。现有证据不足以把 D1 02、D1 03 严格命名为主码流和副码流。

飞利浦摄像头云协议中,本地模拟服务器的最小可行实现步骤是什么?

最小可行实现步骤包括:1. 在摄像头网关接管 DNS 和发往公网 UDP 32100–32102 的引导请求;2. 监听 UDP 32100、32101、32102,收到 F1 00 返回 F1 01,收到 F1 12 返回 F1 13,随后用 F1 82 指向本机会话端口;3. 会话端口收到 F1 83 后,保存摄像头实际 IP、端口、token 和 device ID;4. 按顺序返回 F1 03、F1 84、反向 F1 83(flag=0);5. 发送服务器问候,收到摄像头 0x0331 后发送抓包中的 540 字节配置包;6. 按逻辑通道和序号去重所有 F1 D0,及时返回 F1 D1;7. 配置请求收到 ACK 后将会话标为可控制,并使用动态分配的下一 D1 00 序号发送设备命令;8. 会话超时、摄像头重启或出现新 F1 83 时,清除旧状态并重新握手。

飞利浦摄像头云协议中,有哪些尚未确认的部分?

尚未确认的部分包括:F1 12 中变化字段的算法及服务端是否应校验设备签名或密钥;F1 13、F1 40、F1 41 中所有字段的完整语义;0x0010 会话问候中令牌的生成方法、有效期和跨重启稳定性;540 字节配置包中每条记录的准确含义及真正的最小初始化集合;D1 02、D1 03 的完整媒体前导、分帧、乱序重组和双通道关系;对讲帧 timestamp 为什么取视频媒体时钟加 1,以及长时间会话是否需要更新;夜视模式值、移动跟踪和其他 0x81xx 命令在不同固件上的兼容性;摄像头控制响应只代表接受、执行完成,还是最终硬件状态。

🏷️

标签

➡️

继续阅读