应用启动器 Cluster(ApplicationLauncher)
Cluster ID: 0x050C |
所在 Endpoint: 媒体端点(智能电视、机顶盒、流媒体设备等)
ApplicationLauncher 负责在媒体设备上启动、停止和隐藏内容应用 —— 是语音助手「打开 Netflix」「关闭当前应用」等指令的底层实现。 它管理的是应用的生命周期(启动/停止/隐藏),而不是应用内的内容播放。 通常部署在智能电视或机顶盒的媒体端点上,与 ApplicationBasic(应用信息查询)配合使用。
ApplicationBasic(0x050D)负责只读的信息查询 —— 告诉 Controller「这个应用是什么、当前什么状态」。 ApplicationLauncher(0x050C)负责操作 —— 启动、停止、隐藏应用。 两者通常部署在同一个 Endpoint 上:先通过 ApplicationBasic 获取应用信息,再通过 ApplicationLauncher 控制应用生命周期。
命令(Commands)
ApplicationLauncher Cluster 有 3 个请求命令和 1 个响应命令。 LaunchApp 启动应用,StopApp 停止应用,HideApp 隐藏应用(退到后台),三者都返回 LauncherResponse 告知操作结果。 点击下方表格中的命令 ID 可跳转到对应的详细说明。
| ID | 名称 | 方向 | 说明 | 所需特性 |
|---|---|---|---|---|
0x00 |
LaunchApp | 请求 | 启动指定应用 | 无 |
0x01 |
StopApp | 请求 | 停止指定应用 | 无 |
0x02 |
HideApp | 请求 | 隐藏指定应用(退到后台) | 无 |
0x03 |
LauncherResponse | 响应 | 操作结果(三个命令共用) | 无 |
LaunchApp —— 启动应用(0x00)
启动设备上的指定应用。如果应用已在运行,则将其带到前台。 通过 ApplicationStruct 唯一标识目标应用, 可附带应用特定数据(如 DeepLink、启动参数)。
| 参数 | 类型 | 必选 | 说明 |
|---|---|---|---|
| Application | ApplicationStruct | 否 | 要启动的应用标识。省略时表示启动当前 Endpoint 上的应用 |
| Data | octstr | 否 | 应用特定的附加数据(如 DeepLink、启动参数),由应用自行解析 |
// LaunchApp 命令示例
// 启动 CSA 目录中的 StreamCo Player 应用
{
"Application": {
"CatalogVendorID": 24742,
"ApplicationID": "com.streamco.player"
},
"Data": "source=voice&deeplink=/home"
}
使用场景
用户对语音助手说「打开 Netflix」,助手查找到 Netflix 对应的 ApplicationStruct(CatalogVendorID + ApplicationID), 发送 LaunchApp 命令。电视启动 Netflix 并切换到前台显示。 如果附带 Data 参数(如 DeepLink),Netflix 可以直接跳转到指定页面。
StopApp —— 停止应用(0x01)
停止设备上的指定应用。应用的运行状态会变为 Stopped。 如果该应用正在播放内容,播放也会一并终止。
| 参数 | 类型 | 必选 | 说明 |
|---|---|---|---|
| Application | ApplicationStruct | 否 | 要停止的应用标识。省略时表示停止当前 Endpoint 上的应用 |
// StopApp 命令示例
// 停止当前运行的 StreamCo Player 应用
{
"Application": {
"CatalogVendorID": 24742,
"ApplicationID": "com.streamco.player"
}
}
使用场景
用户说「关闭 Netflix」,或自动化规则在晚上 11 点后自动停止所有正在运行的娱乐应用。 StopApp 会彻底终止应用进程,释放系统资源。与 HideApp 不同,被 Stop 的应用需要重新启动才能使用。
HideApp —— 隐藏应用(0x02)
将应用退到后台,但不终止其进程。应用状态变为 ActiveHidden, 仍然可以执行后台任务(如继续播放音乐)。
| 参数 | 类型 | 必选 | 说明 |
|---|---|---|---|
| Application | ApplicationStruct | 否 | 要隐藏的应用标识。省略时表示隐藏当前 Endpoint 上的应用 |
// HideApp 命令示例
// 隐藏应用(退到后台,不终止进程)
{
"Application": {
"CatalogVendorID": 24742,
"ApplicationID": "com.streamco.player"
}
}
使用场景
用户在看视频时收到来电,系统发送 HideApp 将视频应用退到后台,显示来电界面。 通话结束后再通过 LaunchApp 将视频应用切回前台,应用可以从中断处继续播放。 与 StopApp 的区别:HideApp 保留应用状态,适合临时切换;StopApp 彻底关闭,适合不再使用时释放资源。
LauncherResponse —— 操作结果(0x03)
LaunchApp、StopApp 和 HideApp 的统一响应。包含一个状态码和可选的附加数据。 控制端根据 Status 判断操作是否成功,失败时 Data 中可能包含错误详情。
| 字段 | 类型 | 说明 |
|---|---|---|
| Status | StatusEnum | 操作结果状态码(见下方枚举) |
| Data | octstr | 可选的附加数据,成功时可能返回会话信息,失败时返回错误描述 |
// LauncherResponse 响应示例
// 启动成功
{
"Status": 0,
"Data": "session-id=xyz789"
}
// 应用不可用(未安装或不在目录中)
{
"Status": 1,
"Data": "Application not found in catalog"
}
// 等待用户确认(如首次启动需要同意条款)
{
"Status": 3,
"Data": "User approval required for first launch"
}
属性详解
ApplicationLauncher Cluster 共有 2 个属性。点击下方汇总表中的属性 ID 可跳转到对应的详细说明。
| ID | 名称 | 类型 | 说明 |
|---|---|---|---|
0x0000 |
CatalogList | list<uint16> | 设备支持的应用目录厂商 ID 列表 |
0x0001 |
CurrentApp | nullable ApplicationEPStruct | 当前前台运行的应用 |
应用管理(0x0000, 0x0001)
描述设备支持的应用目录范围和当前前台应用的状态。
| ID | 名称 | 类型 | 说明 |
|---|---|---|---|
0x0000 |
CatalogList(目录列表) | list<uint16> | 设备支持的应用目录厂商 ID(CatalogVendorID)列表。 Controller 发送 LaunchApp 时,Application 参数中的 CatalogVendorID 必须在此列表中,否则设备无法识别该应用标识。 需要 AP 特性 |
0x0001 |
CurrentApp(当前应用) | nullable ApplicationEPStruct |
当前处于前台的应用信息,包括应用标识和所在 Endpoint。
当没有应用在前台时为 null。
需要 AP 特性
|
CurrentApp 是从设备全局视角看「谁在前台」,而
ApplicationBasic 的 Status 属性是每个应用各自报告自己的运行状态。
一台电视上同时有多个应用的 Status 为 ActiveHidden(后台运行),但 CurrentApp 只指向一个前台应用(或 null)。
结构体定义
ApplicationLauncher Cluster 使用两个结构体来标识应用。
ApplicationEPStruct(应用端点结构体)
描述一个应用及其在设备上对应的 Endpoint。用于 CurrentApp 属性,
让 Controller 既能知道当前前台应用是什么,也能直接定位到它的 Endpoint 进行进一步交互。
| 字段 | 类型 | 必选 | 说明 |
|---|---|---|---|
| Application | ApplicationStruct | 是 | 应用的唯一标识(目录厂商 ID + 应用 ID) |
| Endpoint | endpoint-no | 否 | 应用所在的 Endpoint 编号。有了这个编号,Controller 可以直接访问该 Endpoint 上的其他 Cluster(如 MediaPlayback、ContentLauncher) |
ApplicationStruct(应用标识结构体)
通过目录体系唯一标识一个内容应用。这个结构体在 LaunchApp / StopApp / HideApp 命令和 CurrentApp 属性中都会用到, 也与 ApplicationBasic Cluster 的 Application(0x0004)属性共用同一结构。
| 字段 | 类型 | 说明 |
|---|---|---|
| CatalogVendorID | uint16 | 应用目录的厂商 ID,标识应用来源于哪个目录/平台。例如 CSA 官方目录的 ID 为 0x60AE(24750) |
| ApplicationID | string | 在目录内唯一标识应用的字符串,通常是反向域名风格。如 "com.netflix.app"、"com.youtube.tv" |
CatalogVendorID 是应用目录提供商的 VendorID,不是应用开发商的 VendorID。
可以理解为「这个应用在哪个应用商店上架的」。
同一个应用在不同目录中可能有不同的 ApplicationID,但 CatalogVendorID + ApplicationID 的组合在全局唯一。
枚举
StatusEnum
LauncherResponse 中的状态码,表示应用操作的结果。相比 ContentLauncher 的 StatusEnum,ApplicationLauncher 的状态码涵盖了应用安装和权限审批等场景。
Downloading (4) 和 Installing (5) 是中间状态 —— 收到后不代表操作失败,
而是需要 Controller 等待一段时间后重试 LaunchApp,或订阅相关属性变化来获知安装完成的时机。
PendingUserApproval (3) 同理,需要用户在设备端完成确认后才能继续。
Feature 位图
ApplicationLauncher Cluster 通过 FeatureMap(0xFFFC)声明设备支持的能力:
不启用 AP 特性的设备是单应用设备 —— 设备本身就是一个应用,LaunchApp/StopApp/HideApp 操作的就是这个设备自身。 启用 AP 后,设备是一个应用平台(如智能电视、机顶盒),上面安装了多个独立应用, 每个应用有自己的 Endpoint 和 ApplicationBasic Cluster。 AP 特性启用后才有 CatalogList(设备支持哪些应用目录)和 CurrentApp(当前前台是哪个应用)两个属性。
示例数据
一台启用了 AP(ApplicationPlatform)特性的智能电视的 ApplicationLauncher Cluster 属性读取结果:
{
// --- 支持的应用目录 ---
"0x0000": [24742, 4996], // CatalogList = 支持的目录厂商 ID 列表
// 24742 = CSA 官方目录
// 4996 = 某 OTT 平台目录
// --- 当前前台应用 ---
"0x0001": { // CurrentApp(当前应用,nullable)
"Application": { // ApplicationStruct
"CatalogVendorID": 24742, // 目录厂商 ID(CSA 官方)
"ApplicationID": "com.streamco.player" // 应用 ID
},
"Endpoint": 3 // 应用所在 Endpoint 编号
}
}
发送 LaunchApp 前,应先读取 CatalogList (0x0000) 确认设备支持目标应用所在的目录。
如果 CatalogVendorID 不在列表中,LaunchApp 会返回 AppNotAvailable (1)。
发送后检查 CurrentApp (0x0001) 的变化来确认应用是否成功切换到前台。
常见场景
场景 1:语音助手「打开 XXX 应用」
- 用户对语音助手说「在电视上打开 Netflix」
- 检查设备
FeatureMap (0xFFFC),确认支持 AP 特性 - 读取
CatalogList (0x0000),确认设备支持 CSA 官方目录(24742) - 遍历设备的各个 Endpoint,读取 ApplicationBasic 的
Application (0x0004)属性,找到 Netflix 对应的 ApplicationStruct - 发送
LaunchApp (0x00),传入 Netflix 的 ApplicationStruct - 检查 LauncherResponse 的 Status:
0(Success)—— Netflix 已启动1(AppNotAvailable)—— Netflix 未安装,提示用户3(PendingUserApproval)—— 首次启动需要在电视上确认
- 确认
CurrentApp (0x0001)已更新为 Netflix
场景 2:自动化场景 —— 睡眠模式关闭所有应用
- 用户设置了「睡眠模式」自动化规则:每晚 11 点自动关闭电视上的所有应用
- 读取
CurrentApp (0x0001)获取当前前台应用信息 - 如果 CurrentApp 不为
null,发送StopApp (0x01)停止该应用 - 遍历设备上所有应用 Endpoint,检查各自的 ApplicationBasic 的
Status属性 - 对所有 Status 不为 Stopped(0)的应用,逐个发送
StopApp (0x01) - 全部停止后,可配合 OnOff Cluster 将电视关闭或进入待机模式