public override byte[] Encode() { byte fixedHeader = (0x0A << Constants.Header.MessageTypeOffset) | 0x00 | 0x02 | 0x00; byte[] messageId = new byte[2]; messageId[0] = (byte)((MessageId >> 8) & 0x00FF); messageId[1] = (byte)(MessageId & 0x00FF); ByteContainer topicContainer = new ByteContainer(); int index = 0; while (index < Topics.Count) { topicContainer.Add(Topics[index]); index++; } byte[] payload = topicContainer.ToBytes(); byte[] remainingLengthBytes = EncodeRemainingLength(2 + payload.Length); ByteContainer container = new ByteContainer(); container.Add(fixedHeader); container.Add(remainingLengthBytes); container.Add(messageId); container.Add(payload); return(container.ToBytes()); }
public override byte[] Encode() { byte fixedHeader = (byte)((0x09 << Constants.Header.MessageTypeOffset) | (byte)(0x00) | (byte)(0x00) | (byte)(0x00)); byte[] messageId = new byte[2]; messageId[0] = (byte)((this.MessageId >> 8) & 0x00FF); //MSB messageId[1] = (byte)(this.MessageId & 0x00FF); //LSB ByteContainer qosContainer = new ByteContainer(); int index = 0; while (index < this._qosLevels.Count) { byte qos = (byte)(int)this._qosLevels[index]; qosContainer.Add(qos); index++; } byte[] payload = qosContainer.ToBytes(); byte[] remainingLengthBytes = EncodeRemainingLength(2 + payload.Length); ByteContainer container = new ByteContainer(); container.Add(fixedHeader); container.Add(remainingLengthBytes); container.Add(messageId); container.Add(payload); return(container.ToBytes()); }
internal override MqttMessage Decode(byte[] message) { MqttMessage publishMessage = new PublishMessage(); int index = 0; byte fixedHeader = message[index]; base.DecodeFixedHeader(fixedHeader); int remainingLength = base.DecodeRemainingLength(message); int temp = remainingLength; //increase the fixed header size do { index++; temp = temp / 128; } while (temp > 0); index++; byte[] buffer = new byte[remainingLength]; Buffer.BlockCopy(message, index, buffer, 0, buffer.Length); //base.VariableHeader = new PublishVariableHeader(); index = 0; int length = 0; this.Topic = ByteContainer.DecodeString(buffer, index, out length); index += length; if ((int)QualityOfServiceLevel > 0) { ushort messageId = (ushort)((buffer[index++] << 8) & 0xFF00); messageId |= buffer[index++]; this.MessageId = messageId; length += 2; } //length = ((buffer[index++] << 8) & 0xFF00); //length |= buffer[index++]; byte[] data = new byte[remainingLength - length]; Buffer.BlockCopy(buffer, index, data, 0, data.Length); this.Payload = data; //index = base.VariableHeader.Decode(buffer); //base.Payload = new PublishPayload(); //base.Payload.Decode(buffer, base.VariableHeader, index); return(publishMessage); }
//public ushort MessageId { get; set; } public override byte[] Encode() { byte qos = Convert.ToByte((int)Enum.Parse(typeof(QualityOfServiceLevelType), this.QualityOfService.ToString(), false)); //byte fixedHeader = (byte)((0x08 << Constants.Header.MessageTypeOffset) | // (byte)(qos << Constants.Header.QosLevelOffset) | // (byte)(this.Dup ? (byte)(0x01 << Constants.Header.DupFlagOffset) : (byte)0x00) | // (byte)(this.Retain ? (byte)(0x01) : (byte)0x00)); byte fixedHeader = (byte)((0x08 << Constants.Header.MessageTypeOffset) | (byte)(1 << Constants.Header.QosLevelOffset) | (byte)((byte)0x00) | (byte)((byte)0x00)); byte[] messageId = new byte[2]; messageId[0] = (byte)((this.MessageId >> 8) & 0x00FF); // MSB messageId[1] = (byte)(this.MessageId & 0x00FF); // LSB ByteContainer payloadContainer = new ByteContainer(); IEnumerator <KeyValuePair <string, QualityOfServiceLevelType> > en = this._topics.GetEnumerator(); while (en.MoveNext()) { string topic = en.Current.Key; QualityOfServiceLevelType qosLevel = this._topics[topic]; payloadContainer.Add(topic); byte topicQos = Convert.ToByte((int)qosLevel); payloadContainer.Add(topicQos); } //int index = 0; //while (index < this._topics.Count) //{ // string topic = this._topics[index].Item1; // QualityOfServiceLevelType qosLevel = this._topics[index].Item2; // payloadContainer.Add(topic); // byte topicQos = Convert.ToByte((int)qosLevel); // payloadContainer.Add(topicQos); // index++; //} byte[] payload = payloadContainer.ToBytes(); byte[] remainingLengthBytes = EncodeRemainingLength(payload.Length + 2); ByteContainer container = new ByteContainer(); container.Add(fixedHeader); container.Add(remainingLengthBytes); container.Add(messageId); container.Add(payload); return(container.ToBytes()); }
//public byte[] Data { get; set; } public override byte[] Encode() { byte qos = (byte)(int)this.QualityOfServiceLevel; byte fixedHeader = (byte)((0x03 << Constants.Header.MessageTypeOffset) | (byte)(qos << Constants.Header.QosLevelOffset) | (byte)(this.Dup ? (byte)(0x01 << Constants.Header.DupFlagOffset) : (byte)0x00) | (byte)(this.Retain ? (byte)(0x01) : (byte)0x00)); //PublishVariableHeader variableHeader = this.VariableHeader as PublishVariableHeader; //PublishPayload payload = this.Payload as PublishPayload; ByteContainer vhContainer = new ByteContainer(); vhContainer.Add(this.Topic); if (qos > 0) { byte[] messageId = new byte[2]; messageId[0] = (byte)((this.MessageId >> 8) & 0x00FF); // MSB messageId[1] = (byte)(this.MessageId & 0x00FF); // LSB vhContainer.Add(messageId); } byte[] variableHeaderBytes = vhContainer.ToBytes(); //byte[] variableHeaderBytes = variableHeader.Encode(); //byte[] payloadBytes = payload.Encode(); byte[] lengthSB = new byte[2]; lengthSB[0] = (byte)((this.Payload.Length >> 8) & 0x00FF); // MSB lengthSB[1] = (byte)(this.Payload.Length & 0x00FF); // LSB ByteContainer payloadContainer = new ByteContainer(); //payloadContainer.Add(lengthSB); payloadContainer.Add(this.Payload); byte[] payloadBytes = payloadContainer.ToBytes(); int remainingLength = variableHeaderBytes.Length + payloadBytes.Length; byte[] remainingLengthBytes = base.EncodeRemainingLength(remainingLength); ByteContainer container = new ByteContainer(); container.Add(fixedHeader); container.Add(remainingLengthBytes); container.Add(variableHeaderBytes); container.Add(payloadBytes); return(container.ToBytes()); }
//public ConnectMessage(ConnectVariableHeader variableHeader, ConnectPayload payload) //{ // this.VariableHeader = variableHeader; // this.Payload = payload; //} public override byte[] Encode() { byte fixedHeader = (byte)((0x01 << Constants.Header.MessageTypeOffset) | (byte)(0x00 << Constants.Header.QosLevelOffset) | (byte)(0x00 << Constants.Header.DupFlagOffset) | (byte)(0x00)); //ConnectVariableHeader variableHeader = this.VariableHeader as ConnectVariableHeader; //ConnectPayload payload = this.Payload as ConnectPayload; //variableHeader.SetConnectFlags(payload); SetConnectFlags(); ByteContainer vhContainer = new ByteContainer(); vhContainer.Add(this.ProtocolName); vhContainer.Add((byte)this.ProtocolVersion); vhContainer.Add(this.connectFlags); byte[] keepAlive = new byte[2]; keepAlive[0] = (byte)((this.KeepAlive >> 8) & 0x00FF); // MSB keepAlive[1] = (byte)(this.KeepAlive & 0x00FF); // LSB vhContainer.Add(keepAlive); byte[] variableHeaderBytes = vhContainer.ToBytes(); ByteContainer payloadContainer = new ByteContainer(); payloadContainer.Add(this.ClientId); payloadContainer.Add(this.WillTopic); payloadContainer.Add(this.WillMessage); payloadContainer.Add(this.Username); payloadContainer.Add(this.Password); byte[] payloadBytes = payloadContainer.ToBytes(); //byte[] variableHeaderBytes = variableHeader.Encode(); //byte[] payloadBytes = payload.Encode(); int remainingLength = variableHeaderBytes.Length + payloadBytes.Length; byte[] remainingLengthBytes = base.EncodeRemainingLength(remainingLength); ByteContainer container = new ByteContainer(); container.Add(fixedHeader); container.Add(remainingLengthBytes); container.Add(variableHeaderBytes); container.Add(payloadBytes); return(container.ToBytes()); }
internal override MqttMessage Decode(byte[] message) { SubscribeMessage subscribeMessage = new SubscribeMessage(); int index = 0; byte fixedHeader = message[index]; subscribeMessage.DecodeFixedHeader(fixedHeader); int remainingLength = base.DecodeRemainingLength(message); int temp = remainingLength; //increase the fixed header size do { index++; temp = temp / 128; } while (temp > 0); index++; byte[] buffer = new byte[remainingLength]; Buffer.BlockCopy(message, index, buffer, 0, buffer.Length); ushort messageId = (ushort)((buffer[0] << 8) & 0xFF00); messageId |= buffer[1]; subscribeMessage.MessageId = messageId; while (index < buffer.Length) { int length = 0; string topic = ByteContainer.DecodeString(buffer, index, out length); index += length; QualityOfServiceLevelType topicQosLevel = (QualityOfServiceLevelType)buffer[index++]; //subscribeMessage._topics.Add(new Tuple<string, QualityOfServiceLevelType>(topic, topicQosLevel)); //subscribeMessage.Topics.Add(topic, topicQosLevel); this._topics.Add(topic, topicQosLevel); } return(subscribeMessage); }
public override byte[] Encode() { byte fixedHeader = (0x0B << Constants.Header.MessageTypeOffset) | 0x00 | 0x00 | 0x00; byte[] messageId = new byte[2]; messageId[0] = (byte)((MessageId >> 8) & 0x00FF); messageId[1] = (byte)(MessageId & 0x00FF); byte[] remainingLengthBytes = EncodeRemainingLength(2); ByteContainer container = new ByteContainer(); container.Add(fixedHeader); container.Add(remainingLengthBytes); container.Add(messageId); return(container.ToBytes()); }
internal override MqttMessage Decode(byte[] message) { UnsubscribeMessage unsubscribeMessage = new UnsubscribeMessage(); int index = 0; byte fixedHeader = message[index]; base.DecodeFixedHeader(fixedHeader); int remainingLength = base.DecodeRemainingLength(message); int temp = remainingLength; //increase the fixed header size do { index++; temp = temp / 128; } while (temp > 0); index++; byte[] buffer = new byte[remainingLength]; Buffer.BlockCopy(message, index, buffer, 0, buffer.Length); ushort messageId = (ushort)((buffer[0] << 8) & 0xFF00); messageId |= buffer[1]; this.MessageId = messageId; while (index < buffer.Length) { int length = 0; string topic = ByteContainer.DecodeString(buffer, index, out length); index += length; this.Topics.Add(topic); } return(unsubscribeMessage); }
internal override MqttMessage Decode(byte[] message) { MqttMessage connectMessage = new ConnectMessage(); int index = 0; byte fixedHeader = message[index]; base.DecodeFixedHeader(fixedHeader); int remainingLength = base.DecodeRemainingLength(message); int temp = remainingLength; //increase the fixed header size do { index++; temp = temp / 128; } while (temp > 0); index++; byte[] buffer = new byte[remainingLength]; Buffer.BlockCopy(message, index, buffer, 0, buffer.Length); index = 0; int protocolNameLength = ((buffer[index++] << 8) & 0xFF00); protocolNameLength |= buffer[index++]; byte[] protocolName = new byte[protocolNameLength]; try { Buffer.BlockCopy(buffer, index, protocolName, 0, protocolNameLength); } catch (Exception ex) { Trace.TraceError(ex.Message); } _protocolName = Encoding.UTF8.GetString(protocolName); //if (Encoding.UTF8.GetString(protocolName) != this.ProtocolName) //{ //fault wrong protocol //} index += protocolNameLength; this.ProtocolVersion = (int)buffer[index++]; //if (this.ProtocolVersion != (int)buffer[index++]) //{ // //fault wrong version //} byte connectFlags = buffer[index++]; this.usernameFlag = ((connectFlags >> 0x07) == 0x01) ? true : false; this.passwordFlag = ((connectFlags & 0x64) >> 0x06 == 0x01) ? true : false; this.WillRetain = ((connectFlags & 0x032) >> 0x05 == 0x01) ? true : false; this.WillQualityOfServiceLevel = (QualityOfServiceLevelType)Convert.ToByte(((connectFlags & 0x1F) >> 0x03) | (connectFlags & 0x08 >> 0x03)); this.WillFlag = ((connectFlags & 0x04) >> 0x02 == 0x01) ? true : false; this.CleanSession = ((connectFlags & 0x02) >> 0x01 == 0x01) ? true : false; int keepAliveSec = ((buffer[index++] << 8) & 0xFF00); keepAliveSec |= buffer[index++]; this.KeepAlive = keepAliveSec; int length = 0; this.ClientId = ByteContainer.DecodeString(buffer, index, out length); index += length; if (this.WillFlag) { this.WillTopic = ByteContainer.DecodeString(buffer, index, out length); index += length; this.WillMessage = ByteContainer.DecodeString(buffer, index, out length); index += length; } if (this.usernameFlag) { this.Username = ByteContainer.DecodeString(buffer, index, out length); index += length; } if (this.passwordFlag) { this.Password = ByteContainer.DecodeString(buffer, index, out length); index += length; } return(connectMessage); }