From c597921c60fecf4e75b8d40b5a29806a1ea19f8b Mon Sep 17 00:00:00 2001 From: hehaoyang <1109196436@qq.com> Date: Sun, 28 Jan 2024 01:08:40 +0800 Subject: [PATCH] 20240128 --- HxServer/HxServer/HxServer.csproj | 2 - HxServer/HxServer/ReadMe.cs | 20 +-- HxServer/HxServer/Utils/DebugTrace.cs | 8 +- HxServer/HxServer/Utils/FileUtils.cs | 36 ++--- HxServer/HxServer/Utils/HttpUtils.cs | 13 +- HxServer/HxServer/Utils/TaskUtils.cs | 4 +- ReadMe.md | 212 ++++++++++++++++++++++++++ 通信协议说明(守护程序).docx | Bin 24395 -> 0 bytes 8 files changed, 246 insertions(+), 49 deletions(-) create mode 100644 ReadMe.md delete mode 100644 通信协议说明(守护程序).docx diff --git a/HxServer/HxServer/HxServer.csproj b/HxServer/HxServer/HxServer.csproj index c3801f5..c65ee0f 100644 --- a/HxServer/HxServer/HxServer.csproj +++ b/HxServer/HxServer/HxServer.csproj @@ -13,8 +13,6 @@ - - diff --git a/HxServer/HxServer/ReadMe.cs b/HxServer/HxServer/ReadMe.cs index ddec39b..fbd005a 100644 --- a/HxServer/HxServer/ReadMe.cs +++ b/HxServer/HxServer/ReadMe.cs @@ -1,9 +1,5 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics.CodeAnalysis; -using System.Linq; +using System.Diagnostics.CodeAnalysis; using System.Text; -using System.Threading.Tasks; namespace HxServer; @@ -14,14 +10,14 @@ public class ReadMe { public static string AppName { get => "HxServer"; } - public static string VersionString { get => $"{AppName} V{Version.First().Key.Split(' ')[0]} ({Version.First().Key.Split(' ')[3]})"; } + public static string VersionString => $"{AppName} V{Version.First().Key.Split(' ')[0]} ({Version.First().Key.Split(' ')[3]})"; - static Dictionary> Version = new Dictionary>() + static readonly Dictionary> Version = new() { - ["1.00 Alpha Bulid 20240111"] = new List() - { + ["1.00 Alpha Bulid 20240111"] = + [ "版本名称格式变换", - }, + ], }; [RequiresAssemblyFiles()] @@ -33,9 +29,9 @@ public class ReadMe using (FileStream fr = new(Path.Combine(path, "ReadMe.md"), FileMode.OpenOrCreate, FileAccess.Write, FileShare.ReadWrite)) { - using (StreamWriter sw = new StreamWriter(fr, Encoding.UTF8)) + using (StreamWriter sw = new(fr, Encoding.UTF8)) { - StringBuilder sb = new StringBuilder(); + StringBuilder sb = new(); sb.AppendLine($"# {AppName}").AppendLine(); foreach (var item in Version) { diff --git a/HxServer/HxServer/Utils/DebugTrace.cs b/HxServer/HxServer/Utils/DebugTrace.cs index 498f0dc..403a785 100644 --- a/HxServer/HxServer/Utils/DebugTrace.cs +++ b/HxServer/HxServer/Utils/DebugTrace.cs @@ -1,10 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace HxServer.Utils +namespace HxServer.Utils { public class DebugTrace { diff --git a/HxServer/HxServer/Utils/FileUtils.cs b/HxServer/HxServer/Utils/FileUtils.cs index d903610..fb7aeb8 100644 --- a/HxServer/HxServer/Utils/FileUtils.cs +++ b/HxServer/HxServer/Utils/FileUtils.cs @@ -1,48 +1,49 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using System.Text; namespace HxServer.Utils; public class FileUtils { public static long Size(string fullpath) { try { return new FileInfo(fullpath).Length; } catch { return 0; } } + public static string GetName(string fullpath) { try { return new FileInfo(fullpath).Name; } catch { return ""; } } + public static string ReadString(string fullpath) { try { return File.ReadAllText(fullpath); } catch { return ""; } } + public static byte[] ReadBytes(string fullpath) { try { return File.ReadAllBytes(fullpath); } catch { return null; } } public static void Append(string fullpath, string contents) { try { - Directory.CreateDirectory(fullpath.Substring(0, fullpath.LastIndexOf("/"))); + Directory.CreateDirectory(fullpath[..fullpath.LastIndexOf('/')]); - using FileStream fr = new FileStream(fullpath, FileMode.Append, FileAccess.Write, FileShare.ReadWrite); - using StreamWriter sw = new StreamWriter(fr, Encoding.UTF8); + using FileStream fr = new(fullpath, FileMode.Append, FileAccess.Write, FileShare.ReadWrite); + using StreamWriter sw = new(fr, Encoding.UTF8); sw.WriteLine(contents); } catch { } } + public static void Append(string fullpath, byte[] contents) { try { - Directory.CreateDirectory(fullpath.Substring(0, fullpath.LastIndexOf("/"))); + Directory.CreateDirectory(fullpath[..fullpath.LastIndexOf('/')]); - using FileStream fr = new FileStream(fullpath, FileMode.Append, FileAccess.Write, FileShare.ReadWrite); + using FileStream fr = new(fullpath, FileMode.Append, FileAccess.Write, FileShare.ReadWrite); fr.Write(contents, 0, contents.Length); } catch { } } + public static void Append(string fullpath, byte[] contents, int offset, int count) { try { - Directory.CreateDirectory(fullpath.Substring(0, fullpath.LastIndexOf("/"))); + Directory.CreateDirectory(fullpath[..fullpath.LastIndexOf('/')]); - using FileStream fr = new FileStream(fullpath, FileMode.Append, FileAccess.Write, FileShare.ReadWrite); + using FileStream fr = new(fullpath, FileMode.Append, FileAccess.Write, FileShare.ReadWrite); fr.Write(contents, offset, count); } catch { } @@ -52,23 +53,22 @@ public class FileUtils { try { - Directory.CreateDirectory(fullpath.Substring(0, fullpath.LastIndexOf("/"))); + Directory.CreateDirectory(fullpath[..fullpath.LastIndexOf('/')]); - using FileStream fr = new FileStream(fullpath, FileMode.Create, FileAccess.Write, FileShare.ReadWrite); - using StreamWriter sw = new StreamWriter(fr, Encoding.UTF8); + using FileStream fr = new(fullpath, FileMode.Create, FileAccess.Write, FileShare.ReadWrite); + using StreamWriter sw = new(fr, Encoding.UTF8); sw.WriteLine(contents); } catch { } } - public static void WriteFile(string fullpath, byte[] contents) { try { - Directory.CreateDirectory(fullpath.Substring(0, fullpath.LastIndexOf("/"))); + Directory.CreateDirectory(fullpath[..fullpath.LastIndexOf('/')]); - using FileStream fr = new FileStream(fullpath, FileMode.Create, FileAccess.Write, FileShare.ReadWrite); + using FileStream fr = new(fullpath, FileMode.Create, FileAccess.Write, FileShare.ReadWrite); fr.Write(contents, 0, contents.Length); } catch { } diff --git a/HxServer/HxServer/Utils/HttpUtils.cs b/HxServer/HxServer/Utils/HttpUtils.cs index b7ec044..a3e954a 100644 --- a/HxServer/HxServer/Utils/HttpUtils.cs +++ b/HxServer/HxServer/Utils/HttpUtils.cs @@ -1,7 +1,4 @@ -using System; -using System.Net; -using System.Net.Http; -using System.Text; +using System.Net; namespace HxServer.Utils; @@ -57,7 +54,7 @@ public class HttpUtils /* 设置返回数据为JSON类 */ Context.Response.AddHeader("Content-Type", "application/json"); - System.Threading.Tasks.Task.Factory.StartNew(() => ListenCallBack?.Invoke(null, Context)); + Task.Factory.StartNew(() => ListenCallBack?.Invoke(null, Context)); } /// @@ -71,7 +68,7 @@ public class HttpUtils { result = string.Empty; - using var client = new HttpClient() { Timeout = TimeSpan.FromSeconds(seconds) }; + using HttpClient client = new() { Timeout = TimeSpan.FromSeconds(seconds) }; var response = client.GetAsync(url).Result; if (response.IsSuccessStatusCode) { @@ -97,8 +94,8 @@ public class HttpUtils HttpContent content = new StringContent(data.ToString()); content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/josn"); - using HttpClient client = new(); - HttpResponseMessage res = client.PostAsync(url, content).Result; + using HttpClient client = new() { Timeout = TimeSpan.FromSeconds(seconds) }; + var res = client.PostAsync(url, content).Result; if (res.IsSuccessStatusCode) { result = res.Content.ReadAsStringAsync().Result; diff --git a/HxServer/HxServer/Utils/TaskUtils.cs b/HxServer/HxServer/Utils/TaskUtils.cs index 48dec7b..9e83afc 100644 --- a/HxServer/HxServer/Utils/TaskUtils.cs +++ b/HxServer/HxServer/Utils/TaskUtils.cs @@ -12,9 +12,9 @@ namespace HxServer.Utils; #pragma warning disable IL2026 // Using dynamic types might cause types or members to be removed by trimmer. public class TaskUtils { - private static ConcurrentDictionary TaskQueue = new ConcurrentDictionary(); + private static ConcurrentDictionary TaskQueue = new(); - private static ConcurrentDictionary Dispatchers = new ConcurrentDictionary(); + private static ConcurrentDictionary Dispatchers = new(); public static bool TryCancel(Guid guid) { diff --git a/ReadMe.md b/ReadMe.md new file mode 100644 index 0000000..5bc623e --- /dev/null +++ b/ReadMe.md @@ -0,0 +1,212 @@ +# 通讯协议 + +- [协议结构](#协议结构) +- [数据格式](#数据格式) + - [心跳](#心跳) + - [查询软件参数信息](#查询软件参数信息) + - [修改软件参数信息](#修改软件参数信息) + - [查询日志](#查询日志) + - [添加日志](#添加日志) + - [查询录像](#查询录像) + - [更新录像数据](#更新录像数据) + - [删除录像数据](#删除录像数据) + +## 协议结构 + +| 参数名称 | 类型 | 描述 | +| --- | --- | --- | +| action_type | int | 操作类型 | +| msgInfo | object | 每个接口特有的参数,详见每个接口定义 | + +## 数据格式 + +### 心跳 + +| 参数名称 | 类型 | 描述 | +| --- | --- | --- | +| action_type | int | 0 | +| msgInfo | object | | + +**msgInfo** 参数如下 + +| 参数名称 | 类型 | 描述 | +| --- | --- | --- | +| name | string | 程序名称 | +| version | string | 版本信息 | + +### 查询软件参数信息 + +* 请求 + +| 参数名称 | 类型 | 描述 | +| --- | --- | --- | +| action_type | int | 1 | + +* 回复 + +| 参数名称 | 类型 | 描述 | +| --- | --- | --- | +| action_type | int | 1 | +| msgInfo | Dictionary < string, string > | 设置信息 | + + +### 修改软件参数信息 + +* 请求 + +| 参数名称 | 类型 | 描述 | +| --- | --- | --- | +| action_type | int | 2 | +| msgInfo | Dictionary < string, string > | 设置信息 | + +* 回复 + +| 参数名称 | 类型 | 描述 | +| --- | --- | --- | +| action_type | int | 2 | +| msgInfo | object | | + +**msgInfo** 参数如下 + +| 参数名称 | 类型 | 描述 | +| --- | --- | --- | +| status | bool | true: 成功; false: 失败; | +| message | string | 异常信息 | + +### 查询日志 + +* 请求 + +| 参数名称 | 类型 | 描述 | +| --- | --- | --- | +| action_type | int | 3 | +| msgInfo | object | | + +**msgInfo** 参数如下 + +| 参数名称 | 类型 | 描述 | +| --- | --- | --- | +| type | int | 0: 系统事件; 1: 用户操作; 2: 视频通道; | +| date | string | 日期 | +| index | int | 通道号(仅视频通道日志有效) | +| month | bool | true: 检索全月; false: 不检索全月 | + +* 回复 + +| 参数名称 | 类型 | 描述 | +| --- | --- | --- | +| action_type | int | 3 | +| msgInfo | object[] | | + +**msgInfo ** 参数如下 + +| 参数名称 | 类型 | 描述 | +| --- | --- | --- | +| timestamp | DateTime | 事件事件 | +| type | int | 事件类型 | +| index | int | 视频通道日志类型时为通道号,其他为空 | +| message | string | 消息 | +| data | string | 详细信息 | + + +### 添加日志 + +* 请求 + +| 参数名称 | 类型 | 描述 | +| --- | --- | --- | +| action_type | int | 4 | +| msgInfo | object | | + +**msgInfo** 参数如下 + +| 参数名称 | 类型 | 描述 | +| --- | --- | --- | +| timestamp | DateTime | 事件事件 | +| type | int | 事件类型 | +| index | int | 视频通道日志类型时为通道号,其他为空 | +| message | string | 消息 | +| data | string | 详细信息 | + +### 查询录像 + +* 请求 + +| 参数名称 | 类型 | 描述 | +| --- | --- | --- | +| action_type | int | 5 | +| msgInfo | object | | + +> **msgInfo** 参数为空,查询最早的一条录像数据 + +> **msgInfo** 参数如下, 按通道、开始日期、结束日期参数查询录像数据 + +| 参数名称 | 类型 | 描述 | +| --- | --- | --- | +| channel | int | 通道号 | +| start_date | DateTime | 开始日期 | +| end_date | DateTime | 结束日期 | + +> **msgInfo** 参数如下, 按日期查询录像数据 + +| 参数名称 | 类型 | 描述 | +| --- | --- | --- | +| date | DateTime | 日期 | + + +* 回复 + +| 参数名称 | 类型 | 描述 | +| --- | --- | --- | +| action_type | int | 5 | +| msgInfo | object[] | | + +**msgInfo ** 参数如下 + +| 参数名称 | 类型 | 描述 | +| --- | --- | --- | +| channel | int | 通道号 | +| start_date | DateTime | 开始日期 | +| end_date | DateTime | 结束日期 | +| duration | int | 录像时长 | +| name | string | 文件名称 | +| path | string | 文件路径 | + +### 更新录像数据 + +* 请求 + +| 参数名称 | 类型 | 描述 | +| --- | --- | --- | +| action_type | int | 6 | +| msgInfo | object | | + +**msgInfo ** 参数如下 + +| 参数名称 | 类型 | 描述 | +| --- | --- | --- | +| channel | int | 通道号 | +| start_date | DateTime | 开始日期 | +| end_date | DateTime | 结束日期 | +| duration | int | 录像时长 | +| name | string | 文件名称 | +| path | string | 文件路径 | + +### 删除录像数据 + +| 参数名称 | 类型 | 描述 | +| --- | --- | --- | +| action_type | int | 7 | +| msgInfo | object | | + +> **msgInfo** 参数如下, 按文件路径删除录像 + +| 参数名称 | 类型 | 描述 | +| --- | --- | --- | +| path | string | 文件路径 | + +> **msgInfo** 参数如下, 按录像日期删除录像 + +| 参数名称 | 类型 | 描述 | +| --- | --- | --- | +| date | DateTime | 日期 | \ No newline at end of file diff --git a/通信协议说明(守护程序).docx b/通信协议说明(守护程序).docx deleted file mode 100644 index e22b877717ab674eaa5c40f300e08148342c7ca4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24395 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

I2~8>mIaMc0d|<94fSElVKO<>{X%)d5u9~~_ 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