using LitJson; using System; using System.Collections; using System.Collections.Generic; using System.Text; using UnityEngine; using UnityEngine.Android; using uPLibrary.Networking.M2Mqtt.Messages; using static QTTManager; public class MQTTClient : MonoSingleton { public string OnlineType = "online/"; string password = null;// 需要根据服务器设置 public static byte[] bytes; // public static byt ta; QTTManager qt; // Start is called before the first frame update void Start() { // 请求文件读取和写入权限 if (!Permission.HasUserAuthorizedPermission(Permission.ExternalStorageRead) || !Permission.HasUserAuthorizedPermission(Permission.ExternalStorageWrite)) { Permission.RequestUserPermission(Permission.ExternalStorageRead); Permission.RequestUserPermission(Permission.ExternalStorageWrite); } bytes = (Resources.Load("emqxsl-ca") as TextAsset).bytes; Debug.Log(" DGJ ===> emqxsl-ca.bytes "+ bytes.Length); } Queue rlist = new Queue(); private void OnReceived(MqttMsgPublishEventArgs obj) { rlist.Enqueue(obj); } private void OnConnecting() { Debug.Log("MQtt 连接中"); } private void onSucceed() { Subscribe(); } private void onFaild() { Debug.Log("MQtt 连接失败"); } // Update is called once per frame void Update() { if (rlist.Count > 0) { for (int i = 0; i < rlist.Count; i++) { OnUnityReceived(rlist.Dequeue()); } } } //MQTT接收到的数据 public void OnUnityReceived(MqttMsgPublishEventArgs obj) { string msg = Encoding.UTF8.GetString(obj.Message); Debug.Log("uid => " + obj.Topic + ":\n" + msg); try { JsonData data = JsonMapper.ToObject(msg); Debug.Log(" DGJ === > " + data["type"].ToString()); switch (data["type"].ToString()) { case "CamPos": Debug.Log("DGJ ===> CamPos"); // 根据 uid 同步Player 位置 如果没有就创建 MultiPlayerManager.Instance.ReceivedCamPos(obj.Topic, data); break; case "ActiveSp": // 同步对应景点的开关 MultiPlayerManager.Instance.ReceivedActiveSp( data); break; case "ActiveVideo": // 同步播放器的对应状态 MultiPlayerManager.Instance.ReceivedActiveVideo(data); break; default: break; } } catch { return; } } private void OnDestroy() { DisConnect(); } public string auth; public string topicPrefix; public string clientIdPrefix; public void setData(JsonData data) { //MQTTClinet 连接 MQTTClient.Instance.SetUserName(data["auth"].ToString()); MQTTClient.Instance.SetFront(data["topicPrefix"].ToString()); clientIdPrefix = data["clientIdPrefix"].ToString(); } public void PublicPosScene(string sid,string pos) { ; if (qt != null && qt.IsConnect()) { // Debug.Log("发送===》"+ "10001/realtime/project/" + sid+"_"+ pos); publish("10001/realtime/project/" + sid,Encoding.UTF8.GetBytes(pos)); } } public void SubscribeScene(string sid) { Debug.Log(" DGJ =====> 订阅 " + topicPrefix + sid); Debug.Log(" DGJ =====> 订阅 " + topicPrefix + OnlineType + sid); ushort s = qt.Subscribe( new string[] { topicPrefix+sid, topicPrefix+OnlineType+sid }, new byte[] { MqttMsgBase.QOS_LEVEL_EXACTLY_ONCE, MqttMsgBase.QOS_LEVEL_EXACTLY_ONCE }); } public void SetUserName(string username) { if (auth != null) this.auth = username; } public void SetFront(string front) { if (topicPrefix != null) this.topicPrefix = front; } public string id; public string rid; //连接 public void Connect() { Debug.Log("DGJ ===> MQTT "); if (DeviceType.type == "Phone") { id = UserInfo.Instance.Account + "_Phone"; rid = clientIdPrefix+UserInfo.Instance.Account + "_Glasses"; } else { id = UserInfo.Instance.Account + "_Glasses"; rid = clientIdPrefix + UserInfo.Instance.Account + "_Phone"; } DisConnect(); Debug.Log("mqtturl=====》" + HttpAction.Instance.mqtturl+"_"+ HttpAction.Instance.officeport+ (Resources.Load("emqxsl-ca") as TextAsset).bytes.Length); qt = new QTTManager(topicPrefix+id, auth, password, HttpAction.Instance.mqtturl, HttpAction.Instance.officeport); qt.Connect(); StartCoroutine(Reconnection()); qt.ConnectionFailed -= onFaild; qt.ConnectionSucceeded -= onSucceed; qt.OnConnecting -= OnConnecting; qt.OnReceived -= OnReceived; qt.OnClose -= OnClose; qt.ConnectionFailed += onFaild; qt.ConnectionSucceeded += onSucceed; qt.OnConnecting += OnConnecting; qt.OnReceived += OnReceived; qt.OnClose += OnClose; } private void OnClose(EventArgs obj) { Debug.Log("断开连接"); } private IEnumerator Reconnection() { while (true) { yield return new WaitForSeconds(5); if(qt!=null&&!qt.IsConnect()) { Debug.Log(" DGJ ===> Reconnection "); Connect(); } } } //断开连接 public void DisConnect() { if (qt != null && qt.IsConnect()) qt.DisConnect(); } //订阅 public void Subscribe() { Debug.Log(" DGJ =====> Subscribe "+ id); ushort s = qt.Subscribe( new string[] { topicPrefix+id }, new byte[] { MqttMsgBase.QOS_LEVEL_EXACTLY_ONCE }); Debug.Log(" DGJ =====> Subscribe2"); } public void StartSendCameraPos() { StartCoroutine(sendCameraPos()); } //眼镜端像手机端发送实时位置 IEnumerator sendCameraPos() { Debug.Log("DGJ =====> sendCameraPos" + qt.IsConnect()); while (true) { if(qt!=null&& qt.IsConnect()) { JsonData json = new JsonData(); json["type"] = "CamPos"; // json["x"] = OpenXRCamera.Instance.head.position.x; //json["y"] = OpenXRCamera.Instance.head.position.y; //json["z"] = OpenXRCamera.Instance.head.position.z; json["x"] = GameManager.Instance.Player.transform.localPosition.x; json["y"] = GameManager.Instance.Player.transform.localPosition.y; json["z"] = GameManager.Instance.Player.transform.localPosition.z; json["Sid"] = "sid";//选择的场景id publish(rid,Encoding.UTF8.GetBytes(json.ToJson())); } yield return new WaitForSeconds(0.1f); } } //眼镜发送触发的景点 public void sendActiveSp(string spid,bool isOpen) { JsonData json = new JsonData(); json["type"] = "ActiveSp"; json["Sid"] = "sid";//选择的场景id json["spid"] = spid;//景点id json["isOpen"] = isOpen;//是否打开 publish(rid,Encoding.UTF8.GetBytes(json.ToJson())); Debug.Log("MQtt 发送manage"); } //眼镜发送触发的视频 public void sendActiveVideo(string spid,string videoId, bool isplay,float jindu) { JsonData json = new JsonData(); json["type"] = "ActiveVideo"; json["Sid"] = "sid";//选择的场景id json["spid"] = spid;//景点id json["videoId"] = videoId;//视频id json["isplay"] = isplay;//是否播放 json["jindu"] = jindu;//视频进度 publish(rid,Encoding.UTF8.GetBytes(json.ToJson())); Debug.Log("MQtt 发送manage"); } void publish(string str,byte[] bs) { if(qt!=null&& qt.IsConnect()) { // Debug.Log(id + " DGJ publish =====> " + front+rid + " " + bs.Length); qt.Publish(str, bs, MqttMsgBase.QOS_LEVEL_EXACTLY_ONCE, false); } else { Debug.LogError(" MQTT 未连接 "); } } }