WS-R-C系列读写器二次开发说明 V4.01
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
WS-R-C系列读写器二次开发说明
版本V4.01
最近更新日期
2011年10月20日
适用型号
WS-R-C 系列 Mifare读写器
WS-R-C 系列读写器性能参数
1.适用于符合MIFARE标准的非接触卡
2.支持MIFARE标准
3.工作频率13.56MHZ
4.设备接口:RS232(USB取电,RS232串口通讯)
USB-COM(需安装USB转串口驱动,虚拟串口),
USB-HID(人体工学设备,直接USB通讯,即插即用)
5.通讯方式:串口,USB
6.通讯参数:波特率57600 bit/s,8位数据位,1位停止位,无校验
7.最大读卡距离100mm
8.控制蜂鸣器鸣响
9.外型尺寸:120mm×98mm×29mm
10.颜色:黑色
11.提供的二次开发平台和丰富的应用范例
读写器开发套件包括:
读写器,USB通讯线,开发光盘
开发光盘目录
WS-R-C系列读写器二次开发说明X.doc 说明文档,必看
测试工具\*.* 标准函数测试工具
动态库\*.*读写器访问动态库文件
动态库\C++ Builder\*.* Borland C++ Builder 6专用lib文件,头文件
动态库\Windows dll\*.* Windows平台其他开发语言使用的dll文件
演示源码\BCB6\*.* Borland C++ Builder 6演示源码,接口文件为WSR.h
演示源码\Delphi7\*.*Delphi7演示源码,接口文件为WSR.pas
演示源码\Java\*.* Java演示源码
演示源码\VB6\*.* VB6演示源码,接口文件为WSR.bas
演示源码\VC6\*.* VC6演示源码,接口文件为WSR.h
演示源码\VFP6\*.* VFP6演示源码
演示源码\PB9\*.* Power Builder 9演示源码
演示源码\VS2005 C#\*.* C# (Visual 2005)演示源码,接口文件为WSR.cs
演示源码\VS2005 VB\*.* (Visual 2005)演示源码,接口文件为WSR.vb 演示源码\VS2008 VC\*.* VC (Visual 2008)演示源码,接口文件为WSR.h
演示源码\易语言\*.* 易语言演示源码,
USB驱动\USB转串口驱动 341 (默认安装此驱动)\*.* USB驱动,支持以下操作系统:
支持Windows 98/XP/2000/Vista/7
USB驱动\USB转串口驱动 232\*.* USB驱动,此为特殊驱动,除非事先说明,否则不要安装此驱动
动态库文件包含:
WSR.dll
WSR.lib (库文件, VC,BCB需要)
WSR.h (API函数头文件,VC,BCB需要)
注意:1.动态库支持VC/VB/BCB/Delphi/Visual Foxpro/Power Builder/易语言/Visual Studio 2003/2005/2008/2010等开发工具环境。
2.以下只列出函数在VC开发环境下的描述(表示VC开发环境下的函数声明),其它开发环境的函数描述
在对应的演示源码中可以找到;
3.在参数说明中[in]表示传入参数,[out]表示传出参数;
4.一台计算机只能连接1台USB-HIDM1设备,不能同时连接多台USB-HIDM1设备。
Windows平台开发篇 一、开发基本流程
API函数一般调用顺序
1.打开串口
打开串口 ws_openPort
获取串口句柄 ws_getPort
2.设备访问
点名获取设备信息 ws_callDevice
ws_callDevice1
蜂鸣 ws_beep
3.卡操作
卡号操作
读取卡号 ws_getCardNo_DWORD
ws_getCardNo_Double
ws_getCardNo_String 设置卡序列号的顺序 ws_set_cardno_seq
密码操作
以char字符组方式操作
装载密码 ws_loadKey
修改密码 ws_changeKey
修改密码A ws_changeKeyA
修改密码B ws_changeKeyB
以Hex字符串方式操作
装载密码 ws_loadKey_Hex
修改密码 ws_changeKey_Hex
修改密码A ws_changeKeyA_Hex
修改密码B ws_changeKeyB_Hex
值操作
初始化值 ws_initValue
读值 ws_readValue
增值 ws_incValue
减值 ws_decValue
读写卡操作
以char字符组方式操作
读块数据 ws_readBlock
连续读数据 ws_readData
写块数据 ws_writeBlock
连续写数据 ws_writeData
以Hex字符串方式操作
读块数据 ws_readBlock_Hex
连续读数据 ws_readData_Hex
写块数据 ws_writeBlock_Hex
连续写数据 ws_writeData_Hex
显示屏操作
显示文本 ws_displayText
清空显示 ws_clearText
4.辅助函数
Hex字符串转换为Char字符串 ws_strHexToChar
Char字符串转换为Hex字符串 ws_charToStrHex
计算扇区密码区对应的物理块号 Ws_getKeyBlock
计算扇区块号对应的物理块号 ws _getBlock
动态库版本信息 ws_getDLLInfo
5.关闭串口
关闭串口 ws_closePort
基本事务流程图
说明:
1.流程图中【意外事件】主要是指函数调用失败的情况,一般当函数返回值小于0即为失败;
2.事务从开始到结束是一气呵成的,有些软件开发人员,在打开应用程序界面的时候【打开串口】,关闭界面的时候【关闭串口】,这种做法在非实时操作读写器的应用中是不正确的。
正确的做法就是在需要进行操作卡事务的时候【打开串口】,完成一系列读写卡操作后,马上【关闭串口】,整个过程十分短暂,一般在两秒钟内完成;
3.以上流程不是强制性的标准流程,根据实际开发事务的需要,可以设计出自己的流程。
二、函数原型说明
1.串口控制类
打开串口 ws_openPort
int ws_openPort (int Port)
参 数: Port [in] 串口号(范围:1-255);访问HID设备时,此处传入0
返回值: >=0 成功 <0 失败
关闭串口 ws_closePort
int ws_closePort (int Port)
参 数: Port [in] 串口号(范围:1-255);访问HID设备时,此处传入0
返回值: >=0 成功 <0 失败
2.设备控制类
点名获取设备信息 ws_callDevice
int ws_callDevice (int Port)
参 数: Port [in] 串口号
返回值: >=0 成功 <0 失败
ws_callDevice1(ws_callDevice)
int ws_callDevice1 (int Port,char* Model,int* CPUType,double* Version)
参 数: Port [in] 串口号
Model [out]设备型号
CPUType [out]CPU类型
Version [out]设备版本
返回值: >=0 成功 <0 失败
蜂鸣 ws_beep
int ws_beep (int Port)
参 数: Port [in] 串口号
返回值: >=0 成功 <0 失败
3.卡操作类
卡号操作
卡号即M1卡本身的序列号,这是卡本身固化的信息。
卡号的获取无需进行密码装载和验证即可获得。
读取卡号 ws_getCardNo_DWORD
int ws_getCardNo_DWORD (int Port,DWORD* CardNo)
参 数: Port [in] 串口号
CardNo [out] 以无符号整型数传出卡号
返回值: >=0 成功 <0 失败
ws_getCardNo_Double
int ws_getCardNo_Double (int Port,double* CardNo)
参 数: Port [in] 串口号
CardNo [out] 以双精度浮点数传出卡号
返回值: >=0 成功 <0 失败
ws_getCardNo_String
int ws_getCardNo_String (int Port,char* CardNo)
参 数: Port [in] 串口号
CardNo [out] 以字符串传出卡号,注意卡号最大长度为10
返回值: >=0 成功 <0 失败
设置卡序列号的顺序 ws_set_cardno_seq
Void ws_set_cardno_seq (int Port,int seq)
参 数: Port [in] 串口号
seq [in] 顺序标志:0-默认顺序 1-按字节反转卡号
返回值: >=0 成功 <0 失败
以char 字符组方式操作
装载密码 ws_loadKey
int ws_loadKey (int Port,char* Key,int KeyType)
参 数: Port [in] 串口号
Key [in] 传入密码,长度6字节
KeyType [in] 密码类型 0表示A 密码(默认) 1表示B 密码
返回值: >=0 成功 <0 失败
修改密码 ws_changeKey
int ws_changeKeyA (int Port,int Sector,
char* NewKeyA,char* NewAC,char* NewKeyB)
参 数: Port [in] 串口号
Sector [in] 扇区号,范围0-15 NewKeyA [in] 新密码A,长度6字节
NewKeyAC [in] 新存取控制字,长度4字节 NewKeyB [in] 新密码B,长度6字节
返回值: >=0 成功 <0 失败
以hex 字符串方式操作 装载密码 ws_loadKey_Hex
int ws_loadKey_Hex (int Port,char* Key,int KeyType)
参 数: Port [in] 串口号
Key [in] 传入密码,长度12个字符
KeyType [in] 密码类型 0表示A 密码(默认) 1表示B 密码
返回值: >=0 成功 <0 失败
修改密码 ws_changeKey_Hex
int ws_changeKeyA_Hex (int Port,int Sector, char* NewKeyA,char* NewAC,char* NewKeyB)
参 数: Port [in] 串口号
Sector [in] 扇区号,S50卡范围0-15,S70卡范围0-39 NewKeyA [in] 新密码A,长度12个字符 NewKeyAC [in] 新存取控制字,长度8个字符 NewKeyB [in] 新密码B,长度12个字符
返回值: >=0 成功 <0 失败
M1卡可以自身指令对指定块进行值操作,无需了解具体细节,简化开发的复杂性。
第一次对卡进行值操作时,首先要初始化初值 (ws_initValue ),然后才能进行读值(ws_readValue )、增值(ws_incValue )、减值(ws_decValue )的操作。
初始化值 ws_initValue
Void ws_initValue (int Port,int Block,unsigned long Value)
参 数: Port [in] 串口号
Block [in] 物理块号 Value [in] 初值
返回值: >=0 成功 <0 失败
读值 ws_readValue
Void ws_readValue (int Port,int Block,unsigned long* Value)
参 数: Port [in] 串口号
Block [in] 物理块号 Value [out] 读出的值
返回值: >=0 成功 <0 失败
增值 ws_incValue
Void ws_incValue (int Port,int Block,unsigned long Value)
参 数: Port [in] 串口号
Block [in] 物理块号 Value [in] 增加的值
返回值: >=0 成功 <0 失败
减值 ws_decValue
Void ws_decValue (int Port,int Block,unsigned long Value)
参 数: Port [in] 串口号
Block [in] 物理块号 Value [in] 减去的值
返回值: >=0 成功 <0 失败
读写卡操作
以char 字符组方式操作
读块数据 ws_readBlock
int ws_readBlock (int Port,int Block,char* Data)
参 数: Port [in] 串口号
Block [in] 要读取的块号,S50卡范围0-63,S70卡范围0-255 Data [out] 读出的数据,长度16字节
返回值: >=0 成功 <0 失败
连续读数据 ws_readData
int ws_readData (int Port,int Block,char* Data,int Len)
参 数: Port [in] 串口号
Block [in] 要读取的块号,S50卡范围0-63,S70卡范围0-255 Data [out] 读出的数据,长度由Len 决定 Len [in] 读取字节数
返回值: >=0 成功 <0 失败
写块数据 ws_writeBlock
int ws_writeBlock (int Port,int Block,char* Data)
参 数: Port [in] 串口号
Block [in] 要写入的块号,S50卡范围0-63,S70卡范围0-255 Data [in] 要写入的数据,长度16字节
返回值: >=0 成功 <0 失败
连续写数据 ws_writeData
int ws_writeData (int Port,int Block,char* Data,int Len)
参 数: Port [in] 串口号
Block [in] 要写入的块号,S50卡范围0-63,S70卡范围0-255 Data [in] 要写入的数据,长度由Len 决定 Len [in] 写入字节数
返回值: >=0 成功 <0 失败
显示屏操作
显示文本 ws_displayText
Void ws_initValue (int Port,int LineNo,int Length,char* Text)
参 数: Port [in] 串口号
LineNo [in] 行号,行号为1、2,共2行 Length [in] 文本长度,最长为15个字符 Text [in] 文本
返回值: >=0 成功 <0 失败
清空显示 ws_clearText
Void ws_initValue (int Port,int LineNo)
参 数: Port [in] 串口号
LineNo [in] 行号,行号为1、2,共2行
返回值: >=0 成功 <0 失败
以Hex字符串方式操作
读块数据 ws_readBlock_Hex
int ws_readBlock_Hex (int Port,int Block,char* Data)
参 数: Port [in] 串口号
Block [in] 要读取的块号,S50卡范围0-63,S70卡范围0-255
Data [out] 读出的数据,长度32字节
返回值: >=0 成功 <0 失败
连续读数据 ws_readData_Hex
int ws_readData_Hex (int Port,int Block,char* Data,int Len)
参 数: Port [in] 串口号
Block [in] 要读取的块号,S50卡范围0-63,S70卡范围0-255
Data [out] 读出的数据,长度由Len决定
Len [in] 读取字节数
返回值: >=0 成功 <0 失败
写块数据 ws_writeBlock_Hex
int ws_writeBlock_Hex (int Port,int Block,char* Data)
参 数: Port [in] 串口号
Block [in] 要写入的块号,S50卡范围0-63,S70卡范围0-255
Data [in] 要写入的数据,长度32字节
返回值: >=0 成功 <0 失败
连续写数据 ws_writeData_Hex
int ws_writeData_Hex (int Port,int Block,char* Data,int Len)
参 数: Port [in] 串口号
Block [in] 要写入的块号,S50卡范围0-63,S70卡范围0-255
Data [in] 要写入的数据,长度由Len决定
Len [in] 写入字节数
返回值: >=0 成功 <0 失败
4.辅助函数类
Hex字符串转换为Char字符串 ws_strHexToChar
int ws_strHexToChar (char StrHexValue,int Len,char* CharValue)
参 数: StrHexValue [in] Hex字符串
Len [in] StrHexValue长度
CharHex [out] Char字符串,长度为StrHexValue的一半
返回值: >=0 成功 <0 失败
Char字符串转换为Hex字符串 ws_charToStrHex
int ws_charToStrHex (char CharValue,int Len,char* StrHexValue)
参 数: CharHex [in] Char字符串
Len [in] CharHex长度
StrHexValue [out] Hex字符串,长度为CharHex一倍
返回值: >=0 成功 <0 失败
计算扇区密码区对应的物理块号 ws_getKeyBlock
int ws_getKeyBlock (int Sector)
参 数: Sector [in] 扇区号,S50卡范围0-15,S70卡范围0-39
返回值: >=0 成功,返回值为物理块号 <0 失败
计算扇区块号对应的物理块号 ws_getBlock
int ws_getBlock (int Sector,int SectorBlock)
参 数: Sector [in] 扇区号,S50卡范围0-15,S70卡范围0-39 SectorBlock [in] 扇区块号, S50卡范围0-3,S70卡范围0-15
返回值: >=0 成功,返回值为物理块号 <0 失败
动态库版本信息 ws_getDLLInfo
int ws_getDLLInfo (double* Version,double* BuildDate)
参 数: Version [out]动态库版本号
BuildDate [out]动态库最后生成日期
返回值: >=0 成功 <0 失败
三、函数返回码说明
返回码
说明 十进制(十六进制)
>=0 操作成功
-1 参数值不正确
-10 (0x0A)(仅修改密码)装载密码失败
-11 (0x0B)(仅修改密码)读数据失败
-12 (0x0C) (仅修改密码)写数据失败
-100(0x64) 写串口失败
-101(0x65) 读串口失败
-102(0x66) 接收的数据无效
-226(0xE2) 卡不存在/卡坏
-227(0xE3) 防冲撞错误
-228(0xE4) 锁定卡出错
-229(0xE5) 传密钥出错
-230(0xE6) 密码验证出错
-231(0xE7) 读块数据出错
-232(0xE8) 写块数据出错
-233(0xEA) 复位RC500失败
-234(0xEB) 钱包值调入缓冲区出错
-235(0xEC) 保存缓冲区值中的钱包值出错
-236(0xED) 增值出错
-238(0xEF) 减值出错
-240(0xF0) 块值格式不对
-241(0xF1) 块值不够减
-242(0xF2) 值溢出
WinCE平台开发篇
一、版本介绍
V3.1版开发光盘目录
WS-R-C系列读写器二次开发说明.doc 说明文档,必看
测试工具\*.* 标准函数测试工具
动态库\*.*读写器访问动态库文件
演示源码\VS2005.C#\*.* C# (Visual 2005)演示源码,接口文件为WSR.cs
演示源码\VS2005.VB\*.* (Visual 2005)演示源码,接口文件为WSR.vb
演示源码\VS2005.VC\*.* VC (Visual 2008)演示源码,接口文件为WSRCE.h
V3.5版开发光盘目录(分ARM和x86 两个版本)
说明文档,必看
USB驱动\HID驱动HID接口读写设备驱动
USB驱动\USB转串口驱动FTDI 使用FTDI 芯片USB转串口读写设备驱动
测试工具\*.* 标准函数测试工具
动态库\*.*读写器访问动态库文件
演示源码\VS2005.C#\*.* C# (Visual 2005)演示源码,接口文件为WSR.cs
演示源码\VS2005.VB\*.* (Visual 2005)演示源码,接口文件为WSR.vb
演示源码\VS2005.VC\*.* VC (Visual 2008)演示源码,接口文件为WSRCE.h
动态库文件包含:
WSRCE.dll
WSRCE.lib (库文件, VS2005 VC需要)
WSRCE.h (API函数头文件,VS2005 VC需要)
版本对比
比较内容/开发包版本号V3.1 V3.5
不同处
操作系统平台
WINCE 5.0 支持不支持
WINCE 6.0 支持支持
CPU架构
ARM 支持支持
X86 不支持支持
USB驱动
USB转串口驱动(FTDI) 支持支持
USB转HID驱动不支持支持
相同处
动态库文件名 WSRCE.dll
WSRCE.lib (库文件, VS2005 VC需要)
WSRCE.h (API函数头文件,VS2005 VC需要)
函数接口两者一致,接口声明和定义没有改变
WinCE平台下的使用Visual Studio 和Visual Studio C#开发的软件需要在WinCE平台上安装.Net Compact Framework 2.0及SP1版本以上公共语言运行库及类库。
版本说明
V3.5版本开发包提供ARM和x86两个CPU架构的开发包版本,开发人员请注意与你的开发环境对应,使用正确版本的接口文件和驱动。
如需其他CPU架构的版本,请联系我们索取有关资料。
V3.5版本开发包还提供了WINCE平台下HID接口及USB转串口驱动,HID设备在WindowsXP以上版本平台下是即插即用设备,无需安装驱动。
在WinCE平台下则没有提供对HID设备的支持,仍旧需要安装驱动,该驱动是我公司自主研发,提供安装程序,也可以由开发商自己集成到WINCE BSP包中,在系统启动时自动加载驱动。
二、函数原型说明
除了动态库文件名称不同外,二次开发函数接口定义及调用方式与Windows平台上开发完全一样。
请参阅【Windows平台开发篇】。
三、如何安装WINCE平台下的USB相关驱动(V3.5)
安装HID驱动
HID驱动自V3.5版本下开始提供,主要是用于链接USB-HID接口的设备, 驱动有两个版本ARM版本和x86版本,对应WINCE6.0 相应架构平台。
请根据实际系统环境架构平台,安装对应的驱动版本。
手动安装步骤如下:
1.拷贝【USB驱动\HID驱动】目录下WSRHID.dll 、WSRDrvInstall.exe 两个文件至WINCE系统Windows目录下;
2.运行WSRDrvInstall.exe 文件;
3.点击【注册USB-HID驱动】;
4.驱动安装完毕。
手动安装的驱动,在WINCE系统重新启动后,将会消失,必须重复以上手动安装步骤安装驱动。
如果想一劳永逸的让驱动在WINCE系统启动后,自动安装好,就需要定制WINCE系统,将驱动固化在WINCE中,这需要相应的工具和知识才能完成,此处不做介绍。
在WINCE驱动定制中,驱动文件WSRHID.dll需放在Windows目录下,在注册表中注册以下信息: [HKEY_LOCAL_MACHINE\Drivers\USB\ClientDrivers\WitMark]
"Prefix"="WSR"
"Dll"="WSRHID.dll"
"Order"=dword:00000001
"Index"=dword:00000001
[HKEY_LOCAL_MACHINE\Drivers\USB\LoadClients\20785_8199\Default\Default\WitMark]
"DLL"="WSRHID.dll"
实现以上设置,即完成驱动的安装。
附录
一、Mifare l S50卡特性简介
M1 S50卡为8K位的非接触式IC卡。
电气特性
●容量为8K位EEPrOM
●分为16个扇区,每个扇区为4块,每块16个字节,以块为存取单位
●每个扇区有独立的一组密码及访问控制
●每张卡有唯一序列号,为32位
●具有防冲突机制,支持多卡操作
●无电源,自带天线,内含加密控制逻辑和通讯逻辑电路
●工作温度:-20℃~50℃
●工作频率:13.56MHZ
●通信速率:106KBPS
●读写距离:10mm以内(与读写器有关)
●数据保存期为10年,可改写10万次,读不限次
存储结构
M1 S50卡分为16个扇区,每个扇区4块(块0~3),共64块,按块号编址为0~63。
第0扇区的块0(即绝对地址0块)用于存放厂商代码,已经固化,不可更改。
其他各扇区的块0、块1、块2为数据块,用于存贮数据;块3为密码块,存放密码A、存取控制、密码B,其结构如下:
A0A1A2A3A4A5 FF 07 80 69 B0B1B2B3B4B5
密码A(6字节) 存取控制(4字节) 密码B(6字节)
控制属性
每个扇区的密码和存取控制都是独立的,可以根据实际需要设定各自的密码及存取控制。
在存取控制中每个块都有相应的三个控制位,定义如下:
块0: C10 C20 C30
块1: C11 C21 C31
块2: C12 C22 C32
块3: C13 C23 C33
三个控制位以正和反两种形式存在于存取控制字节中,决定了该块的访问权限(如进行减值操作必须验证KEY A,进行加值操作必须验证KEY B,等等)。
三个控制位在存取控制字节中的位置如下(字节9为备用字节,默认值为0x69):
bit 7 6 5 4 3 2 1 0
字节6C23_b C22_b C21_b C20_b C13_b C12_b C11_b C10_b
字节7C13 C12 C11 C10 C33_b C32_b C31_b C30_b
字节8C33 C32 C31 C30 C23 C22 C21 C20
(注: _b表示取反)
其中,黑色区控制块3,蓝色区控制块2,绿色区控制块1,红色区控制块0。
数据块(块0、块1、块2)的存取控制如下:
控制位(X=0..2) 访 问 条 件 (对块0、1、2)
C1X C2X C3X Read Write Increment Decrement
transfer
restore
0 0 0 KeyA|B KeyA|B KeyA|B KeyA|B
0 1 0 KeyA|B Never Never Never
1 0 0 KeyA|B KeyB Never Never
1 1 0 KeyA|B KeyB KeyB KeyA|B
0 0 1 KeyA|B Never Never KeyA|B
0 1 1 KeyB KeyB Never Never
1 0 1 KeyB Never Never Never
1 1 1 Never Never Never Never
(KeyA|B 表示密码A或密码B,Never表示任何条件下不能实现)
例如:当块0的存取控制位C10 C20 C30=100时,验证密码A或密码B正确后可读;验证密码B正确后可写;不能进行加值、减值操作。
密码块(块3)的存取控制与数据块(块0、1、2)不同,它的存取控制如下:
控制位 密码A 存取控制 密码B
C13 C23 C33 Read Write Read Write Read Write
0 0 0 Never KeyA|B KeyA|B Never KeyA|B KeyA|B
0 1 0 Never Never KeyA|B Never KeyA|B Never
1 0 0 Never KeyB KeyA|B Never Never KeyB
1 1 0 Never Never KeyA|B Never Never Never
0 0 1 Never KeyA|B KeyA|B KeyA|B KeyA|B KeyA|B
0 1 1 Never KeyB KeyA|B KeyB Never KeyB
1 0 1 Never Never KeyA|B KeyB Never Never
1 1 1 Never Never KeyA|B Never Never Never
例如:当块3的存取控制位C13 C23 C33=100时,表示:
密码A: 不可读,验证KEYB正确后,可写(更改)。
存取控制:验证KEYA或KEYB正确后,可读不可写。
密码B: 不可读,验证KEYB正确后,可写。
工作原理
卡片的电气部分只由一个天线和 ASIC 组成。
天线:卡片的天线是只有几组绕线的线圈,很适于封装到 IS0 卡片中。
ASIC:卡片的 ASIC 由一个高速(106KB波特率)的 RF 接口,一个控制单元和一个EEPROM组成。
读写器向 M1 卡发一组固定频率的电磁波,卡片内有一个 LC 串联谐振电路,其频率与讯写器发射的频率相同,在电磁波的激励下,LC 谐振电路产生共振,从而使电容内有了电荷,在这个电容的另一端,接有一个单向导通的电子泵,将电容内的电荷送到另一个电容内储存,当所积累的电荷达到 2V 时,此电容可做为电源为其它电路提供工作电压,将卡内数据发射出去或接取读写器的数据。
二、Mifare l S70卡特性简介
M1 S70卡为32K位的非接触式IC卡。
电气特性
●容量为32K位EEPrOM
●分为40个扇区,前32个扇区,每个扇区为4块;后8个扇区,每个扇区16块;每块16个字节,
以块为存取单位;每个扇区最后一个块为密码块,其它为数据块
●每个扇区有独立的一组密码及访问控制
●每张卡有唯一序列号,为32位
●具有防冲突机制,支持多卡操作
●无电源,自带天线,内含加密控制逻辑和通讯逻辑电路
●工作温度:-20℃~50℃
●工作频率:13.56MHZ
●通信速率:106KBPS
●读写距离:10mm以内(与读写器有关)
●数据保存期为10年,可改写10万次,读不限次
存储结构
M1 S70卡分为40个扇区,前32个扇区,每个扇区4块(块0~3);后8个扇区,每个扇区16个块(扇区块0~15),共256块,按物理块编址为0~255。
第0扇区的块0(即物理块0)用于存放厂商代码,已经固化,不可更改。
前32个扇区的块0、块1、块2为数据块,用于存贮数据,块3为密码块;后8个扇区的块0~14为数据块,用于存贮数据,块15为密码块;密码块存放密码A、存取控制、密码B,其结构如下:
A0A1A2A3A4A5 FF 07 80 69 B0B1B2B3B4B5
密码A(6字节) 存取控制(4字节) 密码B(6字节)
控制属性
每个扇区的密码和存取控制都是独立的,可以根据实际需要设定各自的密码及存取控制。
在存取控制中每个块都有相应的三个控制位,定义如下:
前32个扇区 后8个扇区
块0:C10 C20 C30块0-块4:C10 C20 C30
块1: C11 C21 C31 块5-块9:C11 C21 C31
块2: C12 C22 C32 块10-块14:C12 C22 C32
块3: C13 C23 C33 块15:C13 C23 C33 存取控制的其他定义,完全与M1 S50卡一致,请参照。
工作原理
与M1 S50卡一致,请参照。
三、关于USB驱动安装出现无法安装的解决办法 出现的问题:
运行setup.exe出现提示:
通过Windows安装硬件向导,提示:
解决办法:
桌面-》我的电脑-》属性-》硬件-》驱动程序签名
选择【忽略】,并且将【将这个操作作为系统默认值应用】打勾,点击【确定】保存即可。
四、M1读写器测试工具操作说明
设备连接
读写器测试工具在光盘中文件夹【WSR读写器测试工具】下,文件名为MifareTest_WitMark.exe。
运行该文件,即可看到以下主界面:
首先在【0.通讯/设置】区域内选择正确的串口,点击按键【刷新】可以重新获取串口列表,选择串口后,点击按钮【打开设备】。
如果打开设备失败,请检查读写器是否与电脑连接好,读写器电源灯是否亮着,再检查选择的串口是否正确,如果不确定可以选择其他串口,看看能否打开。
打开串口后,原先界面上其他无法操作的按钮功能现在都可以使用了,界面状态如下:
点击下方【蜂鸣】【设备版本】,如果能听到蜂鸣声,看到设备版本号出现,则表示读写器连接成功。
如下图示:
将M卡放置在读写器上,点击【读卡号】按钮可以获取该卡卡号,通过选择【卡号顺序】,可以改变获得的卡号顺序。
如下图示:
读写卡操作
接下来开始对卡进行读写操作,先在【2.块选择】中选择要读写的扇区号,如下图示:
然后在右侧【4.密码操作】去里装载密码,如要要使用A密码进行读写卡操作,就点击【装载A】;反之,选择【装载B】。
如下图示:
在【5.读写卡】区域中,点击【读数据】,如果之前装载的密码正确,并且有权限访问选定的扇区内的数据,则此时会显示出扇区块0到块3的所有数据,注意此处显示的数据都是以16进制字符串方式显示出来的。
如下图示:
在【5.读写卡】区域下方写数据编辑框中输入数据,然后点击【写数据】按钮,注意此处输入的数据应以16进制字符串。
如下图示:
电子钱包
M1卡本身带有电子钱包功能,在【6.增减值】操作中,有四个按钮【初值】【读值】【增值】【减值】,这是电子钱包的4个基本功能。
电子钱包是针对某个扇区某个数据块进行操作的,它使用到了完整的块,一旦该块被作为电子钱包块,则该块不能再写其他数据,否则将破坏这个电子钱包数据。
初次使用电子钱包需要对指定块进行初始化值操作,之后才能进行【读值】【增值】【减值】操作。
如下图示:
修改密码
在【2.块选择】中选择要修改密码的扇区号,然后在右侧【4.密码操作】去里装载可以读写密码块的正确密码,然后点击【修改密码】按钮,接着会显示修改密码对话框,如下图示:
输入要修改的密码A、存取控制字、密码B,注意此处输入的都是16进制表示的字符串,然后点击【修改密码】按钮,如果装载的密码正确,并且有修改密码的权限,则此扇区的密码即被修改。
请务必牢记修改的密码内容,忘记密码,会造成整个扇区无法访问,相当于该扇区报废,无法使用。
液晶显示
液晶显示是在特别型号有液晶屏的读写器上才有的功能,现有液晶显示可以显示2行文字,每行文字最多15个字符,如下图示:
密码存取控制
通过AB密码和存取控制,开发人员可以掌握对卡的存取和控制方式,具体的设置方式可以参见附录中存取控制说明。
虽然对初次接触M1卡开发的人来说,设置有些复杂,但是此项知识对整个开发的系统安全性来说是重要的一环,意义重大。
从这个意义上来说,开发人员对这项知识的掌握是必要也是必须的。
在本测试工具中,提炼了存取控制的各种存取方式,以可视化方式展现了存取控制基本设置规则,参照本功能和附录中存取控制的相关知识,可以加速开发人员对存取控制的理解和掌握。
通过存取控制,可以对卡的控制精准到块,存取控制还可以对块的操作产生影响。
根据卡的块定义不同,存取控制方式分:数据块存取控制和密码块存取控制。
在【5.读写卡】区域中,每个块行后半部分有存取控制定义,点击最后绿色勾选图标,可以重新定义该块的存取控制方式,如下图示:
设置完成后,点击按钮【生成控制字】,在红色【控制字节】下方的编辑框中可以显示对应的存取控制字,此项功能相当于存取控制计算器,利用此功能,可以大大简化自己运算的复杂性,有效避免计算容易出错的弊端。
数据块存取控制,可以对指定数据块的读、写、增值、减值4个功能进行控制,控制方式有8种不同的组合。
以下是数据块存取控制界面:
此处就第3种组合做详细说明:
对应读操作是A|B,此处含义是可以通过A或者B密码对该块进行读操作;
对应写操作是B,此处含义是仅可以通过B密码对该块进行写操作,如果是A密码,则写操作将失败;
对应增值减值操作都是禁止,此处含义是无论A或者B密码都无法对该块进行增值减值操作。
密码块存取控制是针对每个扇区密码块进行控制的,密码块本身分为三个部分:密码A、存取控制、密码B,针对这三个部分,密码块存取控制可以分别进行读写控制。
以下是密码块存取控制界面:
此处就第6种组合做详细说明:
对应密码A读操作是禁止,表示无论A或B密码都无法对密码A进行读操作;
对应密码A写操作是B,表示可以通过B密码对密码A进行改写操作,A密码禁止对密码A进行改写;
对应存取控制读操作是A|B,表示A或B密码可以对存取控制进行读操作;
对应存取控制读操作是B,表示B密码可以对存取控制进行写操作,A密码禁止对存取控制进行改写;
对应密码B读操作是禁止,表示无论A或B密码都无法对密码B进行读操作;
对应密码B写操作是B,表示可以通过B密码对密码B进行改写操作,A密码禁止对密码B进行改写;。