using System.Collections; using System.Collections.Generic; using UnityEngine; using M2MqttUnity; using uPLibrary.Networking.M2Mqtt; using uPLibrary.Networking.M2Mqtt.Messages; public class mqttReceiver : M2MqttUnityClient { [Header("MQTT topics")] [Tooltip("Set the topic to subscribe. !!!ATTENTION!!! multi-level wildcard # subscribes to all topics")] public string topicSubscribe = "#"; // topic to subscribe. !!! The multi-level wildcard # is used to subscribe to all the topics. Attention i if #, subscribe to all topics. Attention if MQTT is on data plan [Tooltip("Set the topic to publish (optional)")] public string topicPublish = ""; // topic to publish public string messagePublish = ""; // message to publish [Tooltip("Set this to true to perform a testing cycle automatically on startup")] public bool autoTest = false; //using C# Property GET/SET and event listener to reduce Update overhead in the controlled objects private string m_msg; public string msg { get { return m_msg; } set { if (m_msg == value) return; m_msg = value; if (OnMessageArrived != null) { OnMessageArrived(m_msg); } } } public event OnMessageArrivedDelegate OnMessageArrived; public delegate void OnMessageArrivedDelegate(string newMsg); //using C# Property GET/SET and event listener to expose the connection status private bool m_isConnected; public bool isConnected { get { return m_isConnected; } set { if (m_isConnected == value) return; m_isConnected = value; if (OnConnectionSucceeded != null) { OnConnectionSucceeded(isConnected); } } } public event OnConnectionSucceededDelegate OnConnectionSucceeded; public delegate void OnConnectionSucceededDelegate(bool isConnected); // a list to store the messages private List eventMessages = new List(); public void Publish() { client.Publish(topicPublish, System.Text.Encoding.UTF8.GetBytes(messagePublish), MqttMsgBase.QOS_LEVEL_EXACTLY_ONCE, false); Debug.Log("Test message published"); } public void SetEncrypted(bool isEncrypted) { this.isEncrypted = isEncrypted; } protected override void OnConnecting() { base.OnConnecting(); } protected override void OnConnected() { base.OnConnected(); isConnected = true; if (autoTest) { Publish(); } } protected override void OnConnectionFailed(string errorMessage) { Debug.Log("CONNECTION FAILED! " + errorMessage); } protected override void OnDisconnected() { Debug.Log("Disconnected."); isConnected = false; } protected override void OnConnectionLost() { Debug.Log("CONNECTION LOST!"); } protected override void SubscribeTopics() { client.Subscribe(new string[] { topicSubscribe }, new byte[] { MqttMsgBase.QOS_LEVEL_EXACTLY_ONCE }); } protected override void UnsubscribeTopics() { client.Unsubscribe(new string[] { topicSubscribe }); } protected override void Start() { base.Start(); } protected override void DecodeMessage(string topic, byte[] message) { //The message is decoded msg = System.Text.Encoding.UTF8.GetString(message); Debug.Log("Received: " + msg); Debug.Log("from topic: " + m_msg); StoreMessage(msg); if (topic == topicSubscribe) { if (autoTest) { autoTest = false; Disconnect(); } } } private void StoreMessage(string eventMsg) { if (eventMessages.Count > 50) { eventMessages.Clear(); } eventMessages.Add(eventMsg); } protected override void Update() { base.Update(); // call ProcessMqttEvents() } private void OnDestroy() { Disconnect(); } private void OnValidate() { if (autoTest) { autoConnect = true; } } }