频道 Cluster(Channel)
Cluster ID: 0x0504 |
所在 Endpoint: 媒体端点(电视、机顶盒等)
Channel 负责频道的导航和频道线路(Lineup)管理 —— 切台、跳台、按名称搜台、查询频道列表和电子节目单(EPG)。 它是智能电视和机顶盒等媒体设备的核心 Cluster 之一,与 MediaInput 分工不同: MediaInput 管理物理输入源(HDMI、USB),Channel 管理逻辑频道(CCTV-1、HBO)。
Channel Cluster 定义了四个 Feature:CL(频道列表)、LI(线路信息)、 EG(电子节目单)、RP(节目录制)。 最基础的设备可以一个都不启用 —— 只支持 ChangeChannelByNumber 和 SkipChannel 两个基础切台命令。 启用 CL 后提供频道列表供 UI 展示;启用 LI 后暴露运营商和线路信息;启用 EG 后可查询 EPG 节目单;启用 RP 后可预约录制。
命令(Commands)
Channel Cluster 共有 6 个客户端命令和 2 个响应命令。 基础切台(ChangeChannelByNumber / SkipChannel)所有设备都支持, ChangeChannel 需要频道列表或线路信息支撑(CL 或 LI),GetProgramGuide 和录制相关命令需要更高级的特性。 点击下方表格中的命令 ID 可跳转到对应的详细说明。
| ID | 名称 | 说明 | 所需特性 |
|---|---|---|---|
0x00 |
ChangeChannel | 按名称 / 呼号 / 编号模糊匹配切台 | CL 或 LI |
0x02 |
ChangeChannelByNumber | 按主号 + 副号精确切台 | 无 |
0x03 |
SkipChannel | 相对当前频道向前 / 向后跳转 | 无 |
0x04 |
GetProgramGuide | 查询电子节目单(EPG) | EG |
0x06 |
RecordProgram | 预约录制指定节目 | RP |
0x07 |
CancelRecordProgram | 取消已预约的录制 | RP |
响应命令
| ID | 名称 | 触发命令 | 说明 |
|---|---|---|---|
0x01 |
ChangeChannelResponse | ChangeChannel | 返回匹配结果的状态码和可选附加信息 |
0x05 |
ProgramGuideResponse | GetProgramGuide | 返回节目列表和分页信息 |
ChangeChannel —— 模糊匹配切台(0x00)
通过一个字符串在频道列表中模糊匹配并切换频道。设备会依次匹配频道的 Name、CallSign、AffiliateCallSign、
编号(MajorNumber-MinorNumber)等字段。如果唯一匹配到一个频道,自动切换并更新 CurrentChannel;
如果匹配到多个或零个,通过 ChangeChannelResponse 告知控制端。
| 参数 | 类型 | 说明 |
|---|---|---|
| Match | string | 匹配字符串,可以是频道名称、呼号、编号等。例如 "CCTV-6"、"HBO"、"6-1" |
ChangeChannelResponse
ChangeChannel 的响应,告知匹配结果:
| 字段 | 类型 | 说明 |
|---|---|---|
| Status | StatusEnum | 匹配结果状态(见下方枚举) |
| Data | string(可选) | 附加信息。MultipleMatches 时可能包含匹配到的频道名称列表 |
// ChangeChannel 命令响应(ChangeChannelResponse)
// 匹配成功
{
"Status": 0, // Success
"Data": null
}
// 匹配到多个结果
{
"Status": 1, // MultipleMatches
"Data": "CCTV-5 体育, CCTV-5+ 赛事"
}
// 未匹配到任何频道
{
"Status": 2, // NoMatches
"Data": null
}
使用场景
语音助手场景:用户说「换到 CCTV-6」,语音系统将文本传入 ChangeChannel 的 Match 参数。 设备在频道列表中匹配到 "CCTV-6 电影",唯一命中,自动切台,返回 Status = Success。 如果用户说「换到 CCTV-5」但设备同时有"CCTV-5 体育"和"CCTV-5+ 赛事"两个频道, 返回 Status = MultipleMatches,App 需要让用户进一步选择。
ChangeChannelByNumber —— 精确切台(0x02)
通过主号(MajorNumber)和副号(MinorNumber)精确切换到指定频道。
这是最基础的切台命令,不需要设备提供频道列表,所有实现 Channel Cluster 的设备都必须支持。
不返回响应命令 —— 切台成功后 CurrentChannel 属性会更新。
| 参数 | 类型 | 说明 |
|---|---|---|
| MajorNumber | uint16 | 频道主号。例如 CCTV-6 的主号为 6 |
| MinorNumber | uint16 | 频道副号。大多数频道副号为 1;同一主号下有子频道时用副号区分(如 6-1、6-2) |
使用场景
用户在 App 的频道列表中点击某个频道,App 直接用该频道的 MajorNumber 和 MinorNumber 发送此命令。 也适用于遥控器数字键输入场景:用户按下 "6-1",设备解析后调用 ChangeChannelByNumber(6, 1)。
SkipChannel —— 相对跳台(0x03)
相对当前频道向前或向后跳转指定数量的频道。正数向前(频道号增大方向),负数向后。 跳转依据的是设备内部的频道排列顺序,到达列表末尾或开头时会循环(wrap around)。
| 参数 | 类型 | 说明 |
|---|---|---|
| Count | int16 | 跳转数量。+1 = 下一个频道,-1 = 上一个频道,+5 = 向前跳 5 个频道 |
使用场景
对应遥控器上的频道 +/- 按钮。用户按一下 CH+,App 发送 SkipChannel(+1); 按一下 CH-,发送 SkipChannel(-1)。不需要知道当前频道的编号或列表中的位置,设备自行处理。
GetProgramGuide —— 查询节目单(0x04)
查询电子节目单(EPG)数据,返回指定时间范围和频道范围内的节目列表。
此命令需要设备启用 EG(ElectronicGuide) 特性。
响应通过 ProgramGuideResponse 返回,支持分页。
| 参数 | 类型 | 说明 |
|---|---|---|
| StartTime | epoch-s(可选) | 查询的起始时间(UTC 秒级时间戳)。省略表示从当前时间开始 |
| EndTime | epoch-s(可选) | 查询的结束时间。省略表示不限结束时间 |
| ChannelList | list<ChannelInfoStruct>(可选) | 限定查询的频道范围。省略表示查询所有频道 |
| PageToken | PageTokenStruct(可选) | 分页令牌,用于获取下一页结果 |
| RecordingFlag | RecordingFlagBitmap(可选) | 筛选已预约录制或正在录制的节目 |
响应中包含 ProgramList(节目列表)和可选的 Paging(分页信息)。
每个节目条目包含标题、描述、起止时间、所属频道、音频语言、分级等信息。
由于 EPG 数据量通常较大,控制端应合理使用分页和时间 / 频道筛选来控制返回量。
RecordProgram —— 预约录制(0x06)
预约录制指定节目。通过节目的唯一标识符(ProgramIdentifier)或外部 ID 定位要录制的节目。 此命令需要设备启用 RP(RecordProgram) 特性。 该命令只支持具备存储能力的设备(如带硬盘的机顶盒、DVR)。
| 参数 | 类型 | 说明 |
|---|---|---|
| ProgramIdentifier | string | 节目的唯一标识符,来自 EPG 数据中的 Identifier 字段 |
| ShouldRecordSeries | bool | 是否录制整个系列(而非单集) |
| ExternalIDList | list<AdditionalInfoStruct>(可选) | 外部标识符列表,用于跨平台定位同一节目 |
| Data | bytes(可选) | 厂商自定义数据 |
CancelRecordProgram —— 取消录制(0x07)
取消之前通过 RecordProgram 预约的录制任务。参数结构与 RecordProgram 相同, 通过 ProgramIdentifier 定位要取消的录制。需要 RP 特性。
| 参数 | 类型 | 说明 |
|---|---|---|
| ProgramIdentifier | string | 要取消录制的节目标识符 |
| ShouldRecordSeries | bool | 是否取消整个系列的录制 |
| ExternalIDList | list<AdditionalInfoStruct>(可选) | 外部标识符列表 |
| Data | bytes(可选) | 厂商自定义数据 |
属性详解
Channel Cluster 共有 3 个属性。点击下方汇总表中的属性 ID 可跳转到对应的详细说明。
| ID | 名称 | 类型 | 说明 | 所需特性 |
|---|---|---|---|---|
0x0000 |
ChannelList | list<ChannelInfoStruct> | 设备可收看的全部频道列表 | CL |
0x0001 |
Lineup | LineupInfoStruct | 运营商和线路套餐信息 | LI |
0x0002 |
CurrentChannel | ChannelInfoStruct / null | 当前正在收看的频道 | 无 |
频道信息(0x0000 ~ 0x0002)
描述设备可用的频道列表、运营商线路信息以及当前选中的频道。
| ID | 名称 | 类型 | 说明 |
|---|---|---|---|
0x0000 |
ChannelList(频道列表) | list<ChannelInfoStruct> | 设备声明的全部可收看频道。每个元素是一个 ChannelInfoStruct,包含频道编号、名称、呼号、类型等信息。列表的排列顺序即为 SkipChannel 的跳转顺序。需要 CL 特性 |
0x0001 |
Lineup(线路信息) | LineupInfoStruct | 当前设备接入的运营商和线路套餐信息。包含运营商名称、套餐名、邮编等。需要 LI 特性 |
0x0002 |
CurrentChannel(当前频道) | ChannelInfoStruct / null | 当前正在收看的频道信息。Nullable —— null 表示设备当前未调谐到任何频道(例如正在播放 HDMI 输入或流媒体 App)。通过 ChangeChannel / ChangeChannelByNumber / SkipChannel 命令改变 |
控制端应订阅 CurrentChannel 属性的变化,以便在用户通过遥控器换台时同步 App 界面。
如果设备支持 CL 特性,也应在初次连接时读取 ChannelList 构建频道选择 UI。
结构体定义
Channel Cluster 使用两个核心结构体来描述频道和线路信息。
ChannelInfoStruct
描述一个频道的完整信息。MajorNumber 和 MinorNumber 是必选字段,其余为可选。
| 字段 | 类型 | 必选 | 说明 |
|---|---|---|---|
| MajorNumber | uint16 | 是 | 频道主号。例如 CCTV-6 对应 6,HBO 对应 100 |
| MinorNumber | uint16 | 是 | 频道副号。同一主号下的子频道用副号区分,大多数频道副号为 1 |
| Name | string | 否 | 频道名称,供 UI 显示。例如 "CCTV-6 电影" |
| CallSign | string | 否 | 频道呼号(广播标识符)。例如 "CCTV6"、"HBO" |
| AffiliateCallSign | string | 否 | 附属呼号。用于同一频道在不同地区的分支版本,例如 "HBO East" |
| Identifier | string | 否 | 频道的唯一标识符,用于在 EPG 等系统中定位频道。例如 "cctv6-hd" |
| Type | ChannelTypeEnum | 否 | 频道类型 —— 卫星、有线、地面广播还是 OTT 流媒体(见下方枚举) |
LineupInfoStruct
描述设备当前接入的运营商线路信息。OperatorName 和 LineupInfoType 是必选字段。
| 字段 | 类型 | 必选 | 说明 |
|---|---|---|---|
| OperatorName | string | 是 | 运营商名称。例如 "中国广电"、"Comcast" |
| LineupName | string | 否 | 线路套餐名称。例如 "标清数字套餐"、"Premium HD Bundle" |
| PostalCode | string | 否 | 设备所在地区的邮政编码,用于区分同一运营商在不同地区的频道编排差异 |
| LineupInfoType | LineupInfoTypeEnum | 是 | 线路类型(见下方枚举) |
枚举值
StatusEnum
ChangeChannelResponse 中的匹配结果状态:
ChannelTypeEnum
描述频道的传输方式 / 来源类型:
LineupInfoTypeEnum
描述线路运营商的类型:
Matter 1.4 规范中 LineupInfoTypeEnum 目前只定义了 MSO (0) 一个枚举值。
未来版本可能会扩展更多类型。设备实现时应使用 0 作为默认值。
Feature 位图
Channel Cluster 通过 FeatureMap(0xFFFC)声明设备支持哪些可选能力:
ChangeChannel 命令要求设备至少启用 CL 或 LI 之一,否则没有数据来源进行名称匹配。
RP 特性隐含要求 EG —— 要录制节目,必须先能查询到节目信息。
ChangeChannelByNumber 和 SkipChannel 不依赖任何特性,是基础必选命令。
示例数据
一台启用了 CL + LI 特性的机顶盒,当前正在收看 CCTV-6 的 Channel Cluster 读取结果:
{
// --- 当前频道 ---
"0x0002": { // CurrentChannel
"MajorNumber": 6,
"MinorNumber": 1,
"Name": "CCTV-6 电影",
"CallSign": "CCTV6",
"AffiliateCallSign": null,
"Identifier": "cctv6-hd",
"Type": 2 // Terrestrial(地面广播)
},
// --- 频道列表(需要 CL 特性)---
"0x0000": [ // ChannelList
{
"MajorNumber": 1,
"MinorNumber": 1,
"Name": "CCTV-1 综合",
"CallSign": "CCTV1",
"AffiliateCallSign": null,
"Identifier": "cctv1-hd",
"Type": 2 // Terrestrial
},
{
"MajorNumber": 5,
"MinorNumber": 1,
"Name": "CCTV-5 体育",
"CallSign": "CCTV5",
"AffiliateCallSign": null,
"Identifier": "cctv5-hd",
"Type": 2
},
{
"MajorNumber": 6,
"MinorNumber": 1,
"Name": "CCTV-6 电影",
"CallSign": "CCTV6",
"AffiliateCallSign": null,
"Identifier": "cctv6-hd",
"Type": 2
},
{
"MajorNumber": 100,
"MinorNumber": 1,
"Name": "HBO",
"CallSign": "HBO",
"AffiliateCallSign": "HBO East",
"Identifier": "hbo-east",
"Type": 1 // Cable(有线电视)
}
],
// --- 线路信息(需要 LI 特性)---
"0x0001": { // Lineup
"OperatorName": "中国广电",
"LineupName": "标清数字套餐",
"PostalCode": "100000",
"LineupInfoType": 0 // MSO
}
}
对于最简单的设备,可能只有 CurrentChannel (0x0002) 一个属性。
只有支持 CL 特性的设备才会返回 ChannelList (0x0000),只有支持 LI 的设备才会返回 Lineup (0x0001)。
读取前可先检查 FeatureMap (0xFFFC) 判断设备支持哪些特性,避免读取不存在的属性。
常见场景
场景 1:App 频道列表与换台
- 检查
FeatureMap (0xFFFC),确认设备支持 CL(Bit 0 = 1) - 读取
ChannelList (0x0000),获取全部频道(MajorNumber、MinorNumber、Name、CallSign、Type) - 读取
CurrentChannel (0x0002),高亮当前频道 - 在 UI 上展示频道列表,可根据
Type分组显示(地面广播、有线、卫星、OTT) - 用户点击目标频道,发送
ChangeChannelByNumber,传入该频道的 MajorNumber 和 MinorNumber - 订阅
CurrentChannel属性变化,确认切台成功后更新 UI 高亮
场景 2:语音助手模糊搜台
- 确认设备支持 CL 或 LI 特性(ChangeChannel 的前提条件)
- 用户对语音助手说「换到 HBO」,语音系统将文本
"HBO"作为 Match 参数发送ChangeChannel - 检查 ChangeChannelResponse 的 Status:
- Success (0):已切台,无需额外操作
- MultipleMatches (1):向用户展示 Data 中的候选频道列表,让用户选择后用 ChangeChannelByNumber 精确切台
- NoMatches (2):提示用户未找到匹配频道,建议更换搜索词
- 订阅
CurrentChannel确认切台结果
注意:ChangeChannel 的匹配逻辑由设备实现决定。不同设备对同一搜索词的匹配结果可能不同。 App 应优雅处理 MultipleMatches 和 NoMatches 两种情况。