具备界面基础功能
This commit is contained in:
@@ -1,25 +0,0 @@
|
||||
using System.Windows.Media;
|
||||
|
||||
namespace SHH.CameraDashboard
|
||||
{
|
||||
// 日志实体,用于在事件中传递详细信息
|
||||
public class ApiLogEntry
|
||||
{
|
||||
public DateTime Time { get; set; } = DateTime.Now;
|
||||
public string Method { get; set; } // GET, POST
|
||||
public string Url { get; set; }
|
||||
public int StatusCode { get; set; }
|
||||
public long DurationMs { get; set; } // 耗时(毫秒)
|
||||
public string RequestBody { get; set; } // 发送的内容
|
||||
public string ResponseBody { get; set; } // 接收的内容
|
||||
public string ErrorMessage { get; set; } // 异常信息
|
||||
|
||||
// 辅助属性:是否成功
|
||||
public bool IsSuccess => StatusCode >= 200 && StatusCode < 300;
|
||||
|
||||
// 辅助属性:显示颜色
|
||||
public Brush StatusColor => IsSuccess
|
||||
? new SolidColorBrush(Color.FromRgb(78, 201, 176)) // 绿色
|
||||
: new SolidColorBrush(Color.FromRgb(244, 71, 71)); // 红色
|
||||
}
|
||||
}
|
||||
@@ -1,31 +0,0 @@
|
||||
namespace SHH.CameraDashboard;
|
||||
|
||||
public class CameraInfo
|
||||
{
|
||||
// --- 原始 JSON 属性 ---
|
||||
public int Id { get; set; }
|
||||
public string Name { get; set; }
|
||||
public string IpAddress { get; set; }
|
||||
public DeviceBrand Brand { get; set; }
|
||||
public string Status { get; set; } // "Playing", "Disconnected" 等
|
||||
public bool IsPhysicalOnline { get; set; } // 物理在线 (网络)
|
||||
public bool IsOnline { get; set; } // 业务在线 (登录)
|
||||
public bool IsRunning { get; set; } // 正在运行 (拉流)
|
||||
public int RealFps { get; set; }
|
||||
public int Width { get; set; }
|
||||
public int Height { get; set; }
|
||||
|
||||
// --- UI 分离状态逻辑 ---
|
||||
|
||||
// 状态 1: 登录状态 (在线/离线)
|
||||
public string OnlineStatusText => (IsPhysicalOnline && IsOnline) ? "在线" : "离线";
|
||||
|
||||
// 状态 2: 运行状态 (运行/停止)
|
||||
public string RunningStatusText => IsRunning ? "运行中" : "已停止";
|
||||
|
||||
// 品牌信息
|
||||
public string BrandName => Brand.ToString();
|
||||
|
||||
public string DisplayName => string.IsNullOrEmpty(Name) ? IpAddress : Name;
|
||||
public string MediaDetail => IsRunning && Width > 0 ? $"{Width}x{Height} | {RealFps}fps" : "无信号";
|
||||
}
|
||||
@@ -1,63 +0,0 @@
|
||||
namespace SHH.CameraDashboard
|
||||
{
|
||||
/// <summary>
|
||||
/// 视频源物理/逻辑品牌类型
|
||||
/// 职责:用于工厂模式匹配具体的 IVideoSource 实现类,并定义基础通信协议栈
|
||||
/// </summary>
|
||||
public enum DeviceBrand
|
||||
{
|
||||
/// <summary>
|
||||
/// 未知
|
||||
/// </summary>
|
||||
Unknown = 0,
|
||||
|
||||
/// <summary>
|
||||
/// 海康威视 (HikVision)
|
||||
/// 技术路径:基于海康私有 SDK (HCNetSDK.dll / PlayCtrl.dll)。
|
||||
/// 特性:支持全功能控制(PTZ、对讲、配置、报警回传)。
|
||||
/// </summary>
|
||||
HikVision,
|
||||
|
||||
/// <summary>
|
||||
/// 大华 (Dahua)
|
||||
/// 技术路径:基于大华私有 SDK (dhnetsdk.dll / dhplay.dll)。
|
||||
/// 特性:支持全功能控制,与海康私有协议不兼容。
|
||||
/// </summary>
|
||||
Dahua,
|
||||
|
||||
/// <summary>
|
||||
/// USB 摄像头 / 虚拟摄像头
|
||||
/// 技术路径:基于 DirectShow 或 Windows Media Foundation。
|
||||
/// 特性:通常通过 OpenCV (VideoCapture) 或 DirectShowLib 直接读取本地硬件引用。
|
||||
/// </summary>
|
||||
Usb,
|
||||
|
||||
/// <summary>
|
||||
/// 标准 RTSP 流媒体
|
||||
/// 技术路径:基于标准 RTSP/RTP 协议 (RFC 2326)。
|
||||
/// 特性:跨品牌兼容,通常使用 FFmpeg 或 GStreamer 库取流,仅支持音视频,不支持云台控制。
|
||||
/// </summary>
|
||||
RtspGeneral,
|
||||
|
||||
/// <summary>
|
||||
/// 三恒自研 WebSocket 流
|
||||
/// 技术路径:基于 WebSocket 传输的自定义二进制或 Base64 帧。
|
||||
/// 特性:专用于 Web 或云端推送场景的私有流媒体格式。
|
||||
/// </summary>
|
||||
WebSocketShine,
|
||||
|
||||
/// <summary>
|
||||
/// 本地视频文件
|
||||
/// 技术路径:基于文件 IO 的离线解码。
|
||||
/// 特性:常用于算法演示、回放模拟,支持 Mp4, Avi, Mkv 等容器格式。
|
||||
/// </summary>
|
||||
File,
|
||||
|
||||
/// <summary>
|
||||
/// 未知/通用标准 (ONVIF)
|
||||
/// 技术路径:基于标准 ONVIF WebService。
|
||||
/// 特性:用于接入非主流厂商但符合 ONVIF 标准的设备,支持基础 PTZ。
|
||||
/// </summary>
|
||||
OnvifGeneral
|
||||
}
|
||||
}
|
||||
58
SHH.CameraDashboard/Models/LogWebApiModel.cs
Normal file
58
SHH.CameraDashboard/Models/LogWebApiModel.cs
Normal file
@@ -0,0 +1,58 @@
|
||||
namespace SHH.CameraDashboard
|
||||
{
|
||||
/// <summary>
|
||||
/// WebAPI 调用日志模型
|
||||
/// 用于记录 API 请求的详细信息,便于调试和性能分析
|
||||
/// </summary>
|
||||
public class LogWebApiModel
|
||||
{
|
||||
#region --- 核心属性 ---
|
||||
|
||||
/// <summary>
|
||||
/// 获取或设置请求发生的时间
|
||||
/// </summary>
|
||||
public DateTime Time { get; set; } = DateTime.Now;
|
||||
|
||||
/// <summary>
|
||||
/// 获取或设置 HTTP 请求方法 (GET, POST, PUT, DELETE 等)
|
||||
/// </summary>
|
||||
public string Method { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 获取或设置请求的 URL 路径
|
||||
/// </summary>
|
||||
public string Url { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 获取或设置响应的状态码 (200, 404, 500 等)
|
||||
/// </summary>
|
||||
public string StatusCode { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 获取或设置请求的原始数据 (JSON/XML 等)
|
||||
/// </summary>
|
||||
public string RequestData { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 获取或设置响应的原始数据 (JSON/XML 等)
|
||||
/// </summary>
|
||||
public string ResponseData { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 获取或设置请求处理耗时(毫秒)
|
||||
/// </summary>
|
||||
public long ElapsedMilliseconds { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 调用 WebAPI 的应用模块
|
||||
/// </summary>
|
||||
public string AppModule { get; set; } = "System";
|
||||
|
||||
/// <summary>
|
||||
/// 是否自动发送
|
||||
/// </summary>
|
||||
public bool IsAutoPost { get; set; } = false;
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
@@ -1,87 +0,0 @@
|
||||
using System.ComponentModel;
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Windows.Media;
|
||||
|
||||
namespace SHH.CameraDashboard
|
||||
{
|
||||
|
||||
// 1. 单个节点的数据模型
|
||||
public class ServerNode : INotifyPropertyChanged
|
||||
{
|
||||
private string _name = "新节点"; // 默认名称
|
||||
public string Name
|
||||
{
|
||||
get => _name;
|
||||
set { _name = value; OnPropertyChanged(); }
|
||||
}
|
||||
|
||||
private string _ip = "127.0.0.1";
|
||||
public string Ip
|
||||
{
|
||||
get => _ip;
|
||||
set
|
||||
{
|
||||
if (_ip != value)
|
||||
{
|
||||
_ip = value;
|
||||
OnPropertyChanged(); // 通知界面更新
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private int _port = 5000;
|
||||
public int Port
|
||||
{
|
||||
get => _port;
|
||||
set
|
||||
{
|
||||
if (_port != value)
|
||||
{
|
||||
_port = value;
|
||||
OnPropertyChanged();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private string _status = "未检测";
|
||||
public string Status
|
||||
{
|
||||
get => _status;
|
||||
set
|
||||
{
|
||||
_status = value;
|
||||
OnPropertyChanged();
|
||||
OnPropertyChanged(nameof(StatusColor)); // 状态变了,颜色也要跟着变
|
||||
}
|
||||
}
|
||||
public Brush StatusColor
|
||||
{
|
||||
get
|
||||
{
|
||||
switch (Status)
|
||||
{
|
||||
case "✅ 连接成功":
|
||||
return new SolidColorBrush(Color.FromRgb(78, 201, 176)); // 绿色
|
||||
case "❌ 状态码异常":
|
||||
return new SolidColorBrush(Color.FromRgb(255, 140, 0)); // 橙色 (警告)
|
||||
case "❌ 无法连接":
|
||||
return new SolidColorBrush(Color.FromRgb(244, 71, 71)); // 红色 (故障)
|
||||
case "⏳ 检测中...":
|
||||
return new SolidColorBrush(Color.FromRgb(86, 156, 214)); // 蓝色
|
||||
default:
|
||||
return new SolidColorBrush(Color.FromRgb(153, 153, 153)); // 灰色
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void SetResult(bool success, string msg)
|
||||
{
|
||||
Status = msg;
|
||||
}
|
||||
|
||||
public event PropertyChangedEventHandler PropertyChanged;
|
||||
protected void OnPropertyChanged([CallerMemberName] string name = null)
|
||||
=> PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
|
||||
}
|
||||
|
||||
}
|
||||
65
SHH.CameraDashboard/Models/ServiceNodeModel.cs
Normal file
65
SHH.CameraDashboard/Models/ServiceNodeModel.cs
Normal file
@@ -0,0 +1,65 @@
|
||||
using System.ComponentModel;
|
||||
|
||||
namespace SHH.CameraDashboard
|
||||
{
|
||||
/// <summary>
|
||||
/// 服务节点模型,用于表示一个可连接的服务端点
|
||||
/// </summary>
|
||||
public class ServiceNodeModel : INotifyPropertyChanged
|
||||
{
|
||||
#region --- 公共属性 ---
|
||||
|
||||
/// <summary>
|
||||
/// 获取或设置服务节点的名称
|
||||
/// </summary>
|
||||
public string ServiceNodeName { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 获取或设置服务节点的IP地址
|
||||
/// </summary>
|
||||
public string ServiceNodeIp { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 获取或设置服务节点的端口号
|
||||
/// </summary>
|
||||
public string ServiceNodePort { get; set; } = string.Empty;
|
||||
|
||||
#endregion
|
||||
|
||||
#region --- 状态属性 ---
|
||||
|
||||
private string _status = "未检测";
|
||||
/// <summary>
|
||||
/// 获取或设置服务节点的连接状态(如:未检测、在线、离线)
|
||||
/// </summary>
|
||||
public string Status
|
||||
{
|
||||
get => _status;
|
||||
set
|
||||
{
|
||||
_status = value;
|
||||
OnPropertyChanged(nameof(Status));
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region --- INotifyPropertyChanged 实现 ---
|
||||
|
||||
/// <summary>
|
||||
/// 当属性值更改时发生
|
||||
/// </summary>
|
||||
public event PropertyChangedEventHandler? PropertyChanged;
|
||||
|
||||
/// <summary>
|
||||
/// 引发 <see cref="PropertyChanged"/> 事件
|
||||
/// </summary>
|
||||
/// <param name="propertyName">已更改的属性名称</param>
|
||||
protected void OnPropertyChanged(string propertyName)
|
||||
{
|
||||
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
@@ -1,60 +0,0 @@
|
||||
|
||||
namespace SHH.CameraDashboard
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// 视频源逻辑状态枚举
|
||||
/// 描述了从配置加载到视频流稳定输出的完整生命周期
|
||||
/// </summary>
|
||||
public enum VideoSourceStatus
|
||||
{
|
||||
/// <summary>
|
||||
/// 已断开/初始状态。
|
||||
/// 此时资源已释放,尚未执行 Login 或 Start 操作。
|
||||
/// </summary>
|
||||
Disconnected,
|
||||
|
||||
/// <summary>
|
||||
/// 正在尝试建立网络连接。
|
||||
/// 此时正在进行 Socket 握手或探测设备 IP 是否可达。
|
||||
/// </summary>
|
||||
Connecting,
|
||||
|
||||
/// <summary>
|
||||
/// 正在进行身份验证。
|
||||
/// 连接已建立,正在提交 UserName/Password 调用 SDK 的 Login 接口。
|
||||
/// </summary>
|
||||
Authorizing,
|
||||
|
||||
/// <summary>
|
||||
/// 已登录/待机。
|
||||
/// 登录成功并获取到了设备元数据(Metadata),但尚未启动预览(RealPlay)。
|
||||
/// 适用于“仅管理,不看画面”的场景。
|
||||
/// </summary>
|
||||
Connected,
|
||||
|
||||
/// <summary>
|
||||
/// 正常取流播放中
|
||||
/// </summary>
|
||||
Playing,
|
||||
|
||||
/// <summary>
|
||||
/// 正在取流/正常运行中。
|
||||
/// 预览句柄已开启,取流回调函数正在持续接收数据帧并进行解码。
|
||||
/// </summary>
|
||||
Streaming,
|
||||
|
||||
/// <summary>
|
||||
/// 自动重连中。
|
||||
/// 检测到网络抖动或心跳丢失,SDK 正在尝试内部恢复,此时视频流可能处于停滞状态。
|
||||
/// </summary>
|
||||
Reconnecting,
|
||||
|
||||
/// <summary>
|
||||
/// 故障/异常状态。
|
||||
/// 发生了不可恢复的错误(如密码错误、最大连接数限制、设备强制离线)。
|
||||
/// 进入此状态通常需要人工干预或调用 Stop 后重新 Start。
|
||||
/// </summary>
|
||||
Faulted
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user