using System.Configuration; using System.Reflection; using Abp.Configuration; using Abp.Dependency; using Abp.Runtime.Caching; using IwbZero.ToolCommon; using IwbZero.ToolCommon.LogHelpers; using IwbZero.ToolCommon.StringModel; using uPLibrary.Networking.M2Mqtt.Messages; using WeEngine.CommonDto; using WeEngine.Enum; using WeMessageService; namespace WeEngine.Message { public class WeEngineMsgClientManager : ISingletonDependency { public WeEngineMsgClientManager(ISettingManager settingManager, ICacheManager cacheManager) { SettingManager = settingManager; CacheManager = cacheManager; if (Client.NotValidate) { RegisterClient(); } } private static M2MqttMsgClient Client = new M2MqttMsgClient(); //public IIwbMsgClient Client { get; set; } private ISettingManager SettingManager { get; } private ICacheManager CacheManager { get; } public string ClientId { get; set; } /// /// 强制刷新客户端 /// public void RefreshClient() { this.LogInfo($"客户端{ClientId}开始强制刷新!"); Client.DisConnect(); Client = new M2MqttMsgClient(); RegisterClient(); SendMessage(ClientId, $"客户端{ClientId}已强制刷新!"); SendMessage("WeApp", $"客户端{ClientId}已强制刷新!"); } /// /// 注册客户端 /// public void RegisterClient() { ClientId = "WeEngine"; #if DEBUG ClientId += "-TEST"; var result = new MsgClientDto() { AppId = ClientId, Name = "智慧推演引擎", SecretKey = "WePlatformWeEngine", ServerIp = "localhost", ServerPort = 1885, }; #else string url = "";//SettingManager.GetSettingValue(IwbSettingNames.DateCenterUrl); url = url.IsEmpty() ? ConfigurationManager.AppSettings["DataCenter.Platform.BaseUrl"] ?? "http://shvber.com:5025/" : url; this.LogInfo(url); var result = GetMsgClientDto(ClientId, url); if (result == null) { //throw new UserFriendlyException("未查询到消息客户端配置!"); this.LogError($"未查询到消息客户端{ClientId}的配置!"); return; } #endif ClientId = result.AppId; Client.SetOptions(result.ServerIp, result.ServerPort, result.AppId, result.Name, result.SecretKey); Client.SetReceivedHandler(ReceivedHandler); Client.HeartbeatTopic.Add("WeApp"); Subscribe(); } private void Subscribe() { if (Client.CheckClient()) { Client.SubscribeTopic(ClientId, false); Client.SubscribeTopic("Heartbeat"); var t = typeof(MessageType); var fts = t.GetFields(BindingFlags.Static | BindingFlags.Public); foreach (var f in fts) { string name = f.Name; Client.SubscribeTopic($"{name}/+"); //AsyncHelper.RunSync(() => Client.SubscribeTopic(name)); } } } public void SendMessage(WeMessage message, MessageType type, string clientId = null) { if (Client.NotValidate) { RegisterClient(); } var topic = message.RunningId.IsEmpty() ? type.ToString() : $"{type}/{message.RunningId}"; Client.SendMsg(topic, message.Obj2String(), clientId); } public void SendMessage(WeMessage message) { if (Client.NotValidate) { RegisterClient(); } var topic = message.RunningId.IsEmpty() ? message.Type.ToString() : $"{message.Type}/{message.RunningId}"; Client.SendMsg(topic, message.Obj2String(), message.TargetClientId); } public void SendMessage(string msg) { if (Client.NotValidate) { RegisterClient(); } Client.SendMessage(ClientId, msg.Obj2String()); } public void SendMessage(string topic, string msg) { if (Client.NotValidate) { RegisterClient(); } Client.SendMessage(topic, msg.Obj2String()); } /// /// 消息接受回调处理 /// /// private void ReceiveMsgHandler(string msg) { var message = msg.Str2Obj(); if (message != null) { switch (message.Type) { case MessageType.Environment: break; case MessageType.RunningInfo: break; case MessageType.CommonMessage: break; case MessageType.GuideInfo: break; } } else { typeof(WeEngineMsgClientManager).LogError("MSG ERROR:" + msg); } } /// /// 消息接受回调处理 /// /// /// private void ReceivedHandler(object sender, MqttMsgPublishEventArgs e) { if (e.Topic == ClientId || e.Topic == $"{ClientId}/Heartbeat") { return; } string msg = System.Text.Encoding.UTF8.GetString(e.Message); ReceiveMsgHandler(msg); } //private static IMqttApplicationMessageReceivedHandler ReceivedHandler => new MqttApplicationMessageReceivedHandlerDelegate( // (arg) => // { // string payload = System.Text.Encoding.UTF8.GetString(arg.ApplicationMessage.Payload); // var message = payload.Str2Obj(); // if (message != null) // { // switch (message.MsgType) // { // case MessageType.Environment: // break; // case MessageType.RunningInfo: // break; // case MessageType.CommonMessage: // break; // case MessageType.GuideInfo: // break; // } // } // else // { // typeof(WeEngineMsgClientManager).LogError("Message ERROR:" + payload); // } // }); /// /// 获取消息客户端信息 /// /// public MsgClientDto GetMsgClientDto(string appid, string urlPrev) { return CacheManager.GetCache("WeEngineClient").Get($"{appid}", () => { var url = $"{urlPrev.Ew("/")}api/services/WePlatform/MessageServer/GetClient?appid={appid}"; var result = url.RequestPost(""); var dto = result.Str2Obj(); return dto; }); } } }