Beispiel #1
0
        public Command Unmarshal(BinaryReader dis)
        {
            byte fixedHeader = dis.ReadByte();

            Command cmd = MQTTCommandFactory.CreateCommand(fixedHeader);

            // Variable length header gives us total Message length to buffer.
            int length = ReadLength(dis);

            if (length != 0)
            {
                byte[] buffer = dis.ReadBytes(length);

                if (buffer.Length != length)
                {
                    throw new IOException("Invalid stream read occurred.");
                }

                MemoryStream       ms     = new MemoryStream(buffer);
                EndianBinaryReader reader = new EndianBinaryReader(ms);

                cmd.Decode(reader);
            }

            // A CONNACK is a response and it's correlationId is always 1, but if it has an
            // error code, then we create a suitable ErrorResponse here with the correct
            // NMSException in its payload.
            if (cmd.IsCONNACK)
            {
                CONNACK connAck = cmd as CONNACK;
                connAck.CorrelationId = 1;
                if (cmd.IsErrorResponse)
                {
                    ErrorResponse error = new ErrorResponse();
                    error.Error = MQTTExceptionFactory.CreateConnectionException(connAck.ReturnCode);
                    cmd         = error;
                }
            }

            Tracer.DebugFormat("MQTT Command received: {0}", cmd);
            Console.WriteLine("MQTT Command recieved: {0}", cmd);

            return(cmd);
        }
Beispiel #2
0
        public static Command CreateCommand(byte fixedHeader)
        {
            Header header = new Header(fixedHeader);

            Command result = null;

            switch (header.Type)
            {
            case 1:
                result = new CONNECT(header);
                break;

            case 2:
                result = new CONNACK(header);
                break;

            case 3:
                result = new PUBLISH(header);
                break;

            case 4:
                result = new PUBACK(header);
                break;

            case 5:
                result = new PUBREC(header);
                break;

            case 6:
                result = new PUBREL(header);
                break;

            case 7:
                result = new PUBCOMP(header);
                break;

            case 8:
                result = new SUBSCRIBE(header);
                break;

            case 9:
                result = new SUBACK(header);
                break;

            case 10:
                result = new UNSUBSCRIBE(header);
                break;

            case 11:
                result = new UNSUBACK(header);
                break;

            case 12:
                result = new PINGREQ(header);
                break;

            case 13:
                result = new PINGRESP(header);
                break;

            case 14:
                result = new DISCONNECT(header);
                break;

            default:
                throw new NMSException("Unknown Command received");
            }

            return(result);
        }