void Client_MqttMsgPublishReceived(object sender, MqttMsgPublishEventArgs e) { MqttClient client = (MqttClient)sender; // 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, e.Message, false, e.QosLevel, e.Retain); // publish message through publisher manager this.publisherManager.Publish(publish); //signal EventHandler <MqttClientEventArgs> handler = DidRecievePublishMessageFromClient; if (handler != null) { MqttClientEventArgs arg = new MqttClientEventArgs(); arg.Client = client; handler(this, arg); } }
void Client_MqttMsgConnected(object sender, MqttMsgConnectEventArgs e) { // [v3.1.1] session present flag bool sessionPresent = false; // [v3.1.1] generated client id for client who provides client id zero bytes length string clientId = null; MqttClient client = (MqttClient)sender; // verify message to determine CONNACK message return code to the client byte returnCode = this.MqttConnectVerify(e.Message); // [v3.1.1] if client id is zero length, the broker assigns a unique identifier to it clientId = (e.Message.ClientId.Length != 0) ? e.Message.ClientId : Guid.NewGuid().ToString(); // connection "could" be accepted if (returnCode == MqttMsgConnack.CONN_ACCEPTED) { // check if there is a client already connected with same client Id MqttClient clientConnected = this.GetClient(clientId); // force connection close to the existing client (MQTT protocol) if (clientConnected != null) { this.CloseClient(clientConnected); } } try { // connection accepted, load (if exists) client session if (returnCode == MqttMsgConnack.CONN_ACCEPTED) { // check if not clean session and try to recovery a session if (!e.Message.CleanSession) { // create session for the client MqttClientSession clientSession = new MqttClientSession(clientId); // get session for the connected client MqttBrokerSession session = this.sessionManager.GetSession(clientId); // set inflight queue into the client session if (session != null) { clientSession.InflightMessages = session.InflightMessages; // [v3.1.1] session present flag if (client.ProtocolVersion == MqttProtocolVersion.Version_3_1_1) { sessionPresent = true; } } // send CONNACK message to the client client.Connack(e.Message, returnCode, clientId, sessionPresent); // load/inject session to the client client.LoadSession(clientSession); if (session != null) { // set reference to connected client into the session session.Client = client; // there are saved subscriptions if (session.Subscriptions != null) { // register all subscriptions for the connected client foreach (MqttSubscription subscription in session.Subscriptions) { this.subscriberManager.Subscribe(subscription.Topic, subscription.QosLevel, client); // publish retained message on the current subscription this.publisherManager.PublishRetaind(subscription.Topic, clientId); } } // there are saved outgoing messages if (session.OutgoingMessages.Count > 0) { // publish outgoing messages for the session this.publisherManager.PublishSession(session.ClientId); } } //signal EventHandler <MqttClientEventArgs> handler = DidAcceptNewClient; if (handler != null) { MqttClientEventArgs arg = new MqttClientEventArgs(); arg.Client = client; handler(this, arg); } } // requested clean session else { // send CONNACK message to the client client.Connack(e.Message, returnCode, clientId, sessionPresent); this.sessionManager.ClearSession(clientId); } } else { // send CONNACK message to the client client.Connack(e.Message, returnCode, clientId, sessionPresent); } } catch (MqttCommunicationException) { this.CloseClient(client); } }