diff --git a/WeiCloud.Fusion/Alarm.DomainService/Alarm.DomainService.csproj b/WeiCloud.Fusion/Alarm.DomainService/Alarm.DomainService.csproj
index 3a1cf0c..b2d4540 100644
--- a/WeiCloud.Fusion/Alarm.DomainService/Alarm.DomainService.csproj
+++ b/WeiCloud.Fusion/Alarm.DomainService/Alarm.DomainService.csproj
@@ -14,7 +14,7 @@
-
+
diff --git a/WeiCloud.Fusion/Alarm.DomainService/DahAlarm/IDahuaGeneralCtlService.cs b/WeiCloud.Fusion/Alarm.DomainService/DahAlarm/IDahuaGeneralCtlService.cs
index 475c8df..4140c9c 100644
--- a/WeiCloud.Fusion/Alarm.DomainService/DahAlarm/IDahuaGeneralCtlService.cs
+++ b/WeiCloud.Fusion/Alarm.DomainService/DahAlarm/IDahuaGeneralCtlService.cs
@@ -1,5 +1,4 @@
-using Alarm.Application.RequestDto;
-using Alarm.Application.ResponeDto;
+using Alarm.Application.ResponeDto;
using Common.Shared.Application.DaHua;
namespace Alarm.DomainService.DahAlarm
diff --git a/WeiCloud.Fusion/AlarmService/AlarmService.API/AlarmService.API.csproj b/WeiCloud.Fusion/AlarmService/AlarmService.API/AlarmService.API.csproj
index 97918b8..a02dc02 100644
--- a/WeiCloud.Fusion/AlarmService/AlarmService.API/AlarmService.API.csproj
+++ b/WeiCloud.Fusion/AlarmService/AlarmService.API/AlarmService.API.csproj
@@ -8,7 +8,6 @@
-
diff --git a/WeiCloud.Fusion/Common.Shared.Application/ApiResult.cs b/WeiCloud.Fusion/Common.SharedService/Common.Shared.Application/ApiResult.cs
similarity index 100%
rename from WeiCloud.Fusion/Common.Shared.Application/ApiResult.cs
rename to WeiCloud.Fusion/Common.SharedService/Common.Shared.Application/ApiResult.cs
diff --git a/WeiCloud.Fusion/Common.Shared.Application/Common.Shared.Application.csproj b/WeiCloud.Fusion/Common.SharedService/Common.Shared.Application/Common.Shared.Application.csproj
similarity index 100%
rename from WeiCloud.Fusion/Common.Shared.Application/Common.Shared.Application.csproj
rename to WeiCloud.Fusion/Common.SharedService/Common.Shared.Application/Common.Shared.Application.csproj
diff --git a/WeiCloud.Fusion/Common.Shared.Application/DaHua/DaHApiResult.cs b/WeiCloud.Fusion/Common.SharedService/Common.Shared.Application/DaHua/DaHApiResult.cs
similarity index 100%
rename from WeiCloud.Fusion/Common.Shared.Application/DaHua/DaHApiResult.cs
rename to WeiCloud.Fusion/Common.SharedService/Common.Shared.Application/DaHua/DaHApiResult.cs
diff --git a/WeiCloud.Fusion/Common.Shared.Application/DaHua/RequestDto/DahuaVideoQueryDto.cs b/WeiCloud.Fusion/Common.SharedService/Common.Shared.Application/DaHua/RequestDto/DahuaVideoQueryDto.cs
similarity index 100%
rename from WeiCloud.Fusion/Common.Shared.Application/DaHua/RequestDto/DahuaVideoQueryDto.cs
rename to WeiCloud.Fusion/Common.SharedService/Common.Shared.Application/DaHua/RequestDto/DahuaVideoQueryDto.cs
diff --git a/WeiCloud.Fusion/Common.Shared.Application/DaHua/ResponeDto/DahuaVideoResDto.cs b/WeiCloud.Fusion/Common.SharedService/Common.Shared.Application/DaHua/ResponeDto/DahuaVideoResDto.cs
similarity index 100%
rename from WeiCloud.Fusion/Common.Shared.Application/DaHua/ResponeDto/DahuaVideoResDto.cs
rename to WeiCloud.Fusion/Common.SharedService/Common.Shared.Application/DaHua/ResponeDto/DahuaVideoResDto.cs
diff --git a/WeiCloud.Fusion/Common.SharedService/Common.Shared.Application/MQTT/MQTTParamDto.cs b/WeiCloud.Fusion/Common.SharedService/Common.Shared.Application/MQTT/MQTTParamDto.cs
new file mode 100644
index 0000000..458404b
--- /dev/null
+++ b/WeiCloud.Fusion/Common.SharedService/Common.Shared.Application/MQTT/MQTTParamDto.cs
@@ -0,0 +1,74 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace Common.Shared.Application.MQTT
+{
+ ///
+ /// Mqtt参数
+ ///
+ public class MQTTParamDto
+ {
+ ///
+ /// mqtt的标识名称
+ ///
+ public string MqttClientMark { get; set; }
+
+ ///
+ /// 项目ID
+ ///
+
+ public long ProjectId { get; set; }
+
+ ///
+ /// 服务器Ip
+ ///
+ public string HostIp { get; set; }
+
+ ///
+ /// 服务器端口号
+ ///
+ public short HostPort { get; set; }
+
+ ///
+ /// 超时时间 ms
+ ///
+ public int Timeout { get; set; }
+
+ ///
+ /// 通讯质量等级 0至多一次 2一次 1 至少一次
+ ///
+ public short Level { get; set; }
+
+ ///
+ /// 用户名
+ ///
+ public string UserName { get; set; }
+
+ ///
+ /// 密码
+ ///
+
+ public string Password { get; set; }
+
+ ///
+ /// 客户端ID
+ ///
+ public string? ClientId { get; set; }
+
+ ///
+ /// 发布的topic
+ ///
+ public List? PublishTopics { get; set; }
+
+ ///
+ /// 订阅的topic
+ ///
+ public List? SubscribeTopics { get; set; }
+
+ ///
+ /// 物联网版本 1 是老版本 2是新版本
+ ///
+ public short IotType { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/WeiCloud.Fusion/Common.SharedService/Common.Shared.DomainService/Common.Shared.DomainService.csproj b/WeiCloud.Fusion/Common.SharedService/Common.Shared.DomainService/Common.Shared.DomainService.csproj
new file mode 100644
index 0000000..3530a2b
--- /dev/null
+++ b/WeiCloud.Fusion/Common.SharedService/Common.Shared.DomainService/Common.Shared.DomainService.csproj
@@ -0,0 +1,21 @@
+
+
+
+ net8.0
+ enable
+ enable
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/WeiCloud.Fusion/Common.SharedService/Common.Shared.DomainService/MqttClient/IMqttClientService.cs b/WeiCloud.Fusion/Common.SharedService/Common.Shared.DomainService/MqttClient/IMqttClientService.cs
new file mode 100644
index 0000000..136e26a
--- /dev/null
+++ b/WeiCloud.Fusion/Common.SharedService/Common.Shared.DomainService/MqttClient/IMqttClientService.cs
@@ -0,0 +1,28 @@
+using MQTTnet;
+using MQTTnet.Client;
+
+namespace Common.Shared.DomainService.MqttClient
+{
+ public interface IMqttClientService
+ {
+ ///
+ Task SubscribeAsync(string topicName);
+
+ ///
+ /// 取消订阅主题
+ ///
+ ///
+ ///
+ Task UnSubscribeAsync(string topicName);
+
+ ///
+ /// 发送消息
+ ///
+ ///
+ ///
+ ///
+ Task PublishAsync(string topicName, string message);
+
+ Task ReceiveAsync(Action action);
+ }
+}
\ No newline at end of file
diff --git a/WeiCloud.Fusion/Common.SharedService/Common.Shared.DomainService/MqttClient/MQTTClient.cs b/WeiCloud.Fusion/Common.SharedService/Common.Shared.DomainService/MqttClient/MQTTClient.cs
new file mode 100644
index 0000000..64addd6
--- /dev/null
+++ b/WeiCloud.Fusion/Common.SharedService/Common.Shared.DomainService/MqttClient/MQTTClient.cs
@@ -0,0 +1,93 @@
+using Microsoft.Extensions.Logging;
+using MQTTnet;
+using MQTTnet.Client;
+using MQTTnet.Protocol;
+using WeiCloud.Core.BaseModels;
+
+namespace Common.Shared.DomainService.MqttClient
+{
+ public class MQTTClient
+ {
+ private readonly ILogger _logger;
+ internal IMqttClient mqttClient;
+
+ public MQTTClient(ILogger logger)
+ {
+ _logger = logger;
+ }
+
+ private async Task Subscribe(string topicNameStrs)
+ {
+ if (!string.IsNullOrWhiteSpace(topicNameStrs))
+ {
+ var topicNames = topicNameStrs.Split(",");
+ foreach (var topicName in topicNames)
+ {
+ await mqttClient.SubscribeAsync(topicName, MqttQualityOfServiceLevel.AtMostOnce);
+ }
+ }
+ }
+
+ ///
+ /// 初始化
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public async Task Init(string serverIp, int port, string authUser, string authPwd, string topicNameStrs, string clientId = "")
+ {
+ try
+ {
+ if (string.IsNullOrWhiteSpace(clientId))
+ {
+ clientId = Guid.NewGuid().ToString();
+ }
+ var factory = new MqttFactory();
+ mqttClient = factory.CreateMqttClient();
+ var options = new MqttClientOptionsBuilder()
+ .WithTcpServer(serverIp, port)
+ .WithCredentials(authUser, authPwd)
+ .WithCleanSession(false)
+ .WithClientId(clientId)
+ .Build();
+ //mqttClient.UseApplicationMessageReceivedHandler(e =>
+ //{
+ // Console.WriteLine("###收到消息####");
+ // Console.WriteLine($"Topic {e.ApplicationMessage.Topic}");
+ // Console.WriteLine($"Payload {Encoding.UTF8.GetString(e.ApplicationMessage.Payload)}");
+ // Console.WriteLine($"Qos {e.ApplicationMessage.QualityOfServiceLevel}");
+ // Console.WriteLine($"Retain {e.ApplicationMessage.Retain}");
+ // Console.WriteLine();
+ //});
+ mqttClient.DisconnectedAsync += async e =>
+ {
+ Console.WriteLine($"{clientId}连接异常{serverIp} {port}");
+ try
+ {
+ _logger.LogWarning(new LoggerWarp("Init", message: $"{clientId}连接异常{serverIp} {port}").GetMessage());
+ await Task.Delay(TimeSpan.FromSeconds(5));
+ await mqttClient.ConnectAsync(options);
+ //订阅
+ await Subscribe(topicNameStrs);
+ Console.WriteLine($"{clientId}重新连接服务器成功{serverIp} {port}");
+ _logger.LogWarning(new LoggerWarp("Init", message: $"{clientId}重新连接服务器{mqttClient.IsConnected}{serverIp} {port}").GetMessage());
+ }
+ catch (Exception ex)
+ {
+ Console.WriteLine($"重新连接服务器异常 {ex.Message}");
+ _logger.LogError(new LoggerWarp("Init", message: "重新连接服务器异常", ex: ex).GetMessage());
+ }
+ };
+ await mqttClient.ConnectAsync(options);
+ await Subscribe(topicNameStrs);
+ }
+ catch (Exception ex)
+ {
+ _logger.LogError(new LoggerWarp("Init", ex: ex).GetMessage());
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/WeiCloud.Fusion/Common.SharedService/Common.Shared.DomainService/MqttClient/MqttClientListService.cs b/WeiCloud.Fusion/Common.SharedService/Common.Shared.DomainService/MqttClient/MqttClientListService.cs
new file mode 100644
index 0000000..a5222f7
--- /dev/null
+++ b/WeiCloud.Fusion/Common.SharedService/Common.Shared.DomainService/MqttClient/MqttClientListService.cs
@@ -0,0 +1,173 @@
+using Common.Shared.Application.MQTT;
+using Microsoft.Extensions.Logging;
+using MQTTnet;
+using MQTTnet.Client;
+using MQTTnet.Protocol;
+using System.Collections.Concurrent;
+using System.Text;
+using WeiCloud.Utils.Common;
+
+namespace Common.Shared.DomainService.MqttClient
+{
+ public class MqttClientListService
+ {
+ private readonly ILogger _logger;
+
+ ///
+ /// mqttclient集合
+ ///
+ public static ConcurrentDictionary _mqttClientList = new ConcurrentDictionary();
+
+ private MqttFactory _factory = new MqttFactory();
+
+ ///
+ /// DI
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public MqttClientListService(ILogger logger)
+ {
+ _logger = logger;
+ }
+
+ ///
+ /// 创建mqtt客户端
+ ///
+ ///
+ ///
+ public async Task CreateMqttClient(MQTTParamDto mQTT)
+ {
+ try
+ {
+ var key = _mqttClientList.Keys.Where(x => x.MqttClientMark == mQTT.MqttClientMark).FirstOrDefault();
+ if (key != null)
+ {
+ return _mqttClientList[key];
+ }
+
+ if (string.IsNullOrWhiteSpace(mQTT.ClientId))
+ {
+ mQTT.ClientId = "robot_mqtt_" + UidGenerator.Uid().ToString();
+ }
+
+ var mqttClient = _factory.CreateMqttClient();
+ var options = new MqttClientOptionsBuilder()
+ .WithTcpServer(mQTT.HostIp, mQTT.HostPort)
+ .WithCredentials(mQTT.UserName, mQTT.Password)
+ .WithCleanSession(false)
+ .WithClientId(mQTT.ClientId)
+ .Build();
+
+ mqttClient.ApplicationMessageReceivedAsync += delegate (MqttApplicationMessageReceivedEventArgs args)
+ {
+ //var key = _mqttClientList.Keys.Where(x => x.ClientId == ).FirstOrDefault();
+ Console.WriteLine($"Topic {args.ApplicationMessage.Topic}");
+ Console.WriteLine($"Payload {Encoding.UTF8.GetString(args.ApplicationMessage.Payload)}");
+ Console.WriteLine($"Qos {args.ApplicationMessage.QualityOfServiceLevel}");
+ //进行业务处理
+ return Task.CompletedTask;
+ };
+
+ mqttClient.DisconnectedAsync += async e =>
+ {
+ await Task.Delay(TimeSpan.FromSeconds(5));
+ try
+ {
+ await mqttClient.ConnectAsync(options);
+ //订阅
+ await Subscribe(mqttClient, mQTT.SubscribeTopics, mQTT.Level);
+ }
+ catch (Exception ex)
+ {
+ Console.WriteLine($"重新连接服务器异常 {ex.Message}");
+ _logger.LogError($"Init 重新连接服务器异常{ex.Message}");
+ }
+ };
+ await mqttClient.ConnectAsync(options);
+ await Subscribe(mqttClient, mQTT.SubscribeTopics, mQTT.Level);
+ _mqttClientList.TryAdd(mQTT, mqttClient);
+ return mqttClient;
+ }
+ catch (Exception ex)
+ {
+ _logger.LogError($"create mqttclient error {ex.Message}");
+ return null;
+ }
+ }
+
+ ///
+ /// 订阅主题
+ ///
+ ///
+ ///
+ ///
+ ///
+ private async Task Subscribe(IMqttClient mqttClient, List? topics, short level)
+ {
+ var mqttSubscribeOptions = _factory.CreateSubscribeOptionsBuilder();
+ if (topics != null)
+ {
+ foreach (var topic in topics)
+ {
+ mqttSubscribeOptions.WithTopicFilter(
+ f =>
+ {
+ f.WithTopic(topic);
+ if (level == 1)
+ {
+ f.WithAtLeastOnceQoS();
+ }
+ else if (level == 0)
+ {
+ f.WithAtMostOnceQoS();
+ }
+ else if (level == 2)
+ {
+ f.WithExactlyOnceQoS();
+ }
+ });
+ }
+ var response = await mqttClient.SubscribeAsync(mqttSubscribeOptions.Build(), CancellationToken.None);
+ }
+ }
+
+ ///
+ /// 发布主题数据
+ ///
+ ///
+ ///
+ ///
+ public async Task Publish(string mqttClientMark, List msgs)
+ {
+ IMqttClient mqttClient = null;
+ var key = _mqttClientList.Keys.Where(x => x.MqttClientMark == mqttClientMark).FirstOrDefault();
+ if (key != null)
+ {
+ if (key.PublishTopics == null)
+ {
+ return;
+ }
+ mqttClient = _mqttClientList[key];
+ }
+ if (mqttClient == null)
+ {
+ return;
+ }
+ foreach (var msg in msgs)
+ {
+ foreach (var topic in key.PublishTopics)
+ {
+ var applicationMessage = new MqttApplicationMessageBuilder()
+ .WithTopic(topic)
+ .WithPayload(msg)
+ .WithQualityOfServiceLevel(MqttQualityOfServiceLevel.AtMostOnce)
+ .Build();
+ await mqttClient.PublishAsync(applicationMessage, CancellationToken.None);
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/WeiCloud.Fusion/Common.SharedService/Common.Shared.DomainService/MqttClient/MqttClientService.cs b/WeiCloud.Fusion/Common.SharedService/Common.Shared.DomainService/MqttClient/MqttClientService.cs
new file mode 100644
index 0000000..912ffb1
--- /dev/null
+++ b/WeiCloud.Fusion/Common.SharedService/Common.Shared.DomainService/MqttClient/MqttClientService.cs
@@ -0,0 +1,119 @@
+using Common.Shared.DomainService.MqttClient;
+using Microsoft.Extensions.Configuration;
+using MQTTnet;
+using MQTTnet.Client;
+
+namespace WeiCloud.SafetyFirePro.Services
+{
+ public class MqttClientService : IMqttClientService
+ {
+ private readonly MQTTClient _mQTTClient;
+ private readonly IConfiguration _configuration;
+ private string topicName = string.Empty;
+ private string mqttClientId = string.Empty;
+
+ public MqttClientService(MQTTClient mQTTClient, IConfiguration configuration)
+ {
+ _mQTTClient = mQTTClient;
+ //_configuration = configuration;
+ //using var loggerFactory = LoggerFactory.Create(builder =>
+ //{
+ //});
+ //var logger = loggerFactory.CreateLogger();
+ //_mQTTClient = new MQTTClient(logger);
+ //string mqttHostIp = _configuration["MqttClientOption:HostIp"];//IP地址
+ //short mqttHostPort = short.Parse(_configuration["MqttClientOption:HostPort"]);//端口号
+ //int mqttTimeout = short.Parse(_configuration["MqttClientOption:Timeout"]);//超时时间
+ //string mqttUsername = _configuration["MqttClientOption:UserName"];//用户名
+ //string mqttPassword = _configuration["MqttClientOption:Password"];//密码
+ ////string mqttClientId = _configuration["MqttClientOption:ClientId"];
+ //string proid = _configuration["MqttClientOption:ProjectId"];
+
+ //topicName = $"weilink/v1/control/commandcallback/{proid}/#";
+ //_mQTTClient.Init(mqttHostIp, mqttHostPort, mqttUsername, mqttPassword, topicName, mqttClientId);
+ }
+
+ ///
+ /// 订阅主题
+ ///
+ ///
+ ///
+ public async Task SubscribeAsync(string topicName)
+ {
+ if (string.IsNullOrEmpty(topicName))
+ {
+ return -1;
+ }
+ if (!_mQTTClient.mqttClient.IsConnected)
+ {
+ return -2;
+ }
+ await _mQTTClient.mqttClient.SubscribeAsync(new MqttTopicFilterBuilder().WithTopic(topicName).Build());
+ return 1;
+ }
+
+ ///
+ /// 取消订阅主题
+ ///
+ ///
+ ///
+ public async Task UnSubscribeAsync(string topicName)
+ {
+ if (string.IsNullOrEmpty(topicName))
+ {
+ return -1;
+ }
+ if (!_mQTTClient.mqttClient.IsConnected)
+ {
+ return -2;
+ }
+ MqttClientUnsubscribeOptions mqttClientUnsubscribeOptions = new MqttClientUnsubscribeOptions()
+ {
+ TopicFilters = new List() { topicName }
+ };
+ await _mQTTClient.mqttClient.UnsubscribeAsync(mqttClientUnsubscribeOptions);
+ return 1;
+ }
+
+ ///
+ /// 发送消息
+ ///
+ ///
+ ///
+ ///
+ public async Task PublishAsync(string topicName, string message)
+ {
+ if (string.IsNullOrEmpty(topicName))
+ {
+ return new MqttClientPublishResult();
+ }
+ if (!_mQTTClient.mqttClient.IsConnected)
+ {
+ return new MqttClientPublishResult();
+ }
+ var messagebuilder = new MqttApplicationMessageBuilder()
+ .WithTopic(topicName)
+ .WithPayload(message)
+ .WithQualityOfServiceLevel(MQTTnet.Protocol.MqttQualityOfServiceLevel.AtLeastOnce)
+ //.WithExactlyOnceQoS()
+ //.WithAtLeastOnceQoS()
+ .WithRetainFlag(false)
+ .Build();
+ MqttClientPublishResult mqttClientPublishResult = await _mQTTClient.mqttClient.PublishAsync(messagebuilder);
+ return mqttClientPublishResult;
+ }
+
+ ///
+ /// 接收消息
+ ///
+ ///
+ ///
+ public async Task ReceiveAsync(Action action)
+ {
+ _mQTTClient.mqttClient.ApplicationMessageReceivedAsync += async e =>
+ {
+ action(e);
+ };
+ }
+ }
+}
\ No newline at end of file
diff --git a/WeiCloud.Fusion/VideoService/Video.DomainService/Video.DomainService.csproj b/WeiCloud.Fusion/VideoService/Video.DomainService/Video.DomainService.csproj
index c611a6f..ca69cec 100644
--- a/WeiCloud.Fusion/VideoService/Video.DomainService/Video.DomainService.csproj
+++ b/WeiCloud.Fusion/VideoService/Video.DomainService/Video.DomainService.csproj
@@ -7,7 +7,7 @@
-
+
diff --git a/WeiCloud.Fusion/WeiCloud.Core/BaseModels/LoggerWarp.cs b/WeiCloud.Fusion/WeiCloud.Core/BaseModels/LoggerWarp.cs
new file mode 100644
index 0000000..08370f4
--- /dev/null
+++ b/WeiCloud.Fusion/WeiCloud.Core/BaseModels/LoggerWarp.cs
@@ -0,0 +1,35 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace WeiCloud.Core.BaseModels
+{
+ public class LoggerWarp
+ {
+ private readonly string _actionName;
+ private readonly string _message;
+ private readonly Exception _ex;
+
+ public LoggerWarp(string actionName, string message = "", Exception ex = null)
+ {
+ _actionName = actionName;
+ _message = message;
+ _ex = ex;
+ }
+
+ public string GetMessage()
+ {
+ StringBuilder messageString = new StringBuilder();
+ messageString.Append(_actionName).Append("|");
+ if (!string.IsNullOrEmpty(_message))
+ {
+ messageString.Append(_message).Append("|");
+ }
+ if (_ex != null)
+ {
+ messageString.Append($"抛出了异常信息:{_ex.Message} {_ex.StackTrace} {_ex.Source}");
+ }
+ return messageString.ToString();
+ }
+ }
+}
\ No newline at end of file
diff --git a/WeiCloud.Fusion/WeiCloud.Fusion.sln b/WeiCloud.Fusion/WeiCloud.Fusion.sln
index 4c1cf76..b0e6721 100644
--- a/WeiCloud.Fusion/WeiCloud.Fusion.sln
+++ b/WeiCloud.Fusion/WeiCloud.Fusion.sln
@@ -49,12 +49,14 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AlarmService.API", "AlarmSe
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Alarm.DomainService", "Alarm.DomainService\Alarm.DomainService.csproj", "{3ED553C4-3A63-4613-B979-472FDA5EA346}"
EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Common.Shared.Application", "Common.Shared.Application", "{80F3B34B-C334-44D2-A861-31FD403AD57D}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Common.Shared.Application", "Common.Shared.Application\Common.Shared.Application.csproj", "{6CE57FEC-4982-48AF-A9CB-4BCE93A84228}"
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Common.SharedService", "Common.SharedService", "{80F3B34B-C334-44D2-A861-31FD403AD57D}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Alarm.Application", "Alarm.Application\Alarm.Application.csproj", "{89367194-A636-41B9-81F0-283DCB84C296}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Common.Shared.Application", "Common.SharedService\Common.Shared.Application\Common.Shared.Application.csproj", "{9A5FBAFF-EBE8-3156-5547-FB3ED1DEB545}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Common.Shared.DomainService", "Common.SharedService\Common.Shared.DomainService\Common.Shared.DomainService.csproj", "{C2757FC0-54A9-BBD3-2E23-55F2F3912BA4}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -125,14 +127,18 @@ Global
{3ED553C4-3A63-4613-B979-472FDA5EA346}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3ED553C4-3A63-4613-B979-472FDA5EA346}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3ED553C4-3A63-4613-B979-472FDA5EA346}.Release|Any CPU.Build.0 = Release|Any CPU
- {6CE57FEC-4982-48AF-A9CB-4BCE93A84228}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {6CE57FEC-4982-48AF-A9CB-4BCE93A84228}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {6CE57FEC-4982-48AF-A9CB-4BCE93A84228}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {6CE57FEC-4982-48AF-A9CB-4BCE93A84228}.Release|Any CPU.Build.0 = Release|Any CPU
{89367194-A636-41B9-81F0-283DCB84C296}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{89367194-A636-41B9-81F0-283DCB84C296}.Debug|Any CPU.Build.0 = Debug|Any CPU
{89367194-A636-41B9-81F0-283DCB84C296}.Release|Any CPU.ActiveCfg = Release|Any CPU
{89367194-A636-41B9-81F0-283DCB84C296}.Release|Any CPU.Build.0 = Release|Any CPU
+ {9A5FBAFF-EBE8-3156-5547-FB3ED1DEB545}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {9A5FBAFF-EBE8-3156-5547-FB3ED1DEB545}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {9A5FBAFF-EBE8-3156-5547-FB3ED1DEB545}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {9A5FBAFF-EBE8-3156-5547-FB3ED1DEB545}.Release|Any CPU.Build.0 = Release|Any CPU
+ {C2757FC0-54A9-BBD3-2E23-55F2F3912BA4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {C2757FC0-54A9-BBD3-2E23-55F2F3912BA4}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {C2757FC0-54A9-BBD3-2E23-55F2F3912BA4}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {C2757FC0-54A9-BBD3-2E23-55F2F3912BA4}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -154,8 +160,9 @@ Global
{9F2BD2C5-6496-419D-B87A-4F481E963C4D} = {19A25984-FFA8-49BE-A710-6F269A406C61}
{2677EAF0-9F7F-4969-B8B1-3006F35EB93E} = {18791734-CA81-482D-964A-CA6D0F308B8E}
{3ED553C4-3A63-4613-B979-472FDA5EA346} = {18791734-CA81-482D-964A-CA6D0F308B8E}
- {6CE57FEC-4982-48AF-A9CB-4BCE93A84228} = {80F3B34B-C334-44D2-A861-31FD403AD57D}
{89367194-A636-41B9-81F0-283DCB84C296} = {18791734-CA81-482D-964A-CA6D0F308B8E}
+ {9A5FBAFF-EBE8-3156-5547-FB3ED1DEB545} = {80F3B34B-C334-44D2-A861-31FD403AD57D}
+ {C2757FC0-54A9-BBD3-2E23-55F2F3912BA4} = {80F3B34B-C334-44D2-A861-31FD403AD57D}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {379A56DA-D3F0-4E7E-8FF7-DA8E20015BF3}