键盘输入 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 的处理结果。

0
Success 成功 —— 按键已被设备正常处理
1
UnsupportedKey 不支持 —— 设备不识别该按键码
2
InvalidKeyInCurrentState 状态无效 —— 当前状态下不接受该按键(如未播放时按暂停)

CecKeyCode(CEC 按键码)

沿用 HDMI-CEC 标准的按键码定义,覆盖遥控器上常见的所有按键。 按功能分为以下几组,方便按需查阅。

导航键(NV 特性)

方向导航、确认、返回、菜单等基础交互按键,是遥控器最核心的操作区域。

0x00
Select 确认 / OK
0x01
Up 上
0x02
Down 下
0x03
Left 左
0x04
Right 右
0x05
RightUp 右上
0x06
RightDown 右下
0x07
LeftUp 左上
0x08
LeftDown 左下
0x09
RootMenu 主菜单
0x0A
SetupMenu 设置菜单
0x0B
ContentsMenu 内容菜单
0x0D
Exit 退出

数字键(NK 特性)

0~9 数字输入和 Enter 确认,用于频道号输入、密码输入等场景。

0x20
Number0OrNumber10 数字 0(或 10)
0x21
Numbers1 数字 1
0x22
Numbers2 数字 2
0x23
Numbers3 数字 3
0x24
Numbers4 数字 4
0x25
Numbers5 数字 5
0x26
Numbers6 数字 6
0x27
Numbers7 数字 7
0x28
Numbers8 数字 8
0x29
Numbers9 数字 9
0x2B
NumbersEnter 数字输入确认

媒体控制键

播放、暂停、快进、快退、录制等媒体播放控制按键。

0x41
Play 播放
0x42
Stop 停止
0x43
Pause 暂停
0x44
Record 录制
0x45
Rewind 快退
0x46
FastForward 快进
0x47
Eject 弹出
0x48
Forward 下一曲 / 下一章
0x49
Backward 上一曲 / 上一章
0x4B
PausePlayFunction 播放/暂停切换

位置 / 频道键(LK 特性)

频道切换、收藏频道、节目指南等与频道定位相关的按键。

0x30
ChannelUp 频道 +
0x31
ChannelDown 频道 -
0x32
PreviousChannel 上一个频道(回看)
0x60
Data 数据 / 信息
0x53
ElectronicProgramGuide 电子节目指南(EPG)

电源 / 音量键

设备电源控制和音量调节。这些按键通常不受 Feature 限制,大多数设备都支持。

0x40
Power 电源开/关
0x6B
PowerOffFunction 关机
0x6C
PowerOnFunction 开机
0x41
VolumeUp 音量 +
0x42
VolumeDown 音量 -
0x43
Mute 静音
0x6D
MuteFunction 静音(仅静音)
0x6E
RestoreVolumeFunction 恢复音量(取消静音)

颜色功能键

遥控器上的四色快捷键(红、绿、黄、蓝),功能由当前界面上下文决定。

0x72
F2Red 红色键
0x73
F3Green 绿色键
0x74
F4Yellow 黄色键
0x75
F5Blue 蓝色键
CEC 按键码完整列表

以上仅列出最常用的按键码。完整的 CecKeyCode 枚举定义在 Matter 1.4 规范 Section 9.10.4.1 中, 共计 80+ 个值,还包括文字输入键(F1~F5)、音频选择、字幕控制等。 实际开发中,只需实现设备和 App UI 用到的按键即可。

Feature 位图

KeypadInput Cluster 通过 FeatureMap(0xFFFC)声明设备支持的按键类别:

Bit 0
NV(NavigationKeyCodes) 导航键 —— 支持方向键、确认、菜单、返回等导航操作
Bit 1
LK(LocationKeys) 位置键 —— 支持频道切换、频道号输入、节目指南等频道定位操作
Bit 2
NK(NumberKeys) 数字键 —— 支持 0~9 数字输入和数字确认键
Feature 与按键的对应关系

设备不一定支持所有按键。发送 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 充当遥控器
  1. 读取设备的 FeatureMap (0xFFFC),判断支持哪些按键类别
  2. 根据 Feature 动态渲染遥控器 UI:
    • NV 启用 → 显示方向键十字盘 + 确认键 + 菜单/返回
    • NK 启用 → 显示数字键盘(0~9 + Enter)
    • LK 启用 → 显示频道 +/- 按钮和 EPG 入口
  3. 用户点击 UI 上的按键,发送 SendKey (0x00),KeyCode 对应 CecKeyCode 枚举值
  4. 检查 SendKeyResponse 的 Status:
    • Success (0) —— 正常,无需额外处理
    • UnsupportedKey (1) —— 该按键不受支持,UI 上标记为不可用
    • InvalidKeyInCurrentState (2) —— 当前状态下不可用,提示用户
场景 2:语音助手控制电视播放
  1. 用户说"暂停",语音助手解析意图为暂停播放
  2. 发送 SendKey,KeyCode = 0x43 (Pause)
  3. 设备返回 Success,播放暂停
  4. 用户说"继续播放",发送 SendKey,KeyCode = 0x41 (Play)
  5. 注意:如果设备正在菜单界面而非播放状态,发送 Pause 可能返回 InvalidKeyInCurrentState,语音助手应给出相应的语音反馈