键盘输入 Cluster(KeypadInput)
Cluster ID: 0x0509 |
所在 Endpoint: 媒体端点(电视、机顶盒等)
KeypadInput 负责接收遥控器和外部控制端的按键输入 —— 方向导航、数字键、媒体控制键、颜色功能键等。 它是智能电视、机顶盒等媒体设备的核心交互 Cluster,让手机 App 可以充当遥控器使用。 按键编码沿用 HDMI-CEC 标准(CEC Key Code),覆盖了遥控器上常见的所有按键。
KeypadInput 通过三个 Feature 标记设备支持哪些按键类别: NV(导航键:方向、确认、菜单等)、 LK(位置键:频道号、收藏等)、 NK(数字键:0~9、Enter 等)。 发送按键前应先检查 FeatureMap,避免发送设备不支持的按键类别。
命令(Commands)
KeypadInput Cluster 只有 1 个命令和 1 个响应。控制端发送 SendKey,设备返回 SendKeyResponse 表示处理结果。
| ID | 名称 | 方向 | 说明 |
|---|---|---|---|
0x00 |
SendKey | Client → Server | 发送一个按键到设备 |
0x01 |
SendKeyResponse | Server → Client | 设备对 SendKey 的处理结果 |
SendKey —— 发送按键(0x00)
向设备发送一个 CEC 按键码,模拟遥控器按键操作。
设备收到后根据当前状态处理按键,并返回 SendKeyResponse 告知处理结果。
| 参数 | 类型 | 说明 |
|---|---|---|
| KeyCode | CecKeyCode | 要发送的按键码(见下方枚举) |
使用场景
手机 App 充当遥控器时,用户点击方向键或确认键,App 将对应的 CecKeyCode 通过 SendKey 发送给电视。
例如用户按"确认",发送 KeyCode = 0x00 (Select)。
SendKeyResponse —— 按键响应(0x01)
设备对 SendKey 命令的响应,告知控制端按键是否被成功处理。
| 字段 | 类型 | 说明 |
|---|---|---|
| Status | StatusEnum | 按键处理结果(见下方枚举) |
// SendKey 命令示例
// 发送"确认"键(Select = 0x00)
{
"KeyCode": 0 // CecKeyCode.Select
}
// 设备返回 SendKeyResponse
{
"Status": 0 // StatusEnum.Success
}
控制端应根据 StatusEnum 处理异常情况:
收到 UnsupportedKey 时,UI 上对应按键可置灰或隐藏;
收到 InvalidKeyInCurrentState 时,可提示用户当前状态下该按键不可用(如非播放状态下按暂停)。
枚举定义
StatusEnum
SendKeyResponse 的处理结果。
CecKeyCode(CEC 按键码)
沿用 HDMI-CEC 标准的按键码定义,覆盖遥控器上常见的所有按键。 按功能分为以下几组,方便按需查阅。
导航键(NV 特性)
方向导航、确认、返回、菜单等基础交互按键,是遥控器最核心的操作区域。
数字键(NK 特性)
0~9 数字输入和 Enter 确认,用于频道号输入、密码输入等场景。
媒体控制键
播放、暂停、快进、快退、录制等媒体播放控制按键。
位置 / 频道键(LK 特性)
频道切换、收藏频道、节目指南等与频道定位相关的按键。
电源 / 音量键
设备电源控制和音量调节。这些按键通常不受 Feature 限制,大多数设备都支持。
颜色功能键
遥控器上的四色快捷键(红、绿、黄、蓝),功能由当前界面上下文决定。
以上仅列出最常用的按键码。完整的 CecKeyCode 枚举定义在 Matter 1.4 规范 Section 9.10.4.1 中, 共计 80+ 个值,还包括文字输入键(F1~F5)、音频选择、字幕控制等。 实际开发中,只需实现设备和 App UI 用到的按键即可。
Feature 位图
KeypadInput Cluster 通过 FeatureMap(0xFFFC)声明设备支持的按键类别:
设备不一定支持所有按键。发送 SendKey 前应检查 FeatureMap:
没有 NV 就不要发方向键和菜单键;
没有 NK 就不要发数字键;
没有 LK 就不要发频道相关的键。
发送不支持的按键,设备会返回 UnsupportedKey。
示例数据
KeypadInput Cluster 没有应用属性,以下是读取 FeatureMap 判断设备能力的示例:
{
// --- Feature Map ---
"0xFFFC": 7 // FeatureMap = 0b111(NV + LK + NK 全部启用)
// KeypadInput 没有应用属性,
// 只通过 SendKey 命令接收按键输入。
// 读取 FeatureMap 可判断设备支持哪些按键类别。
}
KeypadInput 是一个「纯命令型」Cluster —— 没有可读取的应用属性,只通过 SendKey 命令进行交互。
控制端的遥控器 UI 应根据 FeatureMap 动态显示按键区域:
支持 NV 就显示方向键区域,支持 NK 就显示数字键盘,支持 LK 就显示频道切换按钮。
常见场景
场景 1:手机 App 充当遥控器
- 读取设备的
FeatureMap (0xFFFC),判断支持哪些按键类别 - 根据 Feature 动态渲染遥控器 UI:
- NV 启用 → 显示方向键十字盘 + 确认键 + 菜单/返回
- NK 启用 → 显示数字键盘(0~9 + Enter)
- LK 启用 → 显示频道 +/- 按钮和 EPG 入口
- 用户点击 UI 上的按键,发送
SendKey (0x00),KeyCode 对应 CecKeyCode 枚举值 - 检查
SendKeyResponse的 Status:Success (0)—— 正常,无需额外处理UnsupportedKey (1)—— 该按键不受支持,UI 上标记为不可用InvalidKeyInCurrentState (2)—— 当前状态下不可用,提示用户
场景 2:语音助手控制电视播放
- 用户说"暂停",语音助手解析意图为暂停播放
- 发送
SendKey,KeyCode =0x43 (Pause) - 设备返回
Success,播放暂停 - 用户说"继续播放",发送
SendKey,KeyCode =0x41 (Play) -
注意:如果设备正在菜单界面而非播放状态,发送 Pause 可能返回
InvalidKeyInCurrentState,语音助手应给出相应的语音反馈