using LitJson; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System.Collections; using System.Collections.Generic; using System.Text; using UnityEngine; using static LangChaoRommMinIo; using Blue; public class MQTTManager : MonoSingleton,IController { public string front = "client/"; public string id = ""; public string username = "u@unity3";// 需要根据服务器设置 public string password = null;// 需要根据服务器设置 public string rid = "mqttx_b4c02ddc"; //其他人的ID public string account; public string roomId; public string email; public string phone; public string roleId; public string resourcePool; public int resourcePoolId; public string expertType; public string _username; public string room; public static string certification; /// /// 获取信令 /// public void Signal() { GameStart.Instance.StartCoroutine(HttpTool.Instance.SendHttp(HttpActionLang.signal_certification, "", SignalCallBack)); // GameStart.Instance.StartCoroutine(HttpTool.Instance.SendHttp(HttpActionLang.userinfo, "", UserInfoCallBack)); // HttpTool.Instance.PostMqtt(HttpAction.signal_certification, "", SignalCallBack); } public void SetAccoutInfo(string account) { MQTTManager.Instance.account = account; } private void SignalCallBack(string msg) { Debug.Log(msg); JObject obj = JObject.Parse(msg); if (obj["code"].ToString() == "200") { HttpActionLang.Instance.mqttSocket = obj["data"]["host"].ToString(); MQTTManager.certification = obj["data"]["certification"].ToString(); MQTTManager.Instance.front = obj["data"]["topicPrefix"].ToString(); MQTTManager.Instance.id = obj["data"]["clientId"].ToString(); MQTTManager.Instance.username = obj["data"]["username"].ToString(); MQTTClient.Instance.Connect(); // StartCoroutine(TestCreateRoom()); } else { Debug.LogError("MQTT 获取信令失败 !!!" + obj["code"].ToString()); } } private IEnumerator TestCreateRoom() { yield return new WaitForSeconds(5); while (!RTCRoomManager.Instance.isRTCreate) { yield return new WaitForSeconds(1); this.GetService().CreatRoom(); } } private void UserInfoCallBack(string msg) { Debug.Log(msg); JObject obj = JObject.Parse(msg); if (obj["code"].ToString() == "200") { MQTTManager.Instance._username = obj["data"]["name"].ToString(); MQTTManager.Instance.roleId = obj["data"]["roleId"].ToString(); MQTTManager.Instance.email = obj["data"]["email"].ToString(); MQTTManager.Instance.phone = obj["data"]["phone"].ToString(); MQTTManager.Instance.resourcePool = obj["data"]["resourcePool"].ToString(); MQTTManager.Instance.expertType = obj["data"]["expertType"].ToString(); } else { Debug.LogError("获取用户信息失败 !!!"+ obj["code"].ToString()); } } public void SetRoomId(string id) { MQTTManager.Instance.roomId = id; // MQTTClient.Instance.roomId = "9527"; // 订阅房间频道 MQTTClient.Instance.Subscribe(MQTTManager.Instance.front + "room/" + id); } public void UnSubscribe( string id) { MQTTClient.Instance.UnSubscribe(MQTTManager.Instance.front + "room/" + id); } /// /// 发送消息 /// /// public void PushMsg(string msg) { if (!string.IsNullOrEmpty(msg)) { JsonData json = new JsonData(); json["account"] = MQTTManager.Instance.account; json["Sid"] = "sid";//选择的场景id json["msg"] = msg; MQTTClient.Instance.publish(Encoding.UTF8.GetBytes(json.ToJson())); } } /// /// 发送消息 /// /// public void PushMsg(string channelID, string msg) { if (!string.IsNullOrEmpty(msg)) { MQTTClient.Instance.publish(channelID, Encoding.UTF8.GetBytes(msg)); } } /// /// 接受消息 /// /// public void Received(string msg) { JObject obj = JObject.Parse(msg); Debug.Log("Received ===> " + obj["action"].ToString()); switch (obj["action"].ToString()) { case "timeout": // 超时 UICallManager.Instance.EventTimeOut(); break; case "invite": // 邀请 if(obj["control"] !=null) { string phone = obj["control"]["phone"].ToString(); RTCRoomManager.Instance.controlPhone = phone; if(RTCRoomManager.Instance.rtcState != RTCEnum.OFF) // 当前已经在房间内 直接发送当前房间号 { JsonData data = new JsonData(); data["action"] = "invite"; data["rtcRoom"] =RTCRoomManager.Instance.mRTCRoomInfo.roomId.ToString(); data["personnel"] = new JsonData(); data["personnel"]["id"] = MQTTManager.Instance.id; data["personnel"]["name"] = MQTTManager.Instance._username; data["personnel"]["resourcePoo1"] = MQTTManager.Instance.resourcePool; data["personnel"]["room"] = MQTTManager.Instance.room; data["personnel"]["phone"] = MQTTManager.Instance.phone; // 用MQTT 向中考发送邀请 MQTTManager.Instance.PushMsg(MQTTManager.Instance.front + "online/" + phone, data.ToJson()); } else // 不在房间内,创建房间后 发送邀请 { //string roomid = obj["rtcRoom"].ToString(); //string resourcePool = obj["control"]["resourcePoo1"].ToString(); RTCRoomManager.Instance.isInvite = true; UICallManager.Instance.EventInvite(obj["control"].ToString(), ""); Debug.Log(phone); } } else { Debug.LogError(" 非控制台邀请 "); } break; case "noExpert": // 无专家 UICallManager.Instance.EventNoExpert(); break; case "chat": // 聊天消息 // 拆解用户名 和 聊天内容 显示到聊天框里 string username = obj["from"].ToString(); string chatMsg = obj["chatMessage"].ToString(); FileList.Instance.AddMsgItem(null, username, chatMsg); break; case "share": // 接受文件 // 拆解用户名 和 文件名称 显示到聊天框里 下载文件 FileConfig fileConfig = JsonConvert.DeserializeObject(obj["chatMessage"].ToString()); fileConfig.From = obj["from"].ToString(); Debug.Log(" DGJ ===> FileConfig " + JsonConvert.SerializeObject(fileConfig)); FileList.Instance.AddItem(fileConfig); break; case "remark": // 空间标注 float Valuex = float.Parse(obj["chatMessage"]["x"].ToString()); float Valuey = float.Parse(obj["chatMessage"]["y"].ToString()); ArrowList.Instance.AddArrow(Valuex, Valuey); break; case "clearRemark": ArrowList.Instance.DeleteAll(); break; default: break; } } }