一个TCP长连接设备管理后台工程(六)---封包器与处理器

2023-11-10

封包器

上面介绍了过滤器,过滤器实际就是一个能够处理粘包和拆包的解析器,和封包器的作用正好相反。但是封包器会很简单,因为封包没有粘包和拆包的处理。

代码如下:

//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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

一个TCP长连接设备管理后台工程(六)---封包器与处理器 的相关文章

随机推荐