资源描述
自助终端通信规范
版本控制:
修改日期
编辑人
说明
2014/9/30
翁永杰
起草
2015/1/15
翁永杰
补货协议增加上送上一个补货周期ID
1.1 接口简述
属性符号定义
—— M 强制域(Mandatory),此域在该消息中必须出现否则将被认为消息格式出错。
—— C 条件域(Conditional),此域在一定条件下出现在该消息中,具体的条件请参考备注说明。
—— N 变长
注:所有的应答报文格式统一为1.1.7 服务àXX应答报文数据格式规范
1.1.1 XXà服务 首次投放消息:
字段
类型
长度
属性
备注
Len
BYTE
2
M
长度.
报文数据字节的数量.
低字节在前,高字节在后
TPDU
BYTE
5
M
TPDU
bOffset
BYTE
1
M
随机数(用于计算MAC)
Version
BYTE
2
C
协议版本号
bCmd
BYTE
1
M
命令字
0x91 //首次投放
0x92 //补货填充
0x90 //心跳报文
0x79 //系统故障
0x7A //货道故障
0x7B //货道空货
0x7C //销售数据
0x7D //设备运行
0x94 //下载参数
TraceNo
BCD
3
M
流水号BCD
MerchantNo
ASCII
15
M
商户号ASC
TermNo
ASCII
8
M
终端号ASC
Date
BCD
4
M
日期 BCD
Time
BCD
3
M
时间 BCD
BillNo
ASCII
10
M
装车单号(首次投放时手输)
BakAmt
BCD
6
M
备用金(首次投放时手输)
ResourceNo
BYTE
13
M
资源编号ASC(售货机对应编号,首次投放时手输)
bChannelNum
BYTE
1
M
上送货道数量(默认48个)
ChannelInfo
BYTE
N
M
货道信息,在“初次投放货道信息结构体”中描述(暂时置为0)
Mac
BYTE
8
M
MAC校验,当MAC出错时, RspCode返回’A1’
1.1.1.1 初次投放货道信息结构体:
字段
类型
长度
属性
备注
ChannelID
BYTE
1
M
货道ID
Price
BCD
6
M
商品的价格
bTotalNum
BYTE
1
M
该货道中商品的总数
1.1.2 XXà服务 补货填充消息:
字段
类型
长度
属性
备注
Len
BYTE
2
M
长度.
报文数据字节的数量.
低字节在前,高字节在后
TPDU
BYTE
5
M
TPDU
bOffset
BYTE
1
M
随机数
Version
BYTE
2
C
协议版本号
bCmd
BYTE
1
M
命令字
0x91 //首次投放
0x92 //补货填充
0x90 //心跳报文
0x79 //系统故障
0x7A //货道故障
0x7B //货道空货
0x7C //销售数据
0x7D //设备运行
0x94 //下载参数
TraceNo
BCD
3
M
流水号BCD
MerchantNo
ASCII
15
M
商户号ASC
TermNo
ASCII
8
M
终端号ASC
Date
BCD
4
M
日期 BCD
Time
BCD
3
M
时间 BCD
cUpplyFlag
BYTE
1
M
补货类型(0)
BillNo
ASCII
10
M
装车单号(补货时手动输入)
bChannelNum
BYTE
1
M
上送货道数量
ChannelInfo
BYTE
N
M
货道信息,在“补货货道信息结构体”中描述(暂时置为0)
POSSupplyNo
BCD
3
C
补货周期ID(上一个)
2015-01-15新增
Mac
BYTE
8
M
MAC校验,当MAC出错时, RspCode返回’A1’
1.1.2.1 补货货道信息结构体:
字段
类型
长度
属性
备注
ChannelID
BYTE
1
M
货道ID
CashNum
BYTE
1
M
????
OffCashNum
BYTE
1
M
????
ReclaimNum
BYTE
1
M
????
1.1.3 XX à服务 系统故障、货道故障、货道空货 消息
字段
类型
长度
属性
备注
Len
BYTE
2
M
长度.
报文数据字节的数量.
低字节在前,高字节在后
TPDU
BYTE
5
M
TPDU
bOffset
BYTE
1
M
随机数
Version
BYTE
2
C
协议版本号
当存在版本号时,
VersionValue为实际要填的值;
当不存在版本号时,
VersionValue为0
bCmd
BYTE
1
M
命令字
0x91 //首次投放
0x92 //补货填充
0x90 //心跳报文
0x79 //系统故障
0x7A //货道故障
0x7B //货道空货
0x7C //销售数据
0x7D //设备运行
0x94 //下载参数
TraceNo
BCD
3
M
流水号BCD
MerchantNo
ASCII
15
M
商户号ASC
TermNo
ASCII
8
M
终端号ASC
Date
BCD
4
M
日期 BCD
Time
BCD
3
M
时间 BCD
TransData
BYTE
8
M
自贩机数据(参考《自动售货机-读卡器数据传输模块间通讯协议VAN_TGQP 第1.4版Ver.pdf》对应指令)
Mac
BYTE
8
M
MAC校验,当MAC出错时, RspCode返回’A1’
1.1.4 XXà服务 销售数据消息:
字段
类型
长度
属性
备注
Len
BYTE
2
M
长度.
报文数据字节的数量.
低字节在前,高字节在后
TPDU
BYTE
5
M
TPDU
bOffset
BYTE
1
M
随机数
Version
BYTE
2
C
协议版本号
当存在版本号时,
VersionValue为实际要填的值;
当不存在版本号时,
VersionValue为0
bCmd
BYTE
1
M
命令字
0x91 //首次投放
0x92 //补货填充
0x90 //心跳报文
0x79 //系统故障
0x7A //货道故障
0x7B //货道空货
0x7C //销售数据
0x7D //设备运行
0x94 //下载参数
TraceNo
BCD
3
M
流水号BCD
MerchantNo
ASCII
15
M
商户号ASC
TermNo
ASCII
8
M
终端号ASC
Date
BCD
4
M
日期 BCD
Time
BCD
3
M
时间 BCD
MerchCode
BCD
3
M
商品代码 BCD(售货机每次商品编号有变动时会把新的商品编号及对应货道号发送到POS,POS通过销售数据里的货道号找到对应商品编号)
POSTraceNo
BCD
3
M
POS流水号BCD(银联流水号,现金交易置为0)
POSSupplyNo
BCD
3
C
POS补货周期号(售货机每次补货后补货周期号累加,首次投放当做1次补货)
TransData
BYTE
36
M
自贩机数据(参考《自动售货机-读卡器数据传输模块间通讯协议VAN_TGQP 第1.4版Ver.pdf》对应指令)
Mac
BYTE
8
M
MAC校验,当MAC出错时, RspCode返回’A1’
1.1.5 XXà服务 心中报文消息
字段
类型
长度
属性
备注
Len
BYTE
2
M
长度.
报文数据字节的数量.
低字节在前,高字节在后
TPDU
BYTE
5
M
TPDU
bOffset
BYTE
1
M
随机数
Version
BYTE
2
C
协议版本号
当存在版本号时,
VersionValue为实际要填的值;
当不存在版本号时,
VersionValue为0
bCmd
BYTE
1
M
命令字
0x91 //首次投放
0x92 //补货填充
0x90 //心跳报文
0x79 //系统故障
0x7A //货道故障
0x7B //货道空货
0x7C //销售数据
0x7D //设备运行
0x94 //下载参数
TraceNo
BCD
3
M
流水号BCD
MerchantNo
ASCII
15
M
商户号ASC
TermNo
ASCII
8
M
终端号ASC
Date
BCD
4
M
日期 BCD
Time
BCD
3
M
时间 BCD
bStatu
BYTE
1
M
心跳状态(0)
Mac
BYTE
8
M
MAC校验,当MAC出错时, RspCode返回’A1’
1.1.6 XXà服务 设备运行消息
字段
类型
长度
属性
备注
Len
BYTE
2
M
长度.
报文数据字节的数量.
低字节在前,高字节在后
TPDU
BYTE
5
M
TPDU
bOffset
BYTE
1
M
随机数
Version
BYTE
2
C
协议版本号
当存在版本号时,
VersionValue为实际要填的值;
当不存在版本号时,
VersionValue为0
bCmd
BYTE
1
M
命令字
0x91 //首次投放
0x92 //补货填充
0x90 //心跳报文
0x79 //系统故障
0x7A //货道故障
0x7B //货道空货
0x7C //销售数据
0x7D //设备运行
0x94 //下载参数
TraceNo
BCD
3
M
流水号BCD
MerchantNo
ASCII
15
M
商户号ASC
TermNo
ASCII
8
M
终端号ASC
Date
BCD
4
M
日期 BCD
Time
BCD
3
M
时间 BCD
TransData
BYTE
30
M
自贩机数据(参考《自动售货机-读卡器数据传输模块间通讯协议VAN_TGQP 第1.4版Ver.pdf》对应指令)
Mac
BYTE
8
M
MAC校验,当MAC出错时, RspCode返回’A1’
1.1.7 服务àXX 应答报文数据格式规范:
字段
类型
长度
属性
备注
Len
BYTE
2
M
长度.
高字节在前,低字节在后
TPDU
BYTE
5
M
TPDU交换TPDU[2,3]与TPDU[4,5]字节交换
bOffset
BYTE
1
M
时间随机数
Version
BYTE
2
M
协议版本号
bCmd
BYTE
1
M
命令字
0x91 //首次投放,
0x92 //补货填充
0x90 //心跳报文
0x79 //系统故障
0x7A //货道故障
0x7B //货道空货
0x7C //销售数据
0x7D //设备运行
0x94 //下载参数
TraceNo
BYTE
3
M
流水号BCD
MerchantNo
BYTE
15
M
商户号ASC
TermNo
BYTE
8
M
终端号ASC
Date
BYTE
4
M
日期 BCD 当前日期
Time
BYTE
3
M
时间 BCD 当前时间
RspCode
BYTE
2
M
返回码ASC
00代表成功,其他失败
1.解包出错时:A0
2.Mac出错时:A1
3.销售:B1
4.补货填充:B2
5.初次投放:B3
6.货道故障登记:B4
7.货道空货登记:B5
8.系统故障登记:B6
9.设备运行状态登记:B7
10.心中登记:B8
11.参数下载登记:B9
Mac
BYTE
8
M
MAC校验
1.2 附录:MAC校验
unsigned char abKeyBuf[264+1]={"\x25\x50\x44\x46\x2D\x31\x2E\x34\x0A\x25\xC3\xA4\xC3\xBC\xC3\xB6\xC3\x9F\x0A\x32\x20\x30\x20\x6F\x62\x6A\x0A\x3C\x3C\x2F\x4C\x65\x6E\x67\x74\x68\x20\x33\x20\x30\x20\x52\x2F\x46\x69\x6C\x74\x65\x72\x2F\x46\x6C\x61\x74\x65\x44\x65\x63\x6F\x64\x65\x3E\x3E\x0A\x73\x74\x72\x65\x61\x6D\x0A\x78\x9C\x9D\x5D\xDD\xCE\xE4\x38\x6E\xBD\xFF\x9E\xA2\xAE\xE7\xE2\x8B\xFE\x68\xCB\x40\x10\xA0\x7B\xBA\x3B\xD7\x13\x34\x90\x17\x48\x76\x83\x20\x1D\x20\x73\x93\xD7\x8F\x6D\x91\xD2\x39\x94\xCB\x55\x99\x59\x60\x56\x67\x8B\x87\x45\xDA\x12\x45\x91\xAA\x6F\xC3\x67\x7C\xFC\xEF\xC7\xFF\x3C\xC2\x23\xEC\x23\xD9\xE4\x33\x3F\x6A\x89\x9F\xDB\xE3\xCF\x7F\x7F\xFC\xEB\x6F\x8F\xFF\xFE\x08\x9F\x6B\x88\xDB\xF2\xF0\xFF\xFD\xE7\xDF\x3F\x96\xED\x53\x1E\x3B\xFA\x5C\x1E\xDB\xF2\xB9\x3E\xE2\xB2\xEB\xD8\x79\x7F\xFB\xED\x23\x2E\xCB\x67\xD2\xCF\x8A\xE0\x27\x29\xC6\xF1\x49\xD9\xBF\x0E\x3F\x13\xE9\x1A\x53\x76\x2A\xCF\x6F\xCB\xF5\xB0\xF3\xFA\xDB\xDA\x67\x57\xDF\xA6\x9F\x5C\x7E\x5B\xFB\xEC\xFA\xDB\x62\x5D\xF7\x27\xB1\x3B\x4B\xDF\x25\xFD\x93\x22\x4C\x6A\xDF\xA6\x9F\xE5\x4F\xB6\x44\xCA\x21\x7C\x7E"};
// MACkey字符串,通过随机数截取MACkey
void Taigu_CalMac(unsigned char *data, unsigned int datalen, unsigned char offset,unsigned char *mac)
{
unsigned char mackey[8], tmp[8], str[1024];
unsigned int i, j, k;
memset( tmp, 0, sizeof( tmp ) );
memset( str, 0, sizeof( str ) );
memcpy( str, data, datalen );
j = datalen%8 ? (datalen/8+1) : datalen/8 ;
for( i=0; i<j; i++ )
{
for( k=0; k<8; k++ )
tmp[k] ^= str[i*8+k];
}
//写死MACkey通过偏移量获取
memcpy(mackey, &abKeyBuf[offset], 8);
DES(mackey ,tmp, mac);
}
展开阅读全文