MQTTClient.cs 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316
  1. using LitJson;
  2. using login;
  3. using System;
  4. using System.Collections;
  5. using System.Collections.Generic;
  6. using System.Text;
  7. using UnityEngine;
  8. using UnityEngine.Android;
  9. using uPLibrary.Networking.M2Mqtt.Messages;
  10. using static QTTManager;
  11. public class MQTTClient : MonoSingleton<MQTTClient>
  12. {
  13. //public string front = "client/";
  14. // public string id = "";
  15. //public string username = "u@unity3";// 需要根据服务器设置
  16. //public string password = null;// 需要根据服务器设置
  17. public string rid = "mqttx_b4c02ddc"; //其他人的ID
  18. //public string account;
  19. //public string roomId;
  20. //public string email;
  21. //public string phone;
  22. //public string roleId;
  23. //public string resourcePool;
  24. //public string expertType;
  25. //public string _username;
  26. public event Action<JsonData> OnCoordinate;
  27. public static byte[] bytes;
  28. // public static string certification;
  29. // public static byt ta;
  30. QTTManager qt;
  31. // Start is called before the first frame update
  32. void Start()
  33. {
  34. // 请求文件读取和写入权限
  35. if (!Permission.HasUserAuthorizedPermission(Permission.ExternalStorageRead) ||
  36. !Permission.HasUserAuthorizedPermission(Permission.ExternalStorageWrite))
  37. {
  38. Permission.RequestUserPermission(Permission.ExternalStorageRead);
  39. Permission.RequestUserPermission(Permission.ExternalStorageWrite);
  40. }
  41. bytes = (Resources.Load("emqxsl-ca") as TextAsset).bytes;
  42. Debug.Log(" DGJ ===> emqxsl-ca.bytes " + bytes.Length);
  43. }
  44. Queue<MqttMsgPublishEventArgs> rlist = new Queue<MqttMsgPublishEventArgs>();
  45. private void OnReceived(MqttMsgPublishEventArgs obj)
  46. {
  47. rlist.Enqueue(obj);
  48. }
  49. private void OnConnecting()
  50. {
  51. Debug.Log("MQtt 连接中");
  52. }
  53. private void onSucceed()
  54. {
  55. // Subscribe(MQTTManager.Instance.front + "online/" + MQTTManager.Instance.phone);
  56. //Subscribe(MQTTManager.Instance.front + "personnel/" + MQTTManager.Instance.resourcePool);
  57. Subscribe(MQTTManager.Instance.front + "personnel/" + MQTTManager.Instance.resourcePoolId);
  58. Subscribe(MQTTManager.Instance.front + "online/" + MQTTManager.Instance.id);
  59. if (!string.IsNullOrEmpty( MQTTManager.Instance.topiceNavigation))
  60. {
  61. Subscribe(MQTTManager.Instance.topiceNavigation);
  62. Subscribe(MQTTManager.Instance.topiceSync);
  63. Subscribe(MQTTManager.Instance.topiceClose);
  64. }
  65. // Subscribe((MQTTManager.Instance.front + "younuo"));
  66. MQTTManager.Instance.isCreateRoom = true;
  67. }
  68. private void onFaild()
  69. {
  70. Debug.Log("MQtt 连接失败");
  71. }
  72. // Update is called once per frame
  73. void Update()
  74. {
  75. if (rlist.Count > 0)
  76. {
  77. for (int i = 0; i < rlist.Count; i++)
  78. {
  79. OnUnityReceived(rlist.Dequeue());
  80. }
  81. }
  82. }
  83. //MQTT接收到的数据
  84. public void OnUnityReceived(MqttMsgPublishEventArgs obj)
  85. {
  86. string msg = Encoding.UTF8.GetString(obj.Message);
  87. Debug.Log("uid => " + obj.Topic + ":\n" + msg);
  88. // UILogManager.Instance.text3.text = msg;
  89. // MQTTManager.Instance.Received(msg);
  90. MQTTManager.Instance.Received(obj);
  91. }
  92. private void OnDestroy()
  93. {
  94. DisConnect();
  95. }
  96. //连接
  97. public void Connect()
  98. {
  99. Debug.Log("DGJ ===> MQTT " + HttpActionLang.Instance.mqttSocket );
  100. //if (DeviceType.type == "Phone")
  101. //{
  102. // id =UserInfo.Instance.name + "_Phone";
  103. // rid = front+UserInfo.Instance.name + "_Glasses";
  104. //}
  105. //else
  106. //{
  107. // id = UserInfo.Instance.name + "_Glasses";
  108. // rid = front+UserInfo.Instance.name + "_Phone";
  109. //}
  110. // Debug.Log("DGJ ==>MQTT " + id + account + " " + username + " " + certification + " " + HttpActionLang.Instance.mqttSocket);
  111. DisConnect();
  112. qt = new QTTManager(MQTTManager.Instance.clientId, MQTTManager.Instance.username , MQTTManager.certification, HttpActionLang.Instance.mqttSocket, "1883");
  113. qt.ConnectionFailed += onFaild;
  114. qt.ConnectionSucceeded += onSucceed;
  115. qt.OnConnecting += OnConnecting;
  116. qt.OnReceived += OnReceived;
  117. qt.OnClose += OnClose;
  118. qt.Connect();
  119. StartCoroutine(Reconnection());
  120. // StartSendCameraPos();
  121. }
  122. private void OnClose(EventArgs obj)
  123. {
  124. Debug.Log("断开连接");
  125. }
  126. private IEnumerator Reconnection()
  127. {
  128. while (true)
  129. {
  130. yield return new WaitForSeconds(5);
  131. if (qt != null && !qt.IsConnect())
  132. {
  133. Debug.Log(" DGJ ===> Reconnection ");
  134. Connect();
  135. }
  136. }
  137. }
  138. //断开连接
  139. public void DisConnect()
  140. {
  141. if (qt != null && qt.IsConnect())
  142. qt.DisConnect();
  143. }
  144. /// <summary>
  145. /// 订阅频道
  146. /// </summary>
  147. /// <param name="channelID"></param>
  148. public void Subscribe(string channelID)
  149. {
  150. Debug.Log(" DGJ =====> Subscribe " + channelID);
  151. if (qt != null && qt.IsConnect())
  152. {
  153. ushort s = qt.Subscribe(
  154. new string[]
  155. {
  156. channelID
  157. //front+"room/"+roomId
  158. },
  159. new byte[]
  160. {
  161. MqttMsgBase.QOS_LEVEL_AT_MOST_ONCE,
  162. //MqttMsgBase.QOS_LEVEL_EXACTLY_ONCE
  163. });
  164. Debug.Log(" DGJ =====> Subscribe2");
  165. }
  166. else
  167. Debug.LogError(" MQTT 未连接 !!!");
  168. }
  169. public void UnSubscribe(string channelID)
  170. {
  171. if (qt != null && qt.IsConnect())
  172. {
  173. ushort s = qt.Unsubscribe(new string[] { channelID });
  174. }
  175. }
  176. public void StartSendCameraPos()
  177. {
  178. StartCoroutine(sendCameraPos());
  179. }
  180. //眼镜端像手机端发送实时位置
  181. IEnumerator sendCameraPos()
  182. {
  183. Debug.Log("DGJ =====> sendCameraPos" + qt.IsConnect());
  184. while (true)
  185. {
  186. yield return new WaitForSeconds(1f);
  187. if (qt != null && qt.IsConnect())
  188. {
  189. JsonData json = new JsonData();
  190. json["type"] = "CamPos";
  191. // json["x"] = OpenXRCamera.Instance.head.position.x;
  192. //json["y"] = OpenXRCamera.Instance.head.position.y;
  193. //json["z"] = OpenXRCamera.Instance.head.position.z;
  194. //json["x"] = GameManager.Instance.Player.transform.localPosition.x;
  195. //json["y"] = GameManager.Instance.Player.transform.localPosition.y;
  196. //json["z"] = GameManager.Instance.Player.transform.localPosition.z;
  197. json["Sid"] = "sid";//选择的场景id
  198. publish(Encoding.UTF8.GetBytes(json.ToJson()));
  199. }
  200. }
  201. }
  202. //眼镜发送触发的景点
  203. public void sendActiveSp(string spid, bool isOpen)
  204. {
  205. JsonData json = new JsonData();
  206. json["type"] = "ActiveSp";
  207. json["Sid"] = "sid";//选择的场景id
  208. json["spid"] = spid;//景点id
  209. json["isOpen"] = isOpen;//是否打开
  210. publish(Encoding.UTF8.GetBytes(json.ToJson()));
  211. Debug.Log("MQtt 发送manage");
  212. }
  213. //眼镜发送触发的视频
  214. public void sendActiveVideo(string spid, string videoId, bool isplay, float jindu)
  215. {
  216. JsonData json = new JsonData();
  217. json["type"] = "ActiveVideo";
  218. json["Sid"] = "sid";//选择的场景id
  219. json["spid"] = spid;//景点id
  220. json["videoId"] = videoId;//视频id
  221. json["isplay"] = isplay;//是否播放
  222. json["jindu"] = jindu;//视频进度
  223. publish(Encoding.UTF8.GetBytes(json.ToJson()));
  224. Debug.Log("MQtt 发送manage");
  225. }
  226. public void SendCoord()
  227. {
  228. JsonData json = new JsonData();
  229. json["id"] = UserInfo.Instance.name;
  230. json["type"] = "Coord";
  231. json["x"] = 0.1f;
  232. json["y"] = 0.1f;
  233. json["z"] = 0.1f;
  234. }
  235. public void publish(byte[] bs)
  236. {
  237. if (qt != null && qt.IsConnect())
  238. {
  239. // Debug.Log(id + account + " DGJ publish =====> " + front + "room/" + roomId + " " + bs.Length);
  240. // qt.Publish(front + "room/" + roomId, bs, MqttMsgBase.QOS_LEVEL_EXACTLY_ONCE, false);
  241. }
  242. else
  243. {
  244. Debug.LogError(" MQTT 未连接 ");
  245. }
  246. }
  247. public void publish(string channelID, byte[] bs)
  248. {
  249. if (qt != null && qt.IsConnect())
  250. {
  251. Debug.Log(MQTTManager.Instance.clientId + MQTTManager.Instance.account + " DGJ publish =====> " + channelID + " " + bs.Length);
  252. qt.Publish(channelID, bs, MqttMsgBase.QOS_LEVEL_EXACTLY_ONCE, false);
  253. }
  254. else
  255. {
  256. Debug.LogError(" MQTT 未连接 ");
  257. }
  258. }
  259. }