一步步教你制作移动式银走卡新闻读取器
当前位置 :| 阿坝藏族羌族自治州却吧二手车交易网 > 车号 > 一步步教你制作移动式银走卡新闻读取器

一步步教你制作移动式银走卡新闻读取器

来源:http://www.sunaijie830711.cn 作者:阿坝藏族羌族自治州却吧二手车交易网 时间:2020-07-05 点击: 98

原标题:一步步教你制作移动式银走卡新闻读取器

文章来源:物联网IOT坦然

荥经市逗经贸发展公司

文章来源:物联网IOT坦然

吾先上图吧,望望你是不是感有趣:

侧面图:

正面图:

拿着它扫了一下吾姥姥的裤兜:

过了几秒,手机收到一封邮件!

倘若望到这你高昂了,那么接着去下望望:

背景:半年前,吾从网上望到一个视频,讲的也许是一幼我站在了一幼我的左右,待了几秒,然后就清新了谁人人的银走卡新闻了,而且不光是银走卡新闻,甚至连持卡人的姓名,身份证号都有。吾望完之后,那时就惊呆了。现在的人都这么牛了吗?于是不伪思索的也从网上买了一个一模相通的NFC读卡器,幻想着本身也能够这么严害。可是货一到,亲炎就没了,由于那时以为很浅易,哪知钻研了一下竟不知从哪入手。不过益在也没铺张,拿着它配了个钥匙。就云云一晃半年以前了……近来吾又望到了这个NFC读卡器,然后还找到了本身大学时期买的树莓派,心想着,是不是能够结相符一下。最后功夫不负有意人,花了益几天的时间,终于把它们拼首来了!

设备:充电宝(5v输出)、树莓派(3代)、NFC读卡器(ACR122U-A9)、手机(具备炎点功能)

说话:python3

流程:也许就是用充电宝充当树莓派的电源,然后把NFC读卡器连接到树莓派,并在树莓派内里实走读取银走卡的程序,读取到银走卡新闻后树莓派经由过程手机开的炎点网络将银走卡新闻发送到本身的邮箱,于是手机上就能望到银走卡有关新闻了。

难点:主要是如何经由过程NFC读卡器,从银走卡里读数据。必要经由过程读卡器给银走卡发送什么数据,对银走卡返回的数据做怎样的处理。

写代码前准备:固然望着下面主代码不众,但其实内里要学许众知识,尤其是关于金融集成电路(IC)卡规范内里的内容,那时逆逆复复望了一个通宵才弄清新了一些。吾们在写代码前大致是要先找到NFC读卡器表明文档和银走卡有关规范,晓畅其做事过程。NFC读卡器发送乞求数据给银走卡,然后银走卡回响反映数据,发送和回响反映的这些数据都是十六进制外示的,在银走卡规范中均有详细表明。清新了命令之后,就是测试。测试吾们用ACR122U读卡器配套的工具(ACR122UTool,可在官网下载,下面资源包中也有)就走,该工具能够发送十六进制命令,然后会表现出回响反映的十六进制格式的字符串,这个字符串是TLV格式的,直接望望不懂,必要再解析一下,这时便可行使工具EMV TLV查询分析器(下面资源包中已有)。你把得到的字符串直接复制上去,它会给你解析益,云云你望首来就清亮一些了。不过解析出来的照样是十六进制,这些个十六进制的字符其实是字节串,这时候必要用python给转码一下,转成gb2312(不要问吾怎么清新要转成这个格式的,由于吾是挨个测试出来的……)就能够望到字母或中文了。末了把这一系列过程用python写出来就走了。

ACR122UTool截图:

将上面的效果复制去空格粘贴到EMV TLV查询分析器平分析:注:末了的'90 00'不要复制,由于这是这个工具的状态新闻,9000外示返回成功。

吾们望到十六进制字符串已经被解析成一段一段了,每段都有其稀奇的意义,吾们把其中的value转码成gb2312,就能望到字母或汉字了。

主程序代码:

fromsmartcard.System importreaders fromsmartcard.util importtoHexString, toBytes, HEX, PACK

fromsearch_map importtrade_type2str, create_card_info, read_tag, create_identityCard_info importsend_mails

def_card_type(typeStr): #银走卡类型标注 # example: 'PBOC DEBIT' ==> 'PBOC DEBIT(借记卡)'iftypeStr.upper == 'PBOC DEBIT': typeStr = typeStr '(借记卡)'eliftypeStr.upper == 'PBOC CREDIT': typeStr = typeStr '(名誉卡)'returntypeStr

def_del20or00(astr): #删除商户名称后边有余字符# example: 50424F435F4C4556454C32205445535400000000 ==> 50424F435F4C4556454C322054455354whileastr[ -2:] == '00'orastr[ -2:] == '20': astr = astr[: -2] returnastr

def_jie_duan1(rawStr): #返回字符串rawStr中'D'以前的字符,即银走卡号# example: 1111111111111111D191200000000000F ==> 1111111111111111111returnrawStr[:rawStr.find( 'D')] def_jie_duan2(rawStr): #返回字符串rawStr中'D'之后的4个字符,即失效日期# example: 1111111111111111D191200000000000F ==> 1912returnrawStr[rawStr.find( 'D') 1:rawStr.find( 'D') 1 4]

definsert_chr(insertStr, intCount= 4, intChr= ' ') : #将银走卡号、日期等做下浅易处理,便于不雅旁观# example: 1111111111111111111 ==> 1111 1111 1111 1111 111# example: 191210 ==> 19/12/10L = []forn inrange( 0,len(insertStr),intCount): #每intCount个字符一个intChrL.append(insertStr[n:n intCount])returnintChr.join(L)

deflog_analyzing(logStr): #营业日志解析,转为字典,映射外参见<<JRT0025.5-2018 中国金融集成电路(IC)卡规范>>(下简称为JRT0025)第5片面 外45# example: 16070308461000000002000000000000000001560156494342432041544D000000000000000000000000010051 ==> {'9A': ['营业日期', '160703'], '9F21': ['营业时间', '084610'], '9F02': ['授权金额', '000000020000'], '9F03': ['其他金额', '000000000000'], '9F1A': ['终端国家代码', '0156'], '5F2A': ['营业货币代码', '0156'], '9F4E': ['商户名称', '494342432041544D'], '9C': ['营业类型', '01'], '9F36': ['行使营业计数器(ATC)', '0051']}log_tlv = {}log_tlv[ '9A'] = [ '营业日期', logStr[ 0: 6]] log_tlv[ '9F21'] = [ '营业时间', logStr[ 6: 12]] log_tlv[ '9F02'] = [ '授权金额', logStr[ 12: 24]] log_tlv[ '9F03'] = [ '其他金额', logStr[ 24: 36]] log_tlv[ '9F1A'] = [ '终端国家代码', logStr[ 36: 40]] log_tlv[ '5F2A'] = [ '营业货币代码', logStr[ 40: 44]] log_tlv[ '9F4E'] = [ '商户名称', _del20or00(logStr[ 44: 84])] log_tlv[ '9C'] = [ '营业类型', logStr[ 84: 86]] log_tlv[ '9F36'] = [ '行使营业计数器(ATC)', logStr[ -4:]] returnlog_tlv

defhex2gb2312(hexStr): #将十六进制转换为gb2312字符# example: 494342432041544D ==> ICBC ATMreturnbytes(toBytes(hexStr)).decode( 'gb2312')

deftlv_analyzing(*tlv): #对tlv格式进走解析,详细可参见JRT0025第5片面 附录A 外A.1tag = read_tagnewtag = {} not_tlv2 = ( '6F', '70', '72', '73', '77', '80', 'A5', '90') # 2个字符的模板not_tlv4 = ( 'BF0C') # 4个字符的模板foreach_tlv intlv: each_tlv_raw = each_tlveach_tlv = each_tlv ' '# print(each_tlv)whilelen(each_tlv) != 1: #表明还存在数据,倘若为1则值为' 'ifeach_tlv.startswith(not_tlv2): #检测稀奇情况,倘若起头是2个字符的模板等ifeach_tlv[ 0: 4] == '7081': # 70为模板,以7081起头的清淡长度有4位(81xx),因此将7081xx删失踪each_tlv = each_tlv[ 6:] elifeach_tlv[ 0: 4] == '9081': # 90为证书,暂不处理,直一连数据一首删失踪length = int(each_tlv[ 4: 6], 16) each_tlv = each_tlv[ 6 length* 2:] else: each_tlv = each_tlv[ 2 2:] #将模板和长度删失踪elifeach_tlv.startswith(not_tlv4): #同上each_tlv = each_tlv[ 4 2:] else: #解析TLVifeach_tlv[ 0: 2] in[i fori intag iflen(i) == 2]: length = int(each_tlv[ 2: 4],车号 16) value = each_tlv[ 4: 4 length* 2] tag[each_tlv[ 0: 2]][ 1] = value each_tlv = each_tlv[ 4 length* 2:] elifeach_tlv[ 0: 4] in[ j forj intag iflen(j) == 4]: length = int(each_tlv[ 4: 6], 16) value = each_tlv[ 6: 6 length* 2] tag[each_tlv[ 0: 4]][ 1] = value each_tlv = each_tlv[ 6 length* 2:] else: #倘若解析不了print( '发现未识别的标签:', each_tlv[ 0: 2], 'or', each_tlv[ 0: 4]) print( '原首标签:', each_tlv_raw) print( '-'* 50) break# print(tag)returntag

