封包器
上面介绍了过滤器,过滤器实际就是一个能够处理粘包和拆包的解析器,和封包器的作用正好相反。但是封包器会很简单,因为封包没有粘包和拆包的处理。
代码如下:
//Packer is proto Packer api
func Packer(msg Message) []byte {
data := make([]byte, 0)
tempbytes := codec.Word2Bytes(msg.HEADER.MID)
data = append(data, tempbytes...)
datalen := uint16(len(msg.BODY)) & 0x03FF
datalen = datalen | 0x4000
tempbytes = utils.Word2Bytes(datalen)
data = append(data, tempbytes...)
data = append(data, msg.HEADER.Version)
if len(msg.HEADER.PhoneNum) < 10 {
data = append(data, make([]byte, 10-len(msg.HEADER.PhoneNum))...)
data = append(data, msg.HEADER.PhoneNum...)
} else {
data = append(data, msg.HEADER.PhoneNum[:10]...)
}
tempbytes = utils.Word2Bytes(msg.HEADER.SeqNum)
data = append(data, tempbytes...)
if msg.HEADER.IsMulti() {
data = append(data, utils.Word2Bytes(msg.HEADER.MutilFlag.MsgSum)...)
data = append(data, utils.Word2Bytes(msg.HEADER.MutilFlag.MsgIndex)...)
}
data = append(data, msg.BODY...)
csdata := byte(checkSum(data[:]))
data = append(data, csdata)
//添加头尾
var tmpdata []byte = []byte{
0x7e}
for _, item := range data {
if item == 0x7d {
tmpdata = append(tmpdata, 0x7d, 0x01)
} else if item == 0x7e {
tmpdata = append(tmpdata, 0x7d, 0x02)
} else {
tmpdata = append(tmpdata, item)
}
}
tmpdata = append(tmpdata, 0x7e)
return tmpdata
}
处理器
处理器用来处理接收到的有效TCP数据包,它应该是比过滤器更上层的一个模块。因为我们是用来管理TCP连接的,一个tcp连接代表着一个终端设备,这个终端设备有各种属性和操作逻辑,这些东西都是依附于TCP的长连接。我们单独定义一个包来组织这部分内容:
package term
而我们的处理器就存在于这个包中。由于这个模块是tcp数据的实际处理模块,所以会牵扯到许多相关连的包,比如前面的codec、proto等,还有数据库的操作。
这一部分我们主要只介绍处理器的逻辑。前面我们说了,我们要处理的包有:
- 平台通用应答
- 终端通用应答
- 终端注册
- 终端注册应答
- 终端鉴权
- 心跳
- 位置上报处理
通过proto的filt