internal void PublishReceived(IMqttSession session, MqttPublishMessage publishMessage) { if (publishMessage.Header.Qos == MqttQos.BestEffort && session.HasQoS2(publishMessage.VariableHeader.MessageIdentifier)) { var pubRec = new MqttPublishReceivedMessage() .WithMessageIdentifier(publishMessage.VariableHeader.MessageIdentifier); session.Write(pubRec); } if (publishMessage.Header.Retain) { this.storageProvider.PutRetained(publishMessage.VariableHeader.TopicName, publishMessage.Payload.Message.ToArray()); } PublishMessage(GetSubscriptions(publishMessage.VariableHeader.TopicName), publishMessage.VariableHeader.TopicName, publishMessage.Payload.Message.ToArray()); switch (publishMessage.Header.Qos) { case MqttQos.AtLeastOnce: var puback = new MqttPublishAckMessage().WithMessageIdentifier(publishMessage.VariableHeader.MessageIdentifier); session.Write(puback); break; case MqttQos.AtMostOnce: session.StoreQoS2(publishMessage.VariableHeader.MessageIdentifier); var pubRec = new MqttPublishReleaseMessage().WithMessageIdentifier(publishMessage.VariableHeader.MessageIdentifier); session.Write(pubRec); break; case MqttQos.BestEffort: default: break; } }
public void ValidPayload() { // Message Specs________________ // <40><02><00><04> (Pub Received for Message ID 4) var sampleMessage = new[] { (byte)0x50, (byte)0x02, (byte)0x0, (byte)0x4, }; MqttMessage baseMessage = MqttMessage.CreateFrom(sampleMessage); Console.WriteLine(baseMessage.ToString()); // check that the message was correctly identified as a connect message. Assert.IsType <MqttPublishReceivedMessage>(baseMessage); MqttPublishReceivedMessage message = (MqttPublishReceivedMessage)baseMessage; // validate the message deserialization Assert.Equal <MqttMessageType>(MqttMessageType.PublishReceived, message.Header.MessageType); Assert.Equal <int>(2, message.Header.MessageSize); // make sure the publish message length matches the expectred size. Assert.Equal <int>(4, message.VariableHeader.MessageIdentifier); }
public void BasicSerialization() { var expected = new[] { (byte)0x50, (byte)0x02, (byte)0x0, (byte)0x4, }; MqttPublishReceivedMessage msg = new MqttPublishReceivedMessage().WithMessageIdentifier(4); Console.WriteLine(msg.ToString()); byte[] actual = MessageSerializationHelper.GetMessageBytes(msg); Assert.Equal <int>(expected.Length, actual.Length); Assert.Equal <byte>(expected[0], actual[0]); // msg type of header Assert.Equal <byte>(expected[1], actual[1]); // remaining length Assert.Equal <byte>(expected[2], actual[2]); // connect ack - compression? always empty Assert.Equal <byte>(expected[3], actual[3]); // return code. }
internal void PublishReceived(WebSocketSession session, MqttPublishMessage publishMessage) { try { string topic = publishMessage.VariableHeader.TopicName; List <MqttSubscriberConstrains> clients = new List <MqttSubscriberConstrains>(); if (this.MqTTSubscriptions.ContainsKey(topic)) { var subscribers = (List <MqttSubscriberConstrains>) this.MqTTSubscriptions[topic]; foreach (var item in subscribers) { if (!clients.Exists(el => el.SubsciberId == item.SubsciberId)) { clients.Add(item); } } foreach (var client in clients) { var websocketsession = this.GetAppSessionByID(client.SubsciberId); websocketsession.Send(new ArraySegment <Byte>(publishMessage.Payload.Message.ToArray())); } } switch (publishMessage.Header.Qos) { case MqttQos.AtLeastOnce: var puback = new MqttPublishAckMessage().WithMessageIdentifier(publishMessage.VariableHeader.MessageIdentifier); using (var messageStream = new MemoryStream()) { puback.WriteTo(messageStream); ArraySegment <byte> bytes = new ArraySegment <byte>(messageStream.ToArray()); session.Send(bytes); } break; case MqttQos.AtMostOnce: //session.StoreQoS2(publishMessage.VariableHeader.MessageIdentifier); //var pubRec = new MqttPublishReleaseMessage().WithMessageIdentifier(publishMessage.VariableHeader.MessageIdentifier); //session.Write(pubRec); break; case MqttQos.BestEffort: var pubRec = new MqttPublishReceivedMessage().WithMessageIdentifier(publishMessage.VariableHeader.MessageIdentifier); using (var messageStream = new MemoryStream()) { pubRec.WriteTo(messageStream); ArraySegment <byte> bytes = new ArraySegment <byte>(messageStream.ToArray()); session.Send(bytes); } break; default: break; } } catch (Exception ex) { log.Error("Error on Publich ", ex); } }