You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

654 lines
24 KiB
C#

using DryIoc;
using Prism.Commands;
using Prism.Mvvm;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections.ObjectModel;
using System.Windows.Threading;
using Txgy.FilesWatcher.model;
using System.Text.Json.Serialization;
using System.Text.Json;
using System.Net.NetworkInformation;
using System.Threading;
using System.Net.WebSockets;
using System.Diagnostics;
using WebSocket4Net;
using System.IO;
using System.Text.Encodings.Web;
using System.Text.Unicode;
using System.Net.Sockets;
using System.Security.Policy;
using Prism.Events;
using ImTools;
using static System.Windows.Forms.Design.AxImporter;
using HandyControl.Controls;
using MQTTnet.Extensions.ManagedClient;
using MQTTnet;
using MQTTnet.Client.Options;
using System.Windows.Markup;
namespace Txgy.FilesWatcher.ViewModels
{
internal class MainViewModel : BindableBase
{
public MainViewModel(WebsocketClient websocketClient, SystemConfig systemConfig, IEventAggregator ea)
{
string filter = "*.index";
string str = File.ReadAllText("systemconfig.json");
_systemConfig = systemConfig;
PostPath = systemConfig.postpath;
RealtimePath= systemConfig.realtimepath;
MseedPath = systemConfig.mseedpath;
MainPath= systemConfig.mainpath;
DataBaseConnect.GetInstance.DataBaseConfig = systemConfig.dBConfig;
watcherArray[0] = new FileSystemWatcher();
watcherArray[1] = new FileSystemWatcher();
InitializeParams(filter);
StartTime = DateTime.Now;
this._ea = ea;
}
private string watcherPath;
public string PostPath
{
get { return watcherPath; }
set { SetProperty(ref watcherPath, value); }
}
private string realtimePath;
public string RealtimePath
{
get { return realtimePath; }
set { SetProperty(ref realtimePath, value); }
}
private string mseedPath;
public string MseedPath
{
get { return mseedPath; }
set { SetProperty(ref mseedPath, value); }
}
private string mainPath;
public string MainPath
{
get { return mainPath; }
set { SetProperty(ref mainPath, value); }
}
private bool isUploadMseedPath;
public bool IsUploadMseedPath
{
get { return isUploadMseedPath; }
set { SetProperty(ref isUploadMseedPath, value); }
}
private bool isUploadRealtimePath;
public bool IsUploadRealtimePath
{
get { return isUploadRealtimePath; }
set { SetProperty(ref isUploadRealtimePath, value); }
}
private bool isUploadPostPath;
public bool IsUploadPostPath
{
get { return isUploadPostPath; }
set { SetProperty(ref isUploadPostPath, value); }
}
private bool isUploadDB = false;
public bool IsUploadDB
{
get { return isUploadDB; }
set { SetProperty(ref isUploadDB, value); }
}
private bool isUploadMQTT = false;
public bool IsUploadMQTT
{
get { return isUploadMQTT; }
set { SetProperty(ref isUploadMQTT, value); }
}
private ObservableCollection<FileModel> dataList = new ObservableCollection<FileModel>();
public ObservableCollection<FileModel> DataList
{
get { return dataList; }
set { SetProperty(ref dataList, value); }
}
private ObservableCollection<FileModel> realTimeDataList = new ObservableCollection<FileModel>();
public ObservableCollection<FileModel> RealTimeDataList
{
get { return realTimeDataList; }
set { SetProperty(ref realTimeDataList, value); }
}
private ObservableCollection<FileModel> postDataList = new ObservableCollection<FileModel>();
public ObservableCollection<FileModel> PostDataList
{
get { return postDataList; }
set { SetProperty(ref postDataList, value); }
}
private ObservableCollection<FileModel> mqttDataList = new ObservableCollection<FileModel>();
public ObservableCollection<FileModel> MQTTDataList
{
get { return mqttDataList; }
set { SetProperty(ref mqttDataList, value); }
}
private DateTime startTime;
public DateTime StartTime { get => startTime; set => SetProperty(ref startTime, value); }
private string runTime;
public string RunTime
{
get { return runTime; }
set { SetProperty(ref runTime, value); }
}
private ObservableCollection<int> intervalTimesSource = new ObservableCollection<int>();
public ObservableCollection<int> IntervalTimesSource
{
get { return intervalTimesSource; }
set { intervalTimesSource = value; }
}
private int selectedIndex;
public int SelectedIndex
{
get { return selectedIndex; }
set { SetProperty(ref selectedIndex, value); }
}
private int proMonInterval = 30;
public int ProMonInterval
{
get => proMonInterval;
set => SetProperty(ref proMonInterval, value);
}
private bool isIndeterminate = false;
public bool IsIndeterminate
{
get { return isIndeterminate; }
set { SetProperty(ref isIndeterminate, value); }
}
private string account="admin";
public string Account
{
get { return account; }
set { SetProperty(ref account, value); }
}
private int workAreaId = 1;
public int WorkAreaId
{
get { return workAreaId; }
set { SetProperty(ref workAreaId, value); }
}
public DelegateCommand StartCommand => new(Start);
public DelegateCommand StopCommand => new(Stop);
private void Start()
{
int res= WatchStartOrSopt(true);
if (res == 0)
{
StartTime = DateTime.Now;
timer1.Interval = TimeSpan.FromSeconds(ProMonInterval);
timer1.Start();
timer1.Tick += timer1_Tick;
}
}
private void Stop()
{
WatchStartOrSopt(false);
timer1.Stop();
}
public DelegateCommand<object> FilePathSaveCommand => new((obj) =>
{
System.Windows.Forms.FolderBrowserDialog fbd = new System.Windows.Forms.FolderBrowserDialog();
string para = obj.ToString();
fbd.SelectedPath = MainPath;// (para == "PostPath") ? PostPath : RealtimePath;
fbd.Description = "请选择文件路径";
fbd.ShowNewFolderButton = true;
if (fbd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
sure(para, fbd.SelectedPath);
UpdateJsonConfig(_systemConfig);
}
});
void sure(string para,string filePath)
{
if (para == "MainPath")
{
if (!Directory.Exists(filePath))
{
MessageBox.Show($"{filePath} 不存在!");
return;
}
MainPath = filePath;
_systemConfig.mainpath = filePath;
}
else if (para == "MseedPath")
{
//替换主目录;
var name = filePath.Replace(MainPath+"\\", "");
string path = Path.Combine(MainPath, name);
if (!Directory.Exists(path))
{
MessageBox.Show($"{path} 不存在!");
return;
}
MseedPath = name;
_systemConfig.mseedpath = name;
}
else if (para == "RealtimePath")
{
var name = filePath.Replace(MainPath + "\\", "");
string path = Path.Combine(MainPath, name);
if (!Directory.Exists(path))
{
MessageBox.Show($"{path} 不存在!");
return;
}
RealtimePath=name;
_systemConfig.realtimepath = RealtimePath;
watcherArray[0].Path = path;
}
else if (para == "PostPath")
{
var name = filePath.Replace(MainPath + "\\", "");
string path = Path.Combine(MainPath, name);
if (!Directory.Exists(path))
{
MessageBox.Show($"{path} 不存在!");
return;
}
PostPath=name;
_systemConfig.postpath = PostPath;
watcherArray[1].Path = path;
}
UpdateJsonConfig(_systemConfig);
}
private void InitializeParams(string fileFilter)
{
timer1.Interval = TimeSpan.FromSeconds(ProMonInterval);
IntervalTimesSource.Add(5);
IntervalTimesSource.Add(10);
IntervalTimesSource.Add(15);
IntervalTimesSource.Add(20);
IntervalTimesSource.Add(30);
IntervalTimesSource.Add(60);
SelectedIndex = 1;
foreach (var watcher in watcherArray)
{
//初始化监听
watcher.BeginInit();
//设置需要监听的更改类型(如:文件或者文件夹的属性,文件或者文件夹的创建时间;NotifyFilters枚举的内容)
watcher.NotifyFilter = NotifyFilters.Attributes
| NotifyFilters.CreationTime
| NotifyFilters.DirectoryName
| NotifyFilters.FileName
| NotifyFilters.LastAccess
| NotifyFilters.LastWrite
| NotifyFilters.Security
| NotifyFilters.Size;
//设置监听的路径
// watcher.Path = PostPath;
watcher.Changed += new FileSystemEventHandler(Watcher_Changed);
// watcherArray.Created += Watcher_Created;
watcher.Deleted += new FileSystemEventHandler(Watcher_Deleted);
watcher.Renamed += new RenamedEventHandler(Watcher_Renamed);
watcher.Error += OnError;
//设置监听文件类型
watcher.Filter = fileFilter;
//设置是否监听子目录
watcher.IncludeSubdirectories = false;
//设置是否启用监听
watcher.EnableRaisingEvents = false;
watcher.EndInit();
}
//初始化mqtt
mqttClient = new MqttFactory().CreateManagedMqttClient();
mqttClient.UseDisconnectedHandler(ee =>
{
Debug.WriteLine($">>> 服务器断开连接,{ee}");
});
mqttClient.UseApplicationMessageReceivedHandler(ee =>
{
try
{
// ResolveDatas(ee.ApplicationMessage.Topic, ee.ApplicationMessage.Payload);
}
catch (Exception ex)
{
MessageBox.Show($">>>数据解析出错,{ex}");
}
});
mqttClient.UseConnectedHandler(ee =>
{
Debug.WriteLine(">>> MQTT 连接到服务!");
// mqttClient.SubscribeAsync(CmdData.STREMACTRL + "#", MQTTnet.Protocol.MqttQualityOfServiceLevel.AtMostOnce);
// mqttClient.SubscribeAsync(CmdData.STREMARES + "#", MQTTnet.Protocol.MqttQualityOfServiceLevel.AtMostOnce);
// Debug.WriteLine($">>>订阅:{CmdData.STREMARES} #");
// mqttClient.SubscribeAsync(CmdData.STREMAUP + "vpn45", MQTTnet.Protocol.MqttQualityOfServiceLevel.AtMostOnce);
// WriteLog($">>>成功订阅:{CmdData.STREMAUP} #");
// mqttClient.SubscribeAsync(CmdData.STREMAROUTERRES + "#", MQTTnet.Protocol.MqttQualityOfServiceLevel.AtMostOnce);
});
}
private void UpdateJsonConfig(SystemConfig systemConfig)
{
var options = new JsonSerializerOptions
{
// 整齐打印
WriteIndented = true,
//重新编码,解决中文乱码问题
Encoder = JavaScriptEncoder.Create(UnicodeRanges.All)
};
string message = JsonSerializer.Serialize(systemConfig, options);
if (File.Exists(settingDataPath))
{
File.WriteAllText(settingDataPath, message);
}
}
private string settingDataPath = "systemconfig.json";
private void timer1_Tick(object? sender, EventArgs e)
{
DateTime currentT= DateTime.Now;
RunTime = DateDiff(currentT, StartTime);
string path = $"{Path.Combine(MainPath, MseedPath)}/{currentT.Month.ToString("D2")}/{currentT.Day.ToString("D2")}/{currentT.Hour.ToString("D2")}/{currentT.AddMinutes(-2).Minute.ToString("D2")}";
// path = "I:\\yuwuN3102mseed\\NET2023\\06\\22\\21\\50";
Debug.WriteLine($"**********当前时间:{currentT},监控路径:{path}");
if (Directory.Exists(path) && IsUploadDB&& IsUploadMseedPath)
{
UploadMseedFile.UploadMSeedOnce((a=>
{
timer1.Dispatcher.Invoke(() =>
{
DataList.Add(new FileModel
{
CreateTime = DateTime.Now.ToString("yyyy-MM-dd T HH:mm:ss"),
Data = $"{DateTime.Now.ToString("yyyy-MM-dd T HH:mm:ss")}{a}"
});
});
}), path, WorkAreaId);
}
}
/// <summary>
/// 启动或者停止监听
/// </summary>
/// <param name="IsEnableRaising">True:启用监听,False:关闭监听</param>
private int WatchStartOrSopt(bool IsEnableRaising)
{
int result = 0;
try
{
if (IsEnableRaising)
{
watcherArray[0].Path = Path.Combine(MainPath, RealtimePath);
watcherArray[1].Path = Path.Combine(MainPath, PostPath);
}
watcherArray[0].EnableRaisingEvents = IsEnableRaising;
watcherArray[1].EnableRaisingEvents = IsEnableRaising;
IsIndeterminate = IsEnableRaising;
}
catch (Exception ex)
{
result = 1;
MessageBox.Show(ex.ToString());
}
return result;
}
private string DateDiff(DateTime DateTime1, DateTime DateTime2)
{
string dateDiff = null;
TimeSpan ts1 = new TimeSpan(DateTime1.Ticks);
TimeSpan ts2 = new
TimeSpan(DateTime2.Ticks);
TimeSpan ts = ts1.Subtract(ts2).Duration();
if (ts.Days > 0)
{
dateDiff += ts.Days.ToString() + "天";
}
if (ts.Hours > 0)
{
dateDiff += ts.Hours.ToString() + "小时";
}
if (ts.Minutes > 0)
{
dateDiff += ts.Minutes.ToString() + "分钟";
}
dateDiff += ts.Seconds.ToString() + "秒";
return dateDiff;
}
private void OnError(object sender, ErrorEventArgs e)
{
}
private void Watcher_Changed(object sender, System.IO.FileSystemEventArgs e)
{
Thread.Sleep(100);
// string tmp = dt.Hour.ToString() + "时" + dt.Minute.ToString() + "分" + dt.Second.ToString() + "秒" + dt.Millisecond.ToString() + "毫秒,目录发生变化\r\n";
DateTime lastWriteTime = DateTime.Now;//File.GetLastWriteTime(e.FullPath);
var watch= sender as FileSystemWatcher;
string lastLine = File.ReadLines(e.FullPath).Last().Trim();
Debug.WriteLine($"最后修改时间:{lastWriteTime},文件路径:{watch.Path}");
if (watch != null && watch.Path == watcherArray[0].Path)
{
watcherArray[0].EnableRaisingEvents = false;
if (IsUploadDB && isUploadRealtimePath)
{
UploadRealtimeFile.UploadRealtimeFileOnce((a, b) =>
{
timer1.Dispatcher.Invoke(() =>
{
RealTimeDataList.Add(new FileModel
{
CreateTime = DateTime.Now.ToString("yyyy-MM-dd T HH:mm:ss"),
Data = $"{DateTime.Now.ToString("yyyy-MM-dd T HH:mm:ss")}事件上传成功。"
});
});
if (IsUploadMQTT)
{
MQPublish(a, b);
timer1.Dispatcher.Invoke(() =>
{
MQTTDataList.Add(new FileModel
{
CreateTime = DateTime.Now.ToString("yyyy-MM-dd T HH:mm:ss"),
Data = $"{DateTime.Now.ToString("yyyy-MM-dd T HH:mm:ss")}事件上传成功。"
});
});
}
}, watcherArray[0].Path, lastLine, WorkAreaId);
}
}
else if (watch != null && watch.Path == watcherArray[1].Path)
{
watcherArray[1].EnableRaisingEvents = false;
if (IsUploadDB && IsUploadPostPath)
{
UploadPostproFile.UploadPostproFileOnce((a, b) =>
{
timer1.Dispatcher.Invoke(() =>
{
PostDataList.Add(new FileModel
{
CreateTime = DateTime.Now.ToString("yyyy-MM-dd T HH:mm:ss"),
Data = $"{DateTime.Now.ToString("yyyy-MM-dd T HH:mm:ss")}事件上传成功。"
});
});
if (IsUploadMQTT)
{
MQPublish(a, b);
timer1.Dispatcher.Invoke(() =>
{
MQTTDataList.Add(new FileModel
{
CreateTime = DateTime.Now.ToString("yyyy-MM-dd T HH:mm:ss"),
Data = $"{DateTime.Now.ToString("yyyy-MM-dd T HH:mm:ss")}事件上传成功。"
});
});
}
}, watcherArray[1].Path, lastLine, WorkAreaId);
}
}
if (watch != null && watch.Path == watcherArray[0].Path)
{
watcherArray[0].EnableRaisingEvents = true;
}
else if (watch != null && watch.Path == watcherArray[1].Path)
{
watcherArray[1].EnableRaisingEvents = true;
}
}
private void Watcher_Renamed(object sender, RenamedEventArgs e)
{
System.Windows.Application.Current.Dispatcher.BeginInvoke(new Action(() => {
DateTime dt = DateTime.Now;
string tmp = dt.Hour.ToString() + "时" + dt.Minute.ToString() + "分" + dt.Second.ToString() + "秒" + dt.Millisecond.ToString() + "毫秒,目录发生变化\r\n";
tmp += "改变类型 :" + e.ChangeType.ToString() + "\r\n"; ;
tmp += "文件全称:" + e.FullPath + "\r\n";
//DataList.Add(new WatcherFileModel
//{
// CreateTime = DateTime.Now.ToString(),
// ChangeType = e.ChangeType,
// Name = e.Name,
// FullPath = e.FullPath,
// Data = tmp
//});
}));
}
private void Watcher_Created(object sender, FileSystemEventArgs e)
{
DateTime dt = DateTime.Now;
string tmp = dt.Hour.ToString() + "时" + dt.Minute.ToString() + "分" + dt.Second.ToString() + "秒" + dt.Millisecond.ToString() + "毫秒,目录发生变化\r\n";
tmp += "改变类型 :" + e.ChangeType.ToString() + "\r\n"; ;
tmp += "文件全称:" + e.FullPath + "\r\n";
//DataList.Add(new WatcherFileModel
//{
// CreateTime = DateTime.Now.ToString(),
// ChangeType = e.ChangeType,
// Name = e.Name,
// FullPath = e.FullPath,
// Data = tmp
//});
}
private void Watcher_Deleted(object sender, FileSystemEventArgs e)
{
DateTime dt = DateTime.Now;
string tmp = dt.Hour.ToString() + "时" + dt.Minute.ToString() + "分" + dt.Second.ToString() + "秒" + dt.Millisecond.ToString() + "毫秒,目录发生变化\r\n";
tmp += "改变类型 :" + e.ChangeType.ToString() + "\r\n"; ;
tmp += "文件全称:" + e.FullPath + "\r\n";
// DataList.Add(new WatcherFileModel
//{
// CreateTime= DateTime.Now.ToString(),
// ChangeType=e.ChangeType,
// Name=e.Name,
// FullPath= e.FullPath,
// Data=tmp
//});
}
private void StartConnectMQ()
{
// 向服务端开放的端口进行服务请求
// string clientID = Guid.NewGuid().ToString();
var mqttClientOptions = new MqttClientOptionsBuilder()
.WithClientId(_systemConfig.mQTTConfig.clientID)// 传入ClientID参数
.WithTcpServer(_systemConfig.mQTTConfig.serverIP, _systemConfig.mQTTConfig.port)//指定TCP连接的IP和Port
.WithCredentials(_systemConfig.mQTTConfig.userName, _systemConfig.mQTTConfig.password);//指定连接的用户名和密码
var options = new ManagedMqttClientOptionsBuilder()
.WithAutoReconnectDelay(TimeSpan.FromSeconds(60))
.WithClientOptions(mqttClientOptions.Build())
.Build();
mqttClient.StartAsync(options);
startTime = DateTime.Now;
}
private void StopMQ()
{
mqttClient?.StopAsync();
}
private void MQPublish(string topic, string openCmd)
{
// byte[] cmdByte = Convert.FromHexString(openCmd.Replace(" ", ""));
MqttApplicationMessage message = new MqttApplicationMessageBuilder()
.WithTopic(topic)
.WithPayload(openCmd)
.WithRetainFlag(false)
.Build();
var res = mqttClient.PublishAsync(message);
string mes = string.Empty;
if (!res.IsFaulted)
{
mes = $">>>数据发送成功:{topic},{openCmd}";
}
else
{
mes = $">>>数据发送失败:{topic},{openCmd}";
}
Debug.WriteLine(mes);
}
private FileSystemWatcher[] watcherArray = new FileSystemWatcher[2];
private DispatcherTimer timer1 = new DispatcherTimer();
private readonly SystemConfig _systemConfig;
private IManagedMqttClient mqttClient;
// private readonly WebsocketClient _websocketClient;
private readonly IEventAggregator _ea;
protected void ShowLoading(string tip = "正在加载....")
{
_ea?.GetEvent<LoadingEvent>().Publish(new LoadingPayload { IsShow = true, Message = tip });
}
protected void HideLoading()
{
_ea?.GetEvent<LoadingEvent>().Publish(new LoadingPayload { IsShow = false });
}
}
}