python基於PCSC協議實現讀卡器和卡片通訊

2021-09-02 14:00:04 字數 3580 閱讀 3683

pcsc協議是windows平台下的一套通用api, 所 有 函 數 的 原 型 都 winscard.h中宣告,應用程式需要包含winscard.lib,所有函式的正常返回值都 scard_s_success。它為讀卡器/卡片和電腦提供了乙個標準介面,實現不同生產商的卡片和讀卡器之間的互操作性。之前工作中使用的時候是在vc++環境下之間呼叫的winscard提供的api,學了python之後試著用python來實現。     python由好個模組封裝了pcsc的介面,比如:pysmartcard/pyscard,我是試用了pysmartcard,後面的**也是基於pysmartcard模組編寫的。

需要先pip安裝這個模組,命令如下:

pip install pysmartcard

pysmartcard模組是pcsc/d8/d6/t6都支援的,我只用了pcsc。

執行**前需要連線上讀卡器,win10下讀卡器驅動貌似是預設安裝的。

#encoding=utf-8

#匯入pcscreader類

from pysmartcard.cpucard import pcscreader

#匯入time模組

import time

def showlog(data, issend):

'''列印日誌函式'''

current = time.strftime('%y_%m_%d %h:%m:%s', time.localtime())

if issend:#傳送到卡片的資料

send = '-->'

else:#卡片返回的資料

send = '

print("{} {} {}".format(current, send, data))

def sendapdu(reader, apdu, recv_list, readertype=none):

'''給卡片傳送指令的函式'''

#清空recv_list[:] =

#去掉多餘的空格

apdu = apdu.replace(' ','')

showlog(apdu, true)

respone = reader.send_apdu(apdu,readertype)

showlog(respone, false)

#recv_list第1個元素是返回資料

#recv_list第2個元素是sw

def sendapducommand(reader, apdu, recv_list, readertype=none):

'''完整的傳送指令函式'''

sendapdu(reader, apdu, recv_list, readertype)

#如果是返回的sw是6cxx或者61xx,重新發指令

apdu = apdu.replace(' ','')

if recv_list[-1][:2] == '61':

apdu = '00c00000' + recv_list[-1][2:4]

sendapdu(reader, apdu, recv_list, readertype)

elif recv_list[-1][:2].upper() == '6c':

apdu = apdu[:8] + recv_list[-1][2:4]

sendapdu(reader, apdu, recv_list, readertype)

'''例項化pcsc讀卡器'''

pcsc = pcscreader()

'''獲取所有的讀卡器列表'''

readername = pcsc.get_pcsc_readerlist()

##print(readername)#字串型別的讀卡器名稱,按;隔開

#按;切割字串,得到所有的讀卡器名稱

print('當前連線的讀卡器有:')

readernamelist = readername.split(';')

for i in range(len(readernamelist)-1):

print("{} {} :{}".format('reader',i,readernamelist[i]))

'''連線指定的讀卡器'''

print('*'*40)

#要連線的讀卡器

usereadername = "scm microsystems inc. sdi010 contactless reader 0"

usereadername = "scm microsystems inc. sdi010 smart card reader 0"

#得到的是字串型別的復位資訊

atr = pcsc.connect_device(usereadername)

if atr:

print("connectdevice success...")

print("atr: ", atr)

else:

print("connectdevice failed!")

'''上電'''

print('*'*40)

#通訊介面型別: 1-contact reader 2-contactless reader

readertype = 1

if 'contactless'.lower() in usereadername.lower():

readertype = 2

if 0== pcsc.power_on(readertype):

print("device poweron success...")

else:

print("device poweron failed!")

'''傳送apdu'''

print('*'*40)

apdu = '00a4 0400 00'

recv_list =

sendapducommand(pcsc,apdu, recv_list, readertype)

if recv_list[1] !="9000":

print("send apdu failed!")

apdu = '0084 0000 08'

recv_list =

sendapducommand(pcsc,apdu, recv_list, readertype)

if recv_list[1] !="9000":

print("send apdu failed!")

'''斷開讀卡器連線'''

pcsc.disconnect_device()

'''sm4_ecb加密計算'''

print('*'*40)

encrypt = pcsc.sm4_ecb('0123456789abcdeffedcba9876543210',\

'0123456789abcdeffedcba9876543210',1)

print(encrypt)

執行結果:

udp協議 基於socketserver實現併發

一 udp協議沒有粘包問題 1,udp協議是資料報協議 客戶端 import socket client socket.socket socket.af inet,socket.sock dgram 資料報協議 udp client.sendto hello encode utf 8 127.0.0...

python基於pickle模組序列化例項(七)

usr bin env python3 coding utf 8 序列化 把變數從記憶體中變成可儲存或傳輸的過程,在python中,序列化叫pickling,在其他語言中也被稱之為serialization,marshalling,flattening等等,都是乙個意思。importpickle d...

基於MQTT的訊息發布訂閱python實現

mqtt 全稱為 message queuing telemetry transport 訊息佇列遙測傳輸 是一種基於發布 訂閱正規化的 輕量級 訊息協議。該協議構建於tcp ip協議上。mqtt協議是輕量 簡單 開放和易於實現的,這些特點使它適用範圍非常廣泛。在很多情況下,包括受限的環境中,如 機...