完善数据采集进程逻辑
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>
|
<TargetFramework>net7.0</TargetFramework>
|
||||||
<ImplicitUsings>enable</ImplicitUsings>
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
<Nullable>enable</Nullable>
|
<Nullable>enable</Nullable>
|
||||||
|
<LangVersion>preview</LangVersion>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
using MasstransferCommon.Model.Constant;
|
using MasstransferCommon.Events;
|
||||||
|
using MasstransferCommon.Model.Constant;
|
||||||
using MasstransferCommon.Utils;
|
using MasstransferCommon.Utils;
|
||||||
using MasstransferCommunicate.Mqtt.Client;
|
using MasstransferCommunicate.Mqtt.Client;
|
||||||
using MasstransferExporter.DataExporter.Model;
|
using MasstransferExporter.DataExporter.Model;
|
||||||
|
@ -11,6 +12,11 @@ namespace MasstransferExporter.DataExporter;
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class ConfigService
|
public class ConfigService
|
||||||
{
|
{
|
||||||
|
static ConfigService()
|
||||||
|
{
|
||||||
|
EventBus<bool>.AddEventHandler(EventType.StartUp, async () => { await ListenConfigIssuedEvent(); });
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 监听配置下发事件
|
/// 监听配置下发事件
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
using System.Drawing;
|
using System.Drawing;
|
||||||
|
using MasstransferCommon.Events;
|
||||||
using MasstransferCommon.Model.Constant;
|
using MasstransferCommon.Model.Constant;
|
||||||
using MasstransferCommon.Utils;
|
using MasstransferCommon.Utils;
|
||||||
using MasstransferCommunicate.Minio;
|
using MasstransferCommunicate.Minio;
|
||||||
|
@ -18,6 +19,11 @@ public class ImageService
|
||||||
private const string BasePath = "masstransfer";
|
private const string BasePath = "masstransfer";
|
||||||
|
|
||||||
|
|
||||||
|
static ImageService()
|
||||||
|
{
|
||||||
|
EventBus<bool>.AddEventHandler(EventType.StartUp, async () => { await ListenImageQueryEvent(); });
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 监听图片查询事件
|
/// 监听图片查询事件
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
using MasstransferCommon.Model.Constant;
|
using MasstransferCommon.Events;
|
||||||
|
using MasstransferCommon.Model.Constant;
|
||||||
using MasstransferCommunicate.Mqtt.Client;
|
using MasstransferCommunicate.Mqtt.Client;
|
||||||
using MasstransferCommunicate.Process.Service;
|
using MasstransferCommunicate.Process.Service;
|
||||||
using MasstransferInfrastructure.Mqtt.Client;
|
|
||||||
|
|
||||||
namespace MasstransferExporter.License;
|
namespace MasstransferExporter.License;
|
||||||
|
|
||||||
|
@ -10,6 +10,11 @@ namespace MasstransferExporter.License;
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class LicenseService
|
public class LicenseService
|
||||||
{
|
{
|
||||||
|
static LicenseService()
|
||||||
|
{
|
||||||
|
EventBus<bool>.AddEventHandler(EventType.StartUp, async () => { await ListenLicenseUpdateEvent(); });
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 启动监听证书更新事件
|
/// 启动监听证书更新事件
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
using MasstransferCommon.Model.Constant;
|
using MasstransferCommon.Events;
|
||||||
|
using MasstransferCommon.Model.Constant;
|
||||||
using MasstransferCommon.Model.Entity;
|
using MasstransferCommon.Model.Entity;
|
||||||
using MasstransferCommon.Utils;
|
using MasstransferCommon.Utils;
|
||||||
using MasstransferCommunicate.Minio;
|
using MasstransferCommunicate.Minio;
|
||||||
|
@ -17,6 +18,11 @@ public class LogFileExporter
|
||||||
private static readonly MinioHelper Minio = MinioHelper.GetInstance();
|
private static readonly MinioHelper Minio = MinioHelper.GetInstance();
|
||||||
|
|
||||||
|
|
||||||
|
static LogFileExporter()
|
||||||
|
{
|
||||||
|
EventBus<bool>.AddEventHandler(EventType.StartUp, async () => { await ListenQueryLogEvent(); });
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 监听查询日志事件
|
/// 监听查询日志事件
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
|
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;
|
||||||
|
@ -14,13 +15,16 @@ 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>
|
||||||
public static async Task StartOTAService()
|
public static async Task StartOTAService()
|
||||||
{
|
{
|
||||||
|
|
||||||
_otaUpdateFileManager = GetOTAUpdateFileManager();
|
_otaUpdateFileManager = GetOTAUpdateFileManager();
|
||||||
|
|
||||||
//订阅云端发包
|
//订阅云端发包
|
||||||
|
@ -69,7 +73,7 @@ public class OTAService
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
await ApiClient.DownloadFileAsync(url, updatePackagePath);
|
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;
|
result = true;
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
|
@ -79,8 +83,8 @@ public class OTAService
|
||||||
}
|
}
|
||||||
|
|
||||||
await ProcessCommunicator.Send(ProcessTopics.DownloadUpdatePackageEventFeedback, result);
|
await ProcessCommunicator.Send(ProcessTopics.DownloadUpdatePackageEventFeedback, result);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//Masstransfer 通知-启动更新
|
//Masstransfer 通知-启动更新
|
||||||
public static async Task HandleOTAUpdateEvent(string topic, OTAUpdateData otaUpdateData)
|
public static async Task HandleOTAUpdateEvent(string topic, OTAUpdateData otaUpdateData)
|
||||||
{
|
{
|
||||||
|
@ -95,7 +99,7 @@ public class OTAService
|
||||||
|
|
||||||
//更新反馈
|
//更新反馈
|
||||||
otaResultData.OtaSoftwareVersion = version;
|
otaResultData.OtaSoftwareVersion = version;
|
||||||
otaResultData.CurrentSoftwareVersion = version; //**需要修改为当前版本
|
otaResultData.CurrentSoftwareVersion = version; //**需要修改为当前版本
|
||||||
|
|
||||||
await MessageQueueHelper.Publish(Topics.OTAUpgradeFeedback, otaResultData);
|
await MessageQueueHelper.Publish(Topics.OTAUpgradeFeedback, otaResultData);
|
||||||
}
|
}
|
||||||
|
@ -140,7 +144,6 @@ public class OTAService
|
||||||
OTAClient.DeleteFile(updatePackagePath);
|
OTAClient.DeleteFile(updatePackagePath);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
|
@ -154,7 +157,7 @@ public class OTAService
|
||||||
Console.WriteLine($"更新异常e: {ex.Message}");
|
Console.WriteLine($"更新异常e: {ex.Message}");
|
||||||
|
|
||||||
//如果重要文件备份已经产生,则删除
|
//如果重要文件备份已经产生,则删除
|
||||||
if(Directory.Exists(criticalBackupDir))
|
if (Directory.Exists(criticalBackupDir))
|
||||||
{
|
{
|
||||||
OTAClient.DeleteDirectory(criticalBackupDir);
|
OTAClient.DeleteDirectory(criticalBackupDir);
|
||||||
}
|
}
|
||||||
|
@ -172,17 +175,18 @@ public class OTAService
|
||||||
{
|
{
|
||||||
Directory.Delete(criticalBackupDir, true);
|
Directory.Delete(criticalBackupDir, true);
|
||||||
}
|
}
|
||||||
Directory.CreateDirectory(criticalBackupDir);
|
|
||||||
|
|
||||||
|
Directory.CreateDirectory(criticalBackupDir);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 回滚
|
/// 回滚
|
||||||
/// </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 };
|
var filePath = new String[] { updatePackagePath };
|
||||||
|
|
||||||
foreach (var directory in directoryList)
|
foreach (var directory in directoryList)
|
||||||
|
@ -206,6 +210,5 @@ public class OTAService
|
||||||
|
|
||||||
//删除旧版本备份
|
//删除旧版本备份
|
||||||
OTAClient.DeleteFile(previousBackupPath);
|
OTAClient.DeleteFile(previousBackupPath);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -1,23 +1,35 @@
|
||||||
using MasstransferCommunicate.Mqtt.Client;
|
using MasstransferCommon.Events;
|
||||||
using MasstransferExporter.DataExporter;
|
using MasstransferCommon.Model.Entity;
|
||||||
using MasstransferExporter.OTA.Service;
|
using MasstransferCommunicate.Mqtt.Client;
|
||||||
|
using MasstransferCommunicate.Process.Service;
|
||||||
|
using MasstransferInfrastructure.Database.Sqlite;
|
||||||
using MasstransferInfrastructure.Mqtt.Model;
|
using MasstransferInfrastructure.Mqtt.Model;
|
||||||
|
|
||||||
|
namespace MasstransferExporter;
|
||||||
|
|
||||||
class Program
|
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",
|
ServerAddress = mqttParams.ServerAddress,
|
||||||
Port = 8884,
|
Port = mqttParams.Port,
|
||||||
EnableTls = false
|
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.WriteLine("按任意键退出");
|
||||||
Console.ReadKey();
|
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 MasstransferCommon.Utils;
|
||||||
|
using MasstransferCommunicate.Mqtt.Client;
|
||||||
using MasstransferExporter.RemoteControl.Model;
|
using MasstransferExporter.RemoteControl.Model;
|
||||||
using Microsoft.Win32;
|
using Microsoft.Win32;
|
||||||
|
|
||||||
|
@ -12,11 +15,30 @@ 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>
|
||||||
|
public static async Task ListenRemoteLockEvent()
|
||||||
|
{
|
||||||
|
await MessageQueueHelper.Subscribe(Topics.RemoteControl, HandleLockCmd);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 处理接收到锁机业务指令
|
/// 处理接收到锁机业务指令
|
||||||
/// </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;
|
var action = cmd.Action;
|
||||||
|
|
||||||
if (action == 0)
|
if (action == 0)
|
||||||
|
|
|
@ -19,7 +19,7 @@ public class ProcessCommunicator
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static async Task Connect()
|
public static async Task Connect()
|
||||||
{
|
{
|
||||||
_helper = await ProcessHelper.CreateServer("Masstransfer");
|
_helper = await ProcessHelper.CreateClient("Masstransfer");
|
||||||
_helper.MessageReceived += HandleMessageReceived;
|
_helper.MessageReceived += HandleMessageReceived;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue