📄 s50兼容卡协议.txt
字号:
一。S50卡的基本描述:
* 16个扇区(s0-s15);每扇区4个块(bn0-bn3);每块16个字节。
* 每个扇区的bn3为该扇区的密钥控制块,为卡片硬件设置区。
* s0的bn0为s50卡片的ic出厂信息区,用户不可使用。
* 对s50卡的读写是按块(16个字节)为单位的。
* 每个块的读写操作均需要密码认证,其密码为该块所在扇区的keyA,或keyB
二。应用协议:(按扇区和块列表)
----------------------------------------------------------------------------------------------
扇区s0:未使用
----------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------
扇区s1:
----------------------------------------------------------------------------------------------
------------------------------------- Memeroy Map ---------------------------------------
块4;功能:
结构:byte[0]---------卡类型
0x01:用户卡
0x00:起用卡
0x02:修改设置卡
0x03:停用卡
0x04:无效卡
0x05:测试卡 //
byte[1:14]----- 数据域
byte[15]------- 块b01的数据总效验
块5;功能:
结构:byte[0:14]------ 数据域
byte[15] ------- 块5的数据总效验
块6;功能:
结构:byte[0:14]------ 数据域
byte[15] ------- 块6的数据总效验
块7;功能;用于存储设置的KeyA,Contorl-Bit和KeyB
初始化密码为6个0Xff
结构:byte[0:5]-------KeyA
byte[6:9]-------Contorl_Bit
byte[10:15] ----KeyB
Contorl_Bit 4个字节的定义:
================================================================
| byte6 |
| bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0 |
| /c23 /c22 /c21 /c20 /c13 /c12 /c11 /c10 |
================================================================
| byte7 |
| bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0 |
| c13 c12 c11 c10 /c33 /c32 /c31 /30 |
================================================================
| byte8 |
| bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0 |
| c33 c32 c31 c30 c23 c22 c21 c20 |
================================================================
| byte9 |
| bit0 bit1 bit2 bit3 bit4 bit5 bit6 bit7 |
| ---- ---- ---- ---- ---- ---- ---- ---- |
================================================================
注:/Cxx表示Cxx取反
>>做用户卡时该扇区块的权限设置如下:(Contorl-Bit的设置):
(写用户卡时,一定用未设置过卡硬件密码的卡片,用新卡的初始密码6个0XFF去写所有的数据)
块b13: (C13,C23,C33) = (0,1,1) : KeyA,KeyB都不可读,KeyA,KeyB写需要KeyB
CTR_BIT读写需要认证 KeyB
块b12: (C12,C22,C32) = (0,1,1) : 读或写都需验证 KeyB
块b11: (C11,C21,C31) = (0,1,1) : 读或写都需验证 KeyB
块b10: (C10,C20,C30) = (0,1,1) : 读或写都需验证 KeyB
----------------------------------------------------------------------------------------------
扇区s2~s15:未使用
----------------------------------------------------------------------------------------------
三。各种卡类型的数据域结构
1.0x01用户卡:
bank4: byte[0] ------- 0x01 用户卡的标识
byte[1:3]------ 3 字节系统号
byte[4:6]------ 3 字节卡号
byte[7:9]------ 3 字节软密码
byte[10]------- 1 字节最近一次充值地点标识
byte[11:14]---- 4 字节最近一次充值时间(BCD年 BCD月 BCD日 BCD时)
byte[15]------- 块4的数据总效验
bank5: byte[0:4]------ 5 字节余额/余量 (xx xx x.x xx xx)元
byte[5:9]------ 5 字节备份余额/余量 (xx xx x.x xx xx)元
byte[10:13]---- 4 字节前次消费金额 (xx x.x xx xx)元
byte[14]------- 用户卡状态字
bit0 : 1:上一次有非法用水操作0:上一次用水操作正常
bit1 : 1:卡已停用(余额为0) 0:卡正常()
bit2 : 0:现金卡 1:水量卡
bit3 : 0:余量和备份余量一致1:余量和备份余量不一致
bit4 : 固定0
bit5 : 固定0
bit6 : 固定0
bit7 : 固定0
byte[15]------- 块5的数据总效验
bank6: byte[0:4]------ 5 字节前次用水时间 (年/月/日/时/分)
byte[5:9]------ 5 字节前次用水前卡余量 (xx xx x.x xx xx)元
byte[10:12]-----3 字节前次用水量 (xx x.x xx)立方米
byte[13:14]---- 2 字节前次结算单价 (xx . xx)元
byte[15]------- 块6的数据总效验
bank7; byte[0:5]-------KeyA 卡的硬件秘密A 写入开户卡中设定的密码
byte[6:9]-------Contorl_Bit 卡读写权限的硬件设置区
byte[10:15] ----KeyB 卡的硬件秘密B 写入开户卡中设定的密码
2.0x00起用卡: (用户将表投入使用,需用起用卡设置表的密码,工作模式,参数等)
bank4: byte[0] ------- 0x00 \\起用卡标识
byte[1:3]------ 3 字节系统号
byte[4:9]----- 6 字节硬件卡密码
byte[10:12]---- 3 字节软件卡密码
byte[13]------- 表工作方式控制字1
bit[7]--------短信通讯起用位 \\1:起用 0:禁用
bit[6]-------卡中余额BCD码性质 \\1:元 0:立方米
bit[5:4]-----位置 \\00:1000L
\\01:100L
\\10:1L
\\11:10L
bit[3]------ 红外/485通讯起用位 \\1:红外 0:485
bit[2:1]---- 短信发送超时有效期 \\00:12小时
\\01:1天
\\10:1周
\\11:1月
bit[0]-------起用卡是否给表设表号 \\1:要设定表号,0:不设定表号
byte[14]------- 主台随机数1
byte[15]------- 块4的数据总效验
bank5: byte[0:1]------ 2 字节设置单价值
byte[2:8]------ 7 字节表号
byte[9:14]----- 6 字节第一短消息目标号码
byte[15]------- 块5的数据总效验
bank6: byte[0:5]------ 6 字节第二短消息目标号码
byte[6:11]----- 6 字节短消息服务中心号码
BYTE[12]------- 主台随机数2
byte[13:14]---- 起用卡验证字 BYTE[13]:高字节,BYTE[14]:低字节。
算法:
bank4,bank5,bank6除每bankX的byte[15]以外,所有的数据的累加成一个16位无符号INT型(HEX格式)
,得到——起用卡验证字[HEX], 高8位放至——BYTE[14],低8位放至BYTE[13]
byte[15]------- 块6的数据总效验
3.0x02修改设置卡:(在水表起用过后修改某些设置)
byte[0] ------- 0x02
bank4: byte[1:3]------ 3 字节系统号
byte[4:6]------ 3 字节软密码
byte[7]-------- 1 字节修改的表工作方式控制字
byte[8]-------- 数据项长度
byte[9:14]----- 数据域
byte[15]------- 块4的数据总效验
bank5: byte[0:14]----- 数据域
byte[15]------- 块5的数据总效验
bank6: byte[0:3]------ 任意
byte[4:6]------ 任意
byte[7]-------- 任意
byte[8:11]----- 任意
byte[12:14]---- 任意
byte[15]------- 任意
4.0x03停用卡:(清除所有用户设置,使水表处于未起用模式)
byte[0]-------- 0x03
bank4: byte[1:3]------ 3 字节系统号
byte[4]-------- 3 字节软密码
byte[7:14]----- 停用字 //'s''t''o''p''m''e''t''r'停用验证字串
byte[15]------- 块b01的数据总效验
bank5: byte[0:3]------ 任意
byte[4]-------- 任意
byte[5:8]------ 任意
byte[9]-------- 任意
byte[10:13]---- 任意
byte[14]------- 任意
byte[15]------- 任意
bank6: byte[0:3]------ 任意
byte[4:6]------ 任意
byte[7]-------- 任意
byte[8:11]----- 任意
byte[12:14]---- 任意
byte[15]------- 任意
5.0x04无效卡; (非用户卡在刷过一次后就作废成无校卡)
byte[0]--------0x04
bank4: byte[1:3]------ 任意
byte[4]-------- 任意
byte[5]-------- 任意
byte[6:14]----- 任意
byte[15]------- 任意
bank5: byte[0:3]------ 任意
byte[4]-------- 任意
byte[5:8]------ 任意
byte[9]-------- 任意
byte[10:13]---- 任意
byte[14]------- 任意
byte[15]------- 任意
bank6: byte[0:3]------ 任意
byte[4:6]------ 任意
byte[7]-------- 任意
byte[8:11]----- 任意
byte[12:14]---- 任意
byte[15]------- 任意
6.0x05工厂测试卡;(用于水表的功能测试)
制卡示例:
1. 制起用卡
//************************************主台设定的参数***********************************//
起用卡标识:0x00
系统号:892345
硬件卡密码:334414567535
软件卡密码:654321
表工作方式控制字1:0xfb
此值表示:起用短信通讯,起用红外通讯,需要给表设定表号,干簧管位置在10升的转针上,卡中余额BCD码是金额
短信发送超时有效期为1天,
主台随机数1:0x23
块4的数据总效验:0x63
设置单价值:2元4角3分 0x02 0x43
给待开户表设定的表号:00000012345678
第一短消息目标号码:013813828458
块5的数据总效验:0x03
第二短消息目标号码:013813828458
短消息服务中心号码:013800250500
主台随机数2:0x54
起用卡验证字:经计算得0xF638。byte[13]=0xF6,byte[14]=0X38
块6的数据总效验:0x8f
//**************************************************************************************//
//*************************************写入卡的数据*************************************//
写起用卡时要求使用硬件卡密码为6个FF的卡(未设置过硬件卡密码的卡),
读写密码为 ff ff ff ff ff ff
bank4写入:00 89 23 45 33 44 14 56 75 35 65 43 21 fb 23 63
bank5写入:02 43 00 00 00 12 34 56 78 01 38 13 82 84 58 03
bank6写入:01 38 13 82 84 58 01 38 00 25 05 00 54 F6 38 8f
bank7(不写) 起用卡不写bank7卡控制区
//**************************************************************************************//
一张起用卡制成后,只能设置一台水表,后水表将起用卡返写成无效卡,主台可将用过的起用卡回收使用。
2. 制用户卡(在上面起用卡起用过的水表上使用)
//************************************主台设定的参数***********************************//
用户卡标识:0x01
系统号:892345
卡号:000001
软件卡密码:654321
最近一次充值地点标识:0X01 当前营业厅地点表识
最近一次充值时间:06122910 06年/12月/29日/10时
块4的数据总效验:0x0E
余额/余量:0010155000 00101.55000元/立方米
备份余额/余量:0010155000 00101.55000元/立方米
前次消费金额:00000000 000.00000元/立方米
用户卡状态字:0x00 正常使用中无非法操作
块5的数据总效验:0xEA
前次用水结算时间:0000000000 BCD年/BCD月/BCD日/BCD时/BCD分
前次用水前卡余额/余量:000000000000 00000.00000元/立方米
前次用水量:000000 000.000立方米
前次结算单价:0000 00.00元
块6的数据总效验:0x00
卡硬件密码A:334414567535 卡硬件密码有KEYA,KEYB两组,为方便主台和水表使用,设KEYA,KEYB相同
卡读写控制区:0f00ff 块b13: KeyA,KeyB都不可读,KeyA,KeyB写需要KeyB,CTR_BIT读写需要认证KeyB
块b12: 读或写都需验证 KeyB
块b11: 读或写都需验证 KeyB
块b10: 读或写都需验证 KeyB
卡硬件密码B:334414567535
//**************************************************************************************//
//*************************************写入卡的数据*************************************//
读写密码为 ff ff ff ff ff ff
写起用卡时要求使用硬件卡密码为6个FF的卡(未设置过硬件卡密码,和控制区的卡),
bank4写入:01 89 23 45 00 00 01 65 43 21 01 06 12 29 10 0E
bank5写入:00 10 15 50 00 00 10 15 50 00 00 00 00 00 00 EA
bank6写入:00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
bank7写入:33 44 14 56 75 35 0f 00 ff 00 33 44 14 56 75 35
//**************************************************************************************//
2. 制停用卡(在上面起用卡起用过的水表上使用)
bank4写入:0389234565432173746F706d6574723b
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -