利用Python对非接触式IC卡的读写操作

     这两年Python这门开发语言火遍了大江南北,处处可以看到关于学习Python的广告。在平时了解客户需求的过程中也接触到了很多开发者正在准备使用Python来开发智能卡读写的相关功能,这里我们就不去追究为何有如此多的用户利用Python这门开发语言来实现智能卡读写操作的原因了。总之,有客户需求我们就应该积极响应。

    关于Python集成开发环境这些过程我们就不一一赘述了,我相信各位使用Python的开发者对这些基础操作都比较熟悉。我们主要是介绍一下在LotusCardDriver.dll 这个动态链接库里面已经是支持了非接触式IC卡,CPU卡、社保卡,居民健康卡,二代证等多种功能,如何利用Python这个开发语言来实现这些功能?平时接触到的用户大多数是使用C#、java这类开发语言实现对非接触式IC卡,CPU卡、社保卡的阅读,用Python的近两年来开始多起来了。

 首先,说明一下LotusCardDriver.dll 这个动态链接库有32位和64位版本,这里介绍64位版本的开发过程。首先,我们定义一个结构体,我喜欢这么称呼他,你们也可以用其他称呼。

import os
class LotusCardParamStruct(Structure): 
    _fields_ = [ ("nCardType", c_int), 
              ("arrCardNo", c_ubyte * 8),
              ("nCardSize",c_int) ,
              ("arrBuffer", c_ubyte * 64),
              ("nBufferSize", c_int),
              ("arrKeys", c_ubyte * 64),
              ("nKeysSize", c_int),
              ("arrCosResultBuffer", c_ubyte * 256),
              ("unCosReultBufferLength", c_int),
              ("arrCosSendBuffer", c_ubyte * 256),
              ("unCosSendBufferLength", c_int)] 
print(os.getcwd()+"\LotusCardDriver.dll")

导入LotusCardDriver.dll 动态链接库,注意,要导入64位的动态链接库。

#Objdll = windll.LoadLibrary("LotusCardDriver.dll")
Objdll = windll.LoadLibrary(os.getcwd()+"\LotusCardDriver.dll")
sttLotusCardParam = LotusCardParamStruct()
#int _stdcall LotusCardOpenDevice(char * pszDeviceName, int nVID, int nPID, LotusCardExtendReadWriteCallBack  pLotusCardExtendReadWriteCallBack);
#LotusHandle WINAPI LotusCardOpenDevice(char * pszDeviceName, int nVID, int nPID, int nUsbDeviceIndex, unsigned int unRecvTimeOut, LotusCardExtendReadWriteCallBack  pLotusCardExtendReadWriteCallBack);

如果采用的是支持网络TCP/IP通信的智能卡读写器,还需要输入读卡器IP地址,这个地址可以通过工具进行自定义配置。

#strServerIp = '192.168.1.252'
strServerIp = ''

 如果采用的USB免驱或者RS232通信接口的智能卡读写器,这一步骤可以省略。

接下来是对非接触式IC卡和二代证阅读的范例了

