VFP读写MifareOne IC卡 M1卡

        M1卡无疑是目前市场上使用范围最广、发卡量最多的射频感应卡,使用NXP S50芯片的进口卡、使用复旦微 F08芯片的国产卡是其中2种最具代表性的M1卡。M1卡有以下特性:

1、分为16个扇区,每个扇区为4块,每块16个字节,以块为存取单位;
2、每个扇区有独立的一组密码及访问控制;
3、每张卡有唯一序列号,为32位;
4、具有防冲突机制,支持多卡操作;
5、无电源,自带天线,内含加密控制逻辑和通讯逻辑电路;
6、数据保存期为10年,可改写10万次,读无限次;
7、工作温度:-20℃~50℃(湿度为90%);
8、工作频率:13.56MHZ;
9、通信速率:106 KBPS;
10、读写距离:10 cm以内(与读写器有关)

本示例使用读写器介绍:Android Linux RFID读写器NFC发卡器WEB可编程NDEF文本/智能海报/-淘宝网 (taobao.com)

 声明函数:


declare integer pcdbeep in OUR_MIFARE.dll integer xms
declare integer pcdgetdevicenumber in OUR_MIFARE.dll string @pdevicenumber
declare integer piccreadex in OUR_MIFARE.dll integer ctrlword,string @mypiccserial,integer myareano,integer authmode,string @mypicckey,string @mypiccdata
declare integer piccwriteex in OUR_MIFARE.dll integer ctrlword,string @mypiccserial,integer myareano,integer authmode,string @mypicckey,string @mypiccdata
declare integer piccchangesinglekey in OUR_MIFARE.dll integer ctrlword,string @mypiccserial,integer myareano,integer authmode,string @mypiccoldkey,string @mypiccnewkey

 轻松读卡:

BLOCK0_EN = 1    &&读块0
BLOCK1_EN = 2    &&读块1
BLOCK2_EN = 4    &&读块2
NEEDSERIAL = 8   &&是否需要只对指定系列号的卡操作
EXTERNKEY =16    &&是否使用外部密码
NEEDHALT = 32    &&是否休眠本卡
    
myctrlword=BLOCK0_EN + BLOCK1_EN + BLOCK2_EN + EXTERNKEY     &&23
mypiccserial=space(4)  && 声明4个字节存放卡号
myareano=8             && 读卡的扇区号
authmode=1             && 1表示认证A密码 0表示认证B密码
mypicckey=chr(255)+chr(255)+chr(255)+chr(255)+chr(255)+chr(255)  &&卡片认证密码
mypiccdata=space(48)   && 声明48个字节存放读卡数据
ans= piccreadex(myctrlword,@mypiccserial,myareano,authmode,@mypicckey,@mypiccdata)
if ans=0 
  aa=ASC(SUBSTR(mypiccserial,1,1))*256*256*256+ASC(SUBSTR(mypiccserial,2,1))*256*256+ASC(SUBSTR(mypiccserial,3,1))*256+ASC(SUBSTR(mypiccserial,4,1))
  = MESSAGEBOX('   操作成功!     '+STR(aa),48,'提示:')
else
   if ans=8 
      = MESSAGEBOX('   请将卡放在感应区!   ',48,'提示:')
   ENDIF
   if ans=12
       aa=ASC(SUBSTR(mypiccserial,1,1))*256*256*256+ASC(SUBSTR(mypiccserial,2,1))*256*256+ASC(SUBSTR(mypiccserial,3,1))*256+ASC(SUBSTR(mypiccserial,4,1))
       = MESSAGEBOX('   密码认证失败!     '+STR(aa),48,'提示:')
   endif
endif      

 轻松写卡:

BLOCK0_EN = 1    &&读块0
BLOCK1_EN = 2    &&读块1
BLOCK2_EN = 4    &&读块2
NEEDSERIAL = 8   &&是否需要只对指定系列号的卡操作
EXTERNKEY =16    &&是否使用外部密码
NEEDHALT = 32    &&是否休眠本卡

myctrlword=BLOCK0_EN + BLOCK1_EN + BLOCK2_EN + EXTERNKEY   &&23
mypiccserial=space(4)  && 声明4个字节存放卡号
myareano=8             && 写卡的扇区号
authmode=1             && 1表示认证A密码 0表示认证B密码
mypicckey=chr(255)+chr(255)+chr(255)+chr(255)+chr(255)+chr(255)  &&卡片认证密码
mypiccdata=''
for i=1 to 48          &&写卡信息,每次写一个扇区共计48个字节
    mypiccdata=mypiccdata+chr(255)
next i    
ans= piccwriteex(myctrlword,@mypiccserial,myareano,authmode,@mypicckey,@mypiccdata)
if ans=0 
  = MESSAGEBOX('   操作成功!     ',48,'提示:')
else
   if ans=8 
      = MESSAGEBOX('   请将卡放在感应区!   ',48,'提示:')
   endif
endif      

修改卡片密码:

myctrlword=0
mypiccserial=space(4)
myareano=8
authmode=1
mypiccoldkey=''

for i=1 to 6
    mypiccoldkey=mypiccoldkey+chr(255)
next i

mypiccnewkey=''
for i=1 to 6
    mypiccnewkey=mypiccnewkey+chr(255)
next i        

ans=piccchangesinglekey(myctrlword,@mypiccserial,myareano,authmode,@mypiccoldkey,@mypiccnewkey)

if ans=0 
    = MESSAGEBOX('   操作成功!     ',48,'提示:')
else
   if ans=8 
      = MESSAGEBOX('   请将卡放在感应区!   ',48,'提示:')
   endif
endif  

本示例下载地址:USB-IC读写器VFP示例源码.rar-其它文档类资源-CSDN文库

猜你喜欢

转载自blog.csdn.net/zhangjin7422/article/details/128573317