PN532data.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. import serial
  2. import binascii
  3. import re
  4. from decodeChipData import decodeData
  5. import serial.tools.list_ports
  6. def openSer():
  7. port_list = list(serial.tools.list_ports.comports())
  8. if len(port_list) == 0:
  9. print('无可用串口')
  10. raise RuntimeError('无可用串口')
  11. else:
  12. for i in range(0, len(port_list)):
  13. print(port_list[i])
  14. for port in port_list:
  15. print(port[0])
  16. name = port[0]
  17. ser = serial.Serial(name, 115200, timeout=0.5)
  18. # 字节大小
  19. ser.bytesize = 8
  20. # 无校验
  21. ser.parity = serial.PARITY_NONE
  22. # 停止位
  23. ser.stopbits = 1
  24. print("已连接端口:" + str(ser.name) + "\n")
  25. return ser
  26. def huan(ser):
  27. da1 = bytes.fromhex("55 55 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ff 03 fd d4 14 01 17 00")
  28. ser.write(da1)
  29. ss = str(binascii.b2a_hex(ser.read(25)))[2:-1]
  30. return ser
  31. # 获取卡号
  32. def getid(ser):
  33. data = bytes.fromhex("00 00 FF 04 FC D4 4A 02 00 E0 00")
  34. ser.write(data)
  35. redata_yid = str(binascii.b2a_hex(ser.read(25)))[2:-1]
  36. if len(redata_yid) == 50:
  37. id = redata_yid[-12:-4]
  38. print("卡号:" + id)
  39. return id, ser
  40. else:
  41. print("数据返回出错:" + redata_yid)
  42. return "0", "0"
  43. # 验证扇区密码
  44. def yanz(ser, id, k, list):
  45. password = "FF FF FF FF FF FF"
  46. password = password.replace(" ", "")
  47. yss = "00 00 FF 0F F1 D4 40 01 61" + k + password + id;
  48. yss = yss.replace(" ", "")
  49. dcs = "00 00 FF 0F F1 D4 40 01 61" + k + ' ' + password + ' ' + id + ' ' + sst(yss[10:]) + " 00"
  50. print('验证秘钥: ' + dcs)
  51. dcs = dcs.replace(" ", "")
  52. yanze = bytes.fromhex(dcs)
  53. ser.write(yanze)
  54. erok = str(binascii.b2a_hex(ser.read(32)))[2:-1]
  55. ma = erok[-8:-4]
  56. # ma = '4100'
  57. if ma == "4100":
  58. print("密码正确")
  59. readdata(ser, k, list)
  60. return ser
  61. else:
  62. print("密码错误\n")
  63. print(dcs)
  64. # 计算16进制字符串和的后两位补码
  65. def sst(data):
  66. sumHex = hex(sum([int(i, 16) for i in re.findall(r'.{2}', data) if i != '']))
  67. sumHexStr = (sumHex + "").replace("0x", "")[1:]
  68. if (sumHexStr == '00'):
  69. return '00'
  70. sumBin = bin(int(sumHexStr, 16))[2:]
  71. temp = ''
  72. for index in range(8 - len(sumBin)):
  73. temp = temp + '0'
  74. sumBin = temp + sumBin + ''
  75. temp = ''
  76. for index in range(len(sumBin)):
  77. if (sumBin[index] == '0'):
  78. temp = temp + '1'
  79. else:
  80. temp = temp + '0'
  81. dcs = hex(int(temp, 2) + 1)[2:]
  82. if (len(dcs) == 1):
  83. dcs = '0' + dcs
  84. return dcs
  85. # 读出块数据
  86. def readdata(ser, k, list):
  87. reco = "00 00 ff 05 fb D4 40 01 30 " + k
  88. reco = reco.replace(" ", "")
  89. command = "00 00 ff 05 fb D4 40 01 30 " + k + ' ' + sst(reco[10:]) + " 00"
  90. print("读取指令:" + command)
  91. recode = bytes.fromhex(command)
  92. ser.write(recode)
  93. ss = str(binascii.b2a_hex(ser.read(64)))[2:-1]
  94. if ss[-9:-4] != "54113":
  95. block_d = ss[-36:-4]
  96. list.append(block_d)
  97. print("读出数据:" + block_d + "\n")
  98. else:
  99. print("读取失败\n")
  100. input("回车继续")
  101. def reader():
  102. ser = openSer()
  103. huan(ser)
  104. id = getid(ser)[0]
  105. list = []
  106. if (id != '0'):
  107. num = 0;
  108. for index in range(4, 256):
  109. num += 1
  110. if (num % 4 == 0):
  111. continue
  112. print('开始第' + str(index) + '个数据块')
  113. k = str(hex(index))
  114. k = k[2:]
  115. if (len(k) < 2):
  116. k = '0' + k
  117. yanz(ser, id, k, list)
  118. else:
  119. print('未获取到芯片卡号')
  120. raise RuntimeError('设备未连接或标签损坏')
  121. print(list)
  122. if (len(list) > 0):
  123. return list
  124. else:
  125. return '0'
  126. list2 = ['03ff0cfcc10100000cf55402656e7218', 'ee5b49cbcd0e2a707a20c0756263c38f', '99b4df9af78e61cea1a2a3a4a5a6a7a8',
  127. '3caf84f96583155b846233f6175bf5b1', '410000093a000000ffffffffffffffff', '13016bc0832ba0141da4619da418cc1e',
  128. '3f70a4949c1f14eafee5f60f62e0fc76', '2f9ecd68477811fa6e25e339b068a9b0', '30c1b7260c227c80473a0af9a5e0e83d',
  129. 'c07e2e1ec9283c49a903304f9edf91dd', '3c656cdee55cf643326933cc21651d6e', '649109fb80c497d0fa88cc143bd98fb8',
  130. '7958184a17413111041178a3cd4d6d8c', '6ef25867355f5533be758a4dc4b380bb', 'df4ed477e4dcfd356abf00cf6cbba0c3',
  131. 'fa6202383c039df9e0afb9e75e244c40', '56d321f7393a97fa6a760f2905e1884f', '6e78cdd146918450bbe3f5f8a9387ed3',
  132. '1b3a79bb4643b07e2f7358c6e48eee2c', 'd75486fa19b02a1af6c98dff274b543d', 'cd53242f44d617abd2399b546069f4c5',
  133. '9c8262a7333cda68ee9d5706f0bd6a23', '21d411e55b2eb5e669b2bf9f3cc3a99a', 'e9b04b0f51442f346202197be956272b',
  134. '3b81e26bca0351ced79bd5aedefd8908', 'e9c8b51598d48742d1126c1d2eaa117d', '548a56a032edc4854988e7be74d8626f',
  135. '520bd9ea95225c58f4cc8bbe2fa74938', '5a1f47085c70577e80dac608adb54000', '80ae246682ae4cc0dd27e7b7a1caee35',
  136. '04e365cbd9cb3b1060dc6ca6585d5460', 'fcb98844aeda307a0a598b6f7d612dcc', '888968ed073aa8b1830cd88ff3a3c67b',
  137. '18f0022fc0e82d9da3f45c8625dbf6de', '961ca6720be2b6b2acd076d4c7fddcd4', '75fb065ddbb0188a567dcc44c85222e7',
  138. '4dff6b70d9921d7a5dc4eaca42b9a368', 'f390a7652148383329337156c0b89d74', 'f2ce67947a89502af5fe09c70f622190',
  139. '90c563ace10ceaafd0c79acf56e5ff77', 'f51e8fd596428db67e6dbdb416031d83', '16ec2d867692f1857771a6c75bd6a182',
  140. 'f977d4ccf3cb02a4ac066e75f284911c', '1c46b925e5679093959e505d64e97e57', 'bdb469bc10b6942f6d67664352ae0cdb',
  141. 'e80103e103e103e103e103e103e103e1', '03e103e103e103e103e103e103e103e1', '03e103e103e103e103e103e103e103e1',
  142. 'a269ecab63fb0ddec0653db2c656e145', 'c30e6274f23f22c5a93ff0a2c78303ea', 'cb610f1ba125dda0f9072b02ae15fb2b',
  143. '722fb62a7a50c8a607dd3447a84ea15d', 'a1b9503a46ae7584541a499ecf413918', 'b8dbc9383e653ffd15e2c2f4587b41d1',
  144. '86ea796794041aa93855f00346fb84e2', 'bd80d36cd2616e6b736cb1e58a13fc70', 'c120cf34c3b2e298041474aff966e64d',
  145. '1443f901e816f7c991f8f0057a1daeaf', '052e60f6ec19a7ca81d4b3bfc9703349', '5d47d338eb3fc65bcf76f9c8c0142b0d',
  146. 'a3ff4fd472a23fa60082f53f23ef5d29', '1f4e22b4bdaaef9e3dec64c8c1ca5606', 'dea0928586e4f655a3c0916881871e9f',
  147. '97eaf18216d5b7be28e72bd61adc73ee', '094a4678e4f94e7d6433418089a2fa02', 'e5f939b5eba90a026a8a0b10538185c2',
  148. 'c520b315225c50a5d0e55a4fccf8140a', 'b336b17ac5a7ceb78f378d84adaaf4d6', 'ada7b701a0fb2df50adf3b24fbc6bc79',
  149. '6eb462abf613fe719354f1e8f3a5dc53', '3609cada3a1dc379ff9e9fd36829b22c', '5440d5c7bf3cca28123a6afa435a8fcd',
  150. 'b0d3f1fc46f185f1aee1f7b732067ef4', 'd49c1706733c5a070a969047293f996b', '489a4cfd749e07a4784523677c72b026',
  151. 'f3011c8cf6dc3bd5fbe242bbfe44a035', '446ce83a84e2f77c2140e0ff74adf690', '90f9d916e34b9526f1a5ba40a008b793',
  152. 'eb3979d996143a2f2b3e8f5f8b3974fd', '6f434424a53b52b298fdb633e0449d4f', '00a8a6f2beea3599069c08e1002af843',
  153. 'e4ceaf9606c97753f59d4946f50f3dec', 'e2b89bcfbd24042ddea95c6ecaf3dbeb', '47388c8431b9fc15e7d30d0841973b0c',
  154. 'da492546c8a05a6607e0441f64c7bd14', 'f8cdf747e678f2992cd59f13f6f8f517', '9814f2180d0339d107bf95ac6eeaa9d5',
  155. 'd97617093b76ce0d8def080bed1b5c50', 'ce264e85cede39ba880ccfb2431144fb', '2c1570c64fe8faf96325da723018b1d6',
  156. 'fc9d40fbd9b605cbbdec5a3e6cb5e6a4', 'd93040615f2accf6620c1444d9be7617', 'd8c379dfcaa931b95a11be0a0d2617f5',
  157. 'b4f13e8b336d30633c24accb47d6037c', '7e6a7414dbda22466de1e41c07ab20ab', 'd7af5ea3e3e2ec50cc7b79cf0a0363bd',
  158. 'c2d0ae9f8631b01e287beade54c32331', '71fd599304b2f5a8e0651c0daeaeeddb', 'dd6d481c783cab43969eabfc232f691d',
  159. '6fec28722f5fa3b78056c8feb93e6050', '7d1cd557f4bade23d42787a5870ea314', 'ff7b7534e538927e4473be70fa6f19bc',
  160. 'b5506bc66ac0081a0cd438e602ff59f1', '95dd9676049f8c75700eba423ff33754', '9237a4e0ed63554b959a7cb108b1e9d4',
  161. 'd3e42cf4cb7b50985cc5bcea5d107292', '9283a2cdce2ed69bd71b1b5ef8b63e39', '4bbf7fcb0514578186bf9ab1b7efb07d',
  162. 'ff53a9a12a0b5bff869a960d02bef6a3', '3f62ab66451bea4f57642d073d0bc6a9', '1c592272902ba73a67ee48b489e2ffc4',
  163. 'fa8df9c9710e05c069c61e154c2c955f', '29384294c55700a6da2d808dc1e921bd', '95e4fca9e5516c557f5ccd5ae403cc50',
  164. 'e7a1428cea5a787c25f1cb4e2de44526', '453aab8b4e7295de7270934b648d1a65', '34ca921dca35deb1a634e22e54c20638',
  165. 'bc7015e533848cfc90a7726e7acdcaf0', 'bcb7c5ff531e31757c5496f6f31f16e6', 'a09447021ed053192b8010eb6f81683a',
  166. 'fad00046813586988cab9004cffc6f19', '477a45207118b14e5f674a797b89cb5c', '2ab1f2b1c91915ecf01607f90a279560',
  167. '49f302af4d21a4d3bc08f7fe30b257da', 'fecc88f8d956cd3f91b3354b13c0842c', '4ebec942a6eeedd140c189a14b95eaa0',
  168. '38490a8da6d790eb2bae13e55a1e8b71', '2bcd23bc76b2222a31f19a69ae1ec297', '07f28a122b17e4276281db4d02633079',
  169. 'a2bb0b89da6a637ec9f280b599004b48', '783a656341a60bfa5cbd1916569ec717', 'fed298915b06f08cbed44e97e328e7bc',
  170. '0148255f13959aa989dcd64521b92b6f', '88638aa1a5e13ad5bc2ca17a4f0e8bcb', 'f9d87fbb46f584c46b01060189f47b45',
  171. 'd52f5cac52cb4a45b4e270d969d3b5c8', '231c0b760a93de341af2d7501a08e9f8', '2ad6d6982e8b0aaa6c5f01ff3e4bad06',
  172. '3329003589c5c8a48b1ca488361743ad', '80df97340671206464c8335f3a07f573', 'bcf32ba460bcee64209aa19eb951e652',
  173. 'd90238da63f30de96442de9993afadab', '5be948b143f98e5cabb330a587100232', 'd6c8f7e4a491e452d8ef9415e7ca8d5e',
  174. '21e2df587430bbc8a97be8917364220a', '2f851c453738894f190e4d0eded0965a', 'eb80864bb4a7b005cfbf557a15271445',
  175. 'c54195a008639f79ea6e826611122884', '15f36645ee70e8961765d5fc2cead310', 'b59ea9973b9ee1c9a8cfda110ec51487',
  176. 'a9b3d1b047e2fd2d98b871e970aff563', 'ed86c24c756628147544ba382a32a401', '82fa2de96e800e52dccf68f6d80bd867',
  177. '3c2338b9201934d1761c6deb2005257c', 'a105d6add8d3b166c61015f43afa6047', '6814fad0facc0b35eb773aa794b17075',
  178. 'de57c68607f885af82af51f3687fc109', '9cedc9641bb18c515d8d8a4ce521b195', 'c8589d5a16e0fb13503fbf4d9f7d763b',
  179. 'd2dd70e00318896b81ca7db8de200073', '1b0ff783e01cf19fba4316b61cae52a8', '3ecf7245a7e75007bb202d28ffd8c5e3',
  180. '442ac7989338b28106253cae64868409', 'a0b367bf15521ca96f5ed3f356234c5a', 'd37624de127f2d747b01662809b23c9e',
  181. '3bfcbd277c8b518bb2307b68eb5734e5', 'bcb1e75374abe55fefeee091fc9bee6c', 'a7c9379192ddb97c9a33c3e6860db9a9',
  182. '0eba5916f6080a22b9ac3619337ac91e', '70c355b44baf0a7e2a5b3fb9199fdbc9', '9610d2d9d1931c1ed124968489e0873f',
  183. '758cf337fe1f140cca3e0a010b1747b9', '44a7f668a16059fa3d7f4d37d4bcee82', 'c6c7767bdba52ef88f78f3bb9ae55e41',
  184. '7b67dd458fb9f5c83a6c0ea362b35d73', 'b474d82f7e7fd20dfd849e5ed9fb0154', '6bb52ca81bb0017f94a8e96c04c0e0c6',
  185. '0163a76f34204b054883556b3528b075', '8ca31cc4c0cdc050716e16931e16cd71', 'c66cb94e4abd39288fe422729abbc221',
  186. 'a07fbad8be92c6bffa73b66d495e6653', 'e11946865620514c1a38bbcd59800d74', 'c73d52ceb72161a3a7788d4445f8a091',
  187. '81d23d7feb882080df20fea6e618e1f5', '471f095f026abf64908fce1ca7655480', '1da75c3c3979361206a853c7fabb8db2',
  188. '3cec4f76af7f9eda6fbc1e3e9d8d13f3']
  189. def readChip():
  190. list = reader()
  191. list = list2
  192. if (list != '0'):
  193. chipData = ''.join(list)
  194. chipData = chipData[22:]
  195. chipNumber = chipData[6:100]
  196. data = re.findall(r'.{2}', chipData)
  197. jdata = ' 0x'.join(data)
  198. jdata = '0x' + jdata + ' \\n'
  199. print(jdata)
  200. return decodeData(jdata), chipNumber, chipData