1、自助终端通信规范版本控制:修改日期编辑人说明2014/9/30翁永杰起草2015/1/15翁永杰补货协议增加上送上一个补货周期ID1.1 接口简述属性符号定义 M强制域(Mandatory),此域在该消息中必须出现否则将被认为消息格式出错。 C条件域(Conditional),此域在一定条件下出现在该消息中,具体的条件请参考备注说明。 N 变长注:所有的应答报文格式统一为1.1.7 服务XX应答报文数据格式规范1.1.1 XX服务 首次投放消息:字段类型长度属性备注LenBYTE2M长度.报文数据字节的数量.低字节在前,高字节在后TPDUBYTE5MTPDUbOffsetBYTE1M随机数(用
2、于计算MAC)VersionBYTE2C协议版本号bCmdBYTE1M命令字0x91 /首次投放0x92 /补货填充0x90 /心跳报文0x79 /系统故障0x7A /货道故障0x7B /货道空货0x7C /销售数据0x7D /设备运行0x94 /下载参数TraceNoBCD3M流水号BCDMerchantNoASCII15M商户号ASCTermNoASCII8M终端号ASCDateBCD4M日期 BCDTimeBCD3M时间 BCDBillNoASCII10M装车单号(首次投放时手输)BakAmtBCD6M备用金(首次投放时手输)ResourceNoBYTE13M资源编号ASC(售货机对应编
3、号,首次投放时手输)bChannelNumBYTE1M上送货道数量(默认48个)ChannelInfoBYTENM货道信息,在“初次投放货道信息结构体”中描述(暂时置为0)MacBYTE8MMAC校验,当MAC出错时, RspCode返回A1 1.1.1.1 初次投放货道信息结构体:字段类型长度属性备注ChannelIDBYTE1M货道IDPriceBCD6M商品的价格bTotalNumBYTE1M该货道中商品的总数1.1.2 XX服务 补货填充消息:字段类型长度属性备注LenBYTE2M长度.报文数据字节的数量.低字节在前,高字节在后TPDUBYTE5MTPDUbOffsetBYTE1M随机
4、数VersionBYTE2C协议版本号bCmdBYTE1M命令字0x91 /首次投放0x92 /补货填充0x90 /心跳报文0x79 /系统故障0x7A /货道故障0x7B /货道空货0x7C /销售数据0x7D /设备运行0x94 /下载参数TraceNoBCD3M流水号BCDMerchantNoASCII15M商户号ASCTermNoASCII8M终端号ASCDateBCD4M日期 BCDTimeBCD3M时间 BCDcUpplyFlagBYTE1M补货类型(0)BillNoASCII10M装车单号(补货时手动输入)bChannelNumBYTE1M上送货道数量ChannelInfoBYT
5、ENM货道信息,在“补货货道信息结构体”中描述(暂时置为0)POSSupplyNoBCD3C补货周期ID(上一个)2015-01-15新增MacBYTE8MMAC校验,当MAC出错时, RspCode返回A11.1.2.1 补货货道信息结构体:字段类型长度属性备注ChannelIDBYTE1M货道IDCashNumBYTE1M?OffCashNumBYTE1M?ReclaimNumBYTE1M?1.1.3 XX 服务 系统故障、货道故障、货道空货 消息字段类型长度属性备注LenBYTE2M长度.报文数据字节的数量.低字节在前,高字节在后TPDUBYTE5MTPDUbOffsetBYTE1M随机
6、数VersionBYTE2C协议版本号当存在版本号时,VersionValue为实际要填的值;当不存在版本号时,VersionValue为0bCmdBYTE1M命令字0x91 /首次投放0x92 /补货填充0x90 /心跳报文0x79 /系统故障0x7A /货道故障0x7B /货道空货0x7C /销售数据0x7D /设备运行0x94 /下载参数TraceNoBCD3M流水号BCDMerchantNoASCII15M商户号ASCTermNoASCII8M终端号ASCDateBCD4M日期 BCDTimeBCD3M时间 BCDTransDataBYTE8M自贩机数据(参考自动售货机-读卡器数据传输
7、模块间通讯协议VAN_TGQP 第1.4版Ver.pdf对应指令)MacBYTE8MMAC校验,当MAC出错时, RspCode返回A11.1.4 XX服务 销售数据消息:字段类型长度属性备注LenBYTE2M长度.报文数据字节的数量.低字节在前,高字节在后TPDUBYTE5MTPDUbOffsetBYTE1M随机数VersionBYTE2C协议版本号当存在版本号时,VersionValue为实际要填的值;当不存在版本号时,VersionValue为0bCmdBYTE1M命令字0x91 /首次投放0x92 /补货填充0x90 /心跳报文0x79 /系统故障0x7A /货道故障0x7B /货道空
8、货0x7C /销售数据0x7D /设备运行0x94 /下载参数TraceNoBCD3M流水号BCDMerchantNoASCII15M商户号ASCTermNoASCII8M终端号ASCDateBCD4M日期 BCDTimeBCD3M时间 BCDMerchCodeBCD3M商品代码 BCD(售货机每次商品编号有变动时会把新的商品编号及对应货道号发送到POS,POS通过销售数据里的货道号找到对应商品编号)POSTraceNoBCD3MPOS流水号BCD(银联流水号,现金交易置为0)POSSupplyNoBCD3CPOS补货周期号(售货机每次补货后补货周期号累加,首次投放当做1次补货)TransDa
9、taBYTE36M自贩机数据(参考自动售货机-读卡器数据传输模块间通讯协议VAN_TGQP 第1.4版Ver.pdf对应指令)MacBYTE8MMAC校验,当MAC出错时, RspCode返回A11.1.5 XX服务 心中报文消息字段类型长度属性备注LenBYTE2M长度.报文数据字节的数量.低字节在前,高字节在后TPDUBYTE5MTPDUbOffsetBYTE1M随机数VersionBYTE2C协议版本号当存在版本号时,VersionValue为实际要填的值;当不存在版本号时,VersionValue为0bCmdBYTE1M命令字0x91 /首次投放0x92 /补货填充0x90 /心跳报文
10、0x79 /系统故障0x7A /货道故障0x7B /货道空货0x7C /销售数据0x7D /设备运行0x94 /下载参数TraceNoBCD3M流水号BCDMerchantNoASCII15M商户号ASCTermNoASCII8M终端号ASCDateBCD4M日期 BCDTimeBCD3M时间 BCDbStatuBYTE1M心跳状态(0)MacBYTE8MMAC校验,当MAC出错时, RspCode返回A11.1.6 XX服务 设备运行消息字段类型长度属性备注LenBYTE2M长度.报文数据字节的数量.低字节在前,高字节在后TPDUBYTE5MTPDUbOffsetBYTE1M随机数Versi
11、onBYTE2C协议版本号当存在版本号时,VersionValue为实际要填的值;当不存在版本号时,VersionValue为0bCmdBYTE1M命令字0x91 /首次投放0x92 /补货填充0x90 /心跳报文0x79 /系统故障0x7A /货道故障0x7B /货道空货0x7C /销售数据0x7D /设备运行0x94 /下载参数TraceNoBCD3M流水号BCDMerchantNoASCII15M商户号ASCTermNoASCII8M终端号ASCDateBCD4M日期 BCDTimeBCD3M时间 BCDTransDataBYTE30M自贩机数据(参考自动售货机-读卡器数据传输模块间通讯
12、协议VAN_TGQP 第1.4版Ver.pdf对应指令)MacBYTE8MMAC校验,当MAC出错时, RspCode返回A11.1.7 服务XX 应答报文数据格式规范:字段类型长度属性备注LenBYTE2M长度.高字节在前,低字节在后TPDUBYTE5MTPDU交换TPDU2,3与TPDU4,5字节交换bOffsetBYTE1M时间随机数VersionBYTE2M协议版本号bCmdBYTE1M命令字0x91 /首次投放,0x92 /补货填充0x90 /心跳报文0x79 /系统故障0x7A /货道故障0x7B /货道空货0x7C /销售数据0x7D /设备运行0x94 /下载参数TraceNo
13、BYTE3M流水号BCDMerchantNoBYTE15M商户号ASCTermNoBYTE8M终端号ASCDateBYTE4M日期 BCD 当前日期TimeBYTE3M时间 BCD 当前时间RspCodeBYTE2M返回码ASC00代表成功,其他失败1.解包出错时:A02.Mac出错时:A13.销售:B14.补货填充:B25.初次投放:B36.货道故障登记:B47.货道空货登记:B58.系统故障登记:B69.设备运行状态登记:B710.心中登记:B811.参数下载登记:B9MacBYTE8MMAC校验1.2 附录:MAC校验unsigned char abKeyBuf264+1=x25x50x
14、44x46x2Dx31x2Ex34x0Ax25xC3xA4xC3xBCxC3xB6xC3x9Fx0Ax32x20x30x20x6Fx62x6Ax0Ax3Cx3Cx2Fx4Cx65x6Ex67x74x68x20x33x20x30x20x52x2Fx46x69x6Cx74x65x72x2Fx46x6Cx61x74x65x44x65x63x6Fx64x65x3Ex3Ex0Ax73x74x72x65x61x6Dx0Ax78x9Cx9Dx5DxDDxCExE4x38x6ExBDxFFx9ExA2xAExE7xE2x8BxFEx68xCBx40x10xA0x7BxBAx3BxD7x13x34x90x17x
15、48x76x83x20x1Dx20x73x93xD7x8Fx6Dx91xD2x39x94xCBx55x99x59x60x56x67x8Bx87x45xDAx12x45x91xAAx6FxC3x67x7CxFCxEFxC7xFFx3CxC2x23xECx23xD9xE4x33x3Fx6Ax89x9FxDBxE3xCFx7Fx7FxFCxEBx6Fx8FxFFxFEx08x9Fx6Bx88xDBxF2xF0xFFxFDxE7xDFx3Fx96xEDx53x1Ex3BxFAx5Cx1ExDBxF2xB9x3ExE2xB2xEBxD8x79x7FxFBxEDx23x2ExCBx67xD2xCFx8Ax
16、E0x27x29xC6xF1x49xD9xBFx0Ex3Fx13xE9x1Ax53x76x2AxCFx6FxCBxF5xB0xF3xFAxDBxDAx67x57xDFxA6x9Fx5Cx7Ex5BxFBxECxFAxDBx62x5DxF7x27xB1x3Bx4BxDFx25xFDx93x22x4Cx6AxDFxA6x9FxE5x4FxB6x44xCAx21x7Cx7E;/ MACkey字符串,通过随机数截取MACkey void Taigu_CalMac(unsigned char *data, unsigned int datalen, unsigned char offset,unsign
17、ed char *mac)unsigned char mackey8, tmp8, str1024;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; ij; i+ )for( k=0; k8; k+ )tmpk = stri*8+k;/写死MACkey通过偏移量获取memcpy(mackey, &abKeyBufoffset, 8);DES(mackey ,tmp, mac);