完善数据采集进程逻辑
This commit is contained in:
parent
3fa0d33bd6
commit
55ed7729e1
|
@ -0,0 +1,10 @@
|
|||
namespace MasstransferCommon.Events;
|
||||
|
||||
/// <summary>
|
||||
/// 用于声明当前方法为事件处理器
|
||||
/// </summary>
|
||||
[AttributeUsage(AttributeTargets.Method)]
|
||||
public class EventAction(params EventType[] types) : Attribute
|
||||
{
|
||||
public EventType[] Types => types;
|
||||
}
|
|
@ -0,0 +1,65 @@
|
|||
using Serilog;
|
||||
|
||||
namespace MasstransferCommon.Events;
|
||||
|
||||
/// <summary>
|
||||
/// 事件总线
|
||||
/// </summary>
|
||||
/// <typeparam name="T"></typeparam>
|
||||
public abstract class EventBus<T>
|
||||
{
|
||||
private static readonly Dictionary<EventType, List<Delegate>> Subscribers = new();
|
||||
|
||||
/// <summary>
|
||||
/// 添加订阅
|
||||
/// </summary>
|
||||
/// <param name="type"></param>
|
||||
/// <param name="action"></param>
|
||||
public static void AddEventHandler(EventType type, Delegate action)
|
||||
{
|
||||
if (Subscribers.TryGetValue(type, out var subscribers))
|
||||
{
|
||||
var any = subscribers.Any(item => item.Equals(action));
|
||||
if (!any) subscribers.Add(action);
|
||||
}
|
||||
else
|
||||
{
|
||||
Subscribers.Add(type, [action]);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 移除订阅逻辑
|
||||
/// </summary>
|
||||
/// <param name="type">事件类型</param>
|
||||
/// <param name="action">回调方法</param>
|
||||
public static void RemoveEventHandler(EventType type, Delegate action)
|
||||
{
|
||||
if (!Subscribers.TryGetValue(type, out var handlers)) return;
|
||||
|
||||
handlers.Remove(action);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 发布事件
|
||||
/// </summary>
|
||||
/// <param name="type"></param>
|
||||
/// <param name="data"></param>
|
||||
public static void Publish(EventType type, T data)
|
||||
{
|
||||
if (!Subscribers.TryGetValue(type, out var subscribers)) return;
|
||||
|
||||
// 创建一个副本,避免在回调中修改订阅列表导致迭代异常
|
||||
var actions = subscribers.ToList();
|
||||
|
||||
foreach (var action in actions)
|
||||
try
|
||||
{
|
||||
action.DynamicInvoke(type, data);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Log.Error(e, e.Message);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,10 @@
|
|||
namespace MasstransferCommon.Events;
|
||||
|
||||
/// <summary>
|
||||
/// 用于声明当前类为事件监听
|
||||
/// </summary>
|
||||
[AttributeUsage(AttributeTargets.Class)]
|
||||
public class EventListener(string name = "") : Attribute
|
||||
{
|
||||
private string Name => name;
|
||||
}
|
|
@ -0,0 +1,15 @@
|
|||
using System.ComponentModel;
|
||||
|
||||
namespace MasstransferCommon.Events;
|
||||
|
||||
/// <summary>
|
||||
/// 通过事件发布订阅模式实现系统各组件的解耦
|
||||
/// 这里定义的是事件的驱动类型
|
||||
/// </summary>
|
||||
public enum EventType
|
||||
{
|
||||
// 系统初始化事件
|
||||
[Description("系统初始化事件")] SetupNotify,
|
||||
|
||||
[Description("系统已经启动事件")] StartUp,
|
||||
}
|
|
@ -4,6 +4,7 @@
|
|||
<TargetFramework>net7.0</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
<LangVersion>preview</LangVersion>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
using MasstransferCommon.Model.Constant;
|
||||
using MasstransferCommon.Events;
|
||||
using MasstransferCommon.Model.Constant;
|
||||
using MasstransferCommon.Utils;
|
||||
using MasstransferCommunicate.Mqtt.Client;
|
||||
using MasstransferExporter.DataExporter.Model;
|
||||
|
@ -11,6 +12,11 @@ namespace MasstransferExporter.DataExporter;
|
|||
/// </summary>
|
||||
public class ConfigService
|
||||
{
|
||||
static ConfigService()
|
||||
{
|
||||
EventBus<bool>.AddEventHandler(EventType.StartUp, async () => { await ListenConfigIssuedEvent(); });
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 监听配置下发事件
|
||||
/// </summary>
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
using System.Drawing;
|
||||
using MasstransferCommon.Events;
|
||||
using MasstransferCommon.Model.Constant;
|
||||
using MasstransferCommon.Utils;
|
||||
using MasstransferCommunicate.Minio;
|
||||
|
@ -18,6 +19,11 @@ public class ImageService
|
|||
private const string BasePath = "masstransfer";
|
||||
|
||||
|
||||
static ImageService()
|
||||
{
|
||||
EventBus<bool>.AddEventHandler(EventType.StartUp, async () => { await ListenImageQueryEvent(); });
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 监听图片查询事件
|
||||
/// </summary>
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
using MasstransferCommon.Model.Constant;
|
||||
using MasstransferCommon.Events;
|
||||
using MasstransferCommon.Model.Constant;
|
||||
using MasstransferCommunicate.Mqtt.Client;
|
||||
using MasstransferCommunicate.Process.Service;
|
||||
using MasstransferInfrastructure.Mqtt.Client;
|
||||
|
||||
namespace MasstransferExporter.License;
|
||||
|
||||
|
@ -10,6 +10,11 @@ namespace MasstransferExporter.License;
|
|||
/// </summary>
|
||||
public class LicenseService
|
||||
{
|
||||
static LicenseService()
|
||||
{
|
||||
EventBus<bool>.AddEventHandler(EventType.StartUp, async () => { await ListenLicenseUpdateEvent(); });
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 启动监听证书更新事件
|
||||
/// </summary>
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
using MasstransferCommon.Model.Constant;
|
||||
using MasstransferCommon.Events;
|
||||
using MasstransferCommon.Model.Constant;
|
||||
using MasstransferCommon.Model.Entity;
|
||||
using MasstransferCommon.Utils;
|
||||
using MasstransferCommunicate.Minio;
|
||||
|
@ -17,6 +18,11 @@ public class LogFileExporter
|
|||
private static readonly MinioHelper Minio = MinioHelper.GetInstance();
|
||||
|
||||
|
||||
static LogFileExporter()
|
||||
{
|
||||
EventBus<bool>.AddEventHandler(EventType.StartUp, async () => { await ListenQueryLogEvent(); });
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 监听查询日志事件
|
||||
/// </summary>
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
using System.Diagnostics;
|
||||
using MasstransferCommon.Events;
|
||||
using MasstransferCommon.Model.Constant;
|
||||
using MasstransferCommon.Utils;
|
||||
using MasstransferCommunicate.Mqtt.Client;
|
||||
|
@ -14,13 +15,16 @@ public class OTAService
|
|||
private static readonly SqliteHelper Db = SqliteHelper.GetInstance();
|
||||
private static OTAUpdateFileManager _otaUpdateFileManager;
|
||||
|
||||
static OTAService()
|
||||
{
|
||||
EventBus<bool>.AddEventHandler(EventType.StartUp, async () => { await StartOTAService(); });
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 启动OTA服务
|
||||
/// </summary>
|
||||
public static async Task StartOTAService()
|
||||
{
|
||||
|
||||
_otaUpdateFileManager = GetOTAUpdateFileManager();
|
||||
|
||||
//订阅云端发包
|
||||
|
@ -69,7 +73,7 @@ public class OTAService
|
|||
try
|
||||
{
|
||||
await ApiClient.DownloadFileAsync(url, updatePackagePath);
|
||||
if(!OTAClient.CheckMD5(checksum, updatePackagePath)) throw new Exception("MD5 check failed.");
|
||||
if (!OTAClient.CheckMD5(checksum, updatePackagePath)) throw new Exception("MD5 check failed.");
|
||||
result = true;
|
||||
}
|
||||
catch (Exception e)
|
||||
|
@ -79,8 +83,8 @@ public class OTAService
|
|||
}
|
||||
|
||||
await ProcessCommunicator.Send(ProcessTopics.DownloadUpdatePackageEventFeedback, result);
|
||||
|
||||
}
|
||||
|
||||
//Masstransfer 通知-启动更新
|
||||
public static async Task HandleOTAUpdateEvent(string topic, OTAUpdateData otaUpdateData)
|
||||
{
|
||||
|
@ -95,7 +99,7 @@ public class OTAService
|
|||
|
||||
//更新反馈
|
||||
otaResultData.OtaSoftwareVersion = version;
|
||||
otaResultData.CurrentSoftwareVersion = version; //**需要修改为当前版本
|
||||
otaResultData.CurrentSoftwareVersion = version; //**需要修改为当前版本
|
||||
|
||||
await MessageQueueHelper.Publish(Topics.OTAUpgradeFeedback, otaResultData);
|
||||
}
|
||||
|
@ -140,7 +144,6 @@ public class OTAService
|
|||
OTAClient.DeleteFile(updatePackagePath);
|
||||
|
||||
return true;
|
||||
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
|
@ -154,7 +157,7 @@ public class OTAService
|
|||
Console.WriteLine($"更新异常e: {ex.Message}");
|
||||
|
||||
//如果重要文件备份已经产生,则删除
|
||||
if(Directory.Exists(criticalBackupDir))
|
||||
if (Directory.Exists(criticalBackupDir))
|
||||
{
|
||||
OTAClient.DeleteDirectory(criticalBackupDir);
|
||||
}
|
||||
|
@ -172,17 +175,18 @@ public class OTAService
|
|||
{
|
||||
Directory.Delete(criticalBackupDir, true);
|
||||
}
|
||||
Directory.CreateDirectory(criticalBackupDir);
|
||||
|
||||
Directory.CreateDirectory(criticalBackupDir);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 回滚
|
||||
/// </summary>
|
||||
private static void RollBack(string appDir, string criticalBackupDir, string updatePackagePath, string previousBackupPath)
|
||||
private static void RollBack(string appDir, string criticalBackupDir, string updatePackagePath,
|
||||
string previousBackupPath)
|
||||
{
|
||||
//删除安装过程中创建的文件、目录
|
||||
var directoryList = new string[] { appDir, criticalBackupDir};
|
||||
var directoryList = new string[] { appDir, criticalBackupDir };
|
||||
var filePath = new String[] { updatePackagePath };
|
||||
|
||||
foreach (var directory in directoryList)
|
||||
|
@ -206,6 +210,5 @@ public class OTAService
|
|||
|
||||
//删除旧版本备份
|
||||
OTAClient.DeleteFile(previousBackupPath);
|
||||
|
||||
}
|
||||
}
|
|
@ -1,23 +1,35 @@
|
|||
using MasstransferCommunicate.Mqtt.Client;
|
||||
using MasstransferExporter.DataExporter;
|
||||
using MasstransferExporter.OTA.Service;
|
||||
using MasstransferCommon.Events;
|
||||
using MasstransferCommon.Model.Entity;
|
||||
using MasstransferCommunicate.Mqtt.Client;
|
||||
using MasstransferCommunicate.Process.Service;
|
||||
using MasstransferInfrastructure.Database.Sqlite;
|
||||
using MasstransferInfrastructure.Mqtt.Model;
|
||||
|
||||
namespace MasstransferExporter;
|
||||
|
||||
class Program
|
||||
{
|
||||
static async Task Main()
|
||||
private static readonly SqliteHelper Db = SqliteHelper.GetInstance();
|
||||
|
||||
public static async Task Main()
|
||||
{
|
||||
var options = new MqttConnectOptions
|
||||
var mqttParams = Db.Query<MqttParams>("select * from mqtt_params").FirstOrDefault();
|
||||
|
||||
// 启动mqtt连接
|
||||
await MessageQueueHelper.InitConnect(new MqttConnectOptions()
|
||||
{
|
||||
ServerAddress = "cloud.haiju-tech.com",
|
||||
Port = 8884,
|
||||
EnableTls = false
|
||||
};
|
||||
ServerAddress = mqttParams.ServerAddress,
|
||||
Port = mqttParams.Port,
|
||||
UserName = mqttParams.UserName,
|
||||
Password = mqttParams.Password
|
||||
});
|
||||
|
||||
await MessageQueueHelper.InitConnect(options);
|
||||
// 启动与主程序的通信
|
||||
await ProcessCommunicator.Connect();
|
||||
|
||||
// 启动完成后,广播启动通知
|
||||
EventBus<bool>.Publish(EventType.StartUp, true);
|
||||
|
||||
CoordinateService.CoordinateExporter();
|
||||
await OTAService.StartOTAService();
|
||||
Console.WriteLine("按任意键退出");
|
||||
Console.ReadKey();
|
||||
}
|
||||
|
|
|
@ -1,5 +1,8 @@
|
|||
using MasstransferCommon.Model.Enum;
|
||||
using MasstransferCommon.Events;
|
||||
using MasstransferCommon.Model.Constant;
|
||||
using MasstransferCommon.Model.Enum;
|
||||
using MasstransferCommon.Utils;
|
||||
using MasstransferCommunicate.Mqtt.Client;
|
||||
using MasstransferExporter.RemoteControl.Model;
|
||||
using Microsoft.Win32;
|
||||
|
||||
|
@ -12,11 +15,30 @@ public class RemoteLockService
|
|||
{
|
||||
private const string KeyPath = @"Software\Masstransfer\Security";
|
||||
|
||||
|
||||
static RemoteLockService()
|
||||
{
|
||||
EventBus<bool>.AddEventHandler(EventType.StartUp, async () => { await ListenRemoteLockEvent(); });
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 监听远程锁机事件
|
||||
/// </summary>
|
||||
public static async Task ListenRemoteLockEvent()
|
||||
{
|
||||
await MessageQueueHelper.Subscribe(Topics.RemoteControl, HandleLockCmd);
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 处理接收到锁机业务指令
|
||||
/// </summary>
|
||||
public static void HandleLockCmd(LockCmd cmd)
|
||||
private static void HandleLockCmd(string topic, string payload)
|
||||
{
|
||||
var cmd = JsonUtil.FromJson<LockCmd>(payload);
|
||||
|
||||
if (cmd == null) return;
|
||||
|
||||
var action = cmd.Action;
|
||||
|
||||
if (action == 0)
|
||||
|
|
|
@ -19,7 +19,7 @@ public class ProcessCommunicator
|
|||
/// </summary>
|
||||
public static async Task Connect()
|
||||
{
|
||||
_helper = await ProcessHelper.CreateServer("Masstransfer");
|
||||
_helper = await ProcessHelper.CreateClient("Masstransfer");
|
||||
_helper.MessageReceived += HandleMessageReceived;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue