Compare commits
No commits in common. "e54f6012789cf2e27568dcf0b65b3098d73f3639" and "b9a7b1350bc78c292696bda3dd4a030ff80b678f" have entirely different histories.
e54f601278
...
b9a7b1350b
|
@ -9,7 +9,7 @@
|
||||||
public static class Topics
|
public static class Topics
|
||||||
{
|
{
|
||||||
// ReSharper disable once InconsistentNaming
|
// ReSharper disable once InconsistentNaming
|
||||||
private const string SN = "G5506771257";
|
private const string SN = "5506771257";
|
||||||
|
|
||||||
private const string Version = "1.0.0";
|
private const string Version = "1.0.0";
|
||||||
|
|
||||||
|
|
|
@ -1,42 +1,22 @@
|
||||||
using Serilog;
|
namespace MasstransferCommon.Scheduler;
|
||||||
|
|
||||||
namespace MasstransferCommon.Scheduler;
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 延时定时任务
|
/// 延时定时任务
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class DelayScheduler
|
public class DelayScheduler
|
||||||
{
|
{
|
||||||
/// <summary>
|
private Timer _timer;
|
||||||
/// 设定延时任务
|
private Action _action;
|
||||||
/// </summary>
|
|
||||||
/// <param name="action"></param>
|
|
||||||
/// <param name="delay"></param>
|
|
||||||
/// <param name="cancellationToken"></param>
|
|
||||||
/// <exception cref="ArgumentNullException"></exception>
|
|
||||||
/// <exception cref="ArgumentOutOfRangeException"></exception>
|
|
||||||
public static async void Delay(Action action, TimeSpan delay, CancellationToken cancellationToken = default)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
if (action == null) throw new ArgumentNullException(nameof(action));
|
|
||||||
if (delay.TotalMilliseconds < 0)
|
|
||||||
throw new ArgumentOutOfRangeException(nameof(delay), "延时时间不能为负数");
|
|
||||||
|
|
||||||
await Task.Delay(delay, cancellationToken);
|
public void Schedule(Action action, TimeSpan delay)
|
||||||
if (cancellationToken.IsCancellationRequested)
|
|
||||||
{
|
{
|
||||||
return;
|
_action = action;
|
||||||
|
_timer = new Timer(TimerCallback, null, delay, Timeout.InfiniteTimeSpan);
|
||||||
}
|
}
|
||||||
|
|
||||||
action();
|
private void TimerCallback(object? state)
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
{
|
||||||
if (e is not TaskCanceledException)
|
_timer?.Dispose();
|
||||||
{
|
_action?.Invoke();
|
||||||
Log.Error(e, "延时任务执行失败");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -1,9 +0,0 @@
|
||||||
namespace MasstransferCommon.Atrributes;
|
|
||||||
|
|
||||||
public interface Instant
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// 初始化对象后进行回调
|
|
||||||
/// </summary>
|
|
||||||
void Initialized();
|
|
||||||
}
|
|
|
@ -28,15 +28,11 @@ public class JsonUtil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static T? FromJson<T>(string json)
|
public static T FromJson<T>(string json)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var settings = new JsonSerializerSettings
|
return JsonConvert.DeserializeObject<T>(json);
|
||||||
{
|
|
||||||
NullValueHandling = NullValueHandling.Ignore
|
|
||||||
};
|
|
||||||
return JsonConvert.DeserializeObject<T>(json, settings);
|
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
|
@ -56,7 +52,7 @@ public class JsonUtil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static T? FromJsonOrDefault<T>(string json)
|
public static T FromJsonOrDefault<T>(string json)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
|
|
@ -22,11 +22,11 @@ public static class RegistryHelper
|
||||||
public static void DeleteValue(string keyPath, string valueName)
|
public static void DeleteValue(string keyPath, string valueName)
|
||||||
{
|
{
|
||||||
using var key = Registry.CurrentUser.OpenSubKey(keyPath, writable: true);
|
using var key = Registry.CurrentUser.OpenSubKey(keyPath, writable: true);
|
||||||
key?.DeleteValue(valueName, false);
|
key?.DeleteValue(valueName);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void DeleteKey(string keyPath)
|
public static void DeleteKey(string keyPath)
|
||||||
{
|
{
|
||||||
Registry.CurrentUser.DeleteSubKeyTree(keyPath, false);
|
Registry.CurrentUser.DeleteSubKeyTree(keyPath, throwOnMissingSubKey: false);
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -1,103 +0,0 @@
|
||||||
namespace MasstransferCommon.Utils;
|
|
||||||
|
|
||||||
using System;
|
|
||||||
|
|
||||||
public class SnowflakeId
|
|
||||||
{
|
|
||||||
private static readonly DateTime Epoch = new DateTime(2020, 1, 1, 0, 0, 0, DateTimeKind.Utc);
|
|
||||||
private const int WorkerIdBits = 5;
|
|
||||||
private const int DatacenterIdBits = 5;
|
|
||||||
private const int SequenceBits = 12;
|
|
||||||
|
|
||||||
private const long MaxWorkerId = -1L ^ (-1L << WorkerIdBits);
|
|
||||||
private const long MaxDatacenterId = -1L ^ (-1L << DatacenterIdBits);
|
|
||||||
|
|
||||||
private const long WorkerIdShift = SequenceBits;
|
|
||||||
private const long DatacenterIdShift = SequenceBits + WorkerIdBits;
|
|
||||||
private const long TimestampLeftShift = SequenceBits + WorkerIdBits + DatacenterIdBits;
|
|
||||||
private const long SequenceMask = -1L ^ (-1L << SequenceBits);
|
|
||||||
|
|
||||||
private readonly object _lock = new object();
|
|
||||||
private long _lastTimestamp = -1L;
|
|
||||||
private long _sequence = 0L;
|
|
||||||
|
|
||||||
private static readonly SnowflakeId Instance = new SnowflakeId(0, 0);
|
|
||||||
|
|
||||||
public long WorkerId { get; }
|
|
||||||
public long DatacenterId { get; }
|
|
||||||
|
|
||||||
public SnowflakeId(long workerId, long datacenterId)
|
|
||||||
{
|
|
||||||
if (workerId > MaxWorkerId || workerId < 0)
|
|
||||||
{
|
|
||||||
throw new ArgumentException($"workerId must be between 0 and {MaxWorkerId}");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (datacenterId > MaxDatacenterId || datacenterId < 0)
|
|
||||||
{
|
|
||||||
throw new ArgumentException($"datacenterId must be between 0 and {MaxDatacenterId}");
|
|
||||||
}
|
|
||||||
|
|
||||||
WorkerId = workerId;
|
|
||||||
DatacenterId = datacenterId;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static string GetNextId()
|
|
||||||
{
|
|
||||||
return Instance.NextId().ToString();
|
|
||||||
}
|
|
||||||
|
|
||||||
private long NextId()
|
|
||||||
{
|
|
||||||
lock (_lock)
|
|
||||||
{
|
|
||||||
var timestamp = TimeGen();
|
|
||||||
|
|
||||||
if (timestamp < _lastTimestamp)
|
|
||||||
{
|
|
||||||
throw new InvalidOperationException("Clock moved backwards. Refusing to generate id");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (_lastTimestamp == timestamp)
|
|
||||||
{
|
|
||||||
_sequence = (_sequence + 1) & SequenceMask;
|
|
||||||
if (_sequence == 0)
|
|
||||||
{
|
|
||||||
timestamp = TilNextMillis(_lastTimestamp);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
_sequence = 0L;
|
|
||||||
}
|
|
||||||
|
|
||||||
_lastTimestamp = timestamp;
|
|
||||||
|
|
||||||
return ((timestamp - EpochTicks()) << (int)TimestampLeftShift) |
|
|
||||||
(DatacenterId << (int)DatacenterIdShift) |
|
|
||||||
(WorkerId << (int)WorkerIdShift) |
|
|
||||||
_sequence;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private long TilNextMillis(long lastTimestamp)
|
|
||||||
{
|
|
||||||
var timestamp = TimeGen();
|
|
||||||
while (timestamp <= lastTimestamp)
|
|
||||||
{
|
|
||||||
timestamp = TimeGen();
|
|
||||||
}
|
|
||||||
|
|
||||||
return timestamp;
|
|
||||||
}
|
|
||||||
|
|
||||||
private long TimeGen()
|
|
||||||
{
|
|
||||||
return (long)(DateTime.UtcNow - Epoch).TotalMilliseconds;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static long EpochTicks()
|
|
||||||
{
|
|
||||||
return (long)(Epoch - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalMilliseconds;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,5 +1,4 @@
|
||||||
using MasstransferCommon.Atrributes;
|
using MasstransferCommon.Events;
|
||||||
using MasstransferCommon.Events;
|
|
||||||
using MasstransferCommon.Model.Constant;
|
using MasstransferCommon.Model.Constant;
|
||||||
using MasstransferCommon.Utils;
|
using MasstransferCommon.Utils;
|
||||||
using MasstransferCommunicate.Mqtt.Client;
|
using MasstransferCommunicate.Mqtt.Client;
|
||||||
|
@ -11,12 +10,17 @@ namespace MasstransferExporter.DataExporter;
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 配置服务
|
/// 配置服务
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class ConfigService : Instant
|
public class ConfigService
|
||||||
{
|
{
|
||||||
|
static ConfigService()
|
||||||
|
{
|
||||||
|
EventBus<bool>.AddEventHandler(EventType.StartUp, async () => { await ListenConfigIssuedEvent(); });
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 监听配置下发事件
|
/// 监听配置下发事件
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private static async Task ListenConfigIssuedEvent(EventType type, bool start)
|
public static async Task ListenConfigIssuedEvent()
|
||||||
{
|
{
|
||||||
await MessageQueueHelper.Subscribe(Topics.DownloadConfigData, HandleConfigIssuedEvent);
|
await MessageQueueHelper.Subscribe(Topics.DownloadConfigData, HandleConfigIssuedEvent);
|
||||||
}
|
}
|
||||||
|
@ -50,9 +54,4 @@ public class ConfigService : Instant
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Initialized()
|
|
||||||
{
|
|
||||||
EventBus<bool>.AddEventHandler(EventType.StartUp, ListenConfigIssuedEvent);
|
|
||||||
}
|
|
||||||
}
|
}
|
|
@ -1,5 +1,4 @@
|
||||||
using MasstransferCommon.Atrributes;
|
using MasstransferCommon.Model.Constant;
|
||||||
using MasstransferCommon.Model.Constant;
|
|
||||||
using MasstransferCommon.Utils;
|
using MasstransferCommon.Utils;
|
||||||
using MasstransferCommunicate.Minio;
|
using MasstransferCommunicate.Minio;
|
||||||
using MasstransferCommunicate.Mqtt.Client;
|
using MasstransferCommunicate.Mqtt.Client;
|
||||||
|
@ -11,7 +10,7 @@ namespace MasstransferExporter.DataExporter;
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 坐标信息业务类
|
/// 坐标信息业务类
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class CoordinateService : Instant
|
public class CoordinateService
|
||||||
{
|
{
|
||||||
private static readonly SqliteHelper Db = SqliteHelper.GetInstance();
|
private static readonly SqliteHelper Db = SqliteHelper.GetInstance();
|
||||||
|
|
||||||
|
@ -112,8 +111,4 @@ public class CoordinateService : Instant
|
||||||
};
|
};
|
||||||
await MessageQueueHelper.Publish(Topics.CoordinateUpload, data);
|
await MessageQueueHelper.Publish(Topics.CoordinateUpload, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Initialized()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
}
|
|
@ -1,5 +1,4 @@
|
||||||
using System.Drawing;
|
using System.Drawing;
|
||||||
using MasstransferCommon.Atrributes;
|
|
||||||
using MasstransferCommon.Events;
|
using MasstransferCommon.Events;
|
||||||
using MasstransferCommon.Model.Constant;
|
using MasstransferCommon.Model.Constant;
|
||||||
using MasstransferCommon.Utils;
|
using MasstransferCommon.Utils;
|
||||||
|
@ -11,7 +10,7 @@ using MasstransferInfrastructure.Database.Sqlite;
|
||||||
|
|
||||||
namespace MasstransferExporter.ImageExporter;
|
namespace MasstransferExporter.ImageExporter;
|
||||||
|
|
||||||
public class ImageService : Instant
|
public class ImageService
|
||||||
{
|
{
|
||||||
private static readonly MinioHelper Minio = MinioHelper.GetInstance();
|
private static readonly MinioHelper Minio = MinioHelper.GetInstance();
|
||||||
|
|
||||||
|
@ -20,10 +19,15 @@ public class ImageService : Instant
|
||||||
private const string BasePath = "masstransfer";
|
private const string BasePath = "masstransfer";
|
||||||
|
|
||||||
|
|
||||||
|
static ImageService()
|
||||||
|
{
|
||||||
|
EventBus<bool>.AddEventHandler(EventType.StartUp, async () => { await ListenImageQueryEvent(); });
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 监听图片查询事件
|
/// 监听图片查询事件
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private static async Task ListenImageQueryEvent(EventType type, bool start)
|
public static async Task ListenImageQueryEvent()
|
||||||
{
|
{
|
||||||
await MessageQueueHelper.Subscribe(Topics.UpdateLicenseEvent, HandleImageQueryEvent);
|
await MessageQueueHelper.Subscribe(Topics.UpdateLicenseEvent, HandleImageQueryEvent);
|
||||||
}
|
}
|
||||||
|
@ -261,9 +265,4 @@ public class ImageService : Instant
|
||||||
Console.WriteLine($"图片导出失败,{e}");
|
Console.WriteLine($"图片导出失败,{e}");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Initialized()
|
|
||||||
{
|
|
||||||
EventBus<bool>.AddEventHandler(EventType.StartUp, ListenImageQueryEvent);
|
|
||||||
}
|
|
||||||
}
|
}
|
|
@ -1,33 +0,0 @@
|
||||||
using System.Reflection;
|
|
||||||
using MasstransferCommon.Atrributes;
|
|
||||||
|
|
||||||
namespace MasstransferExporter.Init;
|
|
||||||
|
|
||||||
public class InstantUtil
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// 启动是对象的初始化
|
|
||||||
/// </summary>
|
|
||||||
public static void Init()
|
|
||||||
{
|
|
||||||
// 获取当前程序集
|
|
||||||
var currentAssembly = Assembly.GetExecutingAssembly();
|
|
||||||
|
|
||||||
// 获取所有类型
|
|
||||||
var types = currentAssembly.GetTypes();
|
|
||||||
|
|
||||||
// 找到实现了 Instant 接口的类型
|
|
||||||
var instantImplementations =
|
|
||||||
types.Where(t => typeof(Instant).IsAssignableFrom(t) && t is { IsInterface: false, IsAbstract: false });
|
|
||||||
|
|
||||||
foreach (var type in instantImplementations)
|
|
||||||
{
|
|
||||||
// 创建实例
|
|
||||||
if (Activator.CreateInstance(type) is Instant instance)
|
|
||||||
{
|
|
||||||
// 调用 Initialized 方法
|
|
||||||
instance.Initialized();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,5 +1,4 @@
|
||||||
using MasstransferCommon.Atrributes;
|
using MasstransferCommon.Events;
|
||||||
using MasstransferCommon.Events;
|
|
||||||
using MasstransferCommon.Model.Constant;
|
using MasstransferCommon.Model.Constant;
|
||||||
using MasstransferCommunicate.Mqtt.Client;
|
using MasstransferCommunicate.Mqtt.Client;
|
||||||
using MasstransferCommunicate.Process.Client;
|
using MasstransferCommunicate.Process.Client;
|
||||||
|
@ -9,12 +8,17 @@ namespace MasstransferExporter.License;
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 证书业务
|
/// 证书业务
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class LicenseService : Instant
|
public class LicenseService
|
||||||
{
|
{
|
||||||
|
static LicenseService()
|
||||||
|
{
|
||||||
|
EventBus<bool>.AddEventHandler(EventType.StartUp, async () => { await ListenLicenseUpdateEvent(); });
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 启动监听证书更新事件
|
/// 启动监听证书更新事件
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private static async Task ListenLicenseUpdateEvent(EventType type, bool start)
|
public static async Task ListenLicenseUpdateEvent()
|
||||||
{
|
{
|
||||||
await MessageQueueHelper.Subscribe(Topics.UpdateLicenseEvent, HandleUpdateLicenseEvent);
|
await MessageQueueHelper.Subscribe(Topics.UpdateLicenseEvent, HandleUpdateLicenseEvent);
|
||||||
}
|
}
|
||||||
|
@ -38,9 +42,4 @@ public class LicenseService : Instant
|
||||||
{
|
{
|
||||||
await MessageQueueHelper.Publish(Topics.UpdateLicenseEventFeedback, result);
|
await MessageQueueHelper.Publish(Topics.UpdateLicenseEventFeedback, result);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Initialized()
|
|
||||||
{
|
|
||||||
EventBus<bool>.AddEventHandler(EventType.StartUp, ListenLicenseUpdateEvent);
|
|
||||||
}
|
|
||||||
}
|
}
|
|
@ -1,23 +1,21 @@
|
||||||
using Newtonsoft.Json;
|
namespace MasstransferExporter.LogExporter.Model;
|
||||||
|
|
||||||
namespace MasstransferExporter.LogExporter.Model;
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 用户操作日志
|
/// 用户操作日志
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class OperationLogData
|
public class OperationLogData
|
||||||
{
|
{
|
||||||
[JsonProperty("userName")] public string UserName { get; set; }
|
public string UserName { get; set; }
|
||||||
|
|
||||||
[JsonProperty("controlTimestamp")] public DateTime ControlTimestamp { get; set; }
|
public DateTime ControlTimestamp { get; set; }
|
||||||
|
|
||||||
[JsonProperty("controlType")] public string ControlType { get; set; }
|
public string ControlType { get; set; }
|
||||||
|
|
||||||
[JsonProperty("controlResult")] public string ControlResult { get; set; }
|
public string ControlResult { get; set; }
|
||||||
|
|
||||||
[JsonProperty("controlTarget")] public string ControlTarget { get; set; }
|
public string ControlTarget { get; set; }
|
||||||
|
|
||||||
[JsonProperty("controlParams")] public string ControlParams { get; set; }
|
public string ControlParams { get; set; }
|
||||||
|
|
||||||
[JsonProperty("controlMessage")] public string ControlMessage { get; set; }
|
public string ControlMessage { get; set; }
|
||||||
}
|
}
|
|
@ -1,5 +1,4 @@
|
||||||
using MasstransferCommon.Atrributes;
|
using MasstransferCommon.Events;
|
||||||
using MasstransferCommon.Events;
|
|
||||||
using MasstransferCommon.Model.Constant;
|
using MasstransferCommon.Model.Constant;
|
||||||
using MasstransferCommon.Utils;
|
using MasstransferCommon.Utils;
|
||||||
using MasstransferCommunicate.Mqtt.Client;
|
using MasstransferCommunicate.Mqtt.Client;
|
||||||
|
@ -10,15 +9,20 @@ using MasstransferInfrastructure.Database.Sqlite;
|
||||||
|
|
||||||
namespace MasstransferExporter.OTA.Service;
|
namespace MasstransferExporter.OTA.Service;
|
||||||
|
|
||||||
public class OTAService : Instant
|
public class OTAService
|
||||||
{
|
{
|
||||||
private static readonly SqliteHelper Db = SqliteHelper.GetInstance();
|
private static readonly SqliteHelper Db = SqliteHelper.GetInstance();
|
||||||
private static OTAUpdateFileManager _otaUpdateFileManager;
|
private static OTAUpdateFileManager _otaUpdateFileManager;
|
||||||
|
|
||||||
|
static OTAService()
|
||||||
|
{
|
||||||
|
EventBus<bool>.AddEventHandler(EventType.StartUp, async () => { await StartOTAService(); });
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 启动OTA服务
|
/// 启动OTA服务
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private static async Task StartOTAService(EventType type, bool start)
|
private static async Task StartOTAService()
|
||||||
{
|
{
|
||||||
_otaUpdateFileManager = GetOTAUpdateFileManager();
|
_otaUpdateFileManager = GetOTAUpdateFileManager();
|
||||||
|
|
||||||
|
@ -112,7 +116,7 @@ public class OTAService : Instant
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
//初始化
|
//初始化
|
||||||
InitDir(criticalBackupDir);
|
initDir(criticalBackupDir);
|
||||||
|
|
||||||
//备份重要文件
|
//备份重要文件
|
||||||
OTAClient.BackupEssentialFiles(appDir, criticalBackupDir, criticalFileExtension, criticalSourceLogPath);
|
OTAClient.BackupEssentialFiles(appDir, criticalBackupDir, criticalFileExtension, criticalSourceLogPath);
|
||||||
|
@ -163,7 +167,7 @@ public class OTAService : Instant
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 初始化重要文件备份目录
|
/// 初始化重要文件备份目录
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private static void InitDir(string criticalBackupDir)
|
private static void initDir(string criticalBackupDir)
|
||||||
{
|
{
|
||||||
if (Directory.Exists(criticalBackupDir))
|
if (Directory.Exists(criticalBackupDir))
|
||||||
{
|
{
|
||||||
|
@ -181,7 +185,7 @@ public class OTAService : Instant
|
||||||
{
|
{
|
||||||
//删除安装过程中创建的文件、目录
|
//删除安装过程中创建的文件、目录
|
||||||
var directoryList = new string[] { appDir, criticalBackupDir };
|
var directoryList = new string[] { appDir, criticalBackupDir };
|
||||||
var filePath = new string[] { updatePackagePath };
|
var filePath = new String[] { updatePackagePath };
|
||||||
|
|
||||||
foreach (var directory in directoryList)
|
foreach (var directory in directoryList)
|
||||||
{
|
{
|
||||||
|
@ -205,9 +209,4 @@ public class OTAService : Instant
|
||||||
//删除旧版本备份
|
//删除旧版本备份
|
||||||
OTAClient.DeleteFile(previousBackupPath);
|
OTAClient.DeleteFile(previousBackupPath);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Initialized()
|
|
||||||
{
|
|
||||||
EventBus<bool>.AddEventHandler(EventType.StartUp, StartOTAService);
|
|
||||||
}
|
|
||||||
}
|
}
|
|
@ -1,10 +1,7 @@
|
||||||
using MasstransferCommon.Events;
|
using MasstransferCommon.Events;
|
||||||
using MasstransferCommon.Model.Entity;
|
using MasstransferCommon.Model.Entity;
|
||||||
using MasstransferCommon.Scheduler;
|
|
||||||
using MasstransferCommunicate.Mqtt.Client;
|
using MasstransferCommunicate.Mqtt.Client;
|
||||||
using MasstransferCommunicate.Process.Client;
|
using MasstransferCommunicate.Process.Client;
|
||||||
using MasstransferExporter.Init;
|
|
||||||
using MasstransferExporter.LogExporter;
|
|
||||||
using MasstransferInfrastructure.Database.Sqlite;
|
using MasstransferInfrastructure.Database.Sqlite;
|
||||||
using MasstransferInfrastructure.Mqtt.Model;
|
using MasstransferInfrastructure.Mqtt.Model;
|
||||||
|
|
||||||
|
@ -16,9 +13,6 @@ class Program
|
||||||
|
|
||||||
public static async Task Main()
|
public static async Task Main()
|
||||||
{
|
{
|
||||||
// 进行初始化调用
|
|
||||||
InstantUtil.Init();
|
|
||||||
|
|
||||||
var mqttParams = Db.Query<MqttParams>("select * from mqtt_params").FirstOrDefault();
|
var mqttParams = Db.Query<MqttParams>("select * from mqtt_params").FirstOrDefault();
|
||||||
|
|
||||||
// 启动mqtt连接
|
// 启动mqtt连接
|
||||||
|
@ -30,19 +24,14 @@ class Program
|
||||||
Password = mqttParams.Password
|
Password = mqttParams.Password
|
||||||
});
|
});
|
||||||
|
|
||||||
Thread.Sleep(3000);
|
// 启动与主程序的通信
|
||||||
|
ProcessHelper.Init();
|
||||||
|
|
||||||
// 启动完成后,广播启动通知
|
// 启动完成后,广播启动通知
|
||||||
EventBus<bool>.Publish(EventType.StartUp, true);
|
EventBus<bool>.Publish(EventType.StartUp, true);
|
||||||
|
|
||||||
DelayScheduler.Delay(async () => { await LogFileExporter.ExportLogFile(); },
|
|
||||||
TimeSpan.FromSeconds(5));
|
|
||||||
|
|
||||||
// 启动与主程序的通信
|
|
||||||
ProcessHelper.Init();
|
|
||||||
|
|
||||||
Console.WriteLine("按任意键退出");
|
Console.WriteLine("按任意键退出");
|
||||||
|
|
||||||
Console.ReadKey();
|
Console.ReadKey();
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -1,6 +1,4 @@
|
||||||
using Newtonsoft.Json;
|
namespace MasstransferExporter.RemoteControl.Model;
|
||||||
|
|
||||||
namespace MasstransferExporter.RemoteControl.Model;
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 锁机指令
|
/// 锁机指令
|
||||||
|
@ -10,19 +8,16 @@ public class LockCmd
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 0 锁机 1 解锁
|
/// 0 锁机 1 解锁
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[JsonProperty("action")]
|
|
||||||
public int Action { get; set; }
|
public int Action { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 0 立即执行
|
/// 0 立即执行
|
||||||
/// 1 到期执行
|
/// 1 到期执行
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[JsonProperty("lockType")]
|
|
||||||
public int LockType { get; set; }
|
public int LockType { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 到期时间
|
/// 到期时间
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[JsonProperty("expiryTime")]
|
|
||||||
public long ExpiryTime { get; set; }
|
public long ExpiryTime { get; set; }
|
||||||
}
|
}
|
|
@ -1,5 +1,4 @@
|
||||||
using MasstransferCommon.Atrributes;
|
using MasstransferCommon.Events;
|
||||||
using MasstransferCommon.Events;
|
|
||||||
using MasstransferCommon.Model.Constant;
|
using MasstransferCommon.Model.Constant;
|
||||||
using MasstransferCommon.Model.Enum;
|
using MasstransferCommon.Model.Enum;
|
||||||
using MasstransferCommon.Utils;
|
using MasstransferCommon.Utils;
|
||||||
|
@ -12,14 +11,20 @@ namespace MasstransferExporter.RemoteControl;
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 远程锁定服务
|
/// 远程锁定服务
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class RemoteLockService : Instant
|
public class RemoteLockService
|
||||||
{
|
{
|
||||||
private const string KeyPath = @"Software\Masstransfer\Security";
|
private const string KeyPath = @"Software\Masstransfer\Security";
|
||||||
|
|
||||||
|
|
||||||
|
static RemoteLockService()
|
||||||
|
{
|
||||||
|
EventBus<bool>.AddEventHandler(EventType.StartUp, async () => { await ListenRemoteLockEvent(); });
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 监听远程锁机事件
|
/// 监听远程锁机事件
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private static async Task ListenRemoteLockEvent(EventType type, bool start)
|
public static async Task ListenRemoteLockEvent()
|
||||||
{
|
{
|
||||||
await MessageQueueHelper.Subscribe(Topics.RemoteControl, HandleLockCmd);
|
await MessageQueueHelper.Subscribe(Topics.RemoteControl, HandleLockCmd);
|
||||||
}
|
}
|
||||||
|
@ -38,7 +43,6 @@ public class RemoteLockService : Instant
|
||||||
|
|
||||||
if (action == 0)
|
if (action == 0)
|
||||||
{
|
{
|
||||||
Console.WriteLine("收到锁机指令");
|
|
||||||
// 更新注册表锁机状态
|
// 更新注册表锁机状态
|
||||||
var lockType = cmd.LockType;
|
var lockType = cmd.LockType;
|
||||||
if (lockType == 0)
|
if (lockType == 0)
|
||||||
|
@ -55,7 +59,6 @@ public class RemoteLockService : Instant
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Console.WriteLine("收到解锁指令");
|
|
||||||
// 解锁
|
// 解锁
|
||||||
var lockType = cmd.LockType;
|
var lockType = cmd.LockType;
|
||||||
if (lockType == 0)
|
if (lockType == 0)
|
||||||
|
@ -72,9 +75,4 @@ public class RemoteLockService : Instant
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Initialized()
|
|
||||||
{
|
|
||||||
EventBus<bool>.AddEventHandler(EventType.StartUp, ListenRemoteLockEvent);
|
|
||||||
}
|
|
||||||
}
|
}
|
|
@ -57,8 +57,6 @@ public class SqliteHelper
|
||||||
/// <typeparam name="T">数据类型</typeparam>
|
/// <typeparam name="T">数据类型</typeparam>
|
||||||
public int Insert<T>(T item)
|
public int Insert<T>(T item)
|
||||||
{
|
{
|
||||||
CreateTable(item!.GetType());
|
|
||||||
|
|
||||||
var id = item?.GetType().GetProperty("Id");
|
var id = item?.GetType().GetProperty("Id");
|
||||||
if (id != null && id.CanWrite) id.SetValue(item, SnowFlakeNew.LongId.ToString());
|
if (id != null && id.CanWrite) id.SetValue(item, SnowFlakeNew.LongId.ToString());
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
using MasstransferCommon.Model.Entity;
|
using MasstransferCommon.Model.Entity;
|
||||||
using MasstransferCommon.Utils;
|
using MasstransferCommon.Utils;
|
||||||
using MasstransferCommunicate.Mqtt.Model;
|
|
||||||
using MasstransferInfrastructure.Database.Sqlite;
|
using MasstransferInfrastructure.Database.Sqlite;
|
||||||
using MasstransferInfrastructure.Mqtt.Model;
|
using MasstransferInfrastructure.Mqtt.Model;
|
||||||
using MQTTnet;
|
using MQTTnet;
|
||||||
|
@ -65,7 +64,7 @@ public class MessageQueueHelper
|
||||||
/// <param name="topic"></param>
|
/// <param name="topic"></param>
|
||||||
/// <param name="message"></param>
|
/// <param name="message"></param>
|
||||||
/// <param name="qos"></param>
|
/// <param name="qos"></param>
|
||||||
public static async Task<bool> Publish<T>(string topic, T message,
|
public static async Task<bool> Publish(string topic, object message,
|
||||||
MqttQualityOfServiceLevel qos = MqttQualityOfServiceLevel.AtMostOnce)
|
MqttQualityOfServiceLevel qos = MqttQualityOfServiceLevel.AtMostOnce)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
|
@ -114,12 +113,9 @@ public class MessageQueueHelper
|
||||||
var methodInfo = subscriber.Method;
|
var methodInfo = subscriber.Method;
|
||||||
var parameters = methodInfo.GetParameters();
|
var parameters = methodInfo.GetParameters();
|
||||||
if (parameters.Length != 2) continue;
|
if (parameters.Length != 2) continue;
|
||||||
var payload = JsonUtil.FromJson<Payload<object>>(message);
|
var type = parameters[1].ParameterType;
|
||||||
|
|
||||||
if (payload == null) continue;
|
|
||||||
|
|
||||||
// 通知订阅者
|
// 通知订阅者
|
||||||
subscriber.DynamicInvoke(topic, JsonUtil.ToJson(payload.Data));
|
subscriber.DynamicInvoke(topic, JsonUtil.FromJson(type, message));
|
||||||
}
|
}
|
||||||
catch (Exception exception)
|
catch (Exception exception)
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,10 +1,7 @@
|
||||||
using System.Security.Cryptography.X509Certificates;
|
using System.Security.Cryptography.X509Certificates;
|
||||||
using MasstransferCommon.Model.Constant;
|
|
||||||
using MasstransferCommon.Utils;
|
using MasstransferCommon.Utils;
|
||||||
using MasstransferCommunicate.Mqtt.Model;
|
|
||||||
using MasstransferInfrastructure.Mqtt.Model;
|
using MasstransferInfrastructure.Mqtt.Model;
|
||||||
using MasstransferSecurity.Utils;
|
using MasstransferSecurity.Utils;
|
||||||
using Masuit.Tools.Systems;
|
|
||||||
using MQTTnet;
|
using MQTTnet;
|
||||||
using MQTTnet.Client;
|
using MQTTnet.Client;
|
||||||
using MQTTnet.Protocol;
|
using MQTTnet.Protocol;
|
||||||
|
@ -36,7 +33,7 @@ class MqttClient
|
||||||
return new MqttClientOptionsBuilder()
|
return new MqttClientOptionsBuilder()
|
||||||
.WithTcpServer(options.ServerAddress, options.Port)
|
.WithTcpServer(options.ServerAddress, options.Port)
|
||||||
// .WithCredentials(options.UserName, options.Password)
|
// .WithCredentials(options.UserName, options.Password)
|
||||||
.WithClientId(Constants.SN)
|
.WithClientId(clientId)
|
||||||
.WithCleanSession()
|
.WithCleanSession()
|
||||||
.WithTlsOptions(
|
.WithTlsOptions(
|
||||||
o =>
|
o =>
|
||||||
|
@ -98,10 +95,10 @@ class MqttClient
|
||||||
/// 发送消息
|
/// 发送消息
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="topic"></param>
|
/// <param name="topic"></param>
|
||||||
/// <param name="data"></param>
|
/// <param name="message"></param>
|
||||||
/// <param name="qos"></param>
|
/// <param name="qos"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public async Task<bool> Publish<T>(string topic, T data,
|
public async Task<bool> Publish(string topic, object message,
|
||||||
MqttQualityOfServiceLevel qos)
|
MqttQualityOfServiceLevel qos)
|
||||||
{
|
{
|
||||||
if (_client is not { IsConnected: true })
|
if (_client is not { IsConnected: true })
|
||||||
|
@ -109,14 +106,7 @@ class MqttClient
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
var message = new Payload<T>()
|
var payload = message as string ?? JsonUtil.ToJson(message);
|
||||||
{
|
|
||||||
MsgId = SnowFlakeNew.LongId.ToString(),
|
|
||||||
Data = data,
|
|
||||||
ConsumeTime = DateTime.Now.Ticks.ToString(),
|
|
||||||
};
|
|
||||||
|
|
||||||
var payload = JsonUtil.ToJson(message);
|
|
||||||
|
|
||||||
var result = await _client.PublishAsync(new MqttApplicationMessageBuilder()
|
var result = await _client.PublishAsync(new MqttApplicationMessageBuilder()
|
||||||
.WithTopic(topic)
|
.WithTopic(topic)
|
||||||
|
|
|
@ -1,10 +1,8 @@
|
||||||
using MasstransferCommunicate.Mqtt.Model;
|
namespace MasstransferInfrastructure.Mqtt.Model;
|
||||||
|
|
||||||
namespace MasstransferInfrastructure.Mqtt.Model;
|
public class Message
|
||||||
|
|
||||||
public class Message<T>
|
|
||||||
{
|
{
|
||||||
public string Topic { get; set; }
|
public string Topic { get; set; }
|
||||||
|
|
||||||
public Payload<T> Payload { get; set; }
|
public Payload Payload { get; set; }
|
||||||
}
|
}
|
|
@ -1,12 +1,10 @@
|
||||||
using Newtonsoft.Json;
|
namespace MasstransferInfrastructure.Mqtt.Model;
|
||||||
|
|
||||||
namespace MasstransferCommunicate.Mqtt.Model;
|
public class Payload
|
||||||
|
|
||||||
public class Payload<T>
|
|
||||||
{
|
{
|
||||||
[JsonProperty("msgId")] public string MsgId { get; set; }
|
public string MsgId { get; set; }
|
||||||
|
|
||||||
[JsonProperty("consumeTime")] public string ConsumeTime { get; set; }
|
public DateTime ConsumeTime { get; set; }
|
||||||
|
|
||||||
[JsonProperty("data")] public T Data { get; set; }
|
public object Data { get; set; }
|
||||||
}
|
}
|
Loading…
Reference in New Issue