You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
158 lines
4.9 KiB
158 lines
4.9 KiB
using System; |
|
using System.Collections.Generic; |
|
using System.Linq; |
|
using System.Text; |
|
using System.Text.Json.Serialization; |
|
using System.Threading.Tasks; |
|
|
|
namespace Common.Shared.Application.DaHua |
|
{ |
|
using System.Text.Json; |
|
using System.Text.Json.Serialization; |
|
|
|
/// <summary> |
|
/// 请求DTO,用于控制摄像头云台操作(变倍、变焦、光圈) |
|
/// </summary> |
|
public class CameraControlReqDto |
|
{ |
|
/// <summary> |
|
/// 数据体,包含摄像头控制的详细参数 |
|
/// </summary> |
|
[JsonPropertyName("data")] |
|
public CameraControlData Data { get; set; } |
|
} |
|
|
|
/// <summary> |
|
/// 摄像头控制参数(data字段) |
|
/// </summary> |
|
public class CameraControlData |
|
{ |
|
/// <summary> |
|
/// 视频通道编码(格式如:1004325$1$0$0) |
|
/// 要求:第一个$后的数字必须是1,且cameraType为2(球机) |
|
/// </summary> |
|
[JsonPropertyName("channelId")] |
|
public string ChannelId { get; set; } |
|
|
|
/// <summary> |
|
/// 操作类型:1 = 变倍,2 = 变焦,3 = 光圈 |
|
/// </summary> |
|
[JsonPropertyName("operateType")] |
|
[JsonConverter(typeof(JsonStringEnumConverterWithNumberMapping<OperateTypeEnum>))] |
|
public OperateTypeEnum OperateType { get; set; } |
|
|
|
/// <summary> |
|
/// 方向:1 = 增加,2 = 减小 |
|
/// </summary> |
|
[JsonPropertyName("direct")] |
|
[JsonConverter(typeof(JsonStringEnumConverterWithNumberMapping<DirectionEnum>))] |
|
public DirectionEnum Direct { get; set; } |
|
|
|
/// <summary> |
|
/// 转动速度(范围:1-8,越大越快) |
|
/// </summary> |
|
[JsonPropertyName("step")] |
|
public string Step { get; set; } |
|
|
|
/// <summary> |
|
/// 命令:0 = 停止动作,1 = 开启动作 |
|
/// ⚠ 停止时其余参数需与启动时一致 |
|
/// </summary> |
|
[JsonPropertyName("command")] |
|
public string Command { get; set; } |
|
|
|
/// <summary> |
|
/// 扩展字段(预留) |
|
/// </summary> |
|
[JsonPropertyName("extend")] |
|
public string Extend { get; set; } |
|
} |
|
|
|
/// <summary> |
|
/// 操作类型枚举:变倍 / 变焦 / 光圈 |
|
/// </summary> |
|
public enum OperateTypeEnum |
|
{ |
|
[EnumValue("1")] |
|
Zoom = 1, // 变倍 |
|
|
|
[EnumValue("2")] |
|
Focus = 2, // 变焦 |
|
|
|
[EnumValue("3")] |
|
Iris = 3 // 光圈 |
|
} |
|
|
|
/// <summary> |
|
/// 操作方向枚举:增加 / 减小 |
|
/// </summary> |
|
public enum DirectionEnum |
|
{ |
|
[EnumValue("1")] |
|
Increase = 1, |
|
|
|
[EnumValue("2")] |
|
Decrease = 2 |
|
} |
|
|
|
public class JsonStringEnumConverterWithNumberMapping<T> : JsonConverter<T> where T : struct, Enum |
|
{ |
|
public override T Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) |
|
{ |
|
try |
|
{ |
|
string rawValue = reader.TokenType switch |
|
{ |
|
JsonTokenType.String => reader.GetString(), |
|
JsonTokenType.Number => reader.GetInt32().ToString(), // 👈 新增对数值的处理 |
|
_ => throw new JsonException($"无法解析 {typeof(T).Name}:不支持的 JSON 类型 {reader.TokenType}") |
|
}; |
|
|
|
foreach (T enumValue in Enum.GetValues(typeof(T))) |
|
{ |
|
var attr = typeof(T).GetField(enumValue.ToString()) |
|
?.GetCustomAttributes(typeof(EnumValueAttribute), false) |
|
?.FirstOrDefault() as EnumValueAttribute; |
|
|
|
if (attr?.Value == rawValue) |
|
{ |
|
return enumValue; |
|
} |
|
} |
|
|
|
throw new JsonException($"无效的枚举值: {rawValue}"); |
|
} |
|
catch (Exception ex) |
|
{ |
|
throw new JsonException($"反序列化 {typeof(T).Name} 失败: {ex.Message}", ex); |
|
} |
|
} |
|
|
|
public override void Write(Utf8JsonWriter writer, T value, JsonSerializerOptions options) |
|
{ |
|
var attr = typeof(T).GetField(value.ToString()) |
|
?.GetCustomAttributes(typeof(EnumValueAttribute), false) |
|
?.FirstOrDefault() as EnumValueAttribute; |
|
|
|
if (attr != null) |
|
{ |
|
writer.WriteStringValue(attr.Value); |
|
} |
|
else |
|
{ |
|
writer.WriteStringValue(value.ToString()); |
|
} |
|
} |
|
} |
|
|
|
/// <summary> |
|
/// 自定义Enum值标记为特定字符串(如"1") |
|
/// </summary> |
|
[AttributeUsage(AttributeTargets.Field)] |
|
public class EnumValueAttribute : Attribute |
|
{ |
|
public string Value { get; } |
|
|
|
public EnumValueAttribute(string value) => Value = value; |
|
} |
|
} |