AI-NVR 移动应用内部结构#
设备访问#
该移动应用有两个启动入口点。一个用于直接访问 AI-NVR 设备,设备访问将基于 <device ip>:端口,而不是通过云端点。第二个入口点用于通过云远程访问设备。此版本不支持通过云远程访问设备。

用户登录#
在使用基于云的访问启动应用时,应用做的第一件事是检查是否已登录用户并持有有效令牌。如果是首次启动或令牌过期的情况,将启动如下所述的登录流程。

与 AI-NVR 设备的通信#
该应用使用 MVVM 模式。
每个请求都从 UI 类(通常是片段或对话框)发起,同时配置一个 Observer 来接收来自 ViewModel 的响应并处理它。
对 API 的调用通过相应模块的 ViewModel 路由到模块仓库,并使用 Retrofit 执行请求。响应被传递回 ViewModel,ViewModel 使用 LiveData 调用 UI 更新并在 Observer 上触发事件。
视频存储工具包 (VST)#
VST API 负责连接的摄像头、流管理和操作。请参阅以下列表中应用中使用的 VST API。
传感器
GET sensor/list:获取传感器/摄像头列表,包含一些详细信息
GET sensor/streams:获取传感器流信息列表
流
POST replay/stream/seek:快进 (+10 秒)、快退 (-10 秒)、倒带和快进
POST replay/stream/pause:暂停录制流播放
POST replay/stream/resume:恢复录制流播放
POST replay/stream/stop:停止 WebRTC 流媒体
POST replay/stream/swap:将流类型从直播切换到录制
POST replay/stream/start:开始 WebRTC 流媒体
GET replay/stream/status:获取流错误状态和播放状态,如 PLAYING、PAUSED、NOT PLAYING
GET replay/stream/stats:获取流统计信息,如帧率、总编码和解码帧数
GET replay/stream/query:获取流上次播放时间戳和相关元数据(如果可用)
以下流程演示了获取已连接摄像头的过程。

从列表中播放/暂停摄像头由 CameraStackAdapter 类中的 setClickListenerState() 触发,该类覆盖了 onRequestStreamState 接口,并最终调用 CameraStackViewModel 类中的一个函数。每个更改 WebRTC 播放器状态(播放/暂停/停止)的媒体播放器请求都从 UI 类(通常是片段或对话框) -> ViewModel -> RtcClient -> Service 类 -> 使用 Retrofit 执行请求的模块 发起。以下流程演示了从 CameraStackAdapter 播放其中一个流。

eMDAT API#
eMDAT API 负责管理 gems - FOV(视野)、绊线和 ROI(感兴趣区域)。它还负责从 gem 数据中检索分析数据。请参阅以下列表中应用中使用的 eMDAT API 函数。
FOV (视野)
GET metrics/occupancy/fov/histogram:列出摄像头视野内的人数
绊线
GET metrics/tripwire/histogram:列出绊线事件计数和警报
GET config/tripwire:列出所有绊线配置
POST config/tripwire:创建绊线
DELETE config/tripwire:删除绊线
GET config/tripwire/history:列出历史绊线配置
GET config/rule/alerts/tripwire:列出绊线警报规则
POST config/rule/alerts/tripwire:创建绊线警报规则
DELETE config/rule/alerts/tripwire:删除绊线警报规则
GET config/rule/alerts/tripwire/history:列出历史绊线警报规则
ROI (感兴趣区域)
GET metrics/occupancy/roi/histogram:列出 ROI 计数和警报
GET config/roi:列出所有 ROI 配置
POST config/roi:创建 ROI
DELETE config/roi:删除 ROI
GET config/roi/history:列出历史 ROI 配置
GET config/rule/alerts/roi:列出 ROI 警报规则
POST config/rule/alerts/roi:创建 ROI 警报规则
DELETE config/rule/alerts/roi:删除 ROI 警报规则
GET config/rule/alerts/roi/history:列出历史 ROI 警报规则
警报
GET alerts:列出所有警报
以下图表演示了选择绊线和获取占用数据的简化流程。

启用/禁用实时警报#
参考云上的这些 API 负责为 Jetson 移动应用云连接启用和禁用实时警报。
POST api/enable-notification:启用实时警报。
POST api/disable-notification:禁用实时警报。
以下图表演示了为直接设备和基于云的访问启用/禁用和接收实时警报的简化流程。
