Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
ISO/IEC 29341-17-11 定义了 ConnectionManager 服务,这是 UPnP AV 架构中的一个基础组件,负责管理媒体源(Source)和接收器(Sink)之间连接的建立、监管和拆除。在典型的 UPnP AV 部署中,ConnectionManager 充当编排层的角色——它本身不传输媒体数据,而是协商媒体传输的参数,确保发送设备(如 MediaServer)和接收设备(如 MediaRenderer)在传输协议、数据格式和连接语义上达成一致,然后媒体字节才会通过网络传输。
ConnectionManager 服务同时托管在 MediaServer 和 MediaRenderer 设备上。在服务器端,它通告服务器可以提供的协议和内容格式。在渲染器端,它通告渲染器可以接受的协议和格式。控制点查询两端,选择兼容的组合,然后调用 PrepareForConnection 动作来建立媒体管道。这种以协商为中心的设计确保来自不同制造商的 UPnP AV 设备无需事先了解对方的能力即可实现互操作。
协议协商过程从 GetProtocolInfo 动作开始。该动作返回两个列表:Source(设备可以发送的协议和格式)和 Sink(设备可以接收的协议和格式)。对于 MediaServer,Source 列表被填充,Sink 可能为空(或仅包含环回协议)。对于 MediaRenderer,Sink 列表被填充,Source 可能为空。protocolInfo 字符串遵循严格的格式——protocol:network:contentFormat:additionalInfo——其中 protocol 标识传输机制(如 http-get、rtsp、internal),network 指定网络类型(如 *、239.255.255.250:1900),contentFormat 标识 MIME 类型或 UPnP 类,additionalInfo 携带可选参数如打包模式或时钟频率。
一旦识别出兼容的协议,控制点调用 PrepareForConnection 来建立连接。该动作返回一个在整个连接生命周期内标识该连接的 ConnectionID,以及可选的 AVTransportID 和 RenderingControlID(如果连接与特定的传输和渲染实例关联)。连接可以是三种方向类型之一:Input(设备接收内容)、Output(设备发送内容)或 Direction(双向)。使用完毕后,控制点调用 ConnectionComplete 来拆除连接并释放相关资源。
| 动作 | 描述 | 关键参数 | 错误条件 |
|---|---|---|---|
| GetProtocolInfo | 检索支持的协议和格式 | 出参: Source, Sink(逗号分隔的 protocolInfo 列表) | 无——服务可用时始终成功 |
| PrepareForConnection | 建立媒体连接 | 入参: RemoteProtocolInfo, PeerConnectionManager, PeerConnectionID, Direction; 出参: ConnectionID, AVTransportID, RenderingControlID | 702(无此连接)资源耗尽时返回 |
| ConnectionComplete | 终止活动连接 | 入参: ConnectionID | 702(无此连接)ID 无效时返回 |
| GetCurrentConnectionInfo | 检索连接详情 | 入参: ConnectionID; 出参: ConnectionInfo 结构 | 702(无此连接)ID 未知时返回 |
| GetCurrentConnectionIDs | 列出所有活动连接 ID | 出参: ConnectionIDs(逗号分隔列表) | 无 |
实现健壮的 ConnectionManager 需要一丝不苟地关注资源管理。每个活动连接会消耗用于状态跟踪的内存,并可能保留硬件资源,如解码器管道、DMA 通道或网络套接字缓冲区。标准未指定最大并发连接数——这是实现定义的——但设计良好的设备应强制执行可配置的连接限制,并在达到限制时返回清晰的错误代码拒绝新的连接请求。
ConnectionID 是一个不透明标识符,必须在连接的整个生命周期内保持有效。工程师应将 ConnectionID 实现为单调递增的无符号整数或 UUID,在设备运行期间绝不重用已终止连接的 ID。重用 ID 可能导致控制点中微妙的错误,因为控制点可能缓存了连接状态且未能检测到先前连接的 ID 现在指向了一个完全不同的媒体流。
线程安全是另一个关键关注点。ConnectionManager 必须处理并发的 PrepareForConnection 和 ConnectionComplete 调用而不产生竞态条件。一种常见的实现模式使用由读写锁保护的连接表:查询动作(GetCurrentConnectionIDs、GetCurrentConnectionInfo)获取共享读锁,而修改动作(PrepareForConnection、ConnectionComplete)获取排他写锁。这种模式在允许并发查询的同时保持了一致性。
错误处理需要特别关注。当 PrepareForConnection 由于协议不兼容而失败时,动作应返回错误代码 702(无此连接)并附带描述性错误消息——而不是通用的 SOAP 错误。控制点使用特定的错误代码来确定是回退到替代协议还是通知用户不兼容问题。