using LitJson; using login; 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 { string front = "client/"; string id = ""; string username = "u@unity3";// 需要根据服务器设置 string password = null;// 需要根据服务器设置 string rid = "mqttx_b4c02ddc"; //其他人的ID public event Action OnCoordinate; 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["method"].ToString()); switch (data["method"].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; case "coordinate": OnCoordinate?.Invoke(data); break; default: break; } } catch { return; } } private void OnDestroy() { DisConnect(); } public void SetUserName(string username) { if (username != null) this.username = username; } public void SetFront(string front) { if (front != null) this.front = front; } //连接 public void Connect() { Debug.Log("DGJ ===> MQTT "); if (DeviceType.type == "Phone") { id =UserInfo.Instance.name + "_Phone"; rid = front+UserInfo.Instance.name + "_Glasses"; } else { id = UserInfo.Instance.name + "_Glasses"; rid = front+UserInfo.Instance.name + "_Phone"; } DisConnect(); qt = new QTTManager(front+id, username, password, HttpAction.Instance.officeSocket, "1883"); qt.Connect(); StartCoroutine(Reconnection()); 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[] { front+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(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(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(Encoding.UTF8.GetBytes(json.ToJson())); Debug.Log("MQtt 发送manage"); } public void SendCoord() { JsonData json = new JsonData(); json["id"] = UserInfo.Instance.name; json["type"] = "Coord"; json["x"] = 0.1f; json["y"] = 0.1f; json["z"] = 0.1f; } void publish(byte[] bs) { if(qt!=null&& qt.IsConnect()) { // Debug.Log(id + " DGJ publish =====> " + front+rid + " " + bs.Length); qt.Publish(rid, bs, MqttMsgBase.QOS_LEVEL_EXACTLY_ONCE, false); } else { Debug.LogError(" MQTT 未连接 "); } } }