/// <summary> /// Start broker /// </summary> public void Start() { this.commLayer.Start(); this.publisherManager.Start(); Console.WriteLine("Broker Started"); MqttCommon.LogMessageToFile("Broker Started"); }
void Client_MqttMsgSubscribeReceived(object sender, MqttMsgSubscribeEventArgs e) { MqttClient client = (MqttClient)sender; //client.Subscribe(e.Topics, e.QoSLevels); int i = 0; //for (int i = 0; i < e.Topics.Length; i++) //{ commBroker = new CommBroker(); commBroker.connect(e.Topics[i]); if (!commBroker.connected) { throw new Exception("Unable to connect the broker for subscribing message"); } commBroker.disable_heartbeat = true; MqttCommon.LogMessageToFile("Subscribed to:" + e.Topics[i].Replace("/", ".").Replace("+", "*").ToString()); MqttCommon.LogMessageToFile("Topics Subscribed :" + e.Topics.Length.ToString()); Subscription subscription = commBroker.new_subscription(e.Topics[i].Replace("/", ".").Replace("+", "*"), string.Empty, (message, context) => { client.Publish(message.subject.Replace(".", "/"), Convert.FromBase64String(message.data.ToString())); // System.Text.Encoding.UTF8.GetBytes(message.data.ToString())); Console.WriteLine("Message Received"); MqttCommon.LogMessageToFile("Message Received"); Console.WriteLine("From Topic:" + message.subject.Replace(".", "/") + ". Data:" + message.data.ToString()); MqttCommon.LogMessageToFile("From Topic:" + message.subject.Replace(".", "/") + ". Data:" + message.data.ToString()); }, null, commBroker, string.Empty); // TODO : business logic to grant QoS levels based on some conditions ? // now the broker granted the QoS levels requested by client // subscribe client for each topic and QoS level requested //this.subscriberManager.Subscribe(e.Topics[i].Replace("/", ".").Replace("+", "*"), e.QoSLevels[i], client); //} try { // send SUBACK message to the client client.Suback(e.MessageId, e.QoSLevels); //for (int i = 0; i < e.Topics.Length; i++) //{ // // publish retained message on the current subscription // //this.publisherManager.PublishRetaind(e.Topics[i], client.ClientId); //} } catch (MqttCommunicationException) { this.CloseClient(client); } }
void Client_MqttMsgPublishReceived(object sender, MqttMsgPublishEventArgs e) { try { Console.WriteLine("Message Published"); //DmMessage dmMessage = null; string ipAddress; commBroker = new CommBroker(); byte[] publishMessageByte; MqttClient client = (MqttClient)sender; ipAddress = client.RemoteEndPoint.ToString().Substring(8, (client.RemoteEndPoint.ToString().IndexOf(']') - 8)); //publishMessageString = Convert.ToBase64String(e.Message) + ipAddress; //publishMessageByte = Encoding.UTF8.GetBytes(publishMessageString); //Encoding.ASCII.GetBytes(publishMessageString); DmMessage dmMessage = new DmMessage(); dmMessage.publicIpAddress = ipAddress; dmMessage.data = Convert.ToBase64String(e.Message); dmMessage.ToString(); var publishMessageString = Newtonsoft.Json.JsonConvert.SerializeObject(dmMessage); publishMessageByte = Encoding.UTF8.GetBytes(publishMessageString.ToString()); CommMessage message = new CommMessage() { subject = e.Topic.Replace("/", "."), data = publishMessageString, data_length = publishMessageString.Length, message_type = "string", correlation_id = "", reply_to = "" }; // create PUBLISH message to publish // [v3.1.1] DUP flag from an incoming PUBLISH message is not propagated to subscribers // It should be set in the outgoing PUBLISH message based on transmission for each subscriber //MqttMsgPublish publish = new MqttMsgPublish(e.Topic, publishMessageByte, false, e.QosLevel, e.Retain); // publish message through publisher manager //this.publisherManager.Publish(publish); commBroker.connect(e.Topic); MqttCommon.LogMessageToFile("Connected to RabbitMQ"); commBroker.publish(message, false); MqttCommon.LogMessageToFile("Topic Name:" + message.subject.ToString()); MqttCommon.LogMessageToFile("Message Published:" + publishMessageString.ToString()); MqttCommon.LogMessageToFile("Message Published"); commBroker.disconnect(); } catch (Exception ex) { MqttCommon.LogMessageToFile("Error:Message Publish - Failed"); } }
/// <summary> /// Stop broker /// </summary> public void Stop() { this.commLayer.Stop(); this.publisherManager.Stop(); // close connection with all clients lock (clients) { foreach (MqttClient client in this.clients) { client.Close(); } } Console.WriteLine("Broker Stopped"); MqttCommon.LogMessageToFile("Broker Stopped"); }
void commLayer_ClientConnected(object sender, MqttClientConnectedEventArgs e) { // register event handlers from client e.Client.MqttMsgDisconnected += Client_MqttMsgDisconnected; e.Client.MqttMsgPublishReceived += Client_MqttMsgPublishReceived; e.Client.MqttMsgConnected += Client_MqttMsgConnected; e.Client.MqttMsgSubscribeReceived += Client_MqttMsgSubscribeReceived; e.Client.MqttMsgUnsubscribeReceived += Client_MqttMsgUnsubscribeReceived; e.Client.ConnectionClosed += Client_ConnectionClosed; lock (clients) { // add client to the collection this.clients.Add(e.Client); } // start client threads e.Client.Open(); MqttCommon.LogMessageToFile("Broker - Client Connected"); }