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); }
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); }