mirror of
https://github.com/fhmq/hmq.git
synced 2026-04-26 19:48:34 +00:00
237 lines
5.7 KiB
Go
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
|
|
}
|