securityReader.py 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554
  1. #! /usr/bin/env python
  2. """
  3. Smart Card Reader / Writer
  4. """
  5. from smartcard.CardType import AnyCardType
  6. from smartcard.CardRequest import CardRequest
  7. from smartcard.util import toHexString
  8. from smartcard.ATR import ATR
  9. from Crypto.Cipher import DES3 as des3
  10. import random as rnd
  11. import time as tm
  12. import matplotlib.pyplot as plt
  13. import math
  14. import logging
  15. # 通过下面的方式进行简单配置输出方式与日志级别
  16. logging.basicConfig(filename='logger.log', level=logging.INFO)
  17. # 初始化读卡器
  18. def init():
  19. print('初始化读卡器')
  20. card_type = AnyCardType()
  21. card_request = CardRequest(timeout=1, cardType=card_type)
  22. card_service = card_request.waitforcard()
  23. card_service.connection.connect()
  24. # atr = ATR(card_service.connection.getATR())
  25. return card_service
  26. def result_print(result_out_str):
  27. print(result_out_str)
  28. logging.info(result_out_str)
  29. def trace_command(apdu):
  30. print('sending ', toHexString(apdu))
  31. logging.info('sending: '+ toHexString(apdu))
  32. def trace_response(response, sw1, sw2):
  33. if response is None:
  34. response = []
  35. print(
  36. 'serial no.: ',
  37. toHexString(response),
  38. ' status words: ',
  39. "%x %x" % (sw1, sw2)
  40. )
  41. logging.info( 'serial no.: '+
  42. toHexString(response)+
  43. ' status words: '+
  44. "%x %x" % (sw1, sw2))
  45. def bytes2int(data_bytes):
  46. data_number = len(data_bytes)
  47. data_int = 0
  48. for i in range(0, data_number):
  49. data_int = data_int + data_bytes[data_number-i-1]*math.pow(2, i*8)
  50. return int(data_int)
  51. def int2bytes(data_int):
  52. return bytes([data_int])
  53. def bytes2int_list(data_bytes):
  54. data_number = len(data_bytes)
  55. data_int_list = list(range(data_number))
  56. for i in range(0, data_number):
  57. data_int_list[i] = int(str(data_bytes[i]))
  58. return data_int_list
  59. def hexstr2bytes(hex_str):
  60. hex_int_list = hexstr2int_list(hex_str)
  61. hex_bytes = int_list2bytes(hex_int_list)
  62. return hex_bytes
  63. def bytes2hexstr(data_bytes):
  64. data_number = len(data_bytes)
  65. data_hex_str = ''
  66. for i in range(0, data_number):
  67. data_int = int(str(data_bytes[i]))
  68. data_hex_str += "{:02X} ".format(data_int)
  69. return data_hex_str
  70. def hexstr2int_list(data_str):
  71. data_str = data_str.replace('0x', '')
  72. data_str = data_str.replace(' ', '')
  73. data_str = data_str.replace('\r', '')
  74. data_str = data_str.replace('\n', '')
  75. data_str = data_str.replace(',', '')
  76. data_number_int = int(len(data_str)/2)
  77. data_bytes_list = list(range(data_number_int))
  78. data_int_list = list(range(data_number_int))
  79. for i in range(0, data_number_int):
  80. data_bytes_list[i] = bytes.fromhex(data_str[i*2:i*2+2])
  81. data_int_list[i] = int.from_bytes(data_bytes_list[i], 'big')
  82. return data_int_list
  83. def int_list2bytes(data_int_list):
  84. data_bytes = b''.join(map(lambda d:int.to_bytes(d, 1, 'little'), data_int_list))
  85. return data_bytes
  86. #发送指令
  87. def sendCommand(card_service,command):
  88. trace_command(command)
  89. res, s1, s2 = card_service.connection.transmit(command)
  90. trace_response(res, s1, s2)
  91. return res,s1,s2
  92. # 权限验证
  93. def COS_Access(card_service,KEYA_str, KEYB_str):
  94. print('开始ACCESS验证')
  95. rf_command_bytes = [ 0xA2, 0xA4, 0x00, 0x0C, 0x02, 0xAC, 0x01]
  96. data_byres,s1,s2 = sendCommand(card_service,rf_command_bytes)
  97. if s1==99 and s2 == 192:
  98. print('解锁标签')
  99. tm.sleep(15)
  100. rf_command_bytes = [ 0xA2, 0xA4, 0x00, 0x0C, 0x02, 0xAC, 0x01]
  101. data_byres,s1,s2 = sendCommand(card_service,rf_command_bytes)
  102. return
  103. rf_command_bytes = [0xA2, 0xB0, 0x00, 0x10, 0x10]
  104. data_bytes,s1,s2 = sendCommand(card_service,rf_command_bytes)
  105. trnd_bytes = data_bytes[0:8]
  106. mid_bytes = data_bytes[8:17]
  107. # 计算KEYA* KEYB*
  108. random_int_list = bytes2int_list(trnd_bytes)
  109. mid_int_list = bytes2int_list(mid_bytes)
  110. keya_int_list = hexstr2int_list(KEYA_str)
  111. keyb_int_list = hexstr2int_list(KEYB_str)
  112. des3_key_list = [0 for i in range(16)]
  113. for i in range(0,8):
  114. des3_key_list[i] = random_int_list[i] ^ keya_int_list[i]
  115. des3_key_list[i+8] = mid_int_list[i] ^ keyb_int_list[i]
  116. des3_key_bytes = b''.join(map(lambda d:int.to_bytes(d, 1, 'little'), des3_key_list))
  117. Des3_Cipher = des3.new(des3_key_bytes, des3.MODE_ECB)
  118. # 加密随机数
  119. random_key_bytes = b''.join(map(lambda d:int.to_bytes(d, 1, 'little'), random_int_list))
  120. trnd_encrpyt_bytes = Des3_Cipher.encrypt(random_key_bytes)
  121. # trnd_bytes= rnd.randbytes(8)
  122. trnd_bytes = [0xA2,0xD6,0x00,0x10,0x10,0x00,0x10,0x10]
  123. command_bytes = [0xA2,0xD6,0x00,0x10,0x10]
  124. command_bytes.extend(trnd_encrpyt_bytes)
  125. command_bytes.extend(trnd_bytes)
  126. res,s1,s2 = sendCommand(card_service,command_bytes)
  127. if s1 == 144 and s2 == 0:
  128. res,s1,s2 = sendCommand(card_service,[0xA2,0xB0,0x00,0x10,0x10])
  129. # sendCommand(res)
  130. # trnd_encrpyt_bytes = Des3_Cipher.encrypt(trnd_bytes)
  131. return Des3_Cipher
  132. # 读读取数据
  133. def COS_Read_Data(card_service,Des3_Cipher, address_int, length_int, package_size):
  134. result_print("COS读取数据")
  135. result = False
  136. # 选中PL DATA
  137. rf_command_bytes = [0xA2,0xA4,0x00,0x0C,0x02,0xDA,0x01]
  138. data_bytes,s1,s2 = sendCommand(rf_command_bytes)
  139. # 读数据
  140. data_bytes = ISO14443_4A_ReadBinary(0xA2, address_int, length_int, package_size)
  141. data_bytes = b''.join(map(lambda d:int.to_bytes(d, 1, 'little'), data_bytes))
  142. data_bytes = Des3_Cipher.decrypt(data_bytes)
  143. data_str = bytes2hexstr(data_bytes)
  144. result = True
  145. result_print("成功", result)
  146. result_print(data_str, result)
  147. return result, data_bytes
  148. # 读取温度
  149. def COS_Read_Tempture(card_service,Des3_Cipher):
  150. result_print("COS读取温度")
  151. result = False
  152. tempture_int = 0
  153. # 选中PL DATA
  154. command_bytes = [0xA2,0xA4,0x00,0x0C,0x02,0xDA,0x01]
  155. data_bytes,s1,s2 = sendCommand(card_service,command_bytes)
  156. # 读取数据
  157. data_bytes = ISO14443_4A_ReadBinary(card_service,0xA2, 0, 80, 60)
  158. data_bytes = b''.join(map(lambda d:int.to_bytes(d, 1, 'little'), data_bytes))
  159. data_bytes = Des3_Cipher.decrypt(data_bytes)
  160. # 解析数据
  161. data_bias = 12
  162. CID_bytes = data_bytes[data_bias+0: data_bias+2]
  163. TID_bytes = data_bytes[data_bias+2: data_bias+8]
  164. GTIN_bytes = data_bytes[data_bias+8: data_bias+18]
  165. VID_bytes = data_bytes[data_bias+18:data_bias+26]
  166. MID_bytes = data_bytes[data_bias+26:data_bias+34]
  167. MAC_bytes = data_bytes[data_bias+34:data_bias+42]
  168. TRNG_bytes = data_bytes[data_bias+42:data_bias+50]
  169. PAGE_bytes = data_bytes[data_bias+50:data_bias+51]
  170. RNUM_bytes = data_bytes[data_bias+51:data_bias+55]
  171. Cal_Data = [[0 for i in range(2)] for j in range(3)]
  172. Cal_Data[0][0] = (data_bytes[data_bias+55]*16 + (data_bytes[data_bias+56]>>4))/10
  173. Cal_Data[0][1] = (data_bytes[data_bias+56]&0x0F)*256 + data_bytes[data_bias+57]
  174. Cal_Data[1][0] = (data_bytes[data_bias+58]*16 + (data_bytes[data_bias+59]>>4))/10
  175. Cal_Data[1][1] = (data_bytes[data_bias+59]&0x0F)*256 + data_bytes[data_bias+60]
  176. Cal_Data[2][0] = (data_bytes[data_bias+61]*16 + (data_bytes[data_bias+62]>>4))/10
  177. Cal_Data[2][1] = (data_bytes[data_bias+62]&0x0F)*256 + data_bytes[data_bias+63]
  178. info_json = {
  179. "CID":bytes2hexstr(CID_bytes),
  180. "TID":bytes2hexstr(TID_bytes),
  181. "GTIN":bytes2hexstr(GTIN_bytes),
  182. "VID":bytes2hexstr(VID_bytes),
  183. "MID":bytes2hexstr(MID_bytes),
  184. "MAC":bytes2hexstr(MAC_bytes),
  185. "TRNG":bytes2hexstr(TRNG_bytes),
  186. "PAGE":bytes2hexstr(PAGE_bytes),
  187. "RUNM":bytes2hexstr(RNUM_bytes),
  188. "CAL1":{
  189. "TEMP":str(Cal_Data[0][0]),
  190. "ADC":str(Cal_Data[0][1])
  191. },
  192. "CAL2":{
  193. "TEMP":str(Cal_Data[1][0]),
  194. "ADC":str(Cal_Data[1][1])
  195. },
  196. "CAL3":{
  197. "TEMP":str(Cal_Data[2][0]),
  198. "ADC":str(Cal_Data[2][1])
  199. }
  200. }
  201. command_bytes = [0xA2,0xB0,0x00,0x4E,0x08]
  202. data_bytes,s1,s2 = sendCommand(card_service,command_bytes)
  203. data_bytes = b''.join(map(lambda d:int.to_bytes(d, 1, 'little'), data_bytes))
  204. data_bytes = Des3_Cipher.decrypt(data_bytes)
  205. tempture_int = int(str(data_bytes[0]))*256 + int(str(data_bytes[1]))
  206. adc_data_int = tempture_int >> 5
  207. if(adc_data_int<Cal_Data[1][1]):
  208. tempture1 = Cal_Data[0][0]
  209. adc1 = Cal_Data[0][1]
  210. tempture2 = Cal_Data[1][0]
  211. adc2 = Cal_Data[1][1]
  212. else:
  213. tempture1 = Cal_Data[1][0]
  214. adc1 = Cal_Data[1][1]
  215. tempture2 = Cal_Data[2][0]
  216. adc2 = Cal_Data[2][1]
  217. k = (tempture1-tempture2)/(adc1-adc2)
  218. b = tempture1 - (k*adc1)
  219. tempture_float = k*adc_data_int + b
  220. info_json['tempture_data'] = tempture_float
  221. return info_json
  222. # 读数据
  223. def ISO14443_4A_ReadBinary(card_service,cla_bytes, address_start_int, length_int, RF_PACKAGE_SIZE):
  224. data_read_bytes = []
  225. des3_key_int_list = [0 for i in range(2)]
  226. package_size_int = RF_PACKAGE_SIZE
  227. package_number_int = int(length_int / package_size_int)
  228. package_bytes_left_int = length_int % package_size_int
  229. i = 0
  230. # 读取整包数据
  231. for i in range (0, package_number_int):
  232. data_address_int = address_start_int + i * package_size_int
  233. des3_key_int_list[0] = int(data_address_int/256)
  234. des3_key_int_list[1] = int(data_address_int%256)
  235. data_address_bytes = int_list2bytes(des3_key_int_list)
  236. rf_command_bytes = [cla_bytes,0xB0]
  237. rf_command_bytes.extend(data_address_bytes)
  238. rf_command_bytes.extend(bytes([package_size_int]))
  239. data_bytes, s1,s2 = sendCommand(card_service,rf_command_bytes)
  240. if s1 == 144 and s2 == 0:
  241. data_read_bytes.extend(data_bytes)
  242. # 读取剩余数据
  243. if package_bytes_left_int!=0:
  244. if package_number_int!=0:
  245. i = i+1
  246. data_address_int = address_start_int + i * package_size_int
  247. des3_key_int_list[0] = int(data_address_int/256)
  248. des3_key_int_list[1] = int(data_address_int%256)
  249. data_address_bytes = int_list2bytes(des3_key_int_list)
  250. rf_command_bytes = [cla_bytes,0xB0]
  251. rf_command_bytes.extend(data_address_bytes)
  252. rf_command_bytes.extend(bytes([package_size_int]))
  253. data_bytes, s1,s2 = sendCommand(card_service,rf_command_bytes)
  254. if s1 == 144 and s2 == 0:
  255. data_read_bytes.extend(data_bytes)
  256. return data_read_bytes
  257. # ISO14443-4A更新数据
  258. def ISO14443_4A_UpdateBinary(card_service,cla_bytes, address_start_int, length_int, data_write_bytes, RF_PACKAGE_SIZE):
  259. des3_key_int_list = [0 for i in range(2)]
  260. package_size_int = RF_PACKAGE_SIZE
  261. package_number_int = int(length_int / package_size_int)
  262. package_bytes_left_int = length_int % package_size_int
  263. i = 0
  264. # 写整包数据
  265. for i in range (0, package_number_int):
  266. data_address_int = address_start_int + i * package_size_int
  267. des3_key_int_list[0] = int(data_address_int/256)
  268. des3_key_int_list[1] = int(data_address_int%256)
  269. data_address_bytes = int_list2bytes(des3_key_int_list)
  270. rf_command_bytes = [cla_bytes,0xD6]
  271. rf_command_bytes.extend(data_address_bytes)
  272. rf_command_bytes.extend(bytes([package_size_int]))
  273. rf_command_bytes.extend(data_write_bytes[i*package_size_int : (i+1)*package_size_int])
  274. data_bytes,s1,s2 = sendCommand(card_service,rf_command_bytes)
  275. # 写剩余数据
  276. if package_bytes_left_int!=0:
  277. # tm.sleep(0.01)
  278. if package_number_int!=0:
  279. i = i+1
  280. data_address_int = address_start_int + i * package_size_int
  281. des3_key_int_list[0] = int(data_address_int/256)
  282. des3_key_int_list[1] = int(data_address_int%256)
  283. data_address_bytes = int_list2bytes(des3_key_int_list)
  284. rf_command_bytes = [cla_bytes,0xD6]
  285. rf_command_bytes.extend(data_address_bytes)
  286. rf_command_bytes.extend(bytes([package_bytes_left_int]))
  287. rf_command_bytes.extend(data_write_bytes[i*package_size_int:i*package_size_int+package_bytes_left_int])
  288. data_bytes, s1,s2 = sendCommand(card_service,command_bytes)
  289. return data_bytes
  290. # 读取配置文件
  291. def COS_Read_Config(card_service,Des3_Cipher, address_int, length_int, package_size):
  292. result_print("COS读取配置数据")
  293. result = False
  294. # 选中CONFIG
  295. rf_command_bytes = [0xA2,0xA4,0x00,0x0C,0x02,0xCF,0x01]
  296. data_bytes, s1,s2 = sendCommand(card_service,rf_command_bytes)
  297. # 读数据
  298. data_bytes = ISO14443_4A_ReadBinary(card_service,0xA2, address_int, length_int, package_size)
  299. data_bytes = b''.join(map(lambda d:int.to_bytes(d, 1, 'little'), data_bytes))
  300. data_bytes = Des3_Cipher.decrypt(data_bytes)
  301. data_str = bytes2hexstr(data_bytes)
  302. result = True
  303. result_print('config file :'+ data_str)
  304. return data_bytes
  305. # 修改配置文件
  306. def COS_Write_Config(card_service,Des3_Cipher, address_int, length_int, write_bytes, package_size):
  307. result_print("COS写入配置数据")
  308. result = False
  309. # 选中CONFIG
  310. rf_command_bytes = [0xA2,0xA4,0x00,0x0C,0x02,0xCF,0x01]
  311. data_bytes, s1, s2 = sendCommand(card_service,rf_command_bytes)
  312. write_bytes = b''.join(map(lambda d:int.to_bytes(d, 1, 'little'), write_bytes))
  313. data_write_bytes = Des3_Cipher.encrypt(write_bytes)
  314. data_bytes = ISO14443_4A_UpdateBinary(card_service,0xA2, address_int, length_int, data_write_bytes, package_size)
  315. if data_bytes!=b'':
  316. result = True
  317. result_print("COS写入配置数据 成功")
  318. if result == False:
  319. result_print("COS写入配置数据 失败")
  320. return result
  321. # 数据解析
  322. def COS_Analysis(card_service,Des3_Cipher, DATA_SIZE, show_picture_tag):
  323. TEMPTURE_SHOW = True # 显示温度
  324. # TEMPTURE_CAL_TYPE = "KB" # KB校准
  325. TEMPTURE_CAL_TYPE = "3POS"
  326. result_print("COS数据解析")
  327. # 选中DATA
  328. rf_command_bytes = [0xA2,0xA4,0x00,0x0C,0x02,0xDA,0x01]
  329. data_bytes, s1,s2 = sendCommand(card_service,rf_command_bytes)
  330. # 读取数据
  331. data_bytes = ISO14443_4A_ReadBinary(card_service,0xA2, 0, 80, DATA_SIZE)
  332. data_bytes = b''.join(map(lambda d:int.to_bytes(d, 1, 'little'), data_bytes))
  333. data_bytes = Des3_Cipher.decrypt(data_bytes)
  334. # 解析数据
  335. data_bias = 12
  336. CID_bytes = data_bytes[data_bias+0: data_bias+2]
  337. TID_bytes = data_bytes[data_bias+2: data_bias+8]
  338. GTIN_bytes = data_bytes[data_bias+8: data_bias+18]
  339. VID_bytes = data_bytes[data_bias+18:data_bias+26]
  340. MID_bytes = data_bytes[data_bias+26:data_bias+34]
  341. MAC_bytes = data_bytes[data_bias+34:data_bias+42]
  342. TRNG_bytes = data_bytes[data_bias+42:data_bias+50]
  343. PAGE_bytes = data_bytes[data_bias+50:data_bias+51]
  344. RNUM_bytes = data_bytes[data_bias+51:data_bias+55]
  345. if TEMPTURE_CAL_TYPE=="KB":
  346. RES_bytes = data_bytes[data_bias+55:data_bias+58]
  347. K_bytes = data_bytes[data_bias+58:data_bias+62]
  348. B_bytes = data_bytes[data_bias+62:data_bias+66]
  349. info_str = "CID: " + bytes2hexstr(CID_bytes) + "\n" + \
  350. "TID: " + bytes2hexstr(TID_bytes) + "\n" + \
  351. "GTIN: " + bytes2hexstr(GTIN_bytes) + "\n" + \
  352. "VID: " + bytes2hexstr(VID_bytes) + "\n" + \
  353. "MID: " + bytes2hexstr(MID_bytes) + "\n" + \
  354. "MAC: " + bytes2hexstr(MAC_bytes) + "\n" + \
  355. "TRNG: " + bytes2hexstr(TRNG_bytes) + "\n" + \
  356. "PAGE: " + bytes2hexstr(PAGE_bytes) + "\n" + \
  357. "RNUM: " + bytes2hexstr(RNUM_bytes) + "\n" + \
  358. "RES: " + bytes2hexstr(RES_bytes) + "\n" + \
  359. "K: " + bytes2hexstr(K_bytes) + "\n" + \
  360. "B: " + bytes2hexstr(B_bytes)
  361. info_json = {
  362. "CID":bytes2hexstr(CID_bytes),
  363. "TID":bytes2hexstr(TID_bytes),
  364. "GTIN":bytes2hexstr(GTIN_bytes),
  365. "VID":bytes2hexstr(VID_bytes),
  366. "MID":bytes2hexstr(MID_bytes),
  367. "MAC":bytes2hexstr(MAC_bytes),
  368. "TRNG":bytes2hexstr(TRNG_bytes),
  369. "PAGE":bytes2hexstr(PAGE_bytes),
  370. "RUNM":bytes2hexstr(RNUM_bytes),
  371. "RES":bytes2hexstr(RES_bytes),
  372. "K":bytes2hexstr(K_bytes),
  373. "B":bytes2hexstr(B_bytes)
  374. }
  375. else:
  376. Cal_Data = [[0 for i in range(2)] for j in range(3)]
  377. Cal_Data[0][0] = (data_bytes[data_bias+55]*16 + (data_bytes[data_bias+56]>>4))/10
  378. Cal_Data[0][1] = (data_bytes[data_bias+56]&0x0F)*256 + data_bytes[data_bias+57]
  379. Cal_Data[1][0] = (data_bytes[data_bias+58]*16 + (data_bytes[data_bias+59]>>4))/10
  380. Cal_Data[1][1] = (data_bytes[data_bias+59]&0x0F)*256 + data_bytes[data_bias+60]
  381. Cal_Data[2][0] = (data_bytes[data_bias+61]*16 + (data_bytes[data_bias+62]>>4))/10
  382. Cal_Data[2][1] = (data_bytes[data_bias+62]&0x0F)*256 + data_bytes[data_bias+63]
  383. info_str = "CID: " + bytes2hexstr(CID_bytes) + "\n" + \
  384. "TID: " + bytes2hexstr(TID_bytes) + "\n" + \
  385. "GTIN: " + bytes2hexstr(GTIN_bytes) + "\n" + \
  386. "VID: " + bytes2hexstr(VID_bytes) + "\n" + \
  387. "MID: " + bytes2hexstr(MID_bytes) + "\n" + \
  388. "MAC: " + bytes2hexstr(MAC_bytes) + "\n" + \
  389. "TRNG: " + bytes2hexstr(TRNG_bytes) + "\n" + \
  390. "PAGE: " + bytes2hexstr(PAGE_bytes) + "\n" + \
  391. "RNUM: " + bytes2hexstr(RNUM_bytes) + "\n" + \
  392. "CAL1: " + str(Cal_Data[0][0]) + " " + str(Cal_Data[0][1]) + "\n" + \
  393. "CAL2: " + str(Cal_Data[1][0]) + " " + str(Cal_Data[1][1]) + "\n" + \
  394. "CAL3: " + str(Cal_Data[2][0]) + " " + str(Cal_Data[2][1])
  395. info_json = {
  396. "CID":bytes2hexstr(CID_bytes),
  397. "TID":bytes2hexstr(TID_bytes),
  398. "GTIN":bytes2hexstr(GTIN_bytes),
  399. "VID":bytes2hexstr(VID_bytes),
  400. "MID":bytes2hexstr(MID_bytes),
  401. "MAC":bytes2hexstr(MAC_bytes),
  402. "TRNG":bytes2hexstr(TRNG_bytes),
  403. "PAGE":bytes2hexstr(PAGE_bytes),
  404. "RUNM":bytes2hexstr(RNUM_bytes),
  405. "CAL1":{
  406. "TEMP":str(Cal_Data[0][0]),
  407. "ADC":str(Cal_Data[0][1])
  408. },
  409. "CAL2":{
  410. "TEMP":str(Cal_Data[1][0]),
  411. "ADC":str(Cal_Data[1][1])
  412. },
  413. "CAL3":{
  414. "TEMP":str(Cal_Data[2][0]),
  415. "ADC":str(Cal_Data[2][1])
  416. }
  417. }
  418. result_print(info_json)
  419. record_number_int = bytes2int(RNUM_bytes)
  420. record_data_size_int = int(record_number_int*11/8)
  421. if(record_number_int*11%8):
  422. record_data_size_int += 1
  423. record_data_size_mod_int = record_data_size_int%8
  424. if(record_data_size_mod_int):
  425. record_data_size_int = record_data_size_int + (8-record_data_size_mod_int)
  426. # 读取数据
  427. NDEF_MAX_INT = 4032
  428. start_address_int = 78
  429. if (start_address_int+record_data_size_int)>NDEF_MAX_INT:
  430. record_data_size_int = record_data_size_int - 8
  431. record_number_int = int(record_data_size_int*8/11)
  432. data_bytes = ISO14443_4A_ReadBinary(card_service,0xA2, 78, record_data_size_int, DATA_SIZE)
  433. data_bytes = b''.join(map(lambda d:int.to_bytes(d, 1, 'little'), data_bytes))
  434. data_bytes = Des3_Cipher.decrypt(data_bytes)
  435. # 解析adc
  436. tempture_data = [0 for i in range(record_number_int)]
  437. repeat_cnt = int(record_number_int/8)
  438. count_residue = record_number_int%8
  439. if count_residue>0:
  440. repeat_cnt += 1
  441. decode_count = 0
  442. for i in range(0, repeat_cnt):
  443. for j in range(0, 8):
  444. if decode_count>=record_number_int:
  445. break
  446. else:
  447. decode_count += 1
  448. if j==0:
  449. adc_data_int = data_bytes[i*11]*256+data_bytes[i*11+1]
  450. adc_data_int = (adc_data_int&0x0000FFE0)>>5
  451. elif j==1:
  452. adc_data_int = data_bytes[i*11+1]*256+data_bytes[i*11+2]
  453. adc_data_int = (adc_data_int&0x00001FFC)>>2
  454. elif j==2:
  455. adc_data_int = data_bytes[i*11+2]*65536+data_bytes[i*11+3]*256+data_bytes[i*11+4]
  456. adc_data_int = (adc_data_int&0x0003FF80)>>7
  457. elif j==3:
  458. adc_data_int = data_bytes[i*11+4]*256+data_bytes[i*11+5]
  459. adc_data_int = (adc_data_int&0x00007FF0)>>4
  460. elif j==4:
  461. adc_data_int = data_bytes[i*11+5]*256+data_bytes[i*11+6]
  462. adc_data_int = (adc_data_int&0x00000FFE)>>1
  463. elif j==5:
  464. adc_data_int = data_bytes[i*11+6]*65536+data_bytes[i*11+7]*256+data_bytes[i*11+8]
  465. adc_data_int = (adc_data_int&0x0001FFC0)>>6
  466. elif j==6:
  467. adc_data_int = data_bytes[i*11+8]*256+data_bytes[i*11+9]
  468. adc_data_int = (adc_data_int&0x000003FF8)>>3
  469. elif j==7:
  470. adc_data_int = data_bytes[i*11+9]*256+data_bytes[i*11+10]
  471. adc_data_int = (adc_data_int&0x000007FF)>>0
  472. adc_data_int = int(adc_data_int)
  473. if TEMPTURE_SHOW==True:
  474. if(adc_data_int<Cal_Data[1][1]): # 温度小于第二个校准点,使用第一个点和第二个点计算KB值
  475. tempture1 = Cal_Data[0][0]
  476. adc1 = Cal_Data[0][1]
  477. tempture2 = Cal_Data[1][0]
  478. adc2 = Cal_Data[1][1]
  479. else:
  480. tempture1 = Cal_Data[1][0]
  481. adc1 = Cal_Data[1][1]
  482. tempture2 = Cal_Data[2][0]
  483. adc2 = Cal_Data[2][1]
  484. k = (tempture1-tempture2)/(adc1-adc2)
  485. b = tempture1 - (k*adc1)
  486. tempture_float = k*adc_data_int + b
  487. tempture_data[decode_count-1] = tempture_float
  488. else:
  489. tempture_data[decode_count-1] = adc_data_int
  490. result_print(str(tempture_data))
  491. info_json['tempture_data'] = tempture_data
  492. # 波形显示
  493. if show_picture_tag:
  494. DATA_FILTER = 0
  495. x = [0 for i in range(record_number_int)]
  496. for i in range(0, record_number_int):
  497. x[i] = i
  498. plt.figure(figsize=(20.48, 10.24))
  499. plt.title('Tempture Record')
  500. lable_name = bytes2hexstr(VID_bytes)
  501. plt.plot(x, tempture_data, label= lable_name)
  502. plt.legend() # 显示图例
  503. plt.ylim(0, 2048)
  504. plt.ylabel('adc value')
  505. plt.xlabel('time')
  506. plt.show()
  507. return info_json
  508. # def active():
  509. # card_service = init()
  510. # Des3_Cipher = COS_Access(card_service,'0xA0 0xA1 0xA2 0xA3 0xA4 0xA5 0xA6 0xA7','0xA8 0xA9 0xAA 0xAB 0xAC 0xAD 0xAE 0xAF')
  511. # COS_Analysis(card_service,Des3_Cipher,60,False)
  512. # COS_Write_Config(card_service,Des3_Cipher,49162,8,[0xF0, 0x03, 0x00, 0x0F, 0x20, 0x00, 0xF6, 0x00],8)
  513. # data_bytes = COS_Read_Config(card_service,Des3_Cipher,49162,8,8)
  514. # COS_Read_Tempture(Des3_Cipher)
  515. # a = rnd.randbytes(8)