You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

154 lines
6.2 KiB

  1. # encoding:utf-8
  2. from http.server import HTTPServer,SimpleHTTPRequestHandler
  3. from PySmartCard.CpuCard import PcscReader
  4. import time
  5. def getbits(intger):
  6. tmp = intger
  7. b = 0
  8. while(tmp):
  9. tmp >>= 1
  10. b += 1
  11. return b - 1
  12. class cardReaderHelper:
  13. cardReader = None
  14. cardReaderName = ""
  15. def __init__(self):
  16. self.cardReader = PcscReader()
  17. def open(self):
  18. names = self.cardReader.get_pcsc_readerlist()
  19. if len(names) > 0:
  20. self.cardReaderName = names.split(";")[0]
  21. if len(self.cardReaderName) > 0:
  22. print("Found Card Reader:", self.cardReaderName)
  23. return True
  24. else:
  25. print("Can't Found Any Card Reader")
  26. return False
  27. def connect(self):
  28. return self.cardReader.connect_device(self.cardReaderName)
  29. def disconnect(self):
  30. self.cardReader.disconnect_device()
  31. def search(self, timeout):
  32. i = timeout
  33. ATR = ""
  34. while(i > 0):
  35. i -= 1
  36. ATR = self.connect()
  37. if len(ATR) > 0:
  38. break
  39. else:
  40. self.disconnect()
  41. time.sleep(1)
  42. return ATR
  43. def poweron(self):
  44. if self.cardReader.power_on(1) == 0:
  45. return True
  46. else:
  47. self.disconnect()
  48. return False
  49. def __sendAPDU(self, send, readertype=None):
  50. recv = {"data":"","sw":"","sw1":"","sw2":"","empty":True}
  51. print("Send",send)
  52. result = self.cardReader.send_apdu(send, readertype)
  53. if len(result) > 0:
  54. recv["empty"] = False
  55. recv["data"] = result[:-4]
  56. recv["sw"] = result[-4:]
  57. recv["sw1"] = result[-4:-2]
  58. recv["sw2"] = result[-2:]
  59. print("Recv",recv["data"], recv["sw1"], recv["sw2"], recv["sw"], recv["empty"])
  60. return recv
  61. def transfer(self, send, readertype=None):
  62. recv = self.__sendAPDU(send, readertype)
  63. if not recv["empty"]:
  64. if recv["sw1"] == "61":
  65. apdu = "00C00000" + recv["sw2"]
  66. recv = self.__sendAPDU(apdu, readertype)
  67. elif recv["sw1"] == "6C":
  68. apdu = send[0:8] + recv["sw2"]
  69. recv = self.__sendAPDU(apdu, readertype)
  70. return recv
  71. def prase(self, recv):
  72. cardCode=""
  73. if not recv["empty"]:
  74. if "9000" == recv["sw"]:
  75. raw = recv["data"]
  76. cur = 0
  77. while(cur >= 0):
  78. old_cur = cur
  79. cur = raw.find("80", old_cur)
  80. if cur >= 0:
  81. if "03838D" == raw[cur+4:cur+10] or "0301DD" == raw[cur+4:cur+10]:
  82. r_len = int(raw[cur+2:cur+4], 16)
  83. code = int(raw[cur+10:cur+r_len*2+4], 16)
  84. code &= ~(1<<getbits(code))
  85. code >>= 4
  86. cardCode = str(code)
  87. print("Prase Card Code ", cardCode)
  88. break
  89. else:
  90. print("Prase Card Code Failed")
  91. if cur == old_cur:
  92. cur += 1
  93. else:
  94. print("Receive Error "+ recv["sw"])
  95. return cardCode
  96. class My_RequestHandler(SimpleHTTPRequestHandler):
  97. def do_GET(self):
  98. readResult = {"message":"读卡失败,请再次尝试", "result":""}
  99. reader = cardReaderHelper()
  100. if reader.open():
  101. if len(reader.search(10)) > 0:
  102. if reader.poweron():
  103. recv = reader.transfer("FF70076B07A005BE0380010400", 1)
  104. reader.disconnect()
  105. if not recv["empty"]:
  106. code = reader.prase(recv)
  107. if(len(code) > 0):
  108. readResult["message"] = "读卡成功"
  109. readResult["result"] = code
  110. else:
  111. readResult["message"]="读卡失败: " + recv["sw"]
  112. else:
  113. readResult["message"]="读卡失败"
  114. else:
  115. readResult["message"]="卡上电失败"
  116. else:
  117. readResult["message"]="没有搜索到卡片"
  118. result = "{\"code\":\"200\",\"message\":\"" + readResult["message"] + "\",\"result\":\""+ readResult["result"] +"\"}"
  119. print(result)
  120. self.send_response(200)
  121. self.send_header('Content-type','text/plain; charset=utf-8')
  122. self.send_header('Access-Control-Allow-Origin', self.headers['Origin'])
  123. self.send_header('Access-Control-Allow-Credentials', 'true')
  124. self.send_header("Access-Control-Allow-Headers", "authorization")
  125. self.end_headers()
  126. self.wfile.write(bytes(result, "utf8"))
  127. def do_OPTIONS(self):
  128. self.send_response(200, "ok")
  129. self.send_header('Access-Control-Allow-Origin', self.headers['Origin'])
  130. self.send_header('Access-Control-Allow-Credentials', 'true')
  131. self.send_header("Access-Control-Allow-Headers", "authorization")
  132. self.end_headers()
  133. def run(server_class=HTTPServer, handler_class=My_RequestHandler):
  134. server_address = ('', 8000)
  135. httpd = server_class(server_address, handler_class)
  136. print("Start Service!")
  137. httpd.serve_forever()
  138. if __name__ == "__main__":
  139. run()