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());
        }
Exemple #3
0
        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);
        }
Exemple #4
0
        //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());
        }
Exemple #5
0
        //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());
        }
Exemple #6
0
        //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);
        }
Exemple #10
0
        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);
        }