频道 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(可选) 筛选已预约录制或正在录制的节目
ProgramGuideResponse

响应中包含 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 中的匹配结果状态:

0
Success 唯一匹配成功 —— 已切换到目标频道
1
MultipleMatches 匹配到多个频道 —— 需要用户进一步选择
2
NoMatches 未匹配到任何频道

ChannelTypeEnum

描述频道的传输方式 / 来源类型:

0
Satellite 卫星电视 —— 通过卫星信号接收
1
Cable 有线电视 —— 通过同轴电缆或光纤入户
2
Terrestrial 地面广播 —— 通过地面无线信号接收(DVB-T / ATSC)
3
OTT OTT 流媒体 —— 通过互联网传输(IPTV / 网络直播)

LineupInfoTypeEnum

描述线路运营商的类型:

0
MSO Multiple System Operator —— 多系统运营商(最常见,如有线电视公司、IPTV 运营商)
LineupInfoType 目前只有一个值

Matter 1.4 规范中 LineupInfoTypeEnum 目前只定义了 MSO (0) 一个枚举值。 未来版本可能会扩展更多类型。设备实现时应使用 0 作为默认值。

Feature 位图

Channel Cluster 通过 FeatureMap(0xFFFC)声明设备支持哪些可选能力:

Bit 0
CL(ChannelList) 频道列表 —— 设备提供可浏览的频道列表(ChannelList 属性),支持 ChangeChannel 模糊匹配
Bit 1
LI(LineupInfo) 线路信息 —— 设备暴露运营商和线路套餐信息(Lineup 属性),也可支持 ChangeChannel
Bit 2
EG(ElectronicGuide) 电子节目单 —— 设备提供 EPG 数据,支持 GetProgramGuide 命令查询节目信息
Bit 3
RP(RecordProgram) 节目录制 —— 设备支持预约录制,提供 RecordProgram 和 CancelRecordProgram 命令
特性依赖关系

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 频道列表与换台
  1. 检查 FeatureMap (0xFFFC),确认设备支持 CL(Bit 0 = 1)
  2. 读取 ChannelList (0x0000),获取全部频道(MajorNumber、MinorNumber、Name、CallSign、Type)
  3. 读取 CurrentChannel (0x0002),高亮当前频道
  4. 在 UI 上展示频道列表,可根据 Type 分组显示(地面广播、有线、卫星、OTT)
  5. 用户点击目标频道,发送 ChangeChannelByNumber,传入该频道的 MajorNumber 和 MinorNumber
  6. 订阅 CurrentChannel 属性变化,确认切台成功后更新 UI 高亮
场景 2:语音助手模糊搜台
  1. 确认设备支持 CL 或 LI 特性(ChangeChannel 的前提条件)
  2. 用户对语音助手说「换到 HBO」,语音系统将文本 "HBO" 作为 Match 参数发送 ChangeChannel
  3. 检查 ChangeChannelResponse 的 Status:
    • Success (0):已切台,无需额外操作
    • MultipleMatches (1):向用户展示 Data 中的候选频道列表,让用户选择后用 ChangeChannelByNumber 精确切台
    • NoMatches (2):提示用户未找到匹配频道,建议更换搜索词
  4. 订阅 CurrentChannel 确认切台结果

注意:ChangeChannel 的匹配逻辑由设备实现决定。不同设备对同一搜索词的匹配结果可能不同。 App 应优雅处理 MultipleMatches 和 NoMatches 两种情况。