pcsc協議是windows平台下的一套通用api, 所 有 函 數 的 原 型 都 winscard.h中宣告,應用程式需要包含winscard.lib,所有函式的正常返回值都 scard_s_success。它為讀卡器/卡片和電腦提供了乙個標準介面,實現不同生產商的卡片和讀卡器之間的互操作性。之前工作中使用的時候是在vc++環境下之間呼叫的winscard提供的api,學了python之後試著用python來實現。 python由好個模組封裝了pcsc的介面,比如:pysmartcard/pyscard,我是試用了pysmartcard,後面的**也是基於pysmartcard模組編寫的。
需要先pip安裝這個模組,命令如下:
pip install pysmartcardpysmartcard模組是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協議是輕量 簡單 開放和易於實現的,這些特點使它適用範圍非常廣泛。在很多情況下,包括受限的環境中,如 機...