diff --git a/IoTSharp.Data/Enums.cs b/IoTSharp.Data/Enums.cs index d7ad5c90b8f877be350915661fdb7d5c969cf332..d28944f39adb76864f9dcfd703dbfc2888db43b7 100644 --- a/IoTSharp.Data/Enums.cs +++ b/IoTSharp.Data/Enums.cs @@ -173,12 +173,33 @@ namespace IoTSharp.Data /// 不使用 /// None, + /// + /// 平均数 + /// Mean, + /// + /// 中值 + /// Median, + /// + /// 最后一个值 + /// Last, + /// + /// 第一个值 + /// First, + /// + /// 最大 + /// Max, + /// + /// 最小 + /// Min, + /// + /// 合计 + /// Sum } diff --git a/IoTSharp/Controllers/DevicesController.cs b/IoTSharp/Controllers/DevicesController.cs index 9b7f312e0462e9435811cb941a80da293b65a1c1..36cd4edc1978c6c5db00749ccb0dba03932bd7b5 100644 --- a/IoTSharp/Controllers/DevicesController.cs +++ b/IoTSharp/Controllers/DevicesController.cs @@ -527,8 +527,15 @@ namespace IoTSharp.Controllers /// /// 返回指定设备的的遥测数据, 按照keyname 和指定时间范围获取,如果keyname 为 all , 则返回全部key 的数据 /// - /// Which device do you read? - /// 查询条件 + /// 指定设备ID + /// 查询条件例子: + ///{ + /// "keys": "", + /// "begin": "2022-03-23T11:44:56.488Z", + /// "every": "1.03:14:56:166", + /// "aggregate": "Mean" + /// } + /// /// [Authorize(Roles = nameof(UserRole.NormalUser))] [HttpPost("{deviceId}/TelemetryData")] diff --git a/IoTSharp/Dtos/TelemetryDataDto.cs b/IoTSharp/Dtos/TelemetryDataDto.cs index 87729dffe9e124fd3d7d35acc9218fb97e1c7b0a..b02791caf453f7b7b9c026bbe5ff7f6b1aa5216d 100644 --- a/IoTSharp/Dtos/TelemetryDataDto.cs +++ b/IoTSharp/Dtos/TelemetryDataDto.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Linq; +using System.Text.Json; using System.Threading.Tasks; namespace IoTSharp.Dtos @@ -16,6 +17,39 @@ namespace IoTSharp.Dtos public object Value { get; set; } } + public class TimespanConverterNewtonsoft : Newtonsoft.Json.JsonConverter + { + /// + /// Format: Days.Hours:Minutes:Seconds:Milliseconds + /// + public const string TimeSpanFormatString = @"d\.hh\:mm\:ss\:FFF"; + + public override void WriteJson(Newtonsoft.Json.JsonWriter writer, TimeSpan value, Newtonsoft.Json.JsonSerializer serializer) + { + var timespanFormatted = $"{value.ToString(TimeSpanFormatString)}"; + writer.WriteValue(timespanFormatted); + } + + public override TimeSpan ReadJson(Newtonsoft.Json.JsonReader reader, Type objectType, TimeSpan existingValue, bool hasExistingValue, Newtonsoft.Json.JsonSerializer serializer) + { + TimeSpan parsedTimeSpan; + TimeSpan.TryParseExact((string)reader.Value, TimeSpanFormatString, null, out parsedTimeSpan); + return parsedTimeSpan; + } + } + public class TimeSpanConverter : System.Text.Json.Serialization.JsonConverter + { + public override TimeSpan Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + return TimeSpan.Parse(reader.GetString()); + } + + public override void Write(Utf8JsonWriter writer, TimeSpan value, JsonSerializerOptions options) + { + writer.WriteStringValue(value.ToString()); + } + } + /// /// 查询历史遥测数据请求结构体 /// @@ -24,7 +58,7 @@ namespace IoTSharp.Dtos /// /// 要获取的键值, 如果为空, 则为全部 /// - public string keys { get; set; }=String.Empty; + public string keys { get; set; }= string.Empty; /// /// 开始时间 /// @@ -36,6 +70,11 @@ namespace IoTSharp.Dtos /// /// 数据截面聚合间隔 /// + /// 1.03:14:56:166 + /// d.hh:mm:ss:FFF + [Newtonsoft.Json. JsonConverter(typeof(TimespanConverterNewtonsoft))] + [Newtonsoft.Json.JsonProperty(TypeNameHandling = Newtonsoft.Json.TypeNameHandling.All)] + [System.Text.Json.Serialization.JsonConverter(typeof(TimeSpanConverter))] public TimeSpan every { get; set; }= TimeSpan.Zero; /// /// 数据截面计算方式, diff --git a/IoTSharp/IoTSharp.xml b/IoTSharp/IoTSharp.xml index a7c73ab0579bbecf16ad7f15dba331a6254fdd2a..4363454797314540d584825d8be71e644d36130a 100644 --- a/IoTSharp/IoTSharp.xml +++ b/IoTSharp/IoTSharp.xml @@ -701,6 +701,11 @@ 是否被安装 + + + Format: Days.Hours:Minutes:Seconds:Milliseconds + + 查询历史遥测数据请求结构体