You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

50 lines
1.3 KiB

  1. package packet
  2. import (
  3. "errors"
  4. "io"
  5. )
  6. // Error value
  7. var ErrInvalidPacketType = errors.New("invalid MQTT Control Packet type")
  8. // Packet represents an MQTT Control Packet.
  9. type Packet interface {
  10. io.WriterTo
  11. // Type returns the MQTT Control Packet type of the Packet.
  12. Type() (byte, error)
  13. }
  14. // NewFromBytes creates a Packet from the byte data and returns it.
  15. func NewFromBytes(fixedHeader FixedHeader, remaining []byte) (Packet, error) {
  16. // Extract the MQTT Control Packet type from the fixed header.
  17. ptype, err := fixedHeader.ptype()
  18. if err != nil {
  19. return nil, err
  20. }
  21. // Create and return a Packet.
  22. switch ptype {
  23. case TypeCONNACK:
  24. return NewCONNACKFromBytes(fixedHeader, remaining)
  25. case TypePUBLISH:
  26. return NewPUBLISHFromBytes(fixedHeader, remaining)
  27. case TypePUBACK:
  28. return NewPUBACKFromBytes(fixedHeader, remaining)
  29. case TypePUBREC:
  30. return NewPUBRECFromBytes(fixedHeader, remaining)
  31. case TypePUBREL:
  32. return NewPUBRELFromBytes(fixedHeader, remaining)
  33. case TypePUBCOMP:
  34. return NewPUBCOMPFromBytes(fixedHeader, remaining)
  35. case TypeSUBACK:
  36. return NewSUBACKFromBytes(fixedHeader, remaining)
  37. case TypeUNSUBACK:
  38. return NewUNSUBACKFromBytes(fixedHeader, remaining)
  39. case TypePINGRESP:
  40. return NewPINGRESPFromBytes(fixedHeader, remaining)
  41. default:
  42. return nil, ErrInvalidPacketType
  43. }
  44. }