目标导航 Cluster(TargetNavigator)
Cluster ID: 0x0505 |
所在 Endpoint: 媒体端点(电视、机顶盒等)
TargetNavigator 负责在设备的内容目标之间进行导航 —— 这些目标可以是应用、屏幕页面、菜单项等。 用户可以通过它查询设备有哪些可导航的目标、当前处于哪个目标,并跳转到指定目标。 它是智能电视和机顶盒等媒体设备中用于应用切换和界面导航的核心 Cluster。
MediaInput(0x0507)管理的是物理/虚拟输入源(如 HDMI 1、USB), 而 TargetNavigator 管理的是软件层面的内容目标(如 Netflix、YouTube、设置页面)。 一台智能电视可能同时拥有两个 Cluster:MediaInput 切换输入接口,TargetNavigator 切换应用。
命令(Commands)
TargetNavigator Cluster 只有 1 个命令和 1 个响应。 NavigateTarget 用于跳转到指定目标,设备返回 NavigateTargetResponse 告知导航结果。
| ID | 名称 | 方向 | 说明 |
|---|---|---|---|
0x00 |
NavigateTarget | Client → Server | 导航到指定目标 |
0x01 |
NavigateTargetResponse | Server → Client | 导航结果响应 |
NavigateTarget —— 导航到目标(0x00)
请求设备跳转到指定的目标。Target 必须是 TargetList 中某个
TargetInfoStruct 的 Identifier 值。
可选的 Data 字段可以传递额外的导航参数(如深度链接路径)。
设备收到命令后会返回 NavigateTargetResponse 告知结果。
| 参数 | 类型 | 必选 | 说明 |
|---|---|---|---|
| Target | uint8 | 是 | 目标的标识符,必须存在于 TargetList 中 |
| Data | string | 否 | 传递给目标的应用自定义数据,如深度链接 URL、启动参数等 |
// NavigateTarget 命令示例
// 导航到 Identifier=1 的目标(Netflix),附带启动参数
{
"Target": 1,
"Data": "movie/12345"
}
// NavigateTargetResponse 响应
{
"Status": 0, // Success
"Data": "launched"
}
使用场景
用户在手机 App 上选择打开电视上的 Netflix。App 读取 TargetList 找到 Netflix 对应的 Identifier,
发送 NavigateTarget 命令,并在 Data 字段传入要播放的影片 ID。
电视启动 Netflix 并直接跳转到对应影片页面。
NavigateTargetResponse —— 导航结果响应(0x01)
设备对 NavigateTarget 命令的响应。通过 Status 字段告知导航是否成功,
可选的 Data 字段可以携带设备返回的额外信息。
| 字段 | 类型 | 必选 | 说明 |
|---|---|---|---|
| Status | StatusEnum | 是 | 导航结果状态(见下方枚举) |
| Data | string | 否 | 设备返回的附加信息,内容由应用自定义 |
属性详解
TargetNavigator Cluster 共有 2 个属性。点击下方汇总表中的属性 ID 可跳转到对应的详细说明。
| ID | 名称 | 类型 | 说明 |
|---|---|---|---|
0x0000 |
TargetList | list<TargetInfoStruct> | 设备所有可导航目标的列表 |
0x0001 |
CurrentTarget | uint8 | 当前所在目标的标识符 |
目标状态(0x0000, 0x0001)
描述设备当前可导航的目标列表和当前所在的目标。
| ID | 名称 | 类型 | 说明 |
|---|---|---|---|
0x0000 |
TargetList(目标列表) | list<TargetInfoStruct> | 设备声明的全部可导航目标,每个元素是一个 TargetInfoStruct。列表内容反映设备上已安装的应用、可访问的页面或菜单项。每个 Identifier 值唯一。列表可能随设备安装或卸载应用而变化 |
0x0001 |
CurrentTarget(当前目标) | uint8 | 当前所在目标的标识符。该值指向 TargetList 中某个 TargetInfoStruct.Identifier。值为 0xFF 时表示当前没有处于任何已知目标上。通过 NavigateTarget 命令或用户在设备上手动切换时改变 |
控制端应订阅 CurrentTarget 属性的变化,以便在用户通过遥控器或设备界面手动切换应用时同步 App 界面上的高亮状态。
同时也应订阅 TargetList,以便在设备安装或卸载应用后及时更新可用目标列表。
结构体定义
TargetNavigator Cluster 使用一个结构体来描述导航目标信息。
TargetInfoStruct
描述一个导航目标的基本信息,包括唯一标识和显示名称。
| 字段 | 类型 | 说明 |
|---|---|---|
| Identifier | uint8 | 目标的唯一标识符,在 TargetList 内唯一。用于 NavigateTarget 命令定位目标 |
| Name | string | 目标的显示名称,如 "Netflix"、"Settings"。供 UI 展示给用户 |
TargetInfoStruct 比 InputInfoStruct 更简洁 —— 只有 Identifier 和 Name 两个字段,没有类型枚举和描述字段。 这是因为导航目标的性质由应用自身决定,不像物理输入接口那样有固定的分类(HDMI、USB 等)。
枚举定义
StatusEnum
NavigateTargetResponse 中 Status 字段的枚举值,表示导航操作的结果。
示例数据
一台智能电视的 TargetNavigator Cluster 读取结果 —— 当前在设置页面,共有 4 个可导航目标:
{
// --- 当前目标 ---
"0x0001": 2, // CurrentTarget = 2(当前在"设置"页面)
// --- 目标列表 ---
"0x0000": [ // TargetList
{
"Identifier": 0,
"Name": "Home" // 主屏幕
},
{
"Identifier": 1,
"Name": "Netflix" // Netflix 应用
},
{
"Identifier": 2,
"Name": "Settings" // 系统设置
},
{
"Identifier": 3,
"Name": "YouTube" // YouTube 应用
}
]
}
控制端展示目标列表 UI 时,应先读取 TargetList (0x0000) 获取完整列表,
再读取 CurrentTarget (0x0001) 高亮当前所在目标。
由于 TargetInfoStruct 没有类型枚举,如果需要为不同目标显示图标,
可能需要通过 Name 字段匹配已知的应用名称(如"Netflix""YouTube")来选择图标。
常见场景
场景 1:App 远程启动电视上的流媒体应用
- 读取
TargetList (0x0000),获取电视上所有可导航目标(Identifier、Name) - 读取
CurrentTarget (0x0001),高亮当前所在目标 - 在 App UI 上展示目标列表,用户点击"Netflix"
- 发送
NavigateTarget (0x00),Target 设为 Netflix 的 Identifier 值,Data 可传入要播放内容的深度链接 - 检查
NavigateTargetResponse的 Status:Success (0)—— 导航成功,订阅CurrentTarget确认更新后刷新 UITargetNotFound (1)—— 目标已不存在(可能应用被卸载),刷新 TargetListNotAllowed (2)—— 被限制访问,提示用户可能受家长控制等策略限制
场景 2:自动化场景 —— 语音指令切换应用
- 用户对语音助手说"打开 YouTube"
- 语音助手读取
TargetList (0x0000),在列表中按 Name 匹配"YouTube" - 找到匹配项后,发送
NavigateTarget (0x00),Target 设为对应 Identifier - 如果 TargetList 中没有匹配的名称,语音助手回复"该应用不在可用列表中"
- 如果返回
NotAllowed,语音助手提示"当前无法打开该应用,可能受到使用限制"
注意:Name 字段的匹配需要考虑大小写和本地化差异。 设备厂商可能使用不同的名称格式(如"YouTube"vs"youtube"vs"YouTube TV"), 语音助手的匹配逻辑应做模糊匹配或规范化处理。