产品名称 StudyRfid
文档版本 RFID测试程序说明 V2.0

[J2ME]华禹工控 RFID 测试程序设计说明

1 背景和功能

1.1. RFID 测试程序的概念

一个可以下载到华禹手持设备(P1300、P1220、P1500 系列)上的刷卡程序,用于测试华禹手持设备的刷卡功能,能够执行刷卡查询和消费功能。

1.2. 如何体验 RFID 测试程序

下载 StudyRfid.jad 和 StudyRfid.jar 到华禹手持设备上,执行Java程序,可体验刷卡程序。

1.3. RFID 测试程序界面

下面是 StudyRfid 程序的界面(从模拟器中抓取):

图1:
图2:

上图是从模拟器上抓取的程序运行图片,当打开之后会进入到图 1-1,点击后进入图 1-2。第一个选项为查询功能,第二个为消费功能。第三个是设置扣款金额。第四个是使用说明。

2 设计思路

2.1. JNI 的概念

Java 本地接口(Java Native Interface (JNI))允许运行在Java虚拟机(Java Virtual Machine (JVM))上的代码调用本地程序和类库,或者被它们调用,这些程序和类库可以是其它语言编写的,比如C、C++或者汇编语言。当一个程序无法完全使用Java编写时,开发者可以通过JNI来编写本地方法。

2.2. StudyRfid中的包

2.2.1 com.mtk

com.mtk包中的Gpio.java中操作GPIO的方法为华禹提供的JNI方法。

2.2.2 com.huayu.gpio

com.huayu.gpio 包中的 GpioPort.java 定义了华禹手持设备的 GPIO 控制引脚。
对 Gpio 操作更详细的介绍见《华禹工控DIY手机GPIO测试程序设计说明》

2.2.3 其它

com.demo.control 包 GUIController.java 是界面控制的类。
com.demo.view是界面显示的包。所有界面显示的类都在该包中。
com.demo.comm是包中的CommonResource.java是公共资源类。
com.huayu.studyRfid.midlet包中StudyRfidDemoMidelet.java为MIDLet类。

2.3RFID 工作原理

基于华禹平台的手持 RFID 刷卡设备由三部分组成:
1. java 程序:演示程序是 RfidDemo 或者 studyRfid 。
2. 操作系统固件,按照设备型号可分为 P1300、P1220、P1500 等系列。
3. 单片机固件。
java 程序通过串口与单片机通信,并通过 gpio 控制单片机的电源。
读卡操作时,java 程序发送读卡命令,接收到单片机固件返回的卡信息,解析后显示。
写卡操作时,java 程序发送写卡命令,接收到单片机固件返回的成功或者失败信息后,显示结果。

2.4 读卡具体程序示例

2.4.1 打开串口

打开串口前判定是否在手持机上使用,调用
System.getProperty("microedition.platform");
如果得到值为" Sun",判定其在模拟器上使用
s_commUrl = s_commUrlEmu;
当值不为" Sun",判定其在真机上使用
s_commUrl = s_commUrlDevice;
s_commUrlEmus_commUrlDevice赋值与说明:
s_commUrlDevice = "tckcomm:1;baudrate=115200;blocking=off;autocts=off;autorts=off";
s_commUrlEmu= "comm:COM3;baudrate=115200;blocking=off;autocts=off;autorts=off";
COM3 为实际使用的串口。

查看实际使用的串口的方法: 打开我的电脑属性选项,然后点开设备管理器,可看见实际使用的串口。
如图 1-3。

打开串口线程:

cc = (CommConnection) Connector.open(url);
in = cc.openInputStream();
out = cc.openOutputStream();
m_start = true;
new readT().start();

CommConnection 打开手持机的串口
通过 openInputStream 得到输入流;
openOutputStream 得到输出流
同时启动数据接收线程。

接收线程:

While(m_start) {
    int len = in.available();
    if(len != 0) {
        byte[] bData = new byte[len];
        int iRet = in.read(bData);
    }
    Thread.sleep(100);
}

2.4.2 打开模拟开关连接串口与 RFID 单片机的串口

在华禹平台上,可能存在一个串口两种用途的情况。
例如,条码和 RFID 共用一个串口,模拟开关用于控制串口的实际用途。
P1300_SWITCH_PIN 为 P1300 平台上模拟开关的控制脚,
当该 GPIO 脚设置为 P1300_RFID_SWITCH 时,P1300 的串口与 RFID 单片机串口的接通。
P1300:gp.WriteIO(P1300_RFID_SWITCH, P1300_SWITCH_PIN);
P1500 平台:
P1500:gp.WriteIO(P1500_RFID_SWITCH, P1500_SWITCH_PIN);
P1220 平台:
P1220:gp.WriteIO(P1220_RFID_SWITCH, P1220_SWITCH_PIN);

2.4.3 打开 RFID 单片机的电源

P1300:gp.WriteIO(P1300_RFID_POWER_ON, P1300_RFID_POWER_PIN);
P1500:gp.WriteIO(P1500_RFID_POWER_ON, P1500_RFID_POWER_PIN);
P1220:gp.WriteIO(P1220_RFID_POWER_ON, P1220_RFID_POWER_PIN);

2.4.4 发送读卡命令

String readCardData = "023034435234303030303003";
byte[] bData = hexStringToBytes(readCardData);
out.write(bData,0,bData.length);
out.flush();
readCardData 的意义:读卡命令、读取的扇区 4 块 0 的数据;
简单的解释:
02 前缀;
30 34 表示长度为 4;
43 52 表示命令为 CR;(ASCII)
34 表示扇区为 4;
30 表示块区为 0;
30 30 30 30 校验和为 0x0000;(预留)
03 后缀;
命令更详细的格式,见华禹工控 RFID Demo 命令集用户手册

2.4.5 接收并解析返回信息

返回信息: 单片机收到命令后返回ACK;
ACK 的值为{0x02,0x41,0x43,0x4B,0xFF,0x03};

当读卡正确后返回:

02 32 34:表示长度为0x24
43 52:表示命令为CR
34 30:扇区号为4,块号为0
30 30 30 30 30 30 30 30:0x00 0x00 0x00 0x00表示卡号为0;
30 30 30 30:0x00 0x00表示金额为0;
30 30 30 30:0x00 0x00未用;
30 30 30 30 30 30 30 30:0x00 0x00 0x00 0x00未用;
30 30 30 30 30 30 30 30:0x00 0x00 0x00 0x00未用;
30 30 30 30 03:

当读卡出现错误时返回:

02 30 36 : 表示长度为6;(含错误码和校验和的长度)
43 52:表示命令为CR
34 30:表示扇区为4,块号为0;
30 35:错误码为5;表示读错误;
30 30 30 30:校验码;
03
命令更详细的格式,见华禹工控 RFID Demo 命令集用户手册

2.4.6 关闭电源

P1300:gp.WriteIO(P1300_RFID_POWER_OFF, P1300_RFID_POWER_PIN);
P1500:gp.WriteIO(P1500_RFID_POWER_OFF, P1500_RFID_POWER_PIN);
P1220:gp.WriteIO(P1220_RFID_POWER_OFF, P1220_RFID_POWER_PIN);

2.4.7. 关闭串口

if(cotps.out != null) {
    cotps.out.close();
}
if(cotps.in != null) {
    cotps.in.close();
}
if(cotps.cc != null) {
    cotps.cc.close();
}

2.5 写卡操作

2.5.1 打开串口

    与 2.4.1 相同。

2.5.2 打开模拟开关

    与 2.4.2 相同。

2.5.3 打开电源

    与 2.4.3 相同。

2.5.4 发送读卡命令

String writeCardData = "02323443573430303030303030303030303030303030303030303030303030303130303030303030303030303003";
byte[] bData = hexStringToBytes(writeCardData);
out.write(bData,0,bData.length);
out.flush();
writeCardData 的意义:写卡命令、向卡的扇区 4 块 0 写入 16 字节的数据;
02 32 34:表示长度为0x24
43 57:表示命令为CW
34 30:扇区号为4,块号为0
30 30 30 30 30 30 30 30:0x00 0x00 0x00 0x00表示卡号为0;
30 30 30 30:0x00 0x00表示金额为0;
30 30 30 30:0x00 0x00未用;
30 30 30 30 30 30 30 31:0x00 0x00 0x00 0x00未用;
30 30 30 30 30 30 30 30:0x00 0x00 0x00 0x00未用;
以上为写入的16个字节的数据
30 30 30 30 03
命令更详细的格式,见《华禹工控 RFID Demo 命令集用户手册.pdf》

2.5.5 接收并解析返回信息

返回信息: 单片机收到命令后返回ACK:
ACK 的值为{0x02,0x41,0x43,0x4B,0xFF,0x03};

当写卡成功后返回:

02 30 36:表示长度为6;(含错误码和校验码)
43 57:表示命令为CW
34 30:扇区号为4,块号为0
30 30:错误码为0;表示写成功;
30 30 30 30:校验码;
03

当写卡失败后返回:

02 30 36:表示长度为6;(含错误码和校验码)
43 57:表示命令为CW
34 30:扇区号为4,块号为0
30 36:错误码为6;表示写错误
30 30 30 30:校验码
03
命令更详细的格式,见华禹工控 RFID Demo 命令集用户手册

2.5.6 关闭电源

与2.4.6 相同

2.5.7 关闭串口

与2.4.7 相同

3 资源

华禹工控资源:

1. 华禹工控 RFID Demo 命令集用户手册
2. 华禹工控 GPIO 测试程序设计说明。
3. RFID测试程序源码包下载:StudyRfid
4. RFID固件下载:RFID固件下载地址

购买信息:

1. 创易电子淘宝店

编写者 日期 关键词
华禹工控 2010-06-04 Rfid、J2ME、华禹手机模块、JNI

302 Found

302 Found


nginx/1.8.0