1. 驾驶舱
插件化手册
  • FH2 插件开发手册
    • 产品简介
    • 典型场景
    • 发版说明
    • 快速开始
      • 快速开始总览
      • 第一个插件
      • 后端插件
      • 全栈闭环
    • AI辅助开发
      • AI 开发 Skill
      • 安装与复验
      • 第一个工程
      • 真实需求示例:现场问题上报
      • 改造已有工程
      • 调试与交付
    • 开发指南
      • 开发指南
      • 基础概念
        • 基础概念总览
        • 什么是插件开发
        • 平台架构
        • 前端宿主、扩展点与能力
        • 后端运行时、入口与权限
        • 开发流程
        • 安全与隔离
        • 支持范围与问题反馈
      • 开发指南
        • 开发指南总览
        • 前端插件
          • 前端插件深度指南
          • 前端工程结构
          • 插件清单(fh2-plugin.json)
          • 入口与生命周期
          • 界面与状态
          • 多宿主插件
          • 跨宿主通信服务
          • HTTP、WebSocket 与事件
          • 存储、Blob 与定时器
          • 工具链与本地调试页面
        • 后端插件
          • 后端开发深度指南
          • 后端插件的结构
          • 后端源清单 fh2-plugin.json
          • HTTP 接口处理函数
          • 消息订阅与事件处理函数
          • ctx 与能力注入
          • 数据存储与缓存
          • 流程编排
          • 触发方式
          • 连接外部系统
          • 流程编排练习(DAG)
        • 前后端协作
          • 前后端协作总览
          • 前后端共享契约
          • 端到端幂等
          • 事件、通知与状态
          • 统一错误模型
          • 链路标识与诊断日志
        • 完整练习
          • 环境准备
          • 第一个前端插件
          • 第一个后端插件
          • 第一个全栈插件
      • 能力总览
        • 能力地图
        • 能力可用性矩阵
        • 前端能力
          • 平台通用能力
            • 平台通用能力总览
            • 基础运行时:HTTP、事件、WebSocket 与存储
            • 导航、位置与通知
            • 弹窗、音频与剪贴板
            • 地图能力
            • 项目设备能力
            • WPMZ 与航线预览
            • 受控对象上传
          • 项目宿主
            • 项目宿主总览
            • 项目上下文
            • 项目侧边栏入口
            • 项目插件路由
            • 项目工作区
          • 消息宿主
            • 消息宿主总览
            • 消息告警弹层
            • 消息导航与通知
          • 计划库宿主
            • 计划库宿主总览
            • 计划库表单上下文
            • 计划库表单扩展
            • 校验、提交与 `biz_ext`
          • 驾驶舱
            • 驾驶舱插件能力总览
            • 驾驶舱扩展点
            • 上下文与遥测
            • 相机、检测与 AI
            • 场景几何与直播指针
            • 飞控、云台与任务
            • 驾驶舱平台事件
        • 后端能力
          • 后端能力地图
          • 后端能力总览
          • 配置、受管出网与集成连接
          • 事件与流程
          • 飞行任务与违停巡逻
          • 数据存储
          • 媒体与前端通知
          • 资源租约
          • 作业、目标轨迹与视频处理
      • 调试与测试
        • 调试与测试总览
        • 快速入门排错
        • 本地开发
        • Web IDE:打开工程与保存改动
        • 工作流编辑器:节点、接线与交付
        • 知识与 MCP:先判断需要哪一层事实
        • 前端本地调试
        • 后端运行时与流程调试
        • 模拟数据与测试数据
        • 集成测试与 E2E
        • 日志与链路追踪
        • 常见问题排查
      • 完整示例
        • 示例与案例总览
        • 项目侧边栏与工作区
        • 消息告警卡片
        • 计划表单任务清单
        • 驾驶舱动作与左侧面板
        • 最小后端插件
        • 最小全栈插件
        • 多宿主插件实战
        • 事故快处
        • 交通抓拍
        • 违停巡逻完整案例
      • 构建发布与安全
        • 构建、发布与安全
        • 质量门禁
        • 行业包构建与打包
        • 能力版本发布
        • 安装、升级与回滚
        • 安全基线
      • API参考
        • API 参考总览
        • 前端
          • 前端 API 参考
          • 前端插件清单结构
          • 前端 SDK API
          • 前端扩展点目录
          • 前端能力目录
          • 前端平台事件目录
          • 跨宿主通信服务 API
          • 工具链命令行参考(`fh2-plugin`)
        • 后端
          • 后端 API 参考
          • 后端插件源清单
          • 后端 HTTP 接口参考
          • 后端事件消费参考
          • 后端脚本上下文(`ctx`)
          • 后端数据存储
          • 流程编排语言
          • 流程触发器参考
          • 后端能力目录
          • 后端 HTTP API
        • 共享契约
          • 共享契约参考
          • 类型与契约目录
          • 错误模型
          • 版本兼容性
      • 附录
        • 错误码
        • 术语表
        • 常见问题
  1. 驾驶舱

