|
@@ -24,9 +24,9 @@ type DHeader struct {
|
|
|
func (message *Message) Encode() ([]byte, error) {
|
|
|
// 编码消息体
|
|
|
var err error
|
|
|
- var body []byte
|
|
|
+ var data []byte
|
|
|
if message.Body != nil && !reflect.ValueOf(message.Body).IsNil() {
|
|
|
- body, err = message.Body.Encode()
|
|
|
+ data, err = message.Body.Encode(nil)
|
|
|
if err != nil {
|
|
|
return nil, err
|
|
|
}
|
|
@@ -36,34 +36,39 @@ func (message *Message) Encode() ([]byte, error) {
|
|
|
// 二进制转义
|
|
|
buffer := bytes.NewBuffer(nil)
|
|
|
|
|
|
- message.write(buffer, body)
|
|
|
+ message.write(buffer, data)
|
|
|
return buffer.Bytes(), nil
|
|
|
}
|
|
|
|
|
|
// 协议解码
|
|
|
-func (message *Message) Decode(data []byte) error {
|
|
|
+func (message *Message) Decode(ctx *PacketContext, data []byte) (result string, err error) {
|
|
|
// 检验标志位
|
|
|
length := len(data)
|
|
|
if length == 0 {
|
|
|
- return errors.ErrInvalidMessage
|
|
|
+ return result, errors.ErrInvalidMessage
|
|
|
}
|
|
|
- if data[0] != ReceiveByte && data[0] != RegisterByte {
|
|
|
- return errors.ErrInvalidMessage
|
|
|
+ for i := 0; i <= length; i++ {
|
|
|
+ if data[i] == SendByte {
|
|
|
+ continue
|
|
|
+ } else {
|
|
|
+ data = data[i:length]
|
|
|
+ glog.Debugf("收到数据:%2X", data)
|
|
|
+ break
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if data[0] != ReceiveByte {
|
|
|
+ return result, nil
|
|
|
}
|
|
|
if !message.checkSum(data) {
|
|
|
- return errors.ErrInvalidCheckSum
|
|
|
+ return result, errors.ErrInvalidCheckSum
|
|
|
}
|
|
|
- var header Header
|
|
|
- var err error
|
|
|
+
|
|
|
//处理注册包
|
|
|
if data[0] == RegisterByte {
|
|
|
|
|
|
header := Header{}
|
|
|
_ = json.Unmarshal(data, &header)
|
|
|
|
|
|
- //fmt.Println(header.Imei)
|
|
|
- //fmt.Println()
|
|
|
-
|
|
|
header.IccID, err = strconv.ParseUint(header.Imei, 10, 64)
|
|
|
header.MsgID = 0x0040 //消息ID
|
|
|
if err != nil {
|
|
@@ -73,46 +78,43 @@ func (message *Message) Decode(data []byte) error {
|
|
|
}
|
|
|
message.Body = nil
|
|
|
message.Header = header
|
|
|
- return nil
|
|
|
+ return result, nil
|
|
|
}
|
|
|
if len(data) < 8 {
|
|
|
if err != nil {
|
|
|
glog.Errorf("解析报文失败:%s", errors.ErrInvalidBody)
|
|
|
}
|
|
|
}
|
|
|
- if data[7] == 0x93 {
|
|
|
- entity, _, err := message.decode(uint32(0x93), data[:])
|
|
|
+ if data[8] == 0x93 {
|
|
|
+ _, err := message.decode(ctx, uint32(0x93), data[:])
|
|
|
if err != nil {
|
|
|
glog.Errorf("解析报文失败:%s", err.Error())
|
|
|
}
|
|
|
- message.Body = entity
|
|
|
+
|
|
|
} else {
|
|
|
- header.MsgID = MsgID(binary.BigEndian.Uint32(data[10:15])) //消息ID
|
|
|
- entity, _, err := message.decode(uint32(header.MsgID), data[:]) //解析实体对象 entity buffer : 为消息标识
|
|
|
+ msgID := MsgID(binary.BigEndian.Uint32(data[10:15])) //消息ID
|
|
|
+ result, err = message.decode(ctx, uint32(msgID), data[:]) //解析实体对象 entity buffer : 为消息标识
|
|
|
if err != nil {
|
|
|
glog.Errorf("解析报文失败:%s", err.Error())
|
|
|
}
|
|
|
- message.Body = entity
|
|
|
}
|
|
|
-
|
|
|
- message.Header = header
|
|
|
- return nil
|
|
|
+ return result, nil
|
|
|
}
|
|
|
|
|
|
//--->
|
|
|
-func (message *Message) decode(dataType uint32, data []byte) (Entity, int, error) {
|
|
|
+func (message *Message) decode(ctx *PacketContext, dataType uint32, data []byte) (result string, err error) {
|
|
|
creator, ok := entityMapper[dataType]
|
|
|
if !ok {
|
|
|
- return nil, 0, errors.ErrTypeNotRegistered
|
|
|
+ return result, errors.ErrTypeNotRegistered
|
|
|
}
|
|
|
|
|
|
entity := creator()
|
|
|
|
|
|
- count, err := entity.Decode(data) //解析data数据
|
|
|
+ result, err = entity.Decode(ctx, data) //解析data数据
|
|
|
if err != nil {
|
|
|
- return nil, 0, err
|
|
|
+ return result, err
|
|
|
}
|
|
|
- return entity, count, nil
|
|
|
+ return result, err
|
|
|
}
|
|
|
|
|
|
// 写入二进制数据
|