FM1208CPU卡读写函数说明
- 动态库简介
动态库OUR_MIFARE.dll用VC开发,编译成32位Release实体或64位Release实体,适用于WIN2000、XP、2003、win7的32或64位、win8编译和运行环境。本文档下面的源代码例子是C++的调用格式。
本动态库是本公司USB接口FM1208CPU卡读写器的配套文件,必须和读写器一起使用。
OUR_MIFARE.dll支持在软件运行中可以随时更换USB接口。本公司免驱型和有驱型读写器使用的OUR_MIFARE.dll不同,但函数的调用一样,如果客户程序开发好了,免驱型和有驱型互换时,只需更换对应的OUR_MIFARE.dll。
推荐使用动态调用的方法使用本动态库。
二、易用函数
我们把复杂的CPU卡认证、读、写过程集成转化为更简单的函数调用操作,即使是从未接触过一卡通开发的软件开发人员,写起程序来也毫不困难,一点都不浪费开发时间。开发人员不再需要花大量时间去了解CPU卡的内部机制,我们将它封装成五个函数:1、CPU卡CPU卡激活;2、初始化CPU卡;3、创建文件和删除文件;4、修改文件密码;5、读写文件。全国首创,只需十分钟就可轻松搞定CPU卡!。
第一步:CPU卡激活
函数名:cpurequest
功能 |
复位CPU卡成功,CPU卡进入14443A-4的协议模式,可以接着重复操作第二步进行调试了。 |
|
VB声明 |
Declare Function cpurequest Lib "OUR_MIFARE.dll" (ByVal serial As Long, ByVal param As Long, ByVal cosver As Long, ByVal code As Long) As Byte |
|
输入 |
1、serial只需指向一个至少已分配了4个char空间的可写数组 unsigned char *指针, serial的下标由0开始。如果在控制字中没有指定NEEDSERIAL ,则Serial数组的内容无需赋值,因为此数组仅用于返回值。如果指定了NEEDSERIAL,则必须为数组的内容赋值。 2、param只需指向一个至少已分配了4个char空间的可写数组 unsigned char *指针, param的下标由0开始。如果在控制字中没有指定NEEDSERIAL ,则param数组的内容无需赋值,因为此数组仅用于返回值。如果指定了NEEDSERIAL,则必须为数组的内容赋值。 3、myver一个字节空间,返回版本号。 4、myver一个字节空间,返回厂商代码号。 |
|
返回 |
||
返 回 值 说 明 |
0 |
复位CPU卡成功。 |
8 |
寻卡错误,根本就没有卡在感应区,*serial无效。 |
|
50 |
RATS错误,厂家调试代码,用户不需理会。 |
|
51 |
PPS错误,厂家调试代码,用户不需理会 |
|
52 |
已进入了14443-4协议状态,可进行CPU卡功能所有操作了。 |
|
53 |
CPU卡功能通讯错误。 |
|
其他 |
见函数返回代码表: |
第二步:初始化CPU卡:
函数名:cpursinit
功能 |
初始化函数,(ctrlword是否需要先清空卡,不需要清空的话,可以需输入卡密码,卡密码长度)ctrlword_0是否先清空卡,分配空间(字节数) |
|
VB声明 |
Declare Function cpursinit Lib "OUR_MIFARE.dll" (ByVal ctrlword As Byte, ByVal key As Long, ByVal keylen As Byte, ByVal customsize As Long) As Byte |
|
输入 |
1、ctrlword 0表示不清空已创建的文件,1表示将已创建的文件清除。 2、key 卡密码, (卡密码和文件没有任何关系,卡密码只是用来清空卡,读和写 文件是无效的)。是指向下标个数≤16的字节数组,用于存放卡密码。 3、keylen卡密码的长度。 4、customsize 设定应用空间的大小,要≤6121 。 |
|
返回 |
返回unsigned char值,并将卡分配成可用区间为customsize 个字节,并可以在此空间内创建文件,所有创建的文件大小总和不能大于customsize。 |
|
返 回 值 说 明 |
0 |
操作成功,写卡数据有效。 |
其他 |
见函数返回代码表: |
|
例子及注释 |
请要本公司网站下载各种开发工具的例子源代码,本函数的声明和输入参数格式可以直接套用,谢谢使用 |
第三步:创建文件
函数名:cpursfileadd
功能 |
创建好的文件不能删除,只能重新初始化卡来清除所有文件, |
|
VB声明 |
Declare Function cpursfileadd Lib "OUR_MIFARE.dll" (ByVal fileno As Byte, ByVal readonlykey As Long, ByVal readonlykeylen As Byte, ByVal writekey As Long, ByVal writekeylen As Byte, ByVal customsize As Long) As Byte |
|
输入 |
fileno为文件号,取值0-5; readonlykey指向存放只读密码的数组(≥readonlykeylen个char的密码数组); readonlykeylen 只读密码的长度; writekey指向存放读写密码的数组(≥writekeylen个char的密码数组); writekeylen 读写密码长度 customsize 文件大小; |
|
返回 |
返回unsigned char值。 |
|
返 回 值 说 明 |
0 |
操作成功,。 |
60 |
当前文件号已经存在,不能再次创建。 |
|
其他 |
见函数返回代码表: |
第四步:修改文件密码
函数名:cpursfilekeychg
功能 |
修改文件密码,修改后,请妥慎记住,否则该文件将无法再用。 |
|
VB声明 |
Declare Function cpursfilekeychg Lib "OUR_MIFARE.dll" (ByVal fileno As Byte, ByVal keytype As Byte, ByVal oldkey As Long, ByVal oldkeylen As Byte, ByVal newkey As Long, ByVal newkeylen As Byte) As Byte |
|
输入 |
Fileno为文件号,取值0-5; Keytype 认证密码 + 更改密码类型,0更改只读密码,1 更改读写密码,0 用只读密码认证,2 用读写密码认证; Oldkey指向存放旧文件密码的数组(≥Oldkeylen个char的密码数组); Oldkeylen 旧密码长度 Newkey指向存放新文件密码的数组(≥Newkeylen个char的密码数组); Newkeylen 新密码长度 |
|
返回 |
返回unsigned char值。 |
|
返 回 值 说 明 |
0 |
操作成功,。 |
其他 |
见函数返回代码表: |
第五步:读写文件内容
一、读卡函数名:cpursfiledataread
功能 |
读文件数据。 |
|
VB声明 |
Declare Function cpursfiledataread Lib "OUR_MIFARE.dll" (ByVal fileno As Byte, ByVal keytype As Byte, ByVal key As Long, ByVal keylen As Byte, ByVal startaddr As Long, ByVal databuf As Long, ByVal datalen As Long) As Byte |
|
输入 |
Fileno为文件号,取值0-5; Keytype 认证密码类型,0用只读密码认证,2 用读写密码认证; Key指向存放文件密码的数组(≥Keylen个char的密码数组); Keylen 文件密码长度; Startaddr 文件起始地址,≥0 Databuf是指向下标个数大于Datalen的字节数组,用于存放读取上来的数据, Datalen本次读取的长度,≥1 |
|
返回 |
返回unsigned char值。 |
|
返 回 值 说 明 |
0 |
操作成功。 |
其他 |
见函数返回代码表: |
二、写卡函数名:cpursfiledatawrite
功能 |
读文件数据。 |
|
VB声明 |
Declare Function cpursfiledatawrite Lib "OUR_MIFARE.dll" (ByVal fileno As Byte, ByVal keytype As Byte, ByVal key As Long, ByVal keylen As Byte, ByVal startaddr As Long, ByVal databuf As Long, ByVal datalen As Long) As Byte |
|
输入 |
Fileno为文件号,取值0-5; Keytype 认证密码类型,0用只读密码认证,2 用读写密码认证; Key指向存放文件密码的数组(≥Keylen个char的密码数组); Keylen 文件密码长度; Startaddr 文件起始地址,≥0 Databuf是指向下标个数大于Datalen的字节数组,用于存放要写入的数据, Datalen本次写卡的长度,≥1 |
|
返回 |
返回unsigned char值。 |
|
返 回 值 说 明 |
0 |
操作成功。 |
其他 |
见函数返回代码表: |
让读写器发出声音
函数名:pcdbeep
功能 |
让读写器发出声响。(暂不开放对指示灯的控制,如果有特殊要求请致电本公司) |
|
原始声明 |
unsigned char __stdcall pcdbeep(unsigned long xms) |
|
输入 |
xms为响声的时间长度,单位为2毫秒 |
|
返回 |
返回unsigned char值。 |
|
返 回 值 说 明 |
0 |
操作成功,。 |
22 |
动态库或驱动程序异常,解决方法是退出程序,拔出IC卡读写器,重装驱动程序再插上IC卡读写器重试,或者重新拷贝动态库OUR_MIFARE.dll到正确的位置。 |
|
24 |
操作超时。可能是电脑中毒导致USB帧传递调度缓慢,或者是IC卡读写器有问题,解决方法是重启电脑或重新拔插IC卡读写器。 |
|
27 |
USB传输不稳定导致传输的字符不全。不需理会这个错误,因为基本上是不会出现这个错误的。 |
|
28 |
USB传输不稳定导致CRC校验错。不需理会这个错误,因为基本上是不会出现这个错误的。 |
|
其他 |
未知错误 |
|
例子及注释 |
请要本公司网站下载各种开发工具的例子源代码,本函数的声明和输入参数格式可以直接套用,谢谢使用 |
- 可作为软件加密狗,轻松实现自己软件的产权保护。
函数名:pcdgetdevicenumber
功能 |
返回本读写器独一无二的设备编号,此编号固化在芯片中,并通过加密的方式传输。根据此编号可在本公司网站查询是否真正为本公司的质保产品。因为可以返回全球唯一的设备编号,所以只需增加少量的算法,本读写器也可作软件加密狗用。 |
|
原始声明 |
unsigned char __stdcall pcdgetdevicenumber(unsigned char *devicenumber) |
|
输入 |
devicenumber只需指向一个至少已分配了4个char空间的可写数组 unsigned char *指针, serial的下标由0开始。因为此数组仅用于返回设备编号。 |
|
返回 |
返回unsigned char值,并将寻到的卡的序列号传值到*serial数组。 |
|
返 回 值 说 明 |
0 |
操作成功,* devicenumber数组中的数据有效。 |
12 |
读取设备编号失败。 |
|
9 |
有多张卡在感应区,寻卡过程中防冲突失败,*serial无效。 |
|
10 |
该卡可能已被休眠,无法选中,但卡序列号已被读出,*serial数组中的数据有效。 |
|
22 |
动态库或驱动程序异常,解决方法是退出程序,拔出IC卡读写器,重装驱动程序再插上IC卡读写器重试,或者重新拷贝动态库OUR_MIFARE.dll到正确的位置。 |
|
24 |
操作超时。可能是电脑中毒导致USB帧传递调度缓慢,或者是IC卡读写器有问题,解决方法是重启电脑或重新拔插IC卡读写器。 |
|
28 |
USB传输不稳定导致CRC校验错。不需理会这个错误,因为基本上是不会出现这个错误的。 |
|
其他 |
未知错误 |
|
例子及注释 |
请要本公司网站下载各种开发工具的例子源代码,本函数的声明和输入参数格式可以直接套用,谢谢使用 |
函数返回代码表:
RetCode = 0 "操作成功"
RetCode = 8 "请重新拿开卡后再放到感应区"
RetCode = 50 "RATS错误,厂家调试代码,用户不需理会"
RetCode = 51 "PPS错误,厂家调试代码,用户不需理会"
RetCode = 52 "已进入了14443-4协议状态,可进行CPU卡功能所有操作了"
RetCode = 53 "CPU卡功能通讯错误"
RetCode = 54 "数据不足,需要接着发送未完成的数据至卡上"
RetCode = 55 "发送ACK指令给卡,让卡接着发送数据回来"
RetCode = 56 "清空根目录失败"
RetCode = 57 "卡片不支持功能"
RetCode = 58 "卡片初始化失败"
RetCode = 59 "分配的空间不足"
RetCode = 60 "本次操作的实体已存在"
RetCode = 61 "无足够空间"
RetCode = 62 "文件不存在"
RetCode = 63 "权限不足,有可能是用只读密码认证,导致无法更改读写密码或无法写文件"
RetCode = 64 "密码不存在,或密钥文件未创建"
RetCode = 65 "传送长度错误"
RetCode = 66 "Le错误,即接收的数据长度指定过大"
RetCode = 67 "功能不支持或卡中无MF 或卡片已锁定"
RetCode = 68 "密码认证错识次数过多,该密码已被锁死"
RetCode = 86 "更改后的密码长度必须和创建时的长度一致"
RetCode = 87 "应用目录不存在"
RetCode = 88 "应用文件不存在"
RetCode = 89 "文件号不能超过5"
RetCode = 90 "读取文件时返回的长度不足,数据可能不正确"
RetCode = 91 "一次读文件的长度不能超过255"
RetCode = 92 "一次写文件的长度不能超过247"
RetCode >= 70 And RetCode <= 85
"密码错误,剩余次数为" & CStr(RetCode - 70) & ",如果为0,该密码将锁死,无法再认证"
"未知错误"
vb6示例 https://download.csdn.net/download/zhangjin7422/2141877
FM1208-CPU卡VB6示例源码.rar-VB文档类资源-CSDN下载
c#示例 FM1208-CPU卡易写版C#示例源码.rar-C#文档类资源-CSDN下载
FM1208-CPU卡C#示例源码.rar-C#文档类资源-CSDN下载
python示例 FM1208-CPU卡Python示例源码.rar-Python文档类资源-CSDN下载
java示例 FM1208-CPU卡Java_Jna示例源码.rar-Java文档类资源-CSDN下载
delphi示例 FM1208-CPU卡DELPHI示例源码.rar-Delphi文档类资源-CSDN下载
FM1208CPU卡读写函数说明相关推荐
- 射频卡读写原理及实现
射频卡又称非接触式IC卡,它将RFID和IC技术完美结合,使卡片能够在不需要电源及与读卡器不接触的情况下正常工作.目前射频卡已经广泛使用在社会生活的各个领域,如银行卡.企业一卡通系统等.由于射频卡具有 ...
- android 6.0 sd卡读写权限,Android 6.0 读写SD卡权限问题
一.问题描述## Android 6.0 下默认存储SD卡,使用原生FMRadio生成的文件保存到内部存储中 [预置条件]插入T卡[操作步骤]设置>存储设备和USB>选择SD卡为默认存储& ...
- java做的web系统 m1 读卡器 结合_IE浏览器接入IC卡读写器实现M1卡的读写功能
基于ActiveX技术的ocx控件是实现网页上读写 IC卡的一个比较不错的方法,因为ocx是com组件,通过其发布的接口,IE可以实现所有的功能.ActiveX不仅能适应大部分编程语言,做到与编程语言 ...
- 简述sd卡2.0协议_【正点原子FPGA连载】第十二章SD卡读写TXT文本实验-领航者 ZYNQ 之嵌入式开发指南...
1)实验平台:正点原子领航者ZYNQ开发板 2)平台购买地址:https://item.taobao.com/item.htm?&id=606160108761 3)全套实验源码+手册+视频下 ...
- sdhc 读写 扇区 linux,SD卡读写扇区注意事项(转)
在调试SD卡时,大家都喜欢使用扇区进行验证.也就是说,一般都是通过读写扇区数据进行比较,或者读取第0扇区的数据,在通过WinHex软件打开启动扇区进行比较.这种方法对于1G的SD卡或部分2G的SD卡可 ...
- STM32-M3(野火)SD卡读写/移植znFAT文件访问系统
设备: STM32F103VE-M3,板载SD卡读写模块. 源码: 野火的SD卡扇区读写驱动,振南FAT的STM32版本. 另有1G-16G SD卡若干张. 移植过程: SD卡扇区读写驱动测试,SD卡 ...
- STM32CubeMX系列09——SDIO(SD卡读写、SD卡移植FATFS文件系统)
文章目录 1. 准备工作 1.1. 简单扫盲 1.1.1. SD卡 1.1.2. TF卡 1.1.3. SDIO接口 1.2. 所用硬件及原理图 2. 创建工程 2.1. 选择主控 2.2. 系统配置 ...
- ZYNQ-使用SD卡读写文本数据
学习内容 本文主要关于SD卡相关内容,然后使用SD卡进行TXT文本读写,并用串口打印出读写数据. 开发环境 vivado 18.3&SDK,PYNQ-Z2开发板. SD卡简介 SD卡(Secu ...
- 一种射频卡读写原理及实现
原文:http://bbs.dzsc.com/space/viewspacepost.aspx?postid=95408 非接触式IC卡又称射频卡,由IC芯片.感应天线组成,封装在一个标准的PVC卡片 ...
- SD卡提示函数不正确怎样办
硬盘损坏怎么恢复?硬盘是我们工作.学习和生活中常用的信息存储工具,因为容量大.价格便宜而深受人们的喜爱,因此硬盘也成为了我们一些重要信息的信息载具.SD卡提示函数不正确怎样办这时我们该如何恢复我们丢失 ...
最新文章
- JavaScript语言基础13
- SQL Plan Management介绍
- [云炬创业基础笔记]第二章创业者测试23
- 史上最简单MySQL教程详解(进阶篇)之存储过程(一)
- EclipseIDEA使用经验
- PX4 代码中 position_estimator_inav(互补滤波)理解
- Autodesk 3ds Max 渲染之后保存页面卡死问题
- 系统修复专家—SREng
- 编一程序,将两个字符串连接起来,不要用strcat函数。C语言
- MacBook关闭系统更新
- 被国人误解了千年的七句话
- 回溯算法--LeetCode-46 全排列、LeetCode-47 全排列Ⅱ
- 递归算法中的时间复杂度分析
- python的字典-使用字典+遍历字典+字典嵌套
- 神经网络调参-warmup and decay
- 做玫瑰花的方法 用纸_用纸折玫瑰花步骤图
- c语言 /= 和 *= 是什么意思?
- 大数据数据仓库建设流程概述
- python django-blog-zinnia
- Centos中nginx安装步骤(在线/离线)
热门文章
- 基于Python的贪吃蛇游戏设计
- PyQt5的笔记(中-1)
- share 接口的使用
- 软件项目管理实用教程(人民邮电出版)第二章课后习题
- 吉利汽车:数字化转型从上云开始
- python将xml写入excel_Python实现将xml导入至excel
- 转速测试软件app,实时显示行车速度app手机版-手机实时行车速度显示app(gps车速表)v1.6最新版_新绿资源网...
- MySQL高级进阶(三)、InnoDB存储引擎详解
- Proteus仿真:流水灯
- 如何判断电脑是否中毒(转)