驾驶舱平台事件

平台事件是宿主主动推送给插件的广播。当前事件目录是封闭的,只有两个事件,且只有驾驶舱宿主会派发:
事件含义
cockpit.live.lifecycle直播通道的生命周期变化
cockpit.emergency-stop急停被触发或受理
订阅方式统一是 ctx.events.on(事件名, handler),并且清单里要声明 platform:events 权限。
⚠️ 事件不缓存、不重放:订阅之前发生的历史事件不会补发。ctx.events.on 返回一个可释放的订阅句柄,用完可以 dispose(),宿主卸载时插件运行时也会回收。

cockpit.live.lifecycle:直播生命周期#

type Payload = {
  phase: 'started' | 'first-frame' | 'stopped' | 'channel-changed'
  liveId: string
  cameraIndex: string | null
  timestamp: number        // 宿主桥接事件时的 Date.now()
}
phase含义可以开始逐帧处理吗
started直播通道建联成功否——不保证首帧已渲染
first-frame首帧渲染完成是
stopped通道停止(或主码流从 playing 变为非 playing)应停止逐帧业务并清理临时资源
channel-changed相机/通道切换先按旧画面失效处理,等新的 first-frame
要点:
逐帧处理(检测、截帧、叠加标注)只在 first-frame 之后做;started 不够。
同一路流可能出现语义重复的事件(比如重复的 stopped),按 liveId + phase 做幂等处理。
事件按设备过滤:路由里没有 droneSn 不派发;SDK 事件带的 SN 与当前路由不一致时丢弃。

示例:只在首帧后处理,停止时清理#

let readyLiveId: string | null = null
const off = await ctx.events.on('cockpit.live.lifecycle', ({ payload }) => {
  if (payload.phase === 'first-frame') {
    readyLiveId = payload.liveId
    startFrameProcessing(payload.liveId)
  }
  if ((payload.phase === 'stopped' || payload.phase === 'channel-changed')
    && readyLiveId === payload.liveId) {
    readyLiveId = null
    stopFrameProcessing()
  }
})

cockpit.emergency-stop:急停#

type Payload = {
  timestamp: number
  source?: string        // 仅 SDK 提供时才有
}
这个事件表示"驾驶舱 SDK 报告急停已触发或受理",不保证设备最终执行成功。当前 payload 里没有命令 ID,也没有设备终态字段。
正确用法:收到事件后把 UI 切到"等待确认"状态,继续读 cockpit:telemetry / cockpit:flight-task 确认设备实际状态。不要收到事件就当任务成功收尾,也不要假设急停一定来自你自己的插件(可能是宿主上的手动操作触发的)。
const off = await ctx.events.on('cockpit.emergency-stop', ({ payload }) => {
  ctx.logger.warn('急停已触发或受理', payload)
  showEmergencyPending()   // 进入"待确认",继续查状态
})

什么时候用事件、什么时候用状态#

需求用什么
当前是否已有任意直播出首帧cockpit:context 的 liveReady 水位
精确知道哪路流首帧/停止/换通道cockpit.live.lifecycle 事件
控制权、相机、云台、激光的当前值cockpit:telemetry
任务进度和终态cockpit:flight-task
急停被触发/受理的通知cockpit.emergency-stop,之后查状态

常见问题#

现象原因与处理
订阅了但收不到事件清单没声明 platform:events;或当前不在驾驶舱宿主(其他宿主不派发平台事件)
想收到订阅之前的直播事件事件不缓存不重放;激活时先读 cockpit:context.liveReady 兜底
收到重复的 stopped平台会在码流状态下降沿兜底补发;按 liveId + phase 幂等处理
急停事件后设备还在飞事件只代表触发/受理;设备终态要看遥测/飞行任务状态
修改于 2026-10-22 07:06:56
上一页
飞控、云台与任务
下一页
后端能力地图
Built with