# encoding:utf-8 from http.server import HTTPServer,SimpleHTTPRequestHandler from PySmartCard.CpuCard import PcscReader import time def getbits(intger): tmp = intger b = 0 while(tmp): tmp >>= 1 b += 1 return b - 1 class cardReaderHelper: cardReader = None cardReaderName = "" def __init__(self): self.cardReader = PcscReader() def open(self): names = self.cardReader.get_pcsc_readerlist() if len(names) > 0: self.cardReaderName = names.split(";")[0] if len(self.cardReaderName) > 0: print("Found Card Reader:", self.cardReaderName) return True else: print("Can't Found Any Card Reader") return False def connect(self): return self.cardReader.connect_device(self.cardReaderName) def disconnect(self): self.cardReader.disconnect_device() def search(self, timeout): i = timeout ATR = "" while(i > 0): i -= 1 ATR = self.connect() if len(ATR) > 0: break else: self.disconnect() time.sleep(1) return ATR def poweron(self): if self.cardReader.power_on(1) == 0: return True else: self.disconnect() return False def __sendAPDU(self, send, readertype=None): recv = {"data":"","sw":"","sw1":"","sw2":"","empty":True} print("Send",send) result = self.cardReader.send_apdu(send, readertype) if len(result) > 0: recv["empty"] = False recv["data"] = result[:-4] recv["sw"] = result[-4:] recv["sw1"] = result[-4:-2] recv["sw2"] = result[-2:] print("Recv",recv["data"], recv["sw1"], recv["sw2"], recv["sw"], recv["empty"]) return recv def transfer(self, send, readertype=None): recv = self.__sendAPDU(send, readertype) if not recv["empty"]: if recv["sw1"] == "61": apdu = "00C00000" + recv["sw2"] recv = self.__sendAPDU(apdu, readertype) elif recv["sw1"] == "6C": apdu = send[0:8] + recv["sw2"] recv = self.__sendAPDU(apdu, readertype) return recv def prase(self, recv): cardCode="" if not recv["empty"]: if "9000" == recv["sw"]: raw = recv["data"] cur = 0 while(cur >= 0): old_cur = cur cur = raw.find("80", old_cur) if cur >= 0: if "03838D" == raw[cur+4:cur+10] or "0301DD" == raw[cur+4:cur+10]: r_len = int(raw[cur+2:cur+4], 16) code = int(raw[cur+10:cur+r_len*2+4], 16) code &= ~(1<>= 4 cardCode = str(code) print("Prase Card Code ", cardCode) break else: print("Prase Card Code Failed") if cur == old_cur: cur += 1 else: print("Receive Error "+ recv["sw"]) return cardCode class My_RequestHandler(SimpleHTTPRequestHandler): def do_GET(self): readResult = {"message":"读卡失败,请再次尝试", "result":""} reader = cardReaderHelper() if reader.open(): if len(reader.search(10)) > 0: if reader.poweron(): recv = reader.transfer("FF70076B07A005BE0380010400", 1) reader.disconnect() if not recv["empty"]: code = reader.prase(recv) if(len(code) > 0): readResult["message"] = "读卡成功" readResult["result"] = code else: readResult["message"]="读卡失败: " + recv["sw"] else: readResult["message"]="读卡失败" else: readResult["message"]="卡上电失败" else: readResult["message"]="没有搜索到卡片" result = "{\"code\":\"200\",\"message\":\"" + readResult["message"] + "\",\"result\":\""+ readResult["result"] +"\"}" print(result) self.send_response(200) self.send_header('Content-type','text/plain; charset=utf-8') self.send_header('Access-Control-Allow-Origin', self.headers['Origin']) self.send_header('Access-Control-Allow-Credentials', 'true') self.send_header("Access-Control-Allow-Headers", "authorization") self.end_headers() self.wfile.write(bytes(result, "utf8")) def do_OPTIONS(self): self.send_response(200, "ok") self.send_header('Access-Control-Allow-Origin', self.headers['Origin']) self.send_header('Access-Control-Allow-Credentials', 'true') self.send_header("Access-Control-Allow-Headers", "authorization") self.end_headers() def run(server_class=HTTPServer, handler_class=My_RequestHandler): server_address = ('', 8000) httpd = server_class(server_address, handler_class) print("Start Service!") httpd.serve_forever() if __name__ == "__main__": run()