Files
hmq/broker/packet.go
2017-08-26 14:25:38 +08:00

237 lines
5.7 KiB
Go

package broker
import (
"errors"
"hmq/lib/message"
"io"
"net"
log "github.com/cihub/seelog"
)
func checkError(desc string, err error) {
if err != nil {
log.Error(desc, " : ", err)
}
}
func ReadPacket(conn net.Conn) ([]byte, error) {
if conn == nil {
return nil, errors.New("conn is null")
}
// conn.SetReadDeadline(t)
var buf []byte
// read fix header
b := make([]byte, 1)
_, err := io.ReadFull(conn, b)
if err != nil {
return nil, err
}
buf = append(buf, b...)
// read rem msg length
rembuf, remlen := decodeLength(conn)
buf = append(buf, rembuf...)
// read rem msg
packetBytes := make([]byte, remlen)
_, err = io.ReadFull(conn, packetBytes)
if err != nil {
return nil, err
}
buf = append(buf, packetBytes...)
// log.Info("len buf: ", len(buf))
return buf, nil
}
func decodeLength(r io.Reader) ([]byte, int) {
var rLength uint32
var multiplier uint32
var buf []byte
b := make([]byte, 1)
for {
io.ReadFull(r, b)
digit := b[0]
buf = append(buf, b[0])
rLength |= uint32(digit&127) << multiplier
if (digit & 128) == 0 {
break
}
multiplier += 7
}
return buf, int(rLength)
}
func DecodeMessage(buf []byte) (message.Message, error) {
msgType := uint8(buf[0] & 0xF0 >> 4)
switch msgType {
case CONNECT:
return DecodeConnectMessage(buf)
case CONNACK:
return DecodeConnackMessage(buf)
case PUBLISH:
return DecodePublishMessage(buf)
case PUBACK:
return DecodePubackMessage(buf)
case PUBCOMP:
return DecodePubcompMessage(buf)
case PUBREC:
return DecodePubrecMessage(buf)
case PUBREL:
return DecodePubrelMessage(buf)
case SUBSCRIBE:
return DecodeSubscribeMessage(buf)
case SUBACK:
return DecodeSubackMessage(buf)
case UNSUBSCRIBE:
return DecodeUnsubscribeMessage(buf)
case UNSUBACK:
return DecodeUnsubackMessage(buf)
case PINGREQ:
return DecodePingreqMessage(buf)
case PINGRESP:
return DecodePingrespMessage(buf)
case DISCONNECT:
return DecodeDisconnectMessage(buf)
default:
return nil, errors.New("error message type")
}
}
func DecodeConnectMessage(buf []byte) (*message.ConnectMessage, error) {
connMsg := message.NewConnectMessage()
_, err := connMsg.Decode(buf)
if err != nil {
if !message.ValidConnackError(err) {
return nil, errors.New("Connect message format error, " + err.Error())
}
return nil, errors.New("Deode connect message error, " + err.Error())
}
return connMsg, nil
}
func DecodeConnackMessage(buf []byte) (*message.ConnackMessage, error) {
msg := message.NewConnackMessage()
_, err := msg.Decode(buf)
if err != nil {
return nil, errors.New("Decode Connack message error, " + err.Error())
}
return msg, nil
}
func DecodePublishMessage(buf []byte) (*message.PublishMessage, error) {
msg := message.NewPublishMessage()
_, err := msg.Decode(buf)
if err != nil {
return nil, errors.New("Decode Publish message error, " + err.Error())
}
return msg, nil
}
func DecodePubackMessage(buf []byte) (*message.PubackMessage, error) {
msg := message.NewPubackMessage()
_, err := msg.Decode(buf)
if err != nil {
return nil, errors.New("Decode Puback message error, " + err.Error())
}
return msg, nil
}
func DecodePubrecMessage(buf []byte) (*message.PubrecMessage, error) {
msg := message.NewPubrecMessage()
_, err := msg.Decode(buf)
if err != nil {
return nil, errors.New("Decode Pubrec message error, " + err.Error())
}
return msg, nil
}
func DecodePubrelMessage(buf []byte) (*message.PubrelMessage, error) {
msg := message.NewPubrelMessage()
_, err := msg.Decode(buf)
if err != nil {
return nil, errors.New("Decode Pubrel message error, " + err.Error())
}
return msg, nil
}
func DecodePubcompMessage(buf []byte) (*message.PubcompMessage, error) {
msg := message.NewPubcompMessage()
_, err := msg.Decode(buf)
if err != nil {
return nil, errors.New("Decode Pubcomp message error, " + err.Error())
}
return msg, nil
}
func DecodeSubscribeMessage(buf []byte) (*message.SubscribeMessage, error) {
msg := message.NewSubscribeMessage()
_, err := msg.Decode(buf)
if err != nil {
return nil, errors.New("Decode Subscribe message error, " + err.Error())
}
return msg, nil
}
func DecodeSubackMessage(buf []byte) (*message.SubackMessage, error) {
msg := message.NewSubackMessage()
_, err := msg.Decode(buf)
if err != nil {
return nil, errors.New("Decode Suback message error, " + err.Error())
}
return msg, nil
}
func DecodeUnsubscribeMessage(buf []byte) (*message.UnsubscribeMessage, error) {
msg := message.NewUnsubscribeMessage()
_, err := msg.Decode(buf)
if err != nil {
return nil, errors.New("Decode Unsubscribe message error, " + err.Error())
}
return msg, nil
}
func DecodeUnsubackMessage(buf []byte) (*message.UnsubackMessage, error) {
msg := message.NewUnsubackMessage()
_, err := msg.Decode(buf)
if err != nil {
return nil, errors.New("Decode Unsuback message error, " + err.Error())
}
return msg, nil
}
func DecodePingreqMessage(buf []byte) (*message.PingreqMessage, error) {
msg := message.NewPingreqMessage()
_, err := msg.Decode(buf)
if err != nil {
return nil, errors.New("Decode Pingreq message error, " + err.Error())
}
return msg, nil
}
func DecodePingrespMessage(buf []byte) (*message.PingrespMessage, error) {
msg := message.NewPingrespMessage()
_, err := msg.Decode(buf)
if err != nil {
return nil, errors.New("Decode Pingresp message error, " + err.Error())
}
return msg, nil
}
func DecodeDisconnectMessage(buf []byte) (*message.DisconnectMessage, error) {
msg := message.NewDisconnectMessage()
_, err := msg.Decode(buf)
if err != nil {
return nil, errors.New("Decode Disconnect message error, " + err.Error())
}
return msg, nil
}
func EncodeMessage(msg message.Message) ([]byte, error) {
buf := make([]byte, msg.Len())
_, err := msg.Encode(buf)
if err != nil {
return nil, err
}
return buf, nil
}