工程项目CPU白卡写入数据信息。

本文档详细介绍了如何将数据写入CPU卡的过程,包括安装Apk、创建文件夹、写入步骤、写入规则以及相关布局和资源文件的配置。通过示例代码展示了如何进行文件长度不足200和大于200字节时的分次写入,并提供了读写服务的实现。
摘要由CSDN通过智能技术生成

项目:

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,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值