#qq:954486673

#微信:13822155058

#发卡器介绍:https://item.taobao.com/item.htm?spm=a1z10.5-c.w4002-17663462238.11.2141789eoDdZ7K&id=615391857885https://item.taobao.com/item.htm?spm=a1z10.5-c.w4002-17663462238.11.2141789eoDdZ7K&id=615391857885

#python通过缩进来表示代码块,不可以随意更改每行前面的空白,否则程序会运行错误!!!如果缩进不一致,就会报错: IndentationError
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#python -m pdb xxx.py 调试程度 n命令单步执行,s命令单步执行 会进入函数内部  b xx ,c
#import pdb    pdb.set_trace() 设断点import ctypes             #调用DLL动态库要有这个引用
import sys
import os
import pdb                #引入程序调试功能,可用  pdb.set_trace()  设置程序调试断点#IC卡操作错误代码解释
def PrintErrInf(Errcode):if(Errcode==8):print('错误代码:8,未寻到卡,请重新拿开卡后再放到感应区!')elif(Errcode==1):print('错误代码:1,0~2块都没读出来,可能刷卡太块。但卡序列号已被读出来!')elif(Errcode==2):print('错误代码:2,第0块已被读出,但1~2块读取失败。卡序列号已被读出来!')elif(Errcode==3):    print('错误代码:3,第0、1块已被读出,但2块读取失败。卡序列号已被读出来!')elif(Errcode==9):print('错误代码:9,有多张卡在感应区,寻卡过程中防冲突失败,读序列吗错误!')elif(Errcode==10):print('错误代码:10,该卡可能已被休眠,无法选中卡片!')elif(Errcode==11):print('错误代码:11,密码装载失败!')        elif(Errcode==12):print('错误代码:12,卡片密码认证失败!')elif(Errcode==13):print('错误代码:13,读本块失败,可能需要验证密码!')elif(Errcode==14):print('错误代码:14,写本块失败,可能需要验证密码!')elif(Errcode==21):print('错误代码:21,没有动态库!')elif(Errcode==22):print('错误代码:22,动态库或驱动程序异常!')elif(Errcode==23):print('错误代码:23,驱动程序错误或尚未安装!')elif(Errcode==24):print('错误代码:24,操作超时,一般是动态库没有反映!')elif(Errcode==25):print('错误代码:25,发送字数不够!')elif(Errcode==26):print('错误代码:26,发送的CRC错!')elif(Errcode==27):print('错误代码:27,接收的字数不够!')elif(Errcode==28):print('错误代码:28,接收的CRC错!')else:print('未知错误,错误代码:'+str(status))#加载当前目录下的DLL
dllfile=sys.path[0]+'\OUR_MIFARE.dll'
Objdll = ctypes.windll.LoadLibrary(dllfile)
Objdll = ctypes.WinDLL(dllfile)#根据入口参数执行不同功能
if(len(sys.argv)>1): if(str(sys.argv[1])=='0'):    #驱动读写器发出响声Objdll.pcdbeep(50)print('驱动读写器嘀一声!')elif(str(sys.argv[1])=='1'):  #读取设备的出厂编号devno=bytes(4)            #声明4个字节缓冲status=Objdll.pcdgetdevicenumber(devno) % 256if(status==0):Objdll.pcdbeep(38)SerialNum=''for num in range(0,len(devno)):SerialNum=SerialNum+'%02x' % (devno[num])if(num<len(devno)-1):SerialNum=SerialNum+'-'print('设备出厂编号:'+ SerialNum)else:print('读取设备编号失败,错误代码:'+str(status))elif(str(sys.argv[1])=='2'):  #读卡的序列号mypiccserial=bytes(7)     #7个字节卡序列号status = Objdll.piccrequest_ul(mypiccserial) % 256if(status==0):Objdll.pcdbeep(38)piccserialStr=''for num in range(0,len(mypiccserial)):piccserialStr=piccserialStr+'%02x ' % (mypiccserial[num])print('7字节卡序号:'+ piccserialStr)else:PrintErrInf(status)elif(str(sys.argv[1])=='3'):  #读卡内4个页的数据mypiccserial=bytes(7)     #7个字节卡序列号缓冲mypiccdata=bytes(16)      #16个字节读卡的数据缓冲ReadPageBegin=4           #起始页地址status = Objdll.piccrequest_ul(mypiccserial) % 256            #寻卡并读卡的序列号if(status==0):piccserialStr=''for num in range(0,len(mypiccserial)):piccserialStr=piccserialStr+'%02x ' % (mypiccserial[num])print('7字节卡序号:'+ piccserialStr)status = Objdll.piccread_ul(ReadPageBegin,mypiccdata) % 256if(status==0):Objdll.pcdbeep(38)piccdataStr=''for num in range(0,len(mypiccdata)):piccdataStr=piccdataStr+'%02x ' % (mypiccdata[num])print('块%d-块%d数据:' % (ReadPageBegin,ReadPageBegin+3)+piccdataStr)else:PrintErrInf(status)else:PrintErrInf(status)elif(str(sys.argv[1])=='4'):       #写一个页数据mypiccserial=bytes(7)          #7个字节卡序列号mypiccdata=bytes([0,1,2,3])    #1个页4个字节的写卡数据WritePage=4                    #改写页地址status = Objdll.piccrequest_ul(mypiccserial) % 256     #寻卡并读卡的序列号if(status==0):piccserialStr=''for num in range(0,len(mypiccserial)):piccserialStr=piccserialStr+'%02x ' % (mypiccserial[num])print('7字节卡序号:'+ piccserialStr)status = Objdll.piccwrite_ul(WritePage,mypiccdata) % 256if(status==0):Objdll.pcdbeep(38)print('改写块%d内数据成功!' % (WritePage))else:PrintErrInf(status)else:PrintErrInf(status)elif(str(sys.argv[1])=='5'):       #认证卡片密码mypiccserial=bytes(7)          #7个字节卡序列号mypicckey=bytes([eval('0x12'),eval('0x34'),eval('0x56'),eval('0x78')])     #4个字节的卡密码mypiccntagpack=bytes([0,0])    #返回的确认码status = Objdll.piccrequest_ul(mypiccserial) % 256                         #寻卡并读卡的序列号if(status==0):piccserialStr=''for num in range(0,len(mypiccserial)):piccserialStr=piccserialStr+'%02x ' % (mypiccserial[num])print('7字节卡序号:'+ piccserialStr)status = Objdll.piccauthkey_ntag(mypicckey,mypiccntagpack) % 256if(status==0):Objdll.pcdbeep(38)print('卡密码认证成功!确认码为:%02x%02x' % (mypiccntagpack[0],mypiccntagpack[1]))else:PrintErrInf(status)else:PrintErrInf(status)elif(str(sys.argv[1])=='6'):  #轻松读卡,一次最多可读12页共48个字节的数据mypiccserial=bytes(7)     #7个字节卡序列号缓冲mypicckey=bytes(4)        #4个字节的认证密码缓冲mypiccdata=bytes(48)      #48个字节读卡的数据缓冲myblockaddr=4             #起始页地址myblocksize=10            #读卡页数myctrlword=0              #取值0不需要认证密码,16要认证卡密码if(myctrlword==16):mypicckey=bytes([eval('0x12'),eval('0x34'),eval('0x56'),eval('0x78')])     #4个字节的认证密码status = Objdll.piccreadex_ntag(myctrlword,mypiccserial,mypicckey,myblockaddr,myblocksize,mypiccdata) % 256if(status==0):Objdll.pcdbeep(38)piccserialStr=''for num in range(0,len(mypiccserial)):piccserialStr=piccserialStr+'%02x ' % (mypiccserial[num])print('7字节卡序号:'+ piccserialStr)ReadInf=''for num in range(0,myblocksize*4):ReadInf=ReadInf+'%02x ' % (mypiccdata[num])print('读出卡内数据:'+ ReadInf)else:PrintErrInf(status)elif(str(sys.argv[1])=='7'):  #轻松写卡,一次最多可读11页共44个字节的数据mypiccserial=bytes(7)     #7个字节卡序列号缓冲mypicckey=bytes(4)        #4个字节的认证密码缓冲myblockaddr=4             #起始页地址myblocksize=11            #读卡页数myctrlword=0              #取值0不需要认证密码,16要认证卡密码if(myctrlword==16):mypicckey=bytes([eval('0x12'),eval('0x34'),eval('0x56'),eval('0x78')])     #4个字节的认证密码#mypiccdata=bytes([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43])    #写入卡片内数据,一次最多写入44个字节#如果要写字符串等信息,将字符串转成字节数组写入Writeinf='伟大的中华人民共和国万岁!2020-weidadezhonhuarenmingongheguowangshi'Writeinf=Writeinf[0:44]                     #一个扇区最多写44个字节mypiccdata=bytes(Writeinf, encoding='gbk')  #将要写入的信息转bytesstatus = Objdll.piccwriteex_ntag(myctrlword,mypiccserial,mypicckey,myblockaddr,myblocksize,mypiccdata) % 256if(status==0):Objdll.pcdbeep(38)piccserialStr=''for num in range(0,len(mypiccserial)):piccserialStr=piccserialStr+'%02x ' % (mypiccserial[num])print('7字节卡序号:'+ piccserialStr+',写卡成功!')else:PrintErrInf(status)elif(str(sys.argv[1])=='8'):      #设置卡密码及保护机制mypicckey=bytes(4)            #4个字节的认证密码newPickey=bytes(4)            #4个字节的新密码mypiccserial=bytes(7)         #7个字节卡序列号缓冲EnOrDisKey=1                  #0开启密码保护功能,1取消密码保护功能ReadNeedKey=0                 #取值0读卡不需要认证密码,非0读卡也要认证密码myctrlword=16                 #取值0不需要认证密码,16要认证卡密码  对卡操作KeyErrNum=0                   #对卡操作允许密码错误次数(0为不限次)buf4=0mypiccdata=bytes([0,0,0])     #配置信息Barr3=bytes(1)Barr4=bytes(1)Barr5=bytes(1)Barr6=bytes(1)Barr7=bytes(1)Barr12=bytes(1)Barr13=bytes(1)Barr14=bytes(1)Barr15=bytes(1)if(myctrlword==16):           #本次带密码操作卡片mypicckey=bytes([eval('0x12'),eval('0x34'),eval('0x56'),eval('0x78')])     #4个字节的认证密码if(EnOrDisKey==0):            #卡片开启密码保护功能,开启后要记住卡密码,否则卡报废!!!myctrlword=myctrlword+4Barr3=bytes([20])         #配置:密码保护起始页,要根据不同类型的卡来设置myctrlword=myctrlword+1buf4=KeyErrNum % 8        #配置:最大卡密码认证错误次数if(ReadNeedKey>0):        #配置:读卡时需要认证卡密码buf4=buf4+eval('0x80')Barr4=bytes([buf4])myctrlword=myctrlword+2   #配置:启用计数器newPickey=bytes([eval('0x12'),eval('0x34'),eval('0x56'),eval('0x78')])     #配置:4个字节的新密码Barr12=bytes([eval('0x16')])Barr13=bytes([eval('0x16')])else:                         #卡片取消密码保护功能Barr3=bytes([eval('0xFF')])myctrlword=myctrlword+1myctrlword=myctrlword+2mypiccdata=mypiccdata+Barr3+Barr4+Barr5+Barr6+Barr7+newPickey+Barr12+Barr13+Barr14+Barr15  #拼接配置信息status = Objdll.piccinit_ntag(myctrlword,mypiccserial,mypicckey,mypiccdata) % 256if(status==0):Objdll.pcdbeep(38)piccserialStr=''for num in range(0,len(mypiccserial)):piccserialStr=piccserialStr+'%02x ' % (mypiccserial[num])print('7字节卡序号:'+ piccserialStr+',设置卡密码及保护机制成功!')else:PrintErrInf(status)else:print('请加入正确的参数运行程序')
else:print('\n')print('请加以下参数运行程序:')print('参数 0 驱动读卡器嘀一声')print('参数 1 读4个字节设备编号')print('参数 2 读7个字节卡序列号')print('参数 3 读卡内4个页的数据')print('参数 4 改写1个页的数据')print('参数 5 认证卡片密码')print('参数 6 轻松读卡,一次最多可读12页共48个字节的数据')print('参数 7 轻松写卡,一次最多可写11页共44个字节的数据')print('参数 8 设置卡密码及保护机制')sys.exit()

Python DLL 指针函数读写Ntag21x标签相关推荐

  1. python 类的执行中保部存值_Python DLL 读写Ntag21x标签

    #!/usr/bin/env python # -*- coding: utf-8 -*- #python -m pdb xxx.py 调试程度 n命令单步执行,s命令单步执行 会进入函数内部 b x ...

  2. python调用c函数传字符串参数_Python使用ctypes模块调用DLL函数之传递数值、指针与字符串参数...

    在Python语言中,可以使用ctypes模块调用其它如C++语言编写的动态链接库DLL文件中的函数,在提高软件运行效率的同时,也可以充分利用目前市面上各种第三方的DLL库函数,以扩充Python软件 ...

  3. python调用自定义函数返回值的类型_生成dll文件以及python对DLL中函数的调用(参数类型以及返回值)...

    工具:VS2010    python2.7 (若使用的python是64位的,生成的dll也要使用x64) 系统:win7pro 64bit 首先,dll工程的创建以及dll文件的生成: new p ...

  4. python调用dll函数_关于从加载的DLL调用函数的Python基本问题

    我是在搜索和尝试各种各样的例子后提出这个问题的,但我似乎无法从加载的DLL调用函数.我想如果有人能给我举一个例子,我就能理解我做错了什么,并取得一些进展.在 首先,使用Python 3.3.3可以加载 ...

  5. 教你如何运用python实现简单文件读写函数

    这篇文章主要为大家详细介绍了python实现简单文件读写函数,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 python作为脚本性语言,加上它的简便易用性.会经常当作脚 ...

  6. Python使用matplotlib函数subplot可视化多个不同颜色的折线图、在折线图上为每个数据点添加日期数据标签

    Python使用matplotlib函数subplot可视化多个不同颜色的折线图.在折线图上为每个数据点添加日期数据标签 目录

  7. Python使用matplotlib函数subplot可视化多个不同颜色的折线图、使用set_major_formatter函数自定义设置y轴数值标签格式为百分比

    Python使用matplotlib函数subplot可视化多个不同颜色的折线图.使用set_major_formatter函数自定义设置y轴数值标签格式为百分比 目录

  8. Python使用matplotlib函数subplot可视化多个不同颜色的折线图、在折线图上为每个数据点添加数值标签

    Python使用matplotlib函数subplot可视化多个不同颜色的折线图.在折线图上为每个数据点添加数值标签 目录

  9. Python matplotlib可视化:自定义轴标签格式化函数(在轴刻度上添加自定义的数值以及符号形式)、使用自定义函数在Matplotlib中为坐标轴刻度添加自定义符号(例如,货币符号¥$等)

    Python matplotlib可视化:自定义轴标签格式化函数(在轴刻度上添加自定义的数值以及符号形式).使用自定义函数在Matplotlib中为坐标轴刻度添加自定义符号(例如,货币符号¥$等) 目 ...

