You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
432 lines
24 KiB
432 lines
24 KiB
using Container.Common;
|
|
using Container.Services;
|
|
using Newtonsoft.Json;
|
|
using RabbitMQ.Client;
|
|
using RabbitMQ.Client.Events;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.IO;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading;
|
|
using System.Threading.Tasks;
|
|
using System.Windows;
|
|
|
|
|
|
namespace Container.Business
|
|
{
|
|
public class RabbitHostedService
|
|
{
|
|
|
|
private readonly IConnection connection;
|
|
private static App app = ((App)Application.Current);
|
|
private readonly IModel channel;
|
|
static Class_Log _log = new Class_Log();
|
|
public delegate void WebSocketReceiveDelegate(string type, string message);
|
|
public static event WebSocketReceiveDelegate WebSocketReceiveEvent;
|
|
private HttpClient httpclient = new HttpClient();
|
|
private Class_Config con = new Class_Config();
|
|
public RabbitHostedService()
|
|
{
|
|
try
|
|
{
|
|
var factory = new ConnectionFactory()
|
|
{
|
|
UserName = app.rabbitMQ.UserName,
|
|
Password = app.rabbitMQ.Password,
|
|
HostName = app.rabbitMQ.HostName,
|
|
Port = app.rabbitMQ.Port,
|
|
};
|
|
this.connection = factory.CreateConnection();
|
|
this.channel = connection.CreateModel();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
//Console.WriteLine($"RabbitListener init error,ex:{ex.Message}");
|
|
_log.WriteLogFile("rabbitMq"+"init error:" + ex.Message, "RabbitHosted");
|
|
}
|
|
}
|
|
|
|
public Task StartAsync(CancellationToken cancellationToken)
|
|
{
|
|
Register();
|
|
return Task.CompletedTask;
|
|
}
|
|
|
|
|
|
// 注册消费者监听在这里
|
|
public void Register()
|
|
{
|
|
//Console.WriteLine($"RabbitListener register,routeKey:{RouteKey}");
|
|
if (string.IsNullOrEmpty(app.deviceid))
|
|
{
|
|
_log.WriteLogFile("rabbitMq"+ "设备未注册", "RabbitHosted");
|
|
return;
|
|
}
|
|
_log.WriteLogFile("rabbitMq"+ "已连接连接到服务器", "RabbitHosted");
|
|
//交换机名称
|
|
String exchangeName = "topic_immediately";
|
|
//声明交换机
|
|
//channel.ExchangeDeclare(exchange: exchangeName, type: "topic", durable: true);
|
|
//channel.ExchangeDeclare(exchange: "topic.default", type: "topic", durable: true);
|
|
//消息队列名称
|
|
String queueName = "device."+ app.deviceid;
|
|
//声明队列
|
|
channel.QueueDeclare(queue: queueName, durable: false, exclusive: false, autoDelete: true, arguments: null);
|
|
//将队列与交换机进行绑定
|
|
//foreach (var routeKey in args)
|
|
//{//匹配多个路由
|
|
// channel.QueueBind(queue: queueName, exchange: exchangeName, routingKey: routeKey);
|
|
//}
|
|
//channel.QueueBind(queue: queueName, exchange: "topic.default", routingKey: "");
|
|
channel.QueueBind(queue: queueName, exchange: exchangeName, routingKey: queueName);
|
|
//声明为手动确认
|
|
channel.BasicQos(0, 1, false);
|
|
//定义消费者
|
|
var consumer = new EventingBasicConsumer(channel);
|
|
consumer.Received += (model, ea) =>
|
|
{
|
|
var body = ea.Body;
|
|
var message = Encoding.UTF8.GetString(body);
|
|
var result = Process(message);
|
|
if (result)
|
|
{
|
|
channel.BasicAck(ea.DeliveryTag, false);
|
|
}
|
|
};
|
|
//开启监听
|
|
channel.BasicConsume(queue: queueName, autoAck: false, consumer: consumer);
|
|
}
|
|
|
|
// 处理消息的方法
|
|
public virtual bool Process(string msg)
|
|
{
|
|
try
|
|
{
|
|
string type = "";
|
|
_log.WriteLogFile(msg,"rabbit");
|
|
Dictionary<string, Object> diccontent = Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<string, Object>>(msg.ToLower());
|
|
if (diccontent["content"] != null)
|
|
{
|
|
Dictionary<string, Object> dic = JsonConvert.DeserializeObject<Dictionary<string, Object>>(diccontent["content"].ToString());
|
|
if (dic["content"] != null && dic["senderid"] != null)
|
|
{
|
|
Dictionary<string, Object> Commands = JsonConvert.DeserializeObject<Dictionary<string, Object>>(dic["content"].ToString());
|
|
|
|
if (!string.IsNullOrEmpty(Commands["type"].ToString()))
|
|
{
|
|
type = Commands["type"].ToString();
|
|
}
|
|
if (type.Trim().Equals("apppublish"))
|
|
{
|
|
AppListModel model = new AppListModel();
|
|
model.AppID = string.IsNullOrEmpty(Commands["appid"].ToString()) ? "" : Commands["appid"].ToString();
|
|
model.AppType = string.IsNullOrEmpty(Commands["apptype"].ToString()) ? "" : Commands["apptype"].ToString();
|
|
|
|
//model.AppUrl = string.IsNullOrEmpty(Commands["appurl"].ToString()) ? "" : Commands["appurl"].ToString();
|
|
model.Code = string.IsNullOrEmpty(Commands["code"].ToString()) ? "" : Commands["code"].ToString();
|
|
model.Logo = string.IsNullOrEmpty(Commands["logo"].ToString()) ? "" : Commands["logo"].ToString();
|
|
model.Name = string.IsNullOrEmpty(Commands["name"].ToString()) ? "" : Commands["name"].ToString();
|
|
model.ShelfTime = (Commands["shelftime"] == null || string.IsNullOrEmpty(Commands["shelftime"].ToString())) ? "" : Commands["shelftime"].ToString();
|
|
model.Default = string.IsNullOrEmpty(Commands["default"].ToString()) ? "false" : Commands["default"].ToString();
|
|
model.File = Commands["file"]==null ? "" : Commands["file"].ToString();
|
|
model.PackageName = Commands["packagename"]==null ? "" : Commands["packagename"].ToString();
|
|
model.PlatformType = Commands["platformtype"]==null ? "" : Commands["platformtype"].ToString();
|
|
model.Startup = Commands["startup"]==null ? "" : Commands["startup"].ToString();
|
|
model.Version = Commands["version"]==null ? "" : Commands["version"].ToString();
|
|
bool flag = httpclient.DownLoadIcon(ref model.Logo);
|
|
if (!string.IsNullOrEmpty(model.File))
|
|
{
|
|
httpclient.DownLoadFiles(model.File, ref model.File);
|
|
}
|
|
if (!string.IsNullOrEmpty(model.Startup) && (model.Startup.ToLower().StartsWith("https://") || model.Startup.ToLower().StartsWith("http://")))
|
|
{
|
|
model.Startup = _log.WriteAppStart(model.Name, model.Startup);
|
|
}
|
|
con.WriteToExeConfig(model);
|
|
app.AppList.Add(model);
|
|
//_log.WriteLogFile("发布应用", "WebSocketLog");
|
|
//app.AppUpdate = false;
|
|
//if (!string.IsNullOrEmpty(Commands["appname"].ToString()))
|
|
//{
|
|
// app.appName = Commands["appname"].ToString();
|
|
// app.Appdowninfo.exename = Commands["appname"].ToString();
|
|
//}
|
|
//if (!string.IsNullOrEmpty(Commands["filepath"].ToString()))
|
|
//{
|
|
// app.appUrl = Commands["filepath"].ToString();
|
|
|
|
//}
|
|
//if (!string.IsNullOrEmpty(Commands["appnameen"].ToString()))
|
|
//{
|
|
// app.Appdowninfo.exestartname = Commands["appnameen"].ToString();
|
|
//}
|
|
//if (!string.IsNullOrEmpty(Commands["iconfilepath"].ToString()))
|
|
//{
|
|
// app.icourl = Commands["iconfilepath"].ToString();
|
|
//}
|
|
//if (!string.IsNullOrEmpty(Commands["appid"].ToString()))
|
|
//{
|
|
// app.Appdowninfo.AppID = Commands["appid"].ToString();
|
|
//}
|
|
//if (!string.IsNullOrEmpty(Commands["version"].ToString()))
|
|
//{
|
|
// app.Appdowninfo.Version = Commands["version"].ToString();
|
|
//}
|
|
//if (!string.IsNullOrEmpty(Commands["default"].ToString()))
|
|
//{
|
|
// app.Appdowninfo.Default = Convert.ToBoolean(Commands["default"]);
|
|
//}
|
|
}
|
|
else if (type.Trim().Equals("cloud-screenshot"))
|
|
{
|
|
app.screenshotUserName = string.IsNullOrEmpty(Commands["parameter"].ToString()) ? "" : Commands["parameter"].ToString();
|
|
}
|
|
else if (type.Trim().Equals("appdown"))
|
|
{
|
|
var code = Commands["code"].ToString();
|
|
var defaultCode= Commands["defaultapp"].ToString();
|
|
if (!string.IsNullOrEmpty(code))
|
|
{
|
|
var appmodel = app.AppList.Where(i => i.Code == code).FirstOrDefault();
|
|
var appList = app.AppList;
|
|
app.AppList.Remove(appmodel);
|
|
foreach (var item in app.AppList)
|
|
{
|
|
if (item.Code == defaultCode) {
|
|
item.Default = Boolean.TrueString;
|
|
}
|
|
|
|
}
|
|
//con.RemoveExeConfig(appmodel.Code, ref appmodel.File, ref appmodel.Logo, ref appmodel.Startup);
|
|
//if (!string.IsNullOrEmpty(appmodel.File) && Directory.Exists(appmodel.File))
|
|
//{
|
|
// Directory.Delete(appmodel.File);
|
|
//}
|
|
|
|
//if (!string.IsNullOrEmpty(appmodel.Logo) && File.Exists(appmodel.Logo))
|
|
//{
|
|
// File.Delete(appmodel.Logo);
|
|
//}
|
|
|
|
//if (!string.IsNullOrEmpty(appmodel.Logo) && File.Exists(appmodel.Startup))
|
|
//{
|
|
// File.Delete(appmodel.Startup);
|
|
//}
|
|
var nowTimeSlot = app.AppTimeList.Where(i => i.AppCode != code&&i.AppCode!=defaultCode).ToList();
|
|
if (nowTimeSlot.Count < app.AppTimeList.Count) {
|
|
app.AppTimeList = nowTimeSlot;
|
|
con.WriteToAppTimeConfig(app.AppTimeList);
|
|
}
|
|
}
|
|
//app.AppDownCode = "";
|
|
//app.DefaultAppCode = "";
|
|
//if (!string.IsNullOrEmpty(Commands["appid"].ToString()))
|
|
//{
|
|
// app.AppDownCode = Commands["appid"].ToString();
|
|
//}
|
|
//if (!string.IsNullOrEmpty(Commands["defaultappcode"].ToString()))
|
|
//{
|
|
// app.DefaultAppCode = Commands["defaultappcode"].ToString();
|
|
//}
|
|
}
|
|
else if (type.Trim().Equals("apptimeset"))
|
|
{
|
|
HttpMessage httpMessage = new HttpMessage();
|
|
httpMessage.LoadAppTimeConfig();
|
|
//app.DefaultAppCode = "";
|
|
//if (!string.IsNullOrEmpty(Commands["defaultappcode"].ToString()))
|
|
//{
|
|
// app.DefaultAppCode = Commands["defaultappcode"].ToString();
|
|
//}
|
|
}
|
|
else if (type.Trim().Equals("appupdate"))
|
|
{
|
|
AppListModel model = new AppListModel();
|
|
model.AppID = string.IsNullOrEmpty(Commands["appid"].ToString()) ? "" : Commands["appid"].ToString();
|
|
model.AppType = string.IsNullOrEmpty(Commands["apptype"].ToString()) ? "" : Commands["apptype"].ToString();
|
|
|
|
//model.AppUrl = string.IsNullOrEmpty(Commands["appurl"].ToString()) ? "" : Commands["appurl"].ToString();
|
|
model.Code = string.IsNullOrEmpty(Commands["code"].ToString()) ? "" : Commands["code"].ToString();
|
|
model.Logo = string.IsNullOrEmpty(Commands["logo"].ToString()) ? "" : Commands["logo"].ToString();
|
|
model.Name = string.IsNullOrEmpty(Commands["name"].ToString()) ? "" : Commands["name"].ToString();
|
|
model.ShelfTime = (Commands["shelftime"] == null || string.IsNullOrEmpty(Commands["shelftime"].ToString())) ? "" : Commands["shelftime"].ToString();
|
|
model.Default = string.IsNullOrEmpty(Commands["default"].ToString()) ? "false" : Commands["default"].ToString();
|
|
model.File = Commands["file"] == null ? "" : Commands["file"].ToString();
|
|
model.PackageName = Commands["packagename"] == null ? "" : Commands["packagename"].ToString();
|
|
model.PlatformType = Commands["platformtype"] == null ? "" : Commands["platformtype"].ToString();
|
|
model.Startup = Commands["startup"] == null ? "" : Commands["startup"].ToString();
|
|
model.Version = Commands["version"] == null ? "" : Commands["version"].ToString();
|
|
bool flag = httpclient.DownLoadIcon(ref model.Logo);
|
|
var appModel = app.AppList.Where(i => i.Code == model.Code).FirstOrDefault();
|
|
if ((appModel == null || appModel.Version != model.Version) && !string.IsNullOrEmpty(model.File))
|
|
{
|
|
httpclient.DownLoadFiles(model.File, ref model.File);
|
|
}
|
|
if (!string.IsNullOrEmpty(model.Startup) && (model.Startup.ToLower().StartsWith("https://") || model.Startup.ToLower().StartsWith("http://")))
|
|
{
|
|
model.Startup = _log.WriteAppStart(model.Name, model.Startup);
|
|
}
|
|
con.WriteToExeConfig(model);
|
|
foreach (var item in app.AppList)
|
|
{
|
|
if (item.Code == model.Code) {
|
|
item.AppID = model.AppID;
|
|
item.AppType = model.AppType;
|
|
item.Default = model.Default;
|
|
item.File = model.File;
|
|
item.Logo = model.Logo;
|
|
item.Name = model.Name;
|
|
item.PackageName = model.PackageName;
|
|
item.PlatformType = model.PlatformType;
|
|
item.ShelfTime = model.ShelfTime;
|
|
item.Startup = model.Startup;
|
|
item.Version = model.Version;
|
|
}
|
|
}
|
|
}
|
|
else if (type.Trim().Equals("appclock"))
|
|
{
|
|
//if (!string.IsNullOrEmpty(Commands["data"].ToString()))
|
|
//{
|
|
// Dictionary<string, Object> data = JsonConvert.DeserializeObject<Dictionary<string, Object>>(Commands["data"].ToString());
|
|
// if (!string.IsNullOrEmpty(data["startapp"].ToString()))
|
|
// {
|
|
// Dictionary<string, string> startapp = JsonConvert.DeserializeObject<Dictionary<string, string>>(data["startapp"].ToString());
|
|
// if (!string.IsNullOrEmpty(startapp["filename"].ToString()))
|
|
// {
|
|
// app.AppPlayDir = startapp["filename"].ToString();
|
|
// app.AppStartinfo.exepath = startapp["appnameen"].ToString();
|
|
|
|
// if (!string.IsNullOrEmpty(startapp["appnameen"].ToString()))
|
|
// {
|
|
// //app.AppPlayName = startapp["appnameen"].ToString();
|
|
// app.AppStartinfo.exestartname = startapp["appnameen"].ToString();
|
|
// }
|
|
|
|
// if (!string.IsNullOrEmpty(startapp["appid"].ToString()))
|
|
// {
|
|
// app.AppStartinfo.AppID = startapp["appid"].ToString();
|
|
// }
|
|
// if (!string.IsNullOrEmpty(startapp["appname"].ToString()))
|
|
// {
|
|
// app.AppStartinfo.exename = startapp["appname"].ToString();
|
|
// }
|
|
// }
|
|
// else
|
|
// {
|
|
// if (!string.IsNullOrEmpty(data["endapp"].ToString()))
|
|
// {
|
|
// Dictionary<string, string> endapp = JsonConvert.DeserializeObject<Dictionary<string, string>>(data["endapp"].ToString());
|
|
// if (!string.IsNullOrEmpty(endapp["name"].ToString()))
|
|
// {
|
|
// app.AppStartinfo.exename = "";
|
|
// }
|
|
// }
|
|
// }
|
|
// }
|
|
|
|
//}
|
|
}
|
|
else if (type.Trim().Equals("insertad"))
|
|
{
|
|
//if (!string.IsNullOrEmpty(Commands["data"].ToString()))
|
|
//{
|
|
// Dictionary<string, Object> data = JsonConvert.DeserializeObject<Dictionary<string, Object>>(Commands["data"].ToString());
|
|
// if (!string.IsNullOrEmpty(data["filepath"].ToString()))
|
|
// {
|
|
// //Dictionary<string, string> admodel = JsonConvert.DeserializeObject<Dictionary<string, string>>(data["admodel"].ToString());
|
|
// //if (!string.IsNullOrEmpty(data["filepath"].ToString()))
|
|
// //{
|
|
// app.insertAD.Duration = Convert.ToInt32(data["duration"]);
|
|
// app.insertAD.FilePath = data["filepath"].ToString();
|
|
// //}
|
|
// }
|
|
|
|
//}
|
|
}
|
|
else if (type.Trim().Equals("addown"))
|
|
{
|
|
//app.insertAD.Duration = 0;
|
|
//app.insertAD.FilePath = "";
|
|
}
|
|
else if (type.Trim().Equals("devnumedit"))
|
|
{
|
|
if (!string.IsNullOrEmpty(Commands["devnum"].ToString()))
|
|
{
|
|
app.devicemark = Commands["devnum"].ToString();
|
|
}
|
|
}
|
|
else if (type.Trim().Equals("bgset"))
|
|
{
|
|
if (!string.IsNullOrEmpty(Commands["filepath"].ToString()))
|
|
{
|
|
app.bgPath = Commands["filepath"].ToString();
|
|
}
|
|
}
|
|
else if (type.Trim().Equals("screensaver"))
|
|
{
|
|
app.screensaver.ScreenTime = 30;
|
|
if (!string.IsNullOrEmpty(Commands["time"].ToString()))
|
|
{
|
|
app.screensaver.ScreenTime = Convert.ToInt32(Commands["time"]);
|
|
}
|
|
string fileName = string.Empty;
|
|
if (!string.IsNullOrEmpty(Commands["screenfilepath"].ToString()))
|
|
{
|
|
string path = Commands["screenfilepath"].ToString();
|
|
if (!string.IsNullOrEmpty(path))
|
|
{
|
|
httpclient.DownLoadImage(path, "exefile/PCScreen/config", ref fileName);
|
|
}
|
|
}
|
|
Class_Config config = new Class_Config();
|
|
string screentype = "0";
|
|
if (!string.IsNullOrEmpty(Commands["screentype"].ToString()))
|
|
{
|
|
screentype = Commands["screentype"].ToString();
|
|
}
|
|
|
|
string screeneffect = "0";
|
|
if (!string.IsNullOrEmpty(Commands["screeneffect"].ToString()))
|
|
{
|
|
screeneffect = Commands["screeneffect"].ToString();
|
|
}
|
|
|
|
string effecttype = "0";
|
|
if (!string.IsNullOrEmpty(Commands["effecttype"].ToString()))
|
|
{
|
|
effecttype = Commands["effecttype"].ToString();
|
|
}
|
|
config.WriteToScreenConfig(screentype, screeneffect, fileName, effecttype);
|
|
}
|
|
else if (type.Trim().Equals("shutdowntime"))
|
|
{
|
|
app.shutdowntime = Commands["parameter"].ToString();
|
|
}
|
|
}
|
|
}
|
|
if (WebSocketReceiveEvent != null)
|
|
{
|
|
WebSocketReceiveEvent(type, "");
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
_log.WriteLogFile(ex.ToString(), "WebSocketLog");
|
|
|
|
}
|
|
return true;
|
|
}
|
|
|
|
public void DeRegister()
|
|
{
|
|
this.connection.Close();
|
|
}
|
|
public Task StopAsync(CancellationToken cancellationToken)
|
|
{
|
|
this.connection.Close();
|
|
return Task.CompletedTask;
|
|
}
|
|
}
|
|
}
|
|
|