精华内容
下载资源
问答
  • 华大多功能四合一HD-100多功能智能卡读写器配置使用教程一、简介二、配置使用三、代码分享 一、简介 华大HD-100多功能智能卡读写器作为IC卡系统集成必备的前端处理设备,极大地提高了系统的安全性和应用的方便性,能...

    华大多功能四合一HD-100多功能智能卡读写器OCX插件配置使用教程

    一、简介

    华大HD-100多功能智能卡读写器作为IC卡系统集成必备的前端处理设备,极大地提高了系统的安全性和应用的方便性,能更加优秀的服务于卫生、社保、二代证查询、工商、电信、邮政、税务、银行、保险、医疗以及各种收费、储值、查询等智能卡管理应用行业。

    1.HD-100有几种不同配置,功能分别如下:
    四合一:身份证、社保卡、磁条卡、就诊卡 (此次教程叫的就是四合一)
    三合一:社保卡、磁条卡、就诊卡

    2.华大HD-100多功能读卡器产品特点:

    • 支持 ISO/IEC 7816-1/2/3 标准 CPU 卡,T=0、T=1、逻辑加密卡及memory卡,社保卡、医保卡等

    • 支持 Mifare 卡和符合 ISO14443 标准的 A 类和 B 类卡,ISO 15693 等卡片, 通讯速率最高支持 424 Kbps

    • 支持身份证卡片

    • 支持 4个 PSAM 卡安全模块、支持高速 PSAM 卡安全交易认证,符合 ISO7816 标准

    • 安装方便,可靠性高,适合联机使用

    • 全速 USB 接口, RS232,以太网等

    • 人机界面:一个指示灯,指示电源和操作状态

    • 支持在线程序升级,提供 Windows/Linux/Unix 等各种平台下的应用程序标 准 DLL 动态库接口

    二、配置使用

    读卡器图片,如下图

    在这里插入图片描述


    注意:安装前先把360等杀毒软件退出,否则可能会影响读卡器的正常使用
    准备:先将读卡机设备连接到电脑usb接口,确定连接成功之后在进行一下操作

    1.以管理员点击运行(华大多合一控件安装.exe)文件,如下图

    在这里插入图片描述

    2. 安装时一直点击下一步即可,安装成功会显示以下页面

    在这里插入图片描述

    3.完成安装之后打开页面时需要使用 360浏览器或者IE浏览器 打开浏览器–>工具–>Internet选项–>自定义级别 (Internet和本地Internet都需要设置),如下图

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    4.选择启用

    在这里插入图片描述


    5.选择 是,之后打开页面之后选择兼容模式

    在这里插入图片描述

    6.选择允许阻止内容

    在这里插入图片描述

    7.选择 是

    在这里插入图片描述

    8.选择 是

    在这里插入图片描述

    9.硬件配置已完成接下来就可以使用啦!


    三、代码分享

    1.华大读卡器会给一套js代码,首先,需要引入到页面中进行调用。

    <script th:src="@{/js/common/hd_card.js}"></script>
    

    hd_card.js的代码内容如下:

    // version:2019011
    // 华大读卡器 head 中加 <OBJECT classid=clsid:A02C6AFF-89E7-41232-9DF3-508DD546543F9E2 width=0 height=0 align="center" id="bsHDdev" HSPACE=0 VSPACE=0></OBJECT>
    /** ***************基础工具*********************** */
    
    /**
     * 华大读卡器。读身份证或社保卡。返回:{type:类型, realname:姓名,gender:性别,nation:民族,brithday:出生日期,address:家庭住址,idCardNum:身份证号, sidCardNum:社保号, photoBase64: 照片base64字符串}
     */
    function tg_readCard4HD(deviceObjectId, slot) {
        var result = tg_readIdCard4HD(deviceObjectId); // 先读身份证
        if (!result.success) { // 身份证读取失败
            result = tg_readSidCard4HD(deviceObjectId, slot); // 读取社保卡
        }
        return result;
    }
    /**
     * 华大读卡器。读身份证 返回:{type:类型, realname:姓名,gender:性别,nation:民族,brithday:出生日期,address:家庭住址,idCardNum:身份证号, photoBase64: 照片base64字符串}<br>
     * 相片显示:document.getElementById("photo").src="data:image/png;base64,"+photoBase64;
     */
    function tg_readIdCard4HD(deviceObjectId) {
        var result = { // 返回结果
            type : 'idCard' // 身份证
        };
        var deviceObject = document.getElementById(deviceObjectId); // 得到设备控件 deviceObjectId
        var readResult = deviceObject.iReaderIDCard("C:\\zp.jpg"); // 读卡,传入照片路径
        if (readResult == 0) { // 读卡成功
            var cardInfo = deviceObject.pOutInfo;
            var base64Str = deviceObject.base64Data;
            var idCardInfo = cardInfo.split('|').slice(0, 6);
            result.success = true;
            result.realname = idCardInfo[0];
            result.gender = idCardInfo[1];
            result.nation = idCardInfo[2];
            result.brithday = idCardInfo[3];
            result.address = idCardInfo[4];
            result.idCardNum = idCardInfo[5];
            result.photoBase64 = base64Str;
        } else { // 读卡失败
            console.log(deviceObject.pMsgErr);
        }
        return result;
    }
    
    /**
     * 华大读卡器。读社保卡 返回:{type:类型, sidCardNum:社保号,idCardNum:身份证号,realname:姓名,gender:性别,nation:民族,brithday:生日}
     */
    function tg_readSidCard4HD(deviceObjectId, slotParm) {
        var result = { // 返回结果
            type : 'sidCard' // 社保卡
        };
        var deviceObject = document.getElementById(deviceObjectId); // 得到设备控件 deviceObjectId
        var slot = 17; // 传入卡座号 17 -20
        if (slotParm) {
            slot = slotParm;
        }
        var readResult = deviceObject.iReadSicard(slot); // 读卡
        if (readResult == 0) { // 读卡成功
            var cardInfo = deviceObject.pOutInfo;
            var scardInfo = cardInfo.split('|').slice(0, 6);
            result.success = true;
            result.sidCardNum = scardInfo[0];
            result.idCardNum = scardInfo[1];
            result.realname = scardInfo[2];
            result.gender = scardInfo[3];
            result.nation = scardInfo[4];
            result.brithday = scardInfo[5];
        } else { // 读卡失败
            console.log(deviceObject.pMsgErr);
        }
        return result;
    }
    
    

    2.会有一个object classid 需要引入,下面的是我乱写的classid,每个设备都不一样。

    <object classid="clsid:A02C6AFF-89E7-41232-9DF3-508DD546543F9E2" id="bsHDdev" width="0" height="0" hspace="0" vspace="0" />
    

    3.页面使用代码示例(会自带测试页面也可以使用)

    <div class="layui-card layadmin-header">
        <div class="layui-breadcrumb" lay-filter="breadcrumb">
            <a lay-href="">主页</a> <a><cite>会员业务</cite></a> <a href="#/manage/member/"><cite>挂号</cite></a>
        </div>
        <object classid="clsid:A02C6AFF-89E7-41232-9DF3-508DD546543F9E2" id="bsHDdev" width="0" height="0" hspace="0" vspace="0" />
    </div>
    <!--/*******页面内容*******/-->
    <div class="layui-fluid">
        <div class="layui-card">
            <div class="layui-card-body">
                <form id="tg_member_add_form" lay-filter="tg_member_add_form_filter" class="layui-form layui-form-pane">
                    <!--/*防止重复提交*/-->
                    <!--<input name="tgAvoidRepeatSubmitToken" th:value="" type="text" hidden="true" />-->
                    <div class="layui-form-item">
                        <div class="layui-inline">
                            <div class="layui-input-inline">
                                <img src="" id="photoBase64" />
                            </div>
                        </div>
                    </div>
                    <div class="layui-form-item">
                        <div class="layui-inline">
                            <label class="layui-form-label">姓名<span style="color: red"> *</span></label>
                            <div class="layui-input-inline">
                                <input name="realname" id="realname" disabled placeholder="请输入姓名"  required maxlength="31" autocomplete="off" autofocus="autofocus" class="layui-input" type="text" />
                            </div>
                        </div>
                    </div>
                    <div class="layui-form-item">
                        <div class="layui-inline">
                            <label class="layui-form-label">性别<span style="color: red"> *</span></label>
                            <div class="layui-input-inline">
                                <input id="genderStr" disabled placeholder="请输入性别"  required maxlength="31" autocomplete="off" autofocus="autofocus" class="layui-input" type="text" /> 
                                <input id="gender" name="gender" type="text" hidden="true" />
                            </div>
                        </div>
                    </div>
                    <div class="layui-form-item">
                        <div class="layui-inline">
                            <label class="layui-form-label">民族<span style="color: red"> *</span></label>
                            <div class="layui-input-inline">
                                <input name="nation" id="nation" disabled placeholder="请输入民族"  required maxlength="31" autocomplete="off" autofocus="autofocus" class="layui-input" type="text" />
                            </div>
                        </div>
                    </div>
                    <div class="layui-form-item">
                        <div class="layui-inline">
                            <label class="layui-form-label">出生日期<span style="color: red"> *</span></label>
                            <div class="layui-input-inline">
                                <input name="brithday" id="brithday" disabled placeholder="请输入出生日期"  required maxlength="31" autocomplete="off" autofocus="autofocus" class="layui-input" type="text" />
                            </div>
                        </div>
                    </div>
                    <div class="layui-form-item">
                        <div class="layui-inline">
                            <label class="layui-form-label">身份证号<span style="color: red"> *</span></label>
                            <div class="layui-input-inline">
                                <input name="idCardNum" id="idCardNum" disabled placeholder="请输入身份证号"  required maxlength="31" autocomplete="off" autofocus="autofocus" class="layui-input" type="text" />
                            </div>
                        </div>
                    </div>
                    <div class="layui-form-item">
                        <div class="layui-inline">
                            <label class="layui-form-label">社保号<span style="color: red"> *</span></label>
                            <div class="layui-input-inline">
                                <input name="sidCardNum" id="sidCardNum" disabled placeholder="请输入社保号"  required maxlength="31" autocomplete="off" autofocus="autofocus" class="layui-input" type="text" />
                            </div>
                        </div>
                    </div>
                    <div class="layui-form-item">
                        <label class="layui-form-label">地址<span style="color: red"> *</span></label>
                        <div class="layui-input-block">
                            <input name="address" id="address" disabled placeholder="请输入地址"  required maxlength="31" autocomplete="off" autofocus="autofocus" class="layui-input" type="text" />
                        </div>
                    </div>
                    <div class="layui-form-item">
                        <div class="layui-input-block">
                            <div class="layui-footer">
                                <input type="button" id="tg_readCard_add_submit_but" value="读卡" class="layui-btn layui-btn-lg layui-btn-normal" lay-submit="" lay-filter="tg_readCard_add_submit_but_filter">
                                <button id="tg_member_add_form_submit_but" lay-filter="tg_member_add_form_submit_but_filter" class="layui-btn layui-btn-lg" lay-submit="">挂号</button>
                            </div>
                        </div>
                    </div>
                </form>
            </div>
        </div>
    </div>
    <!--/*******当前页js*******/-->
    <script>
        layui.use([ 'member', 'form', 'layer' ], function() {
            var member = layui.member, form = layui.form, $ = layui.$, layer = layui.layer;
            form.render(null, 'tg_member_add_form_filter'); // 渲染该模板动态表单
            // 监听读卡 
            form.on('submit(tg_readCard_add_submit_but_filter)', function(data) {
                var result = tg_readCard4HD("bsHDdev", 17);
                if (result.success) {
                    // 设置input值
                    $("#realname").attr("value", result.realname); // 姓名
                    $("#genderStr").attr("value", result.gender); // 性别
                    if(result.gender == "男"){
                        $("#gender").attr("value", 1);
                    } else {
                        $("#gender").attr("value", 2);
                    }
                    var year = result.brithday.substr(0, 4);
                    var month = result.brithday.substr(4, 2);
                    var day = result.brithday.substr(6, 2);
                    $("#nation").attr("value", result.nation); // 民族
                    $("#brithday").attr("value", year + "-" + month + "-" + day); // 出生日期
                    $("#address").attr("value", result.address); // 地址
                    $("#idCardNum").attr("value", result.idCardNum); // 身份证号
                    $("#sidCardNum").attr("value", result.sidCardNum); // 社保号
                    if( result.photoBase64 != null ){
                        $("#photoBase64").attr("src", 'data:image/jpeg;base64,' + result.photoBase64); // 照片base6
                    }
                    // 读卡提交到后台的值
                    data.field.realname = result.realname; // 姓名
                    data.field.gender = $("#gender").val(); // 性别
                    data.field.nation = result.nation; // 民族
                    data.field.brithday = year + "-" + month + "-" + day; // 出生日期
                    data.field.address = result.address; // 地址
                    data.field.idCardNum = result.idCardNum; // 身份证号
                    data.field.sidCardNum = result.sidCardNum; // 社保号
                    data.field.photoBase64 = result.photoBase64; // 照片base6
                 tg_submitForm('tg_readCard_add_submit_but', BASE_URL + 'm/cardRecord/add.htm', data.field, function(d) {
                }); 
                return false; // 阻止form跳转
                }
            });
            // 监听提交 
            form.on('submit(tg_member_add_form_submit_but_filter)', function(data) {
                if(data.field.realname != ""){
                    tg_submitForm('tg_member_add_form_submit_but', BASE_URL + 'm/signRecord/add.htm', data.field, function(d) {
                        tg_alert_success_location('/manage/member/show/id=' + data.field.idCardNum); // 成功提醒并跳转
                    });
                }else{
                    layer.msg("请读取卡片");
                }
                return false; // 阻止form跳转
            }); 
        });
    </script>
    

    以上就是华大多功能四合一HD-100多功能智能卡读写器配置的使用教程,希望可以帮助到你,如有疑问欢迎私信探讨交流。

    展开全文
  • 本文实例讲述了Yii实现数据库主从读写分离的方法。分享给大家供大家参考。具体分析如下: Yii框架数据库数据库、主从、读写分离 实现,功能描述: 1.实现主从数据库读写分离 主库:写 从库(可个):读 2.主数据库...
  • IC卡读写器开发说明

    千次阅读 2018-09-15 15:41:32
    动态库简介 动态库OUR_MIFARE.dll用VC开发,编译成32位Release实体或64位...本动态库是本公司USB接口IC卡读写器的配套文件,必须和读写器一起使用。 OUR_MIFARE.dll支持在软件运行中可以随时更换USB接口。本公司免...
    
    

    动态库OUR_MIFARE.dll用VC开发,编译成32位Release实体或64位Release实体,适用于WIN2000、XP、2003、win7的32或64位、win8编译和运行环境。本文档下面的源代码例子是C++的调用格式。

    本动态库是本公司USB接口IC卡读写器的配套文件,必须和读写器一起使用。

    OUR_MIFARE.dll支持在软件运行中可以随时更换USB接口。本公司免驱型和有驱型读写器使用的OUR_MIFARE.dll不同,但函数的调用一样,如果客户程序开发好了,免驱型和有驱型互换时,只需更换对应的OUR_MIFARE.dll。

    推荐使用动态调用的方法使用本动态库。

    本读写器支持的IC卡内部存储结构知识:

    1、ISO14443 TYPE A标准的Mifare One系列卡(含S50卡),容量为1K字节。Mifare One卡的内部存储结构分为16个扇区,从第0区到第15区,每个扇区有独立的密码和权限控制字,可作为独立的电子钱包,每个扇区有4个块,序号为第0块、第1块、第2块、第3块,每块16个字节,第3块是卡的密码和权限控制字专用块,禁止在此存放数据。第0块、第1块、第2块可随意存放数据。但第0区的第0块已被固化了IC卡出厂信息,此块只能读出信息,不可更改。

    每张卡都有一个全球统一的4个字节的序列号。许多公司销售的读卡器只有读取卡序列号的功能,也能用于一般的考勤系统。但这类读卡器跟本公司的读写器有着本质的不同,本公司的读写器不仅能读序列号,而且还有服务于IC卡所有用途的功能,比如选中卡、认证、读卡、写卡、改密码、休眠卡能功能。

    2、ISO14443 TYPE A标准的S70卡,容量为4K字节。共40个扇区,也就是40个独立电子钱包,其中0~31扇区为普通区,区定义与以上的S50卡相同。32~39区为大数据区,每区有16个块,第15块是卡的密码和权限控制字专用块,第0~14块为数据块,每块16个字节,共有224个字节可用。

    二、易用函数

    大部份软件、一卡通公司,只要使用以下二个函数完全可以达到软件需求,比如读出信息、读出金额、扣费等等。

    轻松读卡函数名:piccreadex

    功能

    超强读卡,使用此函数可以一次性读整个区的第0块、第1块、第2块共3块的信息,并且返回卡序列号。

    原始声明

    unsigned char __stdcall piccreadex(unsigned char ctrlword,unsigned char *serial,unsigned char area,unsigned char keyA1B0,unsigned char *picckey,unsigned char *piccdata0_2)

    输入

    1、ctrlword读卡的控制字,ctrlword是一个字节,相当于八个位,每个位只有0和1两种状态:

    推荐使用方法如下:

    //先定义以下常量

    #define BLOCK0_EN   0x01

    #define BLOCK1_EN   0x02

    #define BLOCK2_EN   0x04

    #define NEEDSERIAL  0x08

    #define EXTERNKEY   0x10

    举例:

    //以下控制字含义:读块0、块1、块2,仅读指定序列号的卡,需要每次指定密码

    Ctrlword = BLOCK0_EN + BLOCK1_EN + BLOCK2_EN + NEEDSERIAL+ EXTERNKEY

    //以下控制字含义:读块0、块2,可读任意卡,需要每次指定密码

    Ctrlword = BLOCK0_EN + BLOCK2_EN +  EXTERNKEY

    //以下控制字含义:读块0、块2,可读任意卡,启用芯片内部密码

    Ctrlword = BLOCK0_EN + BLOCK2_EN

     

    2、serial只需指向一个至少已分配了4个char空间的可写数组 unsigned char *指针, serial的下标由0开始。如果在控制字中没有指定NEEDSERIAL ,则Serial数组的内容无需赋值,因为此数组仅用于返回值。如果指定了NEEDSERIAL,则必须为数组的内容赋值。

    3、area是需要读出的区号,则0-15中的某个数。

    4、keyA1B0为0时以B密码来认证,为非0时以A密码来认证。刚出厂的卡以A密码来认证。

     

    5、*picckey 指向存放卡密码的数组(6个char的密码数组)。

     

    6、*piccdata0_2是指向下标个数大于48的字节数组,用于存放3个块的数据,其中下标0~15存放作为读出的块0的数据,下标16~31存放作为读出的块1的数据,下标32~47存放作为读出的块2的数据,

    返回

    返回unsigned char值,并将卡本块的数据传值到*piccdata指向的数组中。

    0

    操作成功,读出的数据有效。

    1

    0~2块都没读出来,可能刷卡太块。但卡序列号已被读出来。

    2

    第0块已被读出,但1~2块读取失败。卡序列号已被读出来。

    3

    第0、1块已被读出,但2块读取失败。卡序列号已被读出来。

    8

    寻卡错误,根本就没有卡在感应区,*serial无效。

    9

    有多张卡在感应区,寻卡过程中防冲突失败,*serial无效。

    10

    该卡可能已被休眠,无法选中,但卡序列号已被读出,*serial数组中的数据有效。

    11

    密码装载失败。

    12

    密码认证失败。

    22

    动态库或驱动程序异常,解决方法是退出程序,拔出IC卡读写器,重装驱动程序再插上IC卡读写器重试,或者重新拷贝动态库OUR_MIFARE.dll到正确的位置。

    24

    操作超时。可能是电脑中毒导致USB帧传递调度缓慢,或者是IC卡读写器有问题,解决方法是重启电脑或重新拔插IC卡读写器。

    27

    USB传输不稳定导致传输的字符不全。不需理会这个错误,因为基本上是不会出现这个错误的。

    28

    USB传输不稳定导致CRC校验错。不需理会这个错误,因为基本上是不会出现这个错误的。

    其他

    未知错误

    例子及注释

    请要本公司网站下载各种开发工具的例子源代码,本函数的声明和输入参数格式可以直接套用,谢谢使用

     

    轻松写卡函数名:Piccwriteex

    功能

    超强写卡,使用此函数可以一次性写整个区的第0块、第1块、第2块信息。

    原始声明

    unsigned char __stdcall piccwriteex(unsigned char ctrlword,unsigned char *serial,unsigned char area, unsigned char keyA1B0,unsigned char *picckey,unsigned char *piccdata0_2)

    输入

    1、ctrlword读卡的控制字,ctrlword是一个字节,相当于八个位,每个位只有0和1两种状态:

    推荐使用方法如下:

    //先定义以下常量

    #define BLOCK0_EN   0x01

    #define BLOCK1_EN   0x02

    #define BLOCK2_EN   0x04

    #define NEEDSERIAL  0x08

    #define EXTERNKEY   0x10

    #define NEEDHALT   0x20

    举例:

    //以下控制字含义:读块0、块1、块2,仅写指定序列号的卡,需要每次指定密码,写成功后休眠卡

    Ctrlword = BLOCK0_EN + BLOCK1_EN + BLOCK2_EN + NEEDSERIAL+ EXTERNKEY + NEEDHALT

    //以下控制字含义:写块0、块2,可写任意卡,需要每次指定密码, 写成功后休眠卡

    Ctrlword = BLOCK0_EN + BLOCK2_EN +  EXTERNKEY + NEEDHALT

    //以下控制字含义:写块0、块2,可写任意卡,启用芯片内部密码,写成功后休眠卡

    Ctrlword = BLOCK0_EN + BLOCK2_EN + NEEDHALT

     

    2、serial只需指向一个至少已分配了4个char空间的可写数组 unsigned char *指针, serial的下标由0开始。如果在控制字中没有指定NEEDSERIAL ,则Serial数组的内容无需赋值,因为此数组仅用于返回值。如果指定了NEEDSERIAL,则必须为该数组的内容赋值。

     

    3、area是需要准备写的区号,则0-15中的某个数。

     

    4、keyA1B0为0时以B密码来认证,为非0时以A密码来认证。刚出厂的卡以A密码来认证。

     

    5、*picckey 指向存放卡密码的数组(6个char的密码数组)。

     

    6、*piccdata0_2是指向下标个数大于48的字节数组,用于存放3个块的数据,其中下标0~15存放作为准备写的块0的数据,下标16~31存放作为准备写的块1的数据,下标32~47存放作为准备写的块2的数据,

    返回

    返回unsigned char值,并将卡本块的数据传值到*piccdata指向的数组中。

    0

    操作成功,写卡数据有效。

    1

    0~2块都没写进去,可能刷卡太块。

    2

    第0块已写进去,但1~2块写失败。

    3

    第0、1块已被写进去,但2块读写失败。

    8

    寻卡错误,根本就没有卡在感应区,*serial无效。

    9

    有多张卡在感应区,寻卡过程中防冲突失败,*serial无效。

    10

    该卡可能已被休眠,无法选中,但卡序列号已被读出,*serial数组中的数据有效。

    11

    密码装载失败。

    12

    密码认证失败

    22

    动态库或驱动程序异常,解决方法是退出程序,拔出IC卡读写器,重装驱动程序再插上IC卡读写器重试,或者重新拷贝动态库OUR_MIFARE.dll到正确的位置。

    24

    操作超时。可能是电脑中毒导致USB帧传递调度缓慢,或者是IC卡读写器有问题,解决方法是重启电脑或重新拔插IC卡读写器。

    27

    USB传输不稳定导致传输的字符不全。不需理会这个错误,因为基本上是不会出现这个错误的。

    28

    USB传输不稳定导致CRC校验错。不需理会这个错误,因为基本上是不会出现这个错误的。

    其他

    未知错误

    例子及注释

    请要本公司网站下载各种开发工具的例子源代码,本函数的声明和输入参数格式可以直接套用,谢谢使用

    以上函数是在已知卡密码的情况下操作。如果需要更改卡密码可通过piccchangesinglekey函数,快速地更改卡密码,piccchangesinglekey详细介绍请查看下面第12页。

     

    让读写器发出声音 函数名: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校验错。不需理会这个错误,因为基本上是不会出现这个错误的。

    其他

    未知错误

    例子及注释

    请要本公司网站下载各种开发工具的例子源代码,本函数的声明和输入参数格式可以直接套用,谢谢使用

     

    功能

    • 其他函数大全

    函数名:piccrequest

    功能

    寻卡并返回该卡的序列号

    原始声明

    unsigned char __stdcall piccrequest(unsigned char *serial)

    输入

    形参*serial只需指向一个至少已分配了4个char空间的可写数组 unsigned char *指针, serial的下标由0开始。Serial数组的内容无需赋值,因为此数组仅用于返回值。

    返回

    返回unsigned char值,并将寻到的卡的序列号传值到*serial数组。

    0

    操作成功,*serial数组中的数据有效。

    8

    寻卡错误,根本就没有卡在感应区,*serial无效。

    9

    有多张卡在感应区,寻卡过程中防冲突失败,*serial无效。

    10

    该卡可能已被休眠,无法选中,但卡序列号已被读出,*serial数组中的数据有效。

    22

    动态库或驱动程序异常,解决方法是退出程序,拔出IC卡读写器,重装驱动程序再插上IC卡读写器重试,或者重新拷贝动态库OUR_MIFARE.dll到正确的位置。

    24

    操作超时。可能是电脑中毒导致USB帧传递调度缓慢,或者是IC卡读写器有问题,解决方法是重启电脑或重新拔插IC卡读写器。

    28

    USB传输不稳定导致CRC校验错。不需理会这个错误,因为基本上是不会出现这个错误的。

    其他

    未知错误

    例子及注释

    /*******************{{piccrequest函数使用特例*********************************/

            //卡序列号缓冲

            unsigned char myserial[4];

            unsigned char status;

            //函数指针声明

            unsigned char (__stdcall *piccrequest)(unsigned char *serial);

            //提示当前目录

            AnsiString FileName=ExtractFilePath(Application->ExeName);

             //如果中没有"\"字符,就加进去

            if(FileName.SubString(FileName.Length(),1) != "\\")

            {

                 FileName += "\\";

            }

     

            //调用读卡函数,如果没有寻到卡返回1,拿卡太快返回2,没注册发卡机返回4,没有驱动程序返回3

            FileName += "OUR_MIFARE.dll";

            if(!FileExists(FileName))

            {//如果文件不存在

                    ShowMessageb("无法在应用程序的文件夹找到IC卡读写卡器动态库");

                    return; //返回

            }

            HINSTANCE hDll;

            //加载动态库

            hDll=LoadLibrary(FileName.c_str());

            //提取动态库

            piccrequest = (unsigned char (__stdcall *piccrequest)(unsigned char *serial))GetProcAddress(hDll,"piccread");

            //调用函数

            status = piccrequest(myserial);

            //返回值处理

            switch(status)

            {

                    case 0:

                            //TO-DO相应的处理,请在以下加入代码

                            break;

                    case 1:

                            break;

                    //...

             }

    注:原始声明指动态库的VC源码内的声明。

    函数名:piccrequestex

    功能

    寻卡并选中指定序列号的IC卡,必须指定序列号

    原始声明

    unsigned char __stdcall piccrequestex (unsigned char *serial)

    输入

    形参*serial只需指向一个至少已分配了4个char空间的数组 unsigned char *指针, serial的下标由0开始, serial数组的值为需要寻卡选卡的卡序列号。

    返回

    返回unsigned char值,并将寻到的卡的序列号传值到*serial数组。

    0

    操作成功,*serial数组中的数据有效。

    8

    寻卡错误,根本就没有卡在感应区,*serial无效。

    9

    有多张卡在感应区,寻卡过程中防冲突失败,*serial无效。

    10

    该卡可能已被休眠,无法选中,但卡序列号已被读出,*serial数组中的数据有效。

    22

    动态库或驱动程序异常,解决方法是退出程序,拔出IC卡读写器,重装驱动程序再插上IC卡读写器重试,或者重新拷贝动态库OUR_MIFARE.dll到正确的位置。

    24

    操作超时。可能是电脑中毒导致USB帧传递调度缓慢,或者是IC卡读写器有问题,解决方法是重启电脑或重新拔插IC卡读写器。

    28

    USB传输不稳定导致CRC校验错。不需理会这个错误,因为基本上是不会出现这个错误的。

    其他

    未知错误

    例子及注释

    /*******************{{piccrequestex函数使用特例*********************************/

            //卡序列号缓冲

            unsigned char myserial[4];

            unsigned char status;

            //函数指针声明

            unsigned char (__stdcall *piccrequestex)(unsigned char *serial);

            //提示当前目录

            AnsiString FileName=ExtractFilePath(Application->ExeName);

             //如果中没有"\"字符,就加进去

            if(FileName.SubString(FileName.Length(),1) != "\\")

            {

                 FileName += "\\";

            }

     

            //调用读卡函数,如果没有寻到卡返回1,拿卡太快返回2,没注册发卡机返回4,没有驱动程序返回3

            FileName += "OUR_MIFARE.dll";

            if(!FileExists(FileName))

            {//如果文件不存在

                    ShowMessageb("无法在应用程序的文件夹找到IC卡读写卡器动态库");

                    return; //返回

            }

            HINSTANCE hDll;

            //加载动态库

            hDll=LoadLibrary(FileName.c_str());

            //提取动态库

            piccrequestex = (unsigned char (__stdcall *piccrequestex)(unsigned char *serial))GetProcAddress(hDll," piccrequeste");

            //调用函数

            Myserial[0] = 0x18;

            Myserial[1] = 0x18;

            Myserial[2] = 0x18;

            Myserial[3] = 0x18;

            //调用函数

            status = piccrequestex (myserial);

            //返回值处理

            switch(status)

            {

                    case 0:

                            //TO-DO相应的处理,请在以下加入代码

                            break;

                    case 1:

                            break;

                    //...

             }

     

    函数名:piccauthkey1

    功能

    密码认证方式1,用外部密码认证,必须指定外部密码。本函数必须在piccrequest或piccrequestex函数执行之后运行,并且要紧接着调用,中途不能调用其他函数。

    原始声明

    unsigned char __stdcall piccauthkey1(unsigned char *serial,unsigned char area,unsigned char keyA1B0,unsigned char *picckey)

    输入

    1、*serial指向存放选中卡序列号的数组,此序列号必须是选中卡的。

    2、area是需要认证的区号,0-15中的某个数。

    3、keyA1B0为0时以B密码来认证,为非0时以A密码来认证。刚出厂的卡以A密码来认证。

    4、*picckey 指向存放卡密码的数组(6个char的密码数组)。

    返回

    返回unsigned char值。

    0

    操作成功,该卡的密码已认证通过,可以进运读写操作了。

    11

    密码装载失败。

    12

    密码认证失败。

    22

    动态库或驱动程序异常,解决方法是退出程序,拔出IC卡读写器,重装驱动程序再插上IC卡读写器重试,或者重新拷贝动态库OUR_MIFARE.dll到正确的位置。

    24

    操作超时。可能是电脑中毒导致USB帧传递调度缓慢,或者是IC卡读写器有问题,解决方法是重启电脑或重新拔插IC卡读写器。

    27

    USB传输不稳定导致传输的字符不全。不需理会这个错误,因为基本上是不会出现这个错误的。

    28

    USB传输不稳定导致CRC校验错。不需理会这个错误,因为基本上是不会出现这个错误的。

    其他

    未知错误

    例子及注释

     

     

    函数名:piccauthkey2

    功能

    密码认证方式2,用芯片内部密码认证,该密码存放在芯片的只写区域(用pcdwritekeytoe2写密码),认证时通过芯片内部纳米线路传输,保密性极强,能小心剖开芯片,再用连上纳米线路拦截恐怕只有请外星人出马了。本函数必须在piccrequest或piccrequestex函数执行之后运行,并且要紧接着调用,中途不能调用其他函数。

    原始声明

    unsigned char __stdcall piccauthkey2(unsigned char *serial,unsigned char area,unsigned char keyA1B0)

    输入

    1、*serial指向存放选中卡序列号的数组(4个char),此序列号必须是选中卡的。

    2、area是需要认证的区号,0-15中的某个数。

    3、keyA1B0为0时以B密码来认证,为非0时以A密码来认证。刚出厂的卡以A密码来认证。

    返回

    返回unsigned char值。

     

    0

    操作成功,该卡的密码已认证通过,可以进运读写操作了。

    11

    密码装载失败。

    12

    密码认证失败。

    22

    动态库或驱动程序异常,解决方法是退出程序,拔出IC卡读写器,重装驱动程序再插上IC卡读写器重试,或者重新拷贝动态库OUR_MIFARE.dll到正确的位置。

    24

    操作超时。可能是电脑中毒导致USB帧传递调度缓慢,或者是IC卡读写器有问题,解决方法是重启电脑或重新拔插IC卡读写器。

    27

    USB传输不稳定导致传输的字符不全。不需理会这个错误,因为基本上是不会出现这个错误的。

    28

    USB传输不稳定导致CRC校验错。不需理会这个错误,因为基本上是不会出现这个错误的。

    其他

    未知错误

    例子及注释

     

     

    函数名:pcdwritekeytoe2

    功能

    将密码写入芯片内部保密性极高的只写区域,此函数写入密码仅仅是为了piccauthkey2函数的使用。

    原始声明

    unsigned char __stdcall pcdwritekeytoe2(unsigned char area,unsigned char keyA1B0,unsigned char *picckey)

     

    输入

    1、area是需要认正的区号,0-15中的某个数。

    2、keyA1B0为0时以B密码来认证,为非0时以A密码来认证。刚出厂的卡以A密码来认证。

    3、*picckey 指向存放卡密码的数组(6个char的密码数组)。

    返回

    返回unsigned char值。

     

    0

    写密码成功

    15

    写密码错误

    22

    动态库或驱动程序异常,解决方法是退出程序,拔出IC卡读写器,重装驱动程序再插上IC卡读写器重试,或者重新拷贝动态库OUR_MIFARE.dll到正确的位置。

    24

    操作超时。可能是电脑中毒导致USB帧传递调度缓慢,或者是IC卡读写器有问题,解决方法是重启电脑或重新拔插IC卡读写器。

    27

    USB传输不稳定导致传输的字符不全。不需理会这个错误,因为基本上是不会出现这个错误的。

    28

    USB传输不稳定导致CRC校验错。不需理会这个错误,因为基本上是不会出现这个错误的。

    其他

    未知错误

    例子及注释

     

     

    函数名:piccread

    功能

    读出一块的数据,也就是16个字节。必须在执行piccrequest或

           Piccrequestex函数,接着执行piccauthkey1或 piccauthkey2函数,然后执行piccread才能成功读出一块的数据。 

    原始声明

    unsigned char __stdcall piccread(unsigned char block,unsigned char *piccdata)

    输入

    1、block是IC卡的绝对块号,当需要读IC卡的第x区的第y块时,绝对块号必须是block = x * 4 + y。

    2、*piccdata是指向下标个数大于16的数组,作为返回16个字节的卡数据的缓存。

    返回

    返回unsigned char值,并将卡本块的数据传值到*piccdata指向的数组中。

    0

    操作成功,读出的数据有效。

    13

    读本块失败,原因是本块所对应的区还没通过密码认证。

    22

    动态库或驱动程序异常,解决方法是退出程序,拔出IC卡读写器,重装驱动程序再插上IC卡读写器重试,或者重新拷贝动态库OUR_MIFARE.dll到正确的位置。

    24

    操作超时。可能是电脑中毒导致USB帧传递调度缓慢,或者是IC卡读写器有问题,解决方法是重启电脑或重新拔插IC卡读写器。

    27

    USB传输不稳定导致传输的字符不全。不需理会这个错误,因为基本上是不会出现这个错误的。

    28

    USB传输不稳定导致CRC校验错。不需理会这个错误,因为基本上是不会出现这个错误的。

    其他

    未知错误

    例子及注释

     

    函数名:piccwrite

    功能

    读出一块的数据,也就是16个字节。必须在执行piccrequest或

           Piccrequestex函数,接着执行piccauthkey1或 piccauthkey2函数,然后执行piccwrite才能成功写进一块的数据。      

    原始声明

    unsigned char __stdcall piccwrite(unsigned char block,unsigned char *piccdata)

    输入

    1、block是IC卡的绝对块号,当需要读IC卡的第x区的第y块时,绝对块号必须是block = x * 4 + y。

    2、*piccdata是指向下标个数大于16的数组,特别提醒在调用piccwrite之前,必须对piccdata数组明确赋值,千万不能写进不明数据,特别对是存放卡权限的第3块,更要明确写入,否则极有可能导致卡作废。

    返回

    返回unsigned char值。

    0

    操作成功,写进数据有效。

    14

    写本块失败,原因是本块所对应的区还没通过密码认证。。

    22

    动态库或驱动程序异常,解决方法是退出程序,拔出IC卡读写器,重装驱动程序再插上IC卡读写器重试,或者重新拷贝动态库OUR_MIFARE.dll到正确的位置。

    24

    操作超时。可能是电脑中毒导致USB帧传递调度缓慢,或者是IC卡读写器有问题,解决方法是重启电脑或重新拔插IC卡读写器。

    27

    USB传输不稳定导致传输的字符不全。不需理会这个错误,因为基本上是不会出现这个错误的。

    28

    USB传输不稳定导致CRC校验错。不需理会这个错误,因为基本上是不会出现这个错误的。

    其他

    未知错误

    例子及注释

     

     

     

    函数名:picchalt

    功能

    休眠选中卡,卡一旦被休眠,将不能再次被选中、不能被读被写。必须得拿卡离开感应区,再次放卡才能再次选中和读写卡。休眠卡功能一般用在只能操作一次的情况下,比如刷一次卡只扣一次钱的情况。      

    原始声明

    unsigned char __stdcall picchalt()

    输入

    不用输入

    返回

    返回unsigned char值。

    0

    操作成功,。

    22

    动态库或驱动程序异常,解决方法是退出程序,拔出IC卡读写器,重装驱动程序再插上IC卡读写器重试,或者重新拷贝动态库OUR_MIFARE.dll到正确的位置。

    24

    操作超时。可能是电脑中毒导致USB帧传递调度缓慢,或者是IC卡读写器有问题,解决方法是重启电脑或重新拔插IC卡读写器。

    27

    USB传输不稳定导致传输的字符不全。不需理会这个错误,因为基本上是不会出现这个错误的。

    28

    USB传输不稳定导致CRC校验错。不需理会这个错误,因为基本上是不会出现这个错误的。

    其他

    未知错误

    例子及注释

     

     

    函数名:piccchangesinglekey

    功能

    改单区密码。

    原始声明

    unsigned char __stdcall piccchangesinglekey(unsigned char ctrlword,unsigned char *serial,unsigned char area , unsigned char keyA1B0,unsigned char *piccoldkey,unsigned char *piccnewkey)

    输入

    1、ctrlword读卡的控制字,ctrlword是一个字节,相当于八个位,每个位只有0和1两种状态:

    推荐使用方法如下:

    //先定义以下常量

    #define NEEDSERIAL  0x08

    举例:

    //以下控制字含义:仅更改指定序列号的卡密码

    Ctrlword = NEEDSERIAL

    //以下控制字含义:更改任意卡密码

    Ctrlword = 0

     

    2、serial只需指向一个至少已分配了4个char空间的可写数组 unsigned char *指针, serial的下标由0开始。如果在控制字中没有指定NEEDSERIAL ,则Serial数组的内容无需赋值,因为此数组仅用于返回值。如果指定了NEEDSERIAL,则必须为该数组的内容赋值。

     

    3、area是需要准备写的区号,则0-15中的某个数。

     

    4、keyA1B0为0时以B密码来认证,为非0时以A密码来认证。刚出厂的卡以A密码来认证。

     

    5、* piccoldkey指向存放卡原始密码的数组(6个char的密码数组)。

     

    6、* piccnewkey指向存放卡新密码(也就是准备改成的密码)的数组(6个char的密码数组)。

    返回

    返回unsigned char值,并将卡本块的数据传值到*piccdata指向的数组中。

    0

    操作成功,写卡数据有效。

    8

    寻卡错误,根本就没有卡在感应区,*serial无效。

    9

    有多张卡在感应区,寻卡过程中防冲突失败,*serial无效。

    10

    该卡可能已被休眠,无法选中,但卡序列号已被读出,*serial数组中的数据有效。

    11

    密码装载失败。

    12

    密码认证失败

    13

    刷卡太快

    14

    刷卡太快

    22

    动态库或驱动程序异常,解决方法是退出程序,拔出IC卡读写器,重装驱动程序再插上IC卡读写器重试,或者重新拷贝动态库OUR_MIFARE.dll到正确的位置。

    24

    操作超时。可能是电脑中毒导致USB帧传递调度缓慢,或者是IC卡读写器有问题,解决方法是重启电脑或重新拔插IC卡读写器。

    27

    USB传输不稳定导致传输的字符不全。不需理会这个错误,因为基本上是不会出现这个错误的。

    28

    USB传输不稳定导致CRC校验错。不需理会这个错误,因为基本上是不会出现这个错误的。

    其他

    未知错误

    例子及注释

    请要本公司网站下载各种开发工具的例子源代码,本函数的声明和输入参数格式可以直接套用,谢谢使用

     

    修改卡片扇区密码

    函数名:piccchangesinglekeyex

    功能

    改单区密码,可同时修改A密码,或密码权限访问字(密码权限编码)或B密码。

    原始声明

    unsigned char __stdcall piccchangesinglekeyex(unsigned char ctrlword,unsigned char *serial,unsigned char area,unsigned char keyA1B0,unsigned char *piccoldkey,unsigned char *piccdata)

    输入

    1、ctrlword读卡的控制字,ctrlword是一个字节,相当于八个位,每个位只有0和1两种状态:

    推荐使用方法如下:

    //先定义以下常量

    #define NEEDSERIAL  0x08

    举例:

    //以下控制字含义:仅更改指定序列号的卡密码

    Ctrlword = NEEDSERIAL

    //以下控制字含义:更改任意卡密码

    Ctrlword = 0

     

    2、serial只需指向一个至少已分配了4个char空间的可写数组 unsigned char *指针, serial的下标由0开始。如果在控制字中没有指定NEEDSERIAL ,则Serial数组的内容无需赋值,因为此数组仅用于返回值。如果指定了NEEDSERIAL,则必须为该数组的内容赋值。

     

    3、area是需要准备写的区号,则0-15中的某个数。

     

    4、keyA1B0为0时以B密码来认证,为非0时以A密码来认证。刚出厂的卡以A密码来认证。

     

    5、* piccoldkey指向存放卡原始密码的数组(6个char的密码数组)。

     

    6、* piccdata指向存放卡新A密码(也就是准备改成的密码)、密码权限访问字、新B密码的数组、指定更改项目的标志(17个char的数组)。其中新A密码6个字节;密码权限访问字4个字节;新B密码6个字节;指定更改项目的标志为1个字节,这个字节为3是表示同时更改A、B、 密码权限访问字,为2表示密码权限访问字不更改,只改A、B密码,为0表示只改A密码

    返回

    返回unsigned char值,并将卡本块的数据传值到*piccdata指向的数组中。

    0

    操作成功,写卡数据有效。

    8

    寻卡错误,根本就没有卡在感应区,*serial无效。

    9

    有多张卡在感应区,寻卡过程中防冲突失败,*serial无效。

    10

    该卡可能已被休眠,无法选中,但卡序列号已被读出,*serial数组中的数据有效。

    11

    密码装载失败。

    12

    密码认证失败

    13

    刷卡太快

    14

    刷卡太快

    22

    动态库或驱动程序异常,解决方法是退出程序,拔出IC卡读写器,重装驱动程序再插上IC卡读写器重试,或者重新拷贝动态库OUR_MIFARE.dll到正确的位置。

    24

    操作超时。可能是电脑中毒导致USB帧传递调度缓慢,或者是IC卡读写器有问题,解决方法是重启电脑或重新拔插IC卡读写器。

    27

    USB传输不稳定导致传输的字符不全。不需理会这个错误,因为基本上是不会出现这个错误的。

    28

    USB传输不稳定导致CRC校验错。不需理会这个错误,因为基本上是不会出现这个错误的。

    30

    密码权限访问字(密码权限编码)校验错误,不允许更改,以免造成卡永久损坏。

    其他

    未知错误

    例子及注释

    请要本公司网站下载各种开发工具的例子源代码,本函数的声明和输入参数格式可以直接套用,谢谢使用

     

    展开全文
  • 转载请注明出处Ext中文网 ...   预览ExtJS 4.0的新功能(六):读写器/Opeartion 许久未更新Blog了,跟大家说声不好意思,要不是工作特忙,以及游戏特吸引人,不然早就写完了,呵呵。当然还离不开夜兄的好言鼓励

     转载请注明出处Ext中文网http://www.ajaxjs.com )。

     

    预览ExtJS 4.0的新功能(六):读写器/Opeartion

    许久未更新Blog了,跟大家说声不好意思,要不是工作特忙,以及游戏特吸引人,不然早就写完了,呵呵。当然还离不开夜兄的好言鼓励,一路有大伙总比一个人不知所然强多了。

    下面内容大多源自翻译……

    Ext.data.Reader

    相信我们并不陌生Reader。虽然Ext 4.0的reader依然发挥着它的解析原始数据的职能,主要是转换特定的数据结构,不过由于新加入数据模型的缘故,整体出发仍需要Reader配合。由于新的 需求被提出,Reader也进行了重构,就是今天我们所看到的新Reader类!

    Reader负责解析加载到Model或Store的数据,通常值的是AJAX请求完毕后的那些数据。要告诉Reader类怎么工作,实际就是在配置Model或Sotre的时候说明清楚Reader该怎么做。参阅它们的文档或者更好。

    Reader可以按照 Ext.data.Association 的定义为每个model所设定的规则读取复杂多层的数据。如下一个例子充分说明了怎么在一个财务CRM中灵活地透析模型与数据之间操作。首先时定义一些模型:

    Edit 2011-9-22 示例代码可能与最新版本的 Ext Model 有区别,但不影响主干意思——感谢 Thanks to QiuQiu/太阳。

    看上去工作量不少,我们只需要知道,用户有许多张订单,其中每张订单有不同的货物组成。它们的实体数据演示如下:

    返回的JSON层数很多,包括有全部用户(出于演示目的暂且一个)以及用户下面的全部订单(演示一个)以及每张订单里面具体有什么货品(演示两个),最后就是Product关联与OrderItem。于是,我们可以这样地读取和使用数据:

    运行上述代码的结果会如下:

    Orders for Ed:
    Order ID: 50, which contains items:
    2 orders of MacBook Pro
    3 orders of iPhone

    Ext.data.Writer

    Writer首次出现在Ext 3.0的API,目的是在针对写操作时,提供一个健全的API。Writer在4.0中得到加强和改善。

    客户端如何“写”数据?这里的“写”只是为了方便描述页面上的数据发生了变化,需要保存到服务端的这么一个过程。Ext API中,对应的就有Read 读的这么一个过程。CRUD是一个极简洁的抽象过程,Read/Writer也是抽象出的一种普通动作。Store记录的数据没有被保存的话,仍是客户端上内存反映的数据。我们必须透过一些定义良好的界面类将数据保存到服务端之中、数据库之中。这时Writer就发挥作用了。整体API中,Writer的发生过程与Request、Operation有关。

    Writer通常为ServerProxy其子类所使用。该类的作用是让Operation与Ext.data.Request之间产生关系,具体说就是根据Operations修改请求对象。例如 Ext.data.JsonWriter会根据配置项参数格式化操作对象及其Ext.data.Model实例。配置项参数来自哪里?原来是来自JsonWriter的构造器参数。

    Writer的关键方法便是write(),该方法接受有一个Request类型对象的参数,实际上是经过Request、Operation对象的records属性,获取到基于JSON结构的记录实体,收集要“写入”的那些数据,然后再通过模板方法getRecordData()转换数据格式,保存到writeRecords()中(writeRecords()也是一个模板方法)。故所以,客户端的数据必须转换为特定的格式发送到服务端的。当前,Writer下面提供了两个子类JsonWriter和XMLWriter,代表可以支持JSON/XML的这两种经典数据格式。

    另外一点,Writer终端的服务端对象并不包括LocalStorge本地储存。

    Operation

    单个Operation类表征了Proxy在进行单个读或者写的时候的具体操作,多个Operation可以批处理为一个Batch(Ext.data.Batch)。Operation对象用于激活Stores和Proxy之间操作,但是必须提出,开发人员通常不会直接和Operation对象打交道,也就是Ext API会内部使用Operation。

    转载请注明出处Ext中文网http://www.ajaxjs.com)。

     

     

    展开全文
  • NFC应用(二)读写器模式

    千次阅读 2013-05-07 13:02:46
    既然有卡,当然就会有读写器,这两种模式是配合在一起使用的。两个卡放一起不能通信,两个读写器模式的设备也不能通信。 NFC读写器一般支持以下一种或多种协议:Mifare、ISO 14443 TypeA、ISO 14443 TypeB、...

    NFC第二种应用场境就是所谓的读写器模式。既然有卡,当然就会有读写器,这两种模式是配合在一起使用的。两个卡放一起不能通信,两个读写器模式的设备也不能通信。

    NFC读写器一般支持以下一种或多种协议:MifareISO 14443 TypeAISO 14443 TypeBFeliCa,然后通过串口或USB等接口与主机进行连接。

    随着NFC的普及,目前越来越多的手机内置了NFC功能,其中一个实用功能就是NFC读写器模式。手机可以与NFC卡片进行数据交互,实与读余额或获取少量标签信息。

    应用场景一,读银行卡、交通卡余额和交易记录。手机读取余额后通过手机屏幕显示给用户,有了这种手机,用户就无需到地铁站或公交上才能查到自己的余额。更可以时刻查询交易记录,检查是否被误扣费了,十分方便。

    应用场景二,读取非接触式标签的内容。以前去到朋友家需要用网络时,少不了问他是哪个AP,密码是什么,而目前可以简单地把家里的AP和密码通过工具写在NFC Tag标签中,贴在家里,朋友来只要轻轻一触即可连接你家的WIFI,十分方便。同样的原理,也可以用在获取海报信息、商家位置、机场地图、折扣券信息等场合。

    应用场景三,食堂、停车场等场合的发卡、充值、扣费,门禁应用,公共交通等等。

    以下,为大家带来一些实用信息。

    NFC手机:Galaxy S 2及此系列以上机型、Galaxy Note系列、Sony Xperia系列、Nexus 4Nexus 7、HTC One X、OPPO Find5、小米 A2、华为Ascend P2MOTOMB855等。

    读公交卡应用:NFCard,碰碰米等。

    NFC Tag读写应用:NFC TagWriter by NXP、飞云NFC、快拍NFC等。


    展开全文
  • 奥地利微电子AS3990 UHF RFID读写器开发板使用指南(一) (2012-02-14 15:27) 标签:  读写器  奥地利  微电子  开发  接口  原文:http://blog.chinaunix.net/uid-10604457-id-3072596.html ...
  • RFID技术、RFID电子标签、读写器

    万次阅读 2013-10-15 17:43:13
    DK,即设备套件(用户软件应用程序),它可以控制一个固定式读写器,也可以同时控制读写器同时工作,而对于这些读写器的识别,会通过调用相应方式的初始化API,而该函数是需要提供一个初始化句柄参数返回对应的句柄,则...
  • Smartcard 读写器函数库的使用说明

    千次阅读 2012-08-16 08:23:29
    使用者要使用卡片阅读机时,必须安装厂商提供之驱动程序(drivers),开发应用程序。 PC/SC(Personal Computer/Smart Card)支持ISO7816-4的基本指令集,界定了IC卡、卡片阅读机及操作系统的责任与分工,各家卡片阅读...
  • vb使用open方法读写文件

    万次阅读 2008-05-26 12:41:00
    vb使用open方法读写文件 (一)打开和关闭文件 1、顺序文件 打开顺序文件,我们可以使用Open语句。它的格式如下: Open pathname
  • 物联12:实习一 读写器的性能测试

    千次阅读 2015-05-27 08:25:47
     熟悉读写器使用,了解读写器的性能,熟悉常用测试方法。 二.实训环境  实训所用设备。 1.电脑 2. FR105高频近距离协议读写器。支持15963、14443A 14443B多种协议。相关的技术参数如下。  型号:rf105  电源...
  • 数据库主从和读写分离的配置和使用方法 TP: ThinkPHP是一个开源的PHP框架,是为了简化企业级应用开发和敏捷WEB应用开发而诞生的。ThinkPHP可以支持windows/Unix/Liunx等服务器环境,正式版需要PHP5.0以上版本支持...
  • IC卡读写器技术及应用

    千次阅读 2008-12-29 00:03:00
    前言 IC卡读写器又叫IC卡读写机具,它是遵循一定的协议,与IC卡建立通信关系,对IC卡进行读写操作的工具。随着IC卡在社会各领域的广泛应用,各种各样的IC卡读写机具也应运而生。为了帮助大家对IC卡读写器有一个较为...
  • 1. 真正USB2.0接口,而不是一般的USB转串口的模式,通讯稳定快速。 2. 由电脑USB接口提供稳定的5V电话,无需外接电源,并内置电源保护。...每个读写器拥有唯一的产品ID号,此ID号可作为软件加密狗之用。
  • 物联12:读写器-rfid系统的核心

    千次阅读 2015-03-07 21:06:55
    在rfid系统中,读写器有处于核心地位,是rfid系统的主要部件。它向上联系上位机,向下通过天线沟通电子标签,其基本功能是将数据加密后发给电子标签,并将电子标签返回的数据解密,然后送给计算机。RFID读写器一般配...
  • 网页调用智能IC卡读写器的解决方案

    千次阅读 2014-09-15 15:28:10
    一、 把智能IC卡读写器的开发接口做成OCX或ActiveX控件    和几家做IC卡读写设备的厂商的工程师沟通过,通常的做法是把IC卡读写器的开发接口封装成OCX控件或ActiveX。使用的时候需要先安装这些控件然后才能...
  • ReentrantLock属于排他锁,这些锁在同一时刻只允许一个线程进行访问,而读写锁在同一时刻可以允许个线程访问,但是在写线程访问时,所有的读和其他写线程都被阻塞。读写锁维护了一对锁,一个读锁和一个写锁,通过...
  • java使用nio读写文件

    千次阅读 2019-11-16 15:49:45
    这个效率通过简单的对比可以说明问题了,NIO在操作大文件读写时,性能优势就体现出来了,下面附上通过NIO操作文件读写的几个方法,后面做参考使用 /** * NIO读写文件工具类 */ public class NIOFileUtil ...
  • 两项新的RFID读写器技术发布

    千次阅读 2007-01-17 12:56:00
    Gen2读写器生产厂家ThingMagic发布了MercuryOS操作系统的升级版 - Yagi,MercuryOS是ThingMagic标志性产品Mercury读写器的操作系统。新升级操作系统的版本号为 MercuryOS 2.4。据ThingMagic公司称,在一些应用实例中...
  • 文件的进程读写

    千次阅读 2013-09-17 16:50:10
    一直以为进程读写文件是安全的,只有fflush和fclose才会真正修改文件内容,诸多开源项目的日志系统也基本都是线程的,asterisk同样没有为ast_log建立一个专门的日志线程,而是各自调用,通过fflush直接写缓存。...
  • 大文件线程读写操作

    千次阅读 2018-07-03 00:52:40
    对于一个比较大的数据文件, 如:20G, 每一行为一个数据单元,在不进行文件切割的前提下, 想利用线程处理文件中的每行数据。 如果依次读取文件中每一行并处理则处理速度较慢较慢; 全部读取再处理机器的内存不能...
  • 安卓app的文件读写方法

    千次阅读 2016-02-29 17:18:07
    最近在学习安卓,总结记录下app读写文件的位置和方法; 安卓的app可以读写的位置为: 1、内置data目录下对应app名称的目录; 2、扩展SD卡(包括虚拟的内置SD卡和外置SD卡); 那么先讲讲内置data目录下...
  • R读写Excel文件中数据的方法

    千次阅读 2014-09-01 14:29:07
    用R语言读写Excel的方法有很,但每种方法都有让人头疼的地方,如xlsx包的代码复杂,只支持Excel2007;RODBC不易理解,限制太,程序不稳定,会出各种怪毛病。另存为csv格式的方法倒是比较通用比较稳定,但又存在...
  • android OTG (USB读写,U盘读写)最全使用相关总结

    万次阅读 多人点赞 2018-04-29 10:36:49
    androidOTG (USB读写,U盘读写) 最全使用相关总结 简介 第一种读取方法:android推荐使用的通过endpoint的形式进行通信 第二种读取方法:像读你sdcard的形式来读你的U盘设备 注意注意注意 提示 博主:来自...
  • 软硬件准备 NFC Reader Tool 手机上的IC卡读写编辑软件,搭配蓝牙或者OTG读卡器使用,可实现在手机上破解门禁卡的功能,是本文的主角。软件付费使用,一次注册终身可用,注册是作者持续更新的动力。该软件功能稳定...
  • 使用MySQL Router实现高可用、负载均衡、读写分离

    万次阅读 多人点赞 2018-07-18 19:25:04
    3. 使用 二、安装配置 三、自动失败切换 四、负载均衡 五、读写分离 六、实例 1. 环境 2. 配置文件 3. 功能测试 参考: 一、MySQL Router简介  MySQL Router是MySQL官方提供的一个轻量级中间件,可以...
  • 读写ini文件的方法

    千次阅读 2006-05-08 19:37:00
    在我们写的程序当中,总有一些配置信息需要保存下来,以便完成程序的功能,最简单的办法就是将这些信息写入INI文件中,程序初始化时再读入.具体应用如下: 一.将信息写入.INI文件中. 1.所用的WINAPI函数原型为: BOOL ...
  • pandas读写Excel文件的3种方法介绍

    千次阅读 2020-07-13 11:04:17
    pandas读写Excel文件的3种方法 直接读取与保存 ###pandas 最新版是sheet_name df = pd.read_excel(’./tips.xlsx’,sheetname=‘test1’) df.to_excel(‘tips2.xlsx’) 新的改变 我们对Markdown编辑进行了一些功能...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 295,499
精华内容 118,199
关键字:

多功能读写器使用方法