MessageClientManager.cs 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328
  1. using System;
  2. using System.Reflection;
  3. using Assets.Plugins.CommonTool;
  4. using Assets.Plugins.Log;
  5. using UnityEngine;
  6. using uPLibrary.Networking.M2Mqtt.Messages;
  7. using Random = System.Random;
  8. namespace Assets.Plugins.WeMessageService
  9. {
  10. public class MessageClientManager : MonoBehaviour
  11. {
  12. private static MessageClientManager _instance;
  13. //public static MessageClientManager Instance => _instance ??= new MessageClientManager();
  14. public static MessageClientManager Instance
  15. {
  16. get
  17. {
  18. if (_instance == null)
  19. {
  20. GameObject obj = new GameObject("MessageClientManagerObj");
  21. _instance = obj.AddComponent<MessageClientManager>();
  22. DontDestroyOnLoad(obj);
  23. _instance.RegisterClient();
  24. }
  25. return _instance;
  26. }
  27. }
  28. private static MessageM2MqttClient Client = new MessageM2MqttClient(true,3);
  29. public string ClientId { get; set; }= "WeApp3D";
  30. public delegate void MsgReceiveHandler(WeMessage msg);
  31. public delegate void MsgReceiveHandlerString(string msg);
  32. public event MsgReceiveHandlerString ReceiveError;
  33. public event MsgReceiveHandlerString ReceiveHeartbeat;
  34. public event MsgReceiveHandler ReceiveStart;
  35. public event MsgReceiveHandler ReceiveEnd;
  36. public event MsgReceiveHandler ReceiveRunningInfo;
  37. public event MsgReceiveHandler ReceiveRoundScore;
  38. public event MsgReceiveHandler ReceiveScene;
  39. public event MsgReceiveHandler ReceiveGuide;
  40. public event MsgReceiveHandler ReceiveEnvironment;
  41. public event MsgReceiveHandler ReceiveMatchSuccess;
  42. public event MsgReceiveHandler ReceiveCommonMsg;
  43. /// <summary>
  44. /// 强制刷新客户端
  45. /// </summary>
  46. public void RefreshClient()
  47. {
  48. this.LogInfo($"客户端{ClientId}开始强制刷新!");
  49. Client.DisConnect();
  50. Client = new MessageM2MqttClient(true);
  51. RegisterClient();
  52. SendMessage(ClientId, $"客户端{ClientId}已强制刷新!");
  53. SendMessage("WeEngine", $"客户端{ClientId}已强制刷新!");
  54. }
  55. /// <summary>
  56. /// 注册客户端
  57. /// </summary>
  58. public void RegisterClient()
  59. {
  60. ClientId = "WeApp3D";
  61. var result = new MsgClientDto()
  62. {
  63. AppId = ClientId,
  64. Name = "智慧演练系统3D",
  65. SecretKey = "WePlatformWeApp3D",
  66. //SecretKey = "WePlatformWeOnlineApp",
  67. ServerIp = "www.shvber.com",
  68. //ServerIp = "47.112.30.247",
  69. ServerPort = 1885,
  70. };
  71. //ClientId = "WeApp3D";
  72. #if DEBUG
  73. //ClientId = "WeApp3D"+"-Test";
  74. //var result = new MsgClientDto()
  75. //{
  76. // AppId = ClientId,
  77. // Name = "智慧演练系统",
  78. // SecretKey = "WePlatformWeApp",
  79. // ServerIp = "shvber.com",
  80. // ServerPort = 1885,
  81. //};
  82. #else
  83. //MsgClientDto result = CacheManager.GetMsgClientDto(ClientId, _url);
  84. //if (result == null)
  85. //{
  86. // //throw new UserFriendlyException("未查询到消息客户端配置!");
  87. // this.LogError($"未查询到消息客户端{ClientId}的配置!");
  88. // return;
  89. //}
  90. #endif
  91. Client.SetOptions(result.ServerIp, result.ServerPort, ClientId, result.Name, result.SecretKey);
  92. Client.SetReceivedHandler(ReceivedHandler);
  93. Subscribe();
  94. SendMessage(ClientId, $"客户端{ClientId}注册!");
  95. SendMessage("WeEngine", $"客户端{ClientId}注册!");
  96. }
  97. private void Subscribe()
  98. {
  99. if (Client.CheckClient())
  100. {
  101. Client.SubscribeTopic(ClientId, false);
  102. Client.SubscribeTopic("Heartbeat");
  103. var t = typeof(MessageType);
  104. var fts = t.GetFields(BindingFlags.Static | BindingFlags.Public);
  105. foreach (var f in fts)
  106. {
  107. Client.SubscribeTopic($"{f.Name}/+");
  108. }
  109. }
  110. }
  111. public void SendMessage(WeMessage message, MessageType type, string clientId = null)
  112. {
  113. if (Client.NotValidate)
  114. {
  115. RegisterClient();
  116. }
  117. var msg = message.Obj2String();
  118. Client.SendMsg(type.ToString(), msg, clientId);
  119. }
  120. public void SendMessage(WeMessage message)
  121. {
  122. if (Client.NotValidate)
  123. {
  124. RegisterClient();
  125. }
  126. var msg = message.Obj2String();
  127. Client.SendMsg(message.Type.ToString(), msg, message.TargetClientId);
  128. }
  129. public void SendSelfMessage(string msg)
  130. {
  131. if (Client.NotValidate)
  132. {
  133. RegisterClient();
  134. }
  135. Client.SendMessage(ClientId, msg);
  136. }
  137. public void SendMessage(string topic, string msg)
  138. {
  139. if (Client.NotValidate)
  140. {
  141. RegisterClient();
  142. }
  143. Client.SendMessage(topic, msg);
  144. }
  145. /// <summary>
  146. /// 消息接受回调处理
  147. /// </summary>
  148. /// <param name="sender"></param>
  149. /// <param name="e"></param>
  150. private void ReceivedHandler(object sender, MqttMsgPublishEventArgs e)
  151. {
  152. string msg = System.Text.Encoding.UTF8.GetString(e.Message);
  153. if (e.Topic == ClientId || e.Topic == $"{ClientId}/Heartbeat")
  154. {
  155. ReceiveHeartbeat?.Invoke(msg);
  156. return;
  157. }
  158. ReceiveMsgHandler(msg);
  159. }
  160. /// <summary>
  161. /// 消息接受回调处理
  162. /// </summary>
  163. /// <param name="msg"></param>
  164. private void ReceiveMsgHandler(string msg)
  165. {
  166. try
  167. {
  168. var message = msg.Str2Obj<WeMessage>();
  169. if (message != null)
  170. {
  171. switch (message.Type)
  172. {
  173. case MessageType.Start:
  174. ReceiveStart?.Invoke(message);
  175. break;
  176. case MessageType.End:
  177. ReceiveEnd?.Invoke(message);
  178. break;
  179. case MessageType.RunningInfo:
  180. ReceiveRunningInfo?.Invoke(message);
  181. break;
  182. case MessageType.RoundScore:
  183. ReceiveRoundScore?.Invoke(message);
  184. break;
  185. case MessageType.SceneInfo:
  186. ReceiveScene?.Invoke(message);
  187. break;
  188. case MessageType.GuideInfo:
  189. ReceiveGuide?.Invoke(message);
  190. break;
  191. case MessageType.Environment:
  192. ReceiveEnvironment?.Invoke(message);
  193. break;
  194. case MessageType.CommandMatchSuccess:
  195. ReceiveMatchSuccess?.Invoke(message);
  196. break;
  197. case MessageType.CommonMessage:
  198. ReceiveCommonMsg?.Invoke(message);
  199. break;
  200. }
  201. }
  202. else
  203. {
  204. ReceiveError?.Invoke(msg);
  205. LogHelper.LogError("MSG ERROR:" + msg);
  206. }
  207. }
  208. catch (Exception e)
  209. {
  210. LogHelper.LogError(e);
  211. }
  212. }
  213. }
  214. public class MsgClientDto
  215. {
  216. public string AppId { get; set; }
  217. public string Name { get; set; }
  218. public string SecretKey { get; set; }
  219. public string ServerIp { get; set; }
  220. public int ServerPort { get; set; }
  221. }
  222. public enum MessageType
  223. {
  224. /// <summary>
  225. /// 内部消息
  226. /// </summary>
  227. InternalMessage,
  228. /// <summary>
  229. /// 开始运行
  230. /// </summary>
  231. Start,
  232. /// <summary>
  233. /// 结束运行
  234. /// </summary>
  235. End,
  236. /// <summary>
  237. /// 运行信息
  238. /// </summary>
  239. RunningInfo,
  240. /// <summary>
  241. /// 轮次评分
  242. /// </summary>
  243. RoundScore,
  244. /// <summary>
  245. /// 情景信息
  246. /// </summary>
  247. SceneInfo,
  248. /// <summary>
  249. /// 环境信息
  250. /// </summary>
  251. Environment,
  252. /// <summary>
  253. /// 引导信息
  254. /// </summary>
  255. GuideInfo,
  256. /// <summary>
  257. /// 指令成功消息
  258. /// </summary>
  259. CommandMatchSuccess,
  260. /// <summary>
  261. /// 普通消息
  262. /// </summary>
  263. CommonMessage,
  264. }
  265. public class WeMessage
  266. {
  267. public WeMessage()
  268. {
  269. Id = $"IWB-{DateTime.Now:MMddHHmmssffff}{new Random(1000).Next(1000, 9999)}";
  270. SendCount = 0;
  271. LastSendDateTime = DateTime.Now;
  272. IsReSend = false;
  273. }
  274. public WeMessage(string msg) : this()
  275. {
  276. Content = msg;
  277. }
  278. public WeMessage(MessageType type, string msg) : this(msg)
  279. {
  280. Type = type;
  281. }
  282. public WeMessage(MessageType type, string runningId, string targetClientId, string msg) : this(msg)
  283. {
  284. Type = type;
  285. TargetClientId = targetClientId;
  286. RunningId = runningId;
  287. }
  288. public string RunningId { get; set; }
  289. [Newtonsoft.Json.JsonIgnore()]
  290. public string TargetClientId { get; set; }
  291. public MessageType Type { get; set; }
  292. public string Id { get; set; }
  293. public string Content { get; set; }
  294. [Newtonsoft.Json.JsonIgnore()]
  295. public int SendCount { get; set; }
  296. [Newtonsoft.Json.JsonIgnore()]
  297. public DateTime LastSendDateTime { get; set; }
  298. [Newtonsoft.Json.JsonIgnore()]
  299. public bool IsReSend { get; set; }
  300. }
  301. }