项目:
1.安装Apk文件,手持机目录下创建 PSAM_Demo文件夹。 代码 MyApplication类。
2.把需要写入到CPU卡的信息文件存放到手持机 PSAM_Demo文件夹下。
3.打开应用页面1(标题Write),把CPU卡放在手持机背部。
写入步骤:
1.CPU卡上电。
2.COS指令:选择 删除MF(对CPU卡进行信息擦出) 点击sendCMD,发送删除MF命令。
3.COS指令:选择 1.建立EF2001 点击sendCMD 09C4=2500字节(创建的EF文件空间大小)
4.COS指令: 选择2001 点击sendCMD
5.写出本地文件名:输入PSAM_Demo文件夹下,需要写入到CPU卡的文件名和后缀
6.点击cpuWrite: 返回数据 9000,直到返回数据显示 write over! 说明写出完成。
注意:写入信息为CPU卡二进制文件。如需写入多个文件,则需要建立多个EF文件(需自定义空间大小),写入时,需选择该文件,才能进行写入操作。
写入规则:
【一】.【文件长度不足200,直接写入。 内容为:前3个长度标记的是文件长度。后面是文件信息内容。
列:欲向卡中写入1122334455667788数据。在读取时,又能知道该文件需读08个长度的数据。
如11占2个字符=1字节。
数据长度16字符=8字节。要求数据长度2字节 (数据长度=08)
前3字节为数据长度,不足3字节,用C补足 (3字节数据长度=08CCCC)
写入数据总长度:3+8=11,转16字节为B, 要求2字节=0B.(写入数据=08CCCC1122334455667788)
命令:
00D600000B08CCCC1122334455667788
命令解析:00D600000B08CCCC1122334455667788
EF目录下写二进制文件:00()D6()00(p1)00(p2)0B(写入信息总长度为11,转16进制=0B)08CCCC1122334455667788(写入的11位数据) 返回码: 9000标示写入成功。
【二】.【文件长度大于200,分次循环写入。 内容为:前3个长度标记的是文件长度。后面是文件信息内容。首次写入3字节,后依次写入200字节和剩余不足200字节的数据。依次写入时,再次写入位置从上次末尾位置开始,所以要计算写的偏移量,首次从0开始写入3字节,第二次偏移量为偏移 3+(200*N次)(N从0开始)】
【一. activity_ucpu_split_write.xml 布局】
<?xml version="1.0" encoding="UTF-8"?>
<!-- SAM卡 -->
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/psam_card"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_marginTop="30dp"
android:orientation="vertical" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:orientation="horizontal" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/cos_cmd" />
<Spinner
android:id="@+id/cpu_cos_cmd"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:orientation="horizontal" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="写出本地文件名称:" />
<EditText
android:id="@+id/path"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:singleLine="true" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:orientation="horizontal" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/send_data" />
<EditText
android:id="@+id/cpu_send_data"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:singleLine="true" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:orientation="horizontal" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/receive_data" />
<EditText
android:id="@+id/cpu_receive_data"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="12sp"
/>
</LinearLayout>
</LinearLayout>
<TableLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
>
<TableRow
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1" >
<Button
android:id="@+id/cpu_reset"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="cpu上电" />
</TableRow>
<TableRow
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
>
<Button
android:id="@+id/cpu_write"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="cpuWrite" />
<Button
android:id="@+id/cpu_send_cmd"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="0.5"
android:text="sendCMD"
/>
</TableRow>
</TableLayout>
</RelativeLayout>
【二. res下资源文件 arrays】
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="test1_arrays">
<item>删除MF</item>
<item>1.建立EF2001</item>
<item>选择2001</item>
<item>2.建立EF2002</item>
<item>选择2002</item>
<item>3.建立EF2003</item>
<item>选择2003</item>
</string-array>
</resources>
【三.类】
package com.example.psam_demo;
import java.io.File;import java.text.DecimalFormat;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;
import test.Utils;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.Toast;
import com.android.rfid.PSAM;
import com.android.rfid.Tools;
import com.example.service.DeviceService;
public class UcpuSplitWriteActivity extends Activity implements OnClickListener {
private EditText inputPath_data,cpu_receive_data,cpu_send_data; //接收返回数据
private Button cpu_reset_btn; //复位CPU卡
private Button cpu_write_btn,cpu_send_cmd; //cpu_write_btn写出文件内容 cpu_send_cmd发送指令
private Spinner cpu_cos_spinner; //Cos指令下拉框
private PSAM psam; //PSAM对象,用于调用封装指令
private MyBroadcast myBroadcast; //广播接收者
public String activity = "com.example.psam_demo.UcpuSplitWriteActivity";
public int cmd_flag = 0; //指令操作状态
// 线程池
ExecutorService exec = Executors.newCachedThreadPool();
final Semaphore semp = new Semaphore(1); //1 只能1个线程同时访问 5=只能5个线程同时访问
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_ucpu_split_write);
init();
}
private void init() {
cpu_cos_spinner = (Spinner) findViewById(R.id.cpu_cos_cmd);
inputPath_data = (EditText) findViewById(R.id.path);
cpu_receive_data = (EditText) findViewById(R.id.cpu_receive_data);
cpu_send_data= (EditText) findViewById(R.id.cpu_send_data);
cpu_reset_btn = (Button)findViewById(R.id.cpu_reset);
cpu_write_btn = (Button)findViewById(R.id.cpu_write);
cpu_send_cmd=(Button)findViewById(R.id.cpu_send_cmd);
cpu_reset_btn.setOnClickListener(this);
cpu_write_btn.setOnClickListener(this);
cpu_send_cmd.setOnClickListener(this);
// 添加COS指令选项
ArrayAdapter select_samAdapter = ArrayAdapter.createFromResource(this,
R.array.test1_arrays,