if__name__ == '__main__': detection = 0#检测扫描的银走卡是否和刚刚扫描的一致,倘若一致则不再扫描,以免展现重复数据SELECT1 = [ 0x00, 0xA4, 0x04, 0x00, 0x07, 0xA0, 0x00, 0x00, 0x03, 0x33, 0x01, 0x01] #选择卡片SELECT2 = [ 0x00, 0xB2, 0x01, 0x14, 0x00] #银走卡号、生失效日期SELECT3 = [ 0x00, 0xB2, 0x01, 0x0C, 0x00] #证件号、姓名、证件类型SELECT4 = [ 0x80, 0xCA, 0x9F, 0x79, 0x00] #读取电子现金余额whileTrue: #程序不息运走try: #选择卡片,发送乞求数据,获取回响反映数据r = readers #以下代码及表明参见pyscard官方文档connection = r[ 0].createConnection connection.connectdata1, sw1, sw2 = connection.transmit(SELECT1)ifdata1 == []: print( '扫描到非银走卡') time.sleep( 0.1) continuedata2, sw1, sw2 = connection.transmit(SELECT2)ifdetection == data2: #倘若前后数据没转折,则重新扫描卡片continuedata3, sw1, sw2 = connection.transmit(SELECT3)data4, sw1, sw2 = connection.transmit(SELECT4)data5_list = []fori inrange( 1, 0xB): #先从卡里读数据,后面再处理SELECT5 = [ 0x00, 0xB2,i, 0x5C, 0x00] #前 i 条营业日志data5, sw1, sw2 = connection.transmit(SELECT5)ifdata5 == []: breakelse: data5_list.append(data5)except: time.sleep( 0.1) else: tlv1 = toHexString(data1,PACK)tlv2 = toHexString(data2,PACK)tlv3 = toHexString(data3,PACK)tlv4 = toHexString(data4,PACK)res = tlv_analyzing(tlv1,tlv2,tlv3,tlv4)s = ( '''银走卡类型:%(cardtype)s 银走卡号:%(cardnumber)s银走卡发卡走:%(cardbank)s银走卡有效期:%(valid)s - %(invalid)s电子现金余额:%(balance).2f持卡人姓名:%(name)s持卡人证件号:%(idcardnumber)s证件归属地:%(idcardbelong)s'''% { 'cardtype': _card_type(hex2gb2312(res[ '50'][ 1])), 'cardnumber': insert_chr(res[ '5A'][ 1].rstrip( 'F')) orinsert_chr(_jie_duan1(res[ '57'][ 1])), 'cardbank': create_card_info(res[ '5A'][ 1].rstrip( 'F')) orcreate_card_info(_jie_duan1(res[ '57'][ 1])), 'valid': insert_chr(res[ '5F25'][ 1], 2, '/'), 'invalid': insert_chr(res[ '5F24'][ 1], 2, '/') orinsert_chr(_jie_duan2(res[ '57'][ 1]), 2, '/'), 'balance': int(res[ '9F79'][ 1])/ 100, 'name': hex2gb2312(res[ '5F20'][ 1]), 'idcardnumber': hex2gb2312(res[ '9F61'][ 1]), 'idcardbelong': create_identityCard_info(hex2gb2312(res[ '9F61'][ 1])) } ) # print(s)s = s 'n近来十次营业如下:'fordata5 indata5_list: tlv5 = toHexString(data5,PACK)log_tlv = log_analyzing(tlv5)s = s ('''nn营业日期 营业时间 授权金额 商户名称 营业类型%7s %9s %9.2f s s'''% (insert_chr(log_tlv[ '9A'][ 1], 2, '/'), insert_chr(log_tlv[ '9F21'][ 1], 2, ':'), int(log_tlv[ '9F02'][ 1])/ 100, hex2gb2312(log_tlv[ '9F4E'][ 1]), trade_type2str(log_tlv[ '9C'][ 1]))) print(s)send_mails.send( 'NFC',s.replace( 'n', '<br>')) #发送邮件print( '*'* 80) detection = data

实走以上代码前需安置pyscard库:

(注:windows用户可直接实走 pip3 install pyscard 安置)

程序及原料: NFC原料代码

后记:其实上面的演示,你只要有个NFC读卡器就走,这个是最主要的,然后吾的python程序是在window10上写的,之后放到了树莓派中。因此上面挑到的exe文件工具,倘若你是苹果电脑打不开,能够得另想手段。然后吾末了面写的参考文章你也能够望望,内里有许众东西也是很主要的,不然你能够会望不懂吾在说什么。这个NFC读卡器只针对带有芯片的银走卡,纯磁条卡不走。你行使这个新闻读取器读取银走卡时,未必候会碰到持卡人姓名,证件号异国的情况,而且其实这栽是大无数的情况,这由于银走在建卡时异国把这些数据写入。PBOC3.0现在的规范是不强制录入持卡人新闻,据说PBOC4.0就是提出不要录入持卡人新闻,而吾们现在正处于PBOC3.0到PBOC4.0之间的阶段。

声明: 本柔件不得用于商业及作恶用途,仅做学习交流行使。

参考文章:

附A: 如何关闭ACR122U读卡器刷卡蜂鸣声。未必候吾们想神不知鬼不觉的扫一下银走卡,因此吾们得把这个声音关失踪。

(另:如需恢复声音,实走FF0052FF00即可。)

(注:以上内容可参考文档API-ACR122U-CN-2.04.pdf,上文原料里已包含。

  根据商务部监测系统显示,6月份第三周(6月15日-6月21日),咸阳市监测的重要生产资料价格有涨有跌,波动幅度不大,市场供需平稳。

  原标题 游戏订阅服务不及预期,苹果取消部分游戏厂商开发合同

  来源:中国基金报

原标题:性价比超高的儿童手表:精准定位一键报警,它让爸妈更放心!

原标题:张铭恩再度现身胡冰卿小区,被发现后转身离开,还要继续否认吗?



Tag:一,步步,教你,制作,移动式,银走,卡,新闻,读取,

 

最新评论
评论内容:不能超过250字,需审核,请自觉遵守互联网相关政策法规。
用户名: 密码:
匿名?
>> 原创也许这才是更众人想要的..

>> 捷克新添241例新冠肺热确诊病..

>> 俄罗斯石油化工巨头西伯尔控..

>> 一夜从天国到地狱,瑞幸做错..

>> 家政服务名誉信休平台正式启..

>> 原创DNF:旭旭宝宝很衰,毁了..

>> 格力电器:现在主流的技术是..

>> 部分转债何以走势异常?有的..

>> 阴阳师鬼童丸成最惨SSR式神,..

>> 【中金固收·名誉】中国短期..

>> “生不逢时”的UNI-T和L3级自动..

>> 暧昧,才是日本流行的生存之..

>> 被按下暂停键,车后服务市场..

>> [新浪彩票]陈青峰排列三第2..

>> 映客回应成被执行人:案件有异..

>> 原创也许这才是更众人想要的..

>> 捷克新添241例新冠肺热确诊病..

>> 俄罗斯石油化工巨头西伯尔控..

>> 一夜从天国到地狱,瑞幸做错..

>> 家政服务名誉信休平台正式启..

>> 原创DNF:旭旭宝宝很衰,毁了..

>> 格力电器:现在主流的技术是..

>> 部分转债何以走势异常?有的..

>> 阴阳师鬼童丸成最惨SSR式神,..

>> 【中金固收·名誉】中国短期..

>> “生不逢时”的UNI-T和L3级自动..

>> 暧昧,才是日本流行的生存之..

>> 被按下暂停键,车后服务市场..

>> [新浪彩票]陈青峰排列三第2..

>> 映客回应成被执行人:案件有异..