Objdll.LotusCardOpenDevice.restype = c_longlong
Objdll.LotusCardGetCardNo.argtypes = [c_longlong, c_int,c_void_p]
Objdll.LotusCardLoadKey.argtypes = [c_longlong, c_int,c_int, c_void_p]
Objdll.LotusCardAuthentication.argtypes = [c_longlong, c_int,c_int, c_void_p]
Objdll.LotusCardRead.argtypes = [c_longlong, c_int, c_void_p]
Objdll.LotusCardWrite.argtypes = [c_longlong, c_int, c_void_p]
Objdll.LotusCardCloseDevice.argtypes = [c_longlong]
Objdll.LotusCardSetCardType.argtypes = [c_longlong,c_byte]
Objdll.LotusCardGetTwoGenerationIDCardNo.argtypes = [c_longlong,c_char_p,c_int]
hLotusCard = Objdll.LotusCardOpenDevice(strServerIp.encode('gb2312'),0,0,0,2000,0)
print(hLotusCard)
RT_ALL = 0x52
RT_NOT_HALT = 0x26
AM_A = 0x60
AM_B = 0x61
szTwoGenerationID =  bytes(64) 
nRequestType = RT_NOT_HALT
bResult = 0
#input("wait input")
if -1 != hLotusCard:
    '''
    bResult = Objdll.LotusCardSetCardType(hLotusCard,0x42)
    if 1==bResult:
        print("LotusCardSetCardType OK")
    else:
        print("LotusCardSetCardType Error")
        sys.exit()
    bResult = Objdll.LotusCardGetTwoGenerationIDCardNo(hLotusCard,szTwoGenerationID, 64)
    if 1==bResult:
        print("LotusCardGetTwoGenerationIDCardNo OK %s" %(szTwoGenerationID))
        print(str(szTwoGenerationID, encoding="utf-8"))
    else:
        print("LotusCardGetTwoGenerationIDCardNo Error")
        exit()
    exit()
    '''
    bResult = Objdll.LotusCardGetCardNo(hLotusCard,nRequestType, byref(sttLotusCardParam))
    if 1==bResult:
        #print(sttLotusCardParam.arrCardNo)
        print("%d" %(len(sttLotusCardParam.arrCardNo)))
        #print("CardNo(HEX) %.2x%.2x%.2x%.2x" %(sttLotusCardParam.arrCardNo[0],sttLotusCardParam.arrCardNo[1],sttLotusCardParam.arrCardNo[2],sttLotusCardParam.arrCardNo[3]))
        print("CardNo(HEX) %.2X%.2X%.2X%.2X" %(sttLotusCardParam.arrCardNo[0],sttLotusCardParam.arrCardNo[1],sttLotusCardParam.arrCardNo[2],sttLotusCardParam.arrCardNo[3]))
        print("CardNo(HEX) %.2X%.2X%.2X%.2X" %(sttLotusCardParam.arrCardNo[3],sttLotusCardParam.arrCardNo[2],sttLotusCardParam.arrCardNo[1],sttLotusCardParam.arrCardNo[0]))
    else:
        print("LotusCardGetCardNo Error")
    if 1==bResult:
        #sttLotusCardParam.arrKeys = "\xff\xff\xff\xff\xff\xff"
        sttLotusCardParam.arrKeys[0] = 0xff
        sttLotusCardParam.arrKeys[1] = 0xff
        sttLotusCardParam.arrKeys[2] = 0xff
        sttLotusCardParam.arrKeys[3] = 0xff
        sttLotusCardParam.arrKeys[4] = 0xff
        sttLotusCardParam.arrKeys[5] = 0xff
        bResult =Objdll.LotusCardLoadKey(hLotusCard, AM_A, 0, byref(sttLotusCardParam))
    if 1==bResult:
        print("LotusCardLoadKey OK")
    else:
        print("LotusCardLoadKey Error")
    if 1==bResult:
        bResult =Objdll.LotusCardAuthentication(hLotusCard, AM_A, 0, byref(sttLotusCardParam))
    if 1==bResult:
        print("LotusCardAuthentication OK")
    else:
        print("LotusCardAuthentication Error")
    '''                
    if 1==bResult:
        bResult =Objdll.LotusCardRead(hLotusCard, 2, byref(sttLotusCardParam))
    if 1==bResult:
        print("LotusCardRead OK")
        #print(sttLotusCardParam.arrBuffer)
        print("ReadData(HEX):%.2x%.2x%.2x%.2x%.2x%.2x%.2x%.2x%.2x%.2x%.2x%.2x%.2x%.2x%.2x%.2x" %(sttLotusCardParam.arrBuffer[0],sttLotusCardParam.arrBuffer[1],sttLotusCardParam.arrBuffer[2],sttLotusCardParam.arrBuffer[3],
            sttLotusCardParam.arrBuffer[4],sttLotusCardParam.arrBuffer[5],sttLotusCardParam.arrBuffer[6],sttLotusCardParam.arrBuffer[7],
            sttLotusCardParam.arrBuffer[8],sttLotusCardParam.arrBuffer[9],sttLotusCardParam.arrBuffer[10],sttLotusCardParam.arrBuffer[11],
            sttLotusCardParam.arrBuffer[12],sttLotusCardParam.arrBuffer[13],sttLotusCardParam.arrBuffer[14],sttLotusCardParam.arrBuffer[15]))
    else:
        print("LotusCardRead Error")
    '''
    if 1==bResult:
        sttLotusCardParam.arrBuffer[0] = 0x00
        sttLotusCardParam.arrBuffer[1] = 0x01
        sttLotusCardParam.arrBuffer[2] = 0x02
        sttLotusCardParam.arrBuffer[3] = 0x03
        sttLotusCardParam.arrBuffer[4] = 0x04
        sttLotusCardParam.arrBuffer[5] = 0x05
        sttLotusCardParam.arrBuffer[6] = 0x06
        sttLotusCardParam.arrBuffer[7] = 0x07
        sttLotusCardParam.arrBuffer[8] = 0x08
        sttLotusCardParam.arrBuffer[9] = 0x09
        sttLotusCardParam.arrBuffer[10] = 0x0A
        sttLotusCardParam.arrBuffer[11] = 0x0B
        sttLotusCardParam.arrBuffer[12] = 0x0C
        sttLotusCardParam.arrBuffer[13] = 0x0D
        sttLotusCardParam.arrBuffer[14] = 0x0E
        sttLotusCardParam.arrBuffer[15] = 0x0F
        
        sttLotusCardParam.nBufferSize = 16
        bResult =Objdll.LotusCardWrite(hLotusCard, 2, byref(sttLotusCardParam))
    if 1==bResult:
        print("LotusCardWrite OK")
    else:
        print("LotusCardWrite Error")
    Objdll.LotusCardCloseDevice(hLotusCard)
    
else:
	print("LotusCardOpenDevice ERROR")
print(bResult)

 下载链接中有详细代码,可以供参考和学习。由于时间匆忙,有遗漏和不足之处还请谅解。

 

  • 0
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

诺塔斯智能

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值