1package packets 2 3import ( 4 "bytes" 5 "fmt" 6 "io" 7) 8 9//SubackPacket is an internal representation of the fields of the 10//Suback MQTT packet 11type SubackPacket struct { 12 FixedHeader 13 MessageID uint16 14 ReturnCodes []byte 15} 16 17func (sa *SubackPacket) String() string { 18 str := fmt.Sprintf("%s", sa.FixedHeader) 19 str += " " 20 str += fmt.Sprintf("MessageID: %d", sa.MessageID) 21 return str 22} 23 24func (sa *SubackPacket) Write(w io.Writer) error { 25 var body bytes.Buffer 26 var err error 27 body.Write(encodeUint16(sa.MessageID)) 28 body.Write(sa.ReturnCodes) 29 sa.FixedHeader.RemainingLength = body.Len() 30 packet := sa.FixedHeader.pack() 31 packet.Write(body.Bytes()) 32 _, err = packet.WriteTo(w) 33 34 return err 35} 36 37//Unpack decodes the details of a ControlPacket after the fixed 38//header has been read 39func (sa *SubackPacket) Unpack(b io.Reader) error { 40 var qosBuffer bytes.Buffer 41 var err error 42 sa.MessageID, err = decodeUint16(b) 43 if err != nil { 44 return err 45 } 46 47 _, err = qosBuffer.ReadFrom(b) 48 if err != nil { 49 return err 50 } 51 sa.ReturnCodes = qosBuffer.Bytes() 52 53 return nil 54} 55 56//Details returns a Details struct containing the Qos and 57//MessageID of this ControlPacket 58func (sa *SubackPacket) Details() Details { 59 return Details{Qos: 0, MessageID: sa.MessageID} 60} 61