Netty私有协议栈在预付卡系统中的应用
Netty私有协议栈在预付卡系统中的应用
1 在业务场景中学Netty
在业务场景中学Netty包含了以下功能
- SpringBoot整合Netty-搭建支付前置系统
- Netty粘包/拆包问题处理
- Netty编解码技术
- 私有协议栈的设计与代码实现(基于POS签到,签退讲解原理)
- Netty整合Nacos实现服务的注册与发现
- Netty开发POS前置支付、退款业务
- Netty基于长连接对设备进行远程管理
- 百万POS终端设备场景下Netty调优
- Netty架构剖析与线程模型
- Netty项目实战版本八股文

2 预付卡系统中POS和前置系统功能
- 消费:在POS上发起消费功能
- 消费冲正:自动发起取消上一笔的消费交易
- 消费撤销:在POS上发起消费撤销交易
- 消费撤销冲正:自动发起上一笔的消费撤销交易
- 签到:POS终端只有签到成功后才可以进行交易
- 重打印:消费成功后打印小票如果没有成功则使用重打印进行打印
- 余额查询:查询预付卡中的余额

3 POS和前置系统协议设计
3.1 消息头数据模型设计
消息头数据属性包含消息的总长度,消息流水号,协议版本号,终端逻辑编号,终端物理编号,商户编号,操作员,批次号,交易号
字段 | 长度(字节) | 类型 | 说明 |
---|---|---|---|
Message Length | 4 | Integer | 消息的总长度(字节)注:消息头长度是加密后消息的总长度,加密只是对内容进行加密。 |
Sequence ID | 4 | Long | 消息流水号,顺序累加,步长为1,循环使用(一对请求和应答消息的流水号必须相同)在同一个业务里面,都用同一个消息流水号。 |
协议版本号 | 4 | Bytes | 协议版本号,1.0 |
终端逻辑编号 | 10 | Bytes | 设备逻辑ID号 |
终端物理编号 | 20 | Bytes | 设备物理ID号 |
商户编号 | 10 | Bytes | 商户编号 |
操作员 | 2 | Bytes | 终端本地的操作员编号。 |
批次号 | 4 | Integer | 除终端签到外,其他交易均需要带上批次号。 |
交易号 | 4 | Integer | 终端每发送一次交易,交易号都加1 |
消息头同时适用于终端往服务端和服务端往终端发送的消息。
批次号: 除终端签到外,终端上送交易均需要带上批次号,而服务端只在签到返回时带上。
交易号:终端每次上送一笔交易,都需要对交易号递增加1,断电保持。
操作员:终端本地管理的操作员编号
3.2 消息体数据模型设计
消息体主要由指令ID和业务内容组成
业务功能主要有: 签到, 签退, 交易(含消费,撤销,重打印,退货等多种业务), 结算等。
4 POS和前置系统签到功能设计
POS和前置系统所有功能采用自定义二进制私有协议进行功能实现,今天来设计签到功能具体协议。该功能会使用用到Netty中的粘包/拆包、编解码技术、私有协议栈的综合应用。
4.1 签到私有协议的设计
签到请求消息体
字段 | 长度(字节) | 类型 | 说明 |
---|---|---|---|
CommandID | 4 | Integer | 注册指令(0x80000001) |
VersionNo | 4 | String | 1.0 |
签到,如果上次有做签退,那么就分配新的批次值,如果上次没有做签退,那么继续沿用原来的批次值
签到响应消息体
字段 | 长度(字节) | 类型 | 说明 |
---|---|---|---|
CommandID | 4 | Integer | 操作指令 |
签到结果 | 1 | byte | 0:成功 1:失败 |
加密算法 | 1 | byte | 0:DES 1:3DES |
WorkKey | 20 | byte | 签名密钥的密文+4个校验字节 |
PinKey | 20 | byte | Pin密钥的密文+4个校验字节 |
BatchNo | 4 | Integer | 每次注册提供的批次号(1-999999可循环使用) |
ServerTime | 14 | String | yyyyMMddHHmmss |
5 Netty如何实现POS和前置系统的签到功能
5.1 粘包/拆包功能的应用

1.服务端分两次读取到数据包,没有产生粘包和拆包
2.服务端一次读取到两个数据包,两个数据包粘到了一起,被称为TCP粘包
3.服务端分两次读取到两个数据包,第一次读取到了Data1的完整包和Data2包的部分内容,第二次读取到了Data2包余下的内容,这被称为拆包
4.服务端分两次读取到两个数据包,第一次读取到Data1的部分包,第二次读取到了Data1余下的包和Data2包完整包
Netty中粘包拆包的两种解决方案分隔符(DelimiterBaseFrameDecoder)和定长解码器 (FixedLengthFrameDecoder)在该项目中我们使用定长解码器解决粘包和拆包问题
5.2 编解码技术的应用
预付卡平台基于私有协议使用二进制格式数据对交易数据进行编解码,Netty中支持常见的编解码框架比如Google Protobuf,Facebook Thrift,MessagePack等编解码框架。
5.3 私有协议栈的应用
私有协议栈我们在第3小节已经设置好,主要包括消息头和消息体两部分。在使用私有协议的过程中我们需要对协议进行编解码。
加入我的星球
加入知识星球,参与项目讨论,在星球内置顶内容可以找到我微信联系方式,添加微信请备注星球会员没有备注的同学不理会。
