Python DLL 指针函数读写Ntag21x标签
#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标签相关推荐
- python 类的执行中保部存值_Python DLL 读写Ntag21x标签
#!/usr/bin/env python # -*- coding: utf-8 -*- #python -m pdb xxx.py 调试程度 n命令单步执行,s命令单步执行 会进入函数内部 b x ...
- python调用c函数传字符串参数_Python使用ctypes模块调用DLL函数之传递数值、指针与字符串参数...
在Python语言中,可以使用ctypes模块调用其它如C++语言编写的动态链接库DLL文件中的函数,在提高软件运行效率的同时,也可以充分利用目前市面上各种第三方的DLL库函数,以扩充Python软件 ...
- python调用自定义函数返回值的类型_生成dll文件以及python对DLL中函数的调用(参数类型以及返回值)...
工具:VS2010 python2.7 (若使用的python是64位的,生成的dll也要使用x64) 系统:win7pro 64bit 首先,dll工程的创建以及dll文件的生成: new p ...
- python调用dll函数_关于从加载的DLL调用函数的Python基本问题
我是在搜索和尝试各种各样的例子后提出这个问题的,但我似乎无法从加载的DLL调用函数.我想如果有人能给我举一个例子,我就能理解我做错了什么,并取得一些进展.在 首先,使用Python 3.3.3可以加载 ...
- 教你如何运用python实现简单文件读写函数
这篇文章主要为大家详细介绍了python实现简单文件读写函数,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 python作为脚本性语言,加上它的简便易用性.会经常当作脚 ...
- Python使用matplotlib函数subplot可视化多个不同颜色的折线图、在折线图上为每个数据点添加日期数据标签
Python使用matplotlib函数subplot可视化多个不同颜色的折线图.在折线图上为每个数据点添加日期数据标签 目录
- Python使用matplotlib函数subplot可视化多个不同颜色的折线图、使用set_major_formatter函数自定义设置y轴数值标签格式为百分比
Python使用matplotlib函数subplot可视化多个不同颜色的折线图.使用set_major_formatter函数自定义设置y轴数值标签格式为百分比 目录
- Python使用matplotlib函数subplot可视化多个不同颜色的折线图、在折线图上为每个数据点添加数值标签
Python使用matplotlib函数subplot可视化多个不同颜色的折线图.在折线图上为每个数据点添加数值标签 目录
- Python matplotlib可视化:自定义轴标签格式化函数(在轴刻度上添加自定义的数值以及符号形式)、使用自定义函数在Matplotlib中为坐标轴刻度添加自定义符号(例如,货币符号¥$等)
Python matplotlib可视化:自定义轴标签格式化函数(在轴刻度上添加自定义的数值以及符号形式).使用自定义函数在Matplotlib中为坐标轴刻度添加自定义符号(例如,货币符号¥$等) 目 ...
最新文章
- Linux ext2文件系统小结
- 商务部数据揭示了零售行业的哪些新趋势?
- VMD_test matlab仿真
- webdriver鼠标上下滑动
- 牛客题霸 [链表中环的入口节点] C++题解/答案
- VirtualBox 扩展虚拟硬盘容量
- python 桌面应用 启动缓慢_如何加快Python 应用的启动时间
- 【白皮书分享】2021年互联网人才招聘白皮书.pdf(附下载链接)
- AcWing 898. 数字三角形
- 使用Spring MVC实现数据绑定
- 软考数据库系统工程师教材改版啦
- atuo_ptr 实现
- 华为手机2.3亿出货量背后,一场技术+市场的胜利
- 开源项目——小Q聊天机器人V1.0
- Unity开发者的C#内存管理
- 从零搭建一个自动化运维体系
- 模式识别八--三层BP神经网络的设计与实现
- 仿抖音点赞效果实现 ——————自定义View
- layui table动态选中_ODME与动态交通分配——DTALite使用测评
- webInspect SprinBoot2.x安全整改
热门文章
- [又值奥运季] 2016年里约奥运会--8月21日赛事
- [HarmonyOS 2]小艺建议是什么,怎么使用?
- N盏灯排成一排,从1到N按顺序依次编号。有N个人也从1到N依次编号。第一个人将灯全部关闭。接着第二个人走过时,把凡是号码是2的倍数的灯的开关拉一下;第三个走过时,把凡是号码是3的倍数的灯的开关拉一下…
- 解决layui表格排序与后台数据返回顺序不一致
- java 时间取整 不满30分钟的算整点,大于30分钟的算30分钟
- 智慧人生 仁者见仁 与君共勉
- 剑网三体服服务器没显示,剑网3体验服安装说明及步骤 教你完成体服安装
- PMP证书含金量有多高?看完本文就知道!
- 连续三天熬夜次世代建模师终于出手,让老板多招女员工
- 解决USG6000V启动失败问题测试eNSP中服务器连通性