最新文章

  1. Linux ext2文件系统小结
  2. 商务部数据揭示了零售行业的哪些新趋势?
  3. VMD_test matlab仿真
  4. webdriver鼠标上下滑动
  5. 牛客题霸 [链表中环的入口节点] C++题解/答案
  6. VirtualBox 扩展虚拟硬盘容量
  7. python 桌面应用 启动缓慢_如何加快Python 应用的启动时间
  8. 【白皮书分享】2021年互联网人才招聘白皮书.pdf(附下载链接)
  9. AcWing 898. 数字三角形
  10. 使用Spring MVC实现数据绑定
  11. 软考数据库系统工程师教材改版啦
  12. atuo_ptr 实现
  13. 华为手机2.3亿出货量背后,一场技术+市场的胜利
  14. 开源项目——小Q聊天机器人V1.0
  15. Unity开发者的C#内存管理
  16. 从零搭建一个自动化运维体系
  17. 模式识别八--三层BP神经网络的设计与实现
  18. 仿抖音点赞效果实现 ——————自定义View
  19. layui table动态选中_ODME与动态交通分配——DTALite使用测评
  20. webInspect SprinBoot2.x安全整改

热门文章

  1. [又值奥运季] 2016年里约奥运会--8月21日赛事
  2. [HarmonyOS 2]小艺建议是什么,怎么使用?
  3. N盏灯排成一排,从1到N按顺序依次编号。有N个人也从1到N依次编号。第一个人将灯全部关闭。接着第二个人走过时,把凡是号码是2的倍数的灯的开关拉一下;第三个走过时,把凡是号码是3的倍数的灯的开关拉一下…
  4. 解决layui表格排序与后台数据返回顺序不一致
  5. java 时间取整 不满30分钟的算整点,大于30分钟的算30分钟
  6. 智慧人生 仁者见仁 与君共勉
  7. 剑网三体服服务器没显示,剑网3体验服安装说明及步骤 教你完成体服安装
  8. PMP证书含金量有多高?看完本文就知道!
  9. 连续三天熬夜次世代建模师终于出手,让老板多招女员工
  10. 解决USG6000V启动失败问题测试eNSP中服务器连通性