安卓Android Studioy读写NXP ICODE2 15693标签源码

 本示例使用的发卡器:https://item.taobao.com/item.htm?spm=a1z10.5-c-s.w4002-21818769070.11.4391789eCLwm3t&id=615391857885

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="3dp"
    tools:context=".ISO15693Activity">

    <androidx.appcompat.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="30dp"
        android:background="?attr/colorPrimary"
        app:navigationIcon="@drawable/baseline_arrow_back_ios_24"
        app:titleTextColor="@color/white"
        tools:ignore="MissingConstraints"
        tools:layout_editor_absoluteY="0dp">

        <TextView
            android:id="@+id/TextViewlabelDispleft"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:text="返回"
            android:textColor="@color/white"
            android:textSize="16sp"
            android:gravity="center"
            android:onClick="retmain" />

        <TextView
            android:id="@+id/TextViewlabelDisp"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:text="15693卡、hid-iclass卡物理卡号测试页"
            android:textColor="@color/white"
            android:gravity="center_horizontal|bottom"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="@+id/TextViewlabelDispleft"
            app:layout_constraintTop_toTopOf="parent" />

    </androidx.appcompat.widget.Toolbar>

    <TextView
        android:id="@+id/sample_text"
        android:layout_width="fill_parent"
        android:layout_height="150dp"
        android:padding="3dp"
        android:text="操作结果"
        android:textSize="12sp"
        android:background="@drawable/shape4border"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"

        />

    <ScrollView
        android:id="@+id/scrollViewIC"
        android:layout_width="fill_parent"
        android:layout_height="0dp"

        android:layout_marginBottom="5dp"
        android:scrollbars="horizontal"
        app:layout_constraintBottom_toTopOf="@+id/sample_text"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/toolbar">

        <androidx.constraintlayout.widget.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:padding="3dp">

            <TextView
                android:id="@+id/labeltextseletag"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="5dp"
                android:text="选择15693标签类型:"
                android:textSize="12sp"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintTop_toTopOf="parent" />

            <Spinner
                android:id="@+id/sp_seletagtype"
                android:layout_width="290dp"
                android:layout_height="20dp"
                android:entries="@array/Tagtype15693"
                android:theme="@style/my_spinner_style"
                app:layout_constraintBottom_toBottomOf="@+id/labeltextseletag"
                app:layout_constraintLeft_toRightOf="@+id/labeltextseletag"
                app:layout_constraintTop_toTopOf="@+id/labeltextseletag" />


            <Button
                android:id="@+id/butt_EasyRead15693Card"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="15dp"
                android:onClick="easyread15693"
                android:text="轻松读15693卡"
                android:textSize="11sp"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintTop_toBottomOf="@+id/labeltextseletag" />

            <Button
                android:id="@+id/butt_EasyWrite15693Card"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:onClick="easywrite15693"
                android:text="轻松写15693卡"
                android:textSize="11sp"
                app:layout_constraintBottom_toBottomOf="@+id/butt_EasyRead15693Card"
                app:layout_constraintLeft_toRightOf="@+id/butt_EasyRead15693Card"
                app:layout_constraintTop_toTopOf="@+id/butt_EasyRead15693Card" />

            <TextView
                android:id="@+id/labeltextUID"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="2dp"
                android:layout_marginTop="6dp"
                android:text="UID:"
                android:textSize="12sp"
                app:layout_constraintLeft_toRightOf="@+id/butt_EasyWrite15693Card"
                app:layout_constraintTop_toTopOf="@+id/butt_EasyWrite15693Card" />

            <TextView
                android:id="@+id/labeltextnote4"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="2dp"
                android:layout_marginTop="16dp"
                android:layout_marginBottom="6dp"
                android:textColor="#FF0000"
                android:text="读写时感应区内只能有一张卡!"
                android:textSize="10sp"
                app:layout_constraintBottom_toBottomOf="@+id/butt_EasyWrite15693Card"
                app:layout_constraintLeft_toRightOf="@+id/butt_EasyWrite15693Card"
                app:layout_constraintTop_toBottomOf="@+id/labeltextUID" />


            <TextView
                android:id="@+id/textDispUID"
                android:layout_width="110dp"
                android:layout_height="wrap_content"
                android:layout_marginLeft="2dp"
                android:background="@drawable/shape4border"
                android:gravity="center"
                android:textColor="#FF0000"
                android:text="                "
                android:textSize="11sp"
                app:layout_constraintBottom_toBottomOf="@+id/labeltextUID"
                app:layout_constraintLeft_toRightOf="@+id/labeltextUID"
                app:layout_constraintTop_toTopOf="@+id/labeltextUID" />

            <TextView
                android:id="@+id/labeltextnote1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="5dp"
                android:text="卡片应用标识AFI:"
                android:textSize="12sp"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintTop_toBottomOf="@+id/butt_EasyRead15693Card" />

            <EditText
                android:id="@+id/textafi"
                android:layout_width="30dp"
                android:layout_height="wrap_content"
                android:layout_marginLeft="5dp"
                android:background="@drawable/shape4border"
                android:gravity="center"
                android:text="00"
                android:textColor="#FF0000"
                android:textSize="12sp"
                app:layout_constraintBottom_toBottomOf="@+id/labeltextnote1"
                app:layout_constraintLeft_toRightOf="@+id/labeltextnote1"
                app:layout_constraintTop_toTopOf="@+id/labeltextnote1" />

            <TextView
                android:id="@+id/labeltextnote2"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="18dp"
                android:text="本次读写起始块:"
                android:textSize="12sp"
                app:layout_constraintBottom_toBottomOf="@+id/textafi"
                app:layout_constraintLeft_toRightOf="@+id/textafi"
                app:layout_constraintTop_toTopOf="@+id/textafi" />

            <EditText
                android:id="@+id/textRWbegin"
                android:layout_width="30dp"
                android:layout_height="wrap_content"
                android:layout_marginLeft="5dp"
                android:background="@drawable/shape4border"
                android:gravity="center"
                android:text="0"
                android:textColor="#FF0000"
                android:textSize="12sp"
                app:layout_constraintBottom_toBottomOf="@+id/labeltextnote2"
                app:layout_constraintLeft_toRightOf="@+id/labeltextnote2"
                app:layout_constraintTop_toTopOf="@+id/labeltextnote2" />

            <TextView
                android:id="@+id/labeltextnote3"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="18dp"
                android:text="读写块数:"
                android:textSize="12sp"
                app:layout_constraintBottom_toBottomOf="@+id/textRWbegin"
                app:layout_constraintLeft_toRightOf="@+id/textRWbegin"
                app:layout_constraintTop_toTopOf="@+id/textRWbegin" />

            <EditText
                android:id="@+id/textRWblocks"
                android:layout_width="30dp"
                android:layout_height="wrap_content"
                android:layout_marginLeft="5dp"
                android:background="@drawable/shape4border"
                android:gravity="center"
                android:text="12"
                android:textColor="#FF0000"
                android:textSize="12sp"
                app:layout_constraintBottom_toBottomOf="@+id/labeltextnote3"
                app:layout_constraintLeft_toRightOf="@+id/labeltextnote3"
                app:layout_constraintTop_toTopOf="@+id/labeltextnote3" />

            <EditText
                android:id="@+id/editrwdata"
                android:layout_width="match_parent"
                android:layout_height="80dp"
                android:layout_marginTop="5dp"
                android:background="@drawable/shape4border"
                android:digits="0123456789ABCDEFabcdef "
                android:inputType="textCapCharacters"
                android:maxLines="8"
                android:gravity="left"
                android:text="                                               "
                android:textSize="12sp"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintTop_toBottomOf="@+id/labeltextnote1" />

            <Button
                android:id="@+id/butt_Request15693Card"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="15dp"
                android:text="搜索感应区内多张15693卡"
                android:textSize="11sp"
                android:onClick="Request15693card"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintTop_toBottomOf="@+id/editrwdata" />

            <TextView
                android:id="@+id/labeltextflag"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="8dp"
                android:text="操作标识:"
                android:textSize="12sp"
                app:layout_constraintBottom_toBottomOf="@+id/butt_Request15693Card"
                app:layout_constraintLeft_toRightOf="@+id/butt_Request15693Card"
                app:layout_constraintTop_toTopOf="@+id/butt_Request15693Card" />

            <EditText
                android:id="@+id/edittextflag"
                android:layout_width="30dp"
                android:layout_height="wrap_content"
                android:layout_marginLeft="5dp"
                android:background="@drawable/shape4border"
                android:gravity="center"
                android:text="00"
                android:textColor="#FF0000"
                android:textSize="12sp"
                app:layout_constraintBottom_toBottomOf="@+id/labeltextflag"
                app:layout_constraintLeft_toRightOf="@+id/labeltextflag"
                app:layout_constraintTop_toTopOf="@+id/labeltextflag" />

            <TextView
                android:id="@+id/labeltextmac"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="25dp"
                android:text="掩码长度:"
                android:textSize="12sp"
                app:layout_constraintBottom_toBottomOf="@+id/edittextflag"
                app:layout_constraintLeft_toRightOf="@+id/edittextflag"
                app:layout_constraintTop_toTopOf="@+id/edittextflag" />

            <EditText
                android:id="@+id/edittextmac"
                android:layout_width="30dp"
                android:layout_height="wrap_content"
                android:layout_marginLeft="5dp"
                android:background="@drawable/shape4border"
                android:gravity="center"
                android:text="0"
                android:textColor="#FF0000"
                android:textSize="12sp"
                app:layout_constraintBottom_toBottomOf="@+id/labeltextmac"
                app:layout_constraintLeft_toRightOf="@+id/labeltextmac"
                app:layout_constraintTop_toTopOf="@+id/labeltextmac" />

            <TextView
                android:id="@+id/labeltextnote5"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="5dp"
                android:text="请选择已搜索到的卡片UID:"
                android:textSize="12sp"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintTop_toBottomOf="@+id/butt_Request15693Card" />

            <Spinner
                android:id="@+id/sp_seleuid"
                android:layout_width="240dp"
                android:layout_height="20dp"
                app:layout_constraintBottom_toBottomOf="@+id/labeltextnote5"
                app:layout_constraintLeft_toRightOf="@+id/labeltextnote5"
                app:layout_constraintTop_toTopOf="@+id/labeltextnote5" />

            <TextView
                android:id="@+id/labeltextnote6"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="5dp"
                android:text="请输入本次读写起始块地址:"
                android:textSize="12sp"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintTop_toBottomOf="@+id/labeltextnote5" />

            <EditText
                android:id="@+id/edittextblockbegin"
                android:layout_width="40dp"
                android:layout_height="wrap_content"
                android:layout_marginLeft="5dp"
                android:background="@drawable/shape4border"
                android:gravity="center"
                android:text="0"
                android:textColor="#FF0000"
                android:textSize="12sp"
                app:layout_constraintBottom_toBottomOf="@+id/labeltextnote6"
                app:layout_constraintLeft_toRightOf="@+id/labeltextnote6"
                app:layout_constraintTop_toTopOf="@+id/labeltextnote6" />

            <TextView
                android:id="@+id/labeltextblocks"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="30dp"
                android:text="本次读写块数:"
                android:textSize="12sp"
                app:layout_constraintBottom_toBottomOf="@+id/edittextblockbegin"
                app:layout_constraintLeft_toRightOf="@+id/edittextblockbegin"
                app:layout_constraintTop_toTopOf="@+id/edittextblockbegin" />

            <EditText
                android:id="@+id/textreadwriteblocks"
                android:layout_width="40dp"
                android:layout_height="wrap_content"
                android:layout_marginLeft="5dp"
                android:background="@drawable/shape4border"
                android:gravity="center"
                android:text="28"
                android:textColor="#FF0000"
                android:textSize="12sp"
                app:layout_constraintBottom_toBottomOf="@+id/labeltextblocks"
                app:layout_constraintLeft_toRightOf="@+id/labeltextblocks"
                app:layout_constraintTop_toTopOf="@+id/labeltextblocks" />

            <Button
                android:id="@+id/butt_read15693block"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="5dp"
                android:text="读取指定UID卡数据"
                android:textSize="11sp"
                android:onClick="read15693block"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintTop_toBottomOf="@+id/labeltextnote6" />

            <Button
                android:id="@+id/butt_write15693block"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="写数据到指定UID卡"
                android:textSize="11sp"
                android:onClick="write15693block"
                app:layout_constraintBottom_toBottomOf="@+id/butt_read15693block"
                app:layout_constraintLeft_toRightOf="@+id/butt_read15693block"
                app:layout_constraintTop_toTopOf="@+id/butt_read15693block" />

            <EditText
                android:id="@+id/editrwblockdata"
                android:layout_width="match_parent"
                android:layout_height="80dp"
                android:layout_marginTop="5dp"
                android:background="@drawable/shape4border"
                android:digits="0123456789ABCDEFabcdef "
                android:inputType="textCapCharacters"
                android:maxLines="8"
                android:gravity="left"
                android:text="                                               "
                android:textSize="12sp"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintTop_toBottomOf="@+id/butt_read15693block" />

            <Button
                android:id="@+id/butt_write15693uid"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="15dp"
                android:onClick="write15693uid"
                android:text="将UID写入SLIX1830卡内"
                android:textSize="11sp"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintTop_toBottomOf="@+id/editrwblockdata" />

            <TextView
                android:id="@+id/labeltextnewuid"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="8dp"
                android:text="新UID:"
                android:textSize="12sp"
                app:layout_constraintBottom_toBottomOf="@+id/butt_write15693uid"
                app:layout_constraintLeft_toRightOf="@+id/butt_write15693uid"
                app:layout_constraintTop_toTopOf="@+id/butt_write15693uid" />

            <EditText
                android:id="@+id/edittextnewuid"
                android:layout_width="130dp"
                android:layout_height="wrap_content"
                android:layout_marginLeft="5dp"
                android:background="@drawable/shape4border"
                android:digits="0123456789ABCDEFabcdef"
                android:gravity="center"
                android:text="               "
                android:textColor="#FF0000"
                android:textSize="12sp"
                app:layout_constraintBottom_toBottomOf="@+id/labeltextnewuid"
                app:layout_constraintLeft_toRightOf="@+id/labeltextnewuid"
                app:layout_constraintTop_toTopOf="@+id/labeltextnewuid" />

        </androidx.constraintlayout.widget.ConstraintLayout>

    </ScrollView>

</androidx.constraintlayout.widget.ConstraintLayout>

 

package com.usbreadertest;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.List;

import android.widget.ArrayAdapter;

import com.reader.ourmifare;

public class ISO15693Activity extends AppCompatActivity {

    private TextView tv;
    private Spinner spinner;
    private ArrayAdapter<String> adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_iso15693);

        androidx.appcompat.widget.Toolbar toolbar=findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        tv = findViewById(R.id.sample_text);
        tv.setText("操作结果");
    }

    @Override
    public void onBackPressed(){
        super.onBackPressed();
        finish();
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if(item.getItemId()==android.R.id.home){
            finish();
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    public void retmain(View view)
    {
        finish();
    }

    public void easyread15693(View view){
        byte status;                      //存放返回值
        byte myctrlword = 0;              //读写控制字,一般取0 就行了
        byte afi ;                        //卡片应用标识
        byte startblock ;                 //指定读起始块地址,最大取值255(根据卡类型)
        byte blocknum ;                   //指定读取块数,最大取值12
        byte[] myuid = new byte[8];       //8字节卡序列号缓冲
        byte[] mydatabuf = new byte[255]; //读卡数据缓冲共255个字节

        tv.setText(" ");

        TextView ctruid=findViewById(R.id.textDispUID);
        ctruid.setText("");

        EditText ctrrwdata=findViewById(R.id.editrwdata);
        ctrrwdata.setText("");

        EditText ctrafi=findViewById(R.id.textafi) ;
        String afistr=ctrafi.getText().toString().trim();
        if (afistr.length() < 2)
        {
            tv.setText("应用标识AFI是2位16进制数据,请输入正确的AFI!");
            return;
        }else {afi=(byte) Integer.parseInt(afistr, 16);  }

        EditText ctrbeginadd = findViewById(R.id.textRWbegin);  //操作起始地址
        startblock=(byte)Integer.parseInt(ctrbeginadd.getText().toString().trim());

        EditText ctrrwblocks = findViewById(R.id.textRWblocks);  //读写块数
        blocknum=(byte)Integer.parseInt(ctrrwblocks.getText().toString().trim());

        Spinner spls = findViewById(R.id.sp_seletagtype);
        int tagtype =(int)(spls.getSelectedItemId());   //标签类型
        if (tagtype==0) {
            if (blocknum < 1 || blocknum > 12) {
                tv.setText("一次最多读写12块数据,如要读写更多的数据请使用循环的方式读写。");
                return;
            }
        }else{
            if (blocknum != 1) {
                tv.setText("富士通标签每次只能读写一块数据!");
                return;
            }
        }

        status = ourmifare.iso15693readex(myctrlword, afi, startblock, blocknum, myuid, mydatabuf) ;
        if (status == 0) {
            ourmifare.pcdbeep(38);
            String serialnumber = "";
            for (int i = 0; i < 8; i++) {
                String bytestr = "00" + Integer.toHexString(myuid[i] & 0xFF);
                serialnumber = serialnumber + bytestr.substring(bytestr.length() - 2, bytestr.length());
            }
            ctruid.setText(serialnumber);

            EditText ctrnewuid=findViewById(R.id.edittextnewuid);
            ctrnewuid.setText(serialnumber);

            String databuf = "";
            for (int i = 1; i < mydatabuf[0]+1; i++) {
                String bytestr = "00" + Integer.toHexString(mydatabuf[i] & 0xFF);
                databuf = databuf + bytestr.substring(bytestr.length() - 2, bytestr.length())+" ";
            }
            ctrrwdata.setText(databuf);

            tv.setText("读取15693标签数据操作成功!");
        } else {
            PrintErrInf(status);   //错误代码提示
        }
    }

    public void easywrite15693(View view){
        byte status;                      //存放返回值
        byte myctrlword = 0;              //读写控制字,一般取0 就行了
        byte afi ;                        //卡片应用标识
        byte startblock ;                 //指定读起始块地址,最大取值255(根据卡类型)
        byte blocknum ;                   //指定读取块数,最大取值12
        byte[] myuid = new byte[8];       //8字节卡序列号缓冲
        byte[] mydatabuf = new byte[255]; //读卡数据缓冲共255个字节
        byte DataLen;

        tv.setText(" ");

        TextView ctruid=findViewById(R.id.textDispUID);
        ctruid.setText("");

        EditText ctrafi=findViewById(R.id.textafi) ;
        String afistr=ctrafi.getText().toString().trim();
        if (afistr.length() < 2)
        {
            tv.setText("应用标识AFI是2位16进制数据,请输入正确的AFI!");
            return;
        }else {afi=(byte) Integer.parseInt(afistr, 16);  }

        EditText ctrbeginadd = findViewById(R.id.textRWbegin);  //操作起始地址
        startblock=(byte)Integer.parseInt(ctrbeginadd.getText().toString().trim());

        EditText ctrrwblocks = findViewById(R.id.textRWblocks);  //读写块数
        blocknum=(byte)Integer.parseInt(ctrrwblocks.getText().toString().trim());

        Spinner spls = findViewById(R.id.sp_seletagtype);
        int tagtype =(int)(spls.getSelectedItemId());   //标签类型
        if (tagtype==0) {
            if (blocknum < 1 || blocknum > 12) {
                tv.setText("一次最多读写12块数据,如要读写更多的数据请使用循环的方式读写。");
                return;
            }
            DataLen=(byte)(blocknum*4);
        }else {
            if (blocknum != 1) {
                tv.setText("富士通标签每次只能读写一块数据!");
                return;
            }
            if (tagtype==1){
                DataLen=(byte)(blocknum*8);     //
            } else{DataLen=(byte)(blocknum*32);}
        }

        EditText ctrrwdata=findViewById(R.id.editrwdata);
        String rwdatahex=ctrrwdata.getText().toString().trim();
        String[] strArr = rwdatahex.split("\\ ");    /*分割接收到的数据后再分析、处理、返回指令 */
        if (strArr.length<DataLen){
            tv.setText("写入数据不足,请输入"+Integer.toString(DataLen*2)+"位16进制写入数据!");
            return;
        }else{
            mydatabuf[0]=DataLen;
            for(int p=0;p<strArr.length;p++) {
                mydatabuf[p+1]=(byte)(Integer.parseInt(strArr[p],16));
            }
        }

        status = ourmifare.iso15693writeex(myctrlword, afi, startblock, blocknum, myuid, mydatabuf) ;
        if (status == 0) {
            ourmifare.pcdbeep(38);
            String serialnumber = "";
            for (int i = 0; i < 8; i++) {
                String bytestr = "00" + Integer.toHexString(myuid[i] & 0xFF);
                serialnumber = serialnumber + bytestr.substring(bytestr.length() - 2, bytestr.length());
            }
            ctruid.setText(serialnumber);
            EditText ctrnewuid=findViewById(R.id.edittextnewuid);
            ctrnewuid.setText(serialnumber);
            tv.setText("写15693标签数据操作成功!");
        } else {
            PrintErrInf(status);   //错误代码提示
        }
    }

    public void Request15693card(View view){
        byte status;                            //存放返回值
        byte[] maskuidbuf = new byte[8];       //卡号掩码,一般可以不理这个参数
        byte[] myuid = new byte[81];           //卡数据缓冲
        byte[] revlen= new byte[1];

        tv.setText(" ");

        Spinner ctrspuid=findViewById(R.id.sp_seleuid);
        List<String> options = new ArrayList<>();
        options.clear();

        adapter = new ArrayAdapter<String>(this,android.R.layout.simple_spinner_dropdown_item,options);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        ctrspuid.setAdapter(adapter);

        EditText ctrtextafi=findViewById(R.id.textafi);
        ctrtextafi.setText("00");
        byte afi = 0;                          //卡片应用标识

        EditText ctrtextflage=findViewById(R.id.edittextflag);
        ctrtextflage.setText("16");
        byte flags = (byte) 0x16;              //操作卡片的标识字,详细说明参看文档

        EditText ctrtextmasklen=findViewById(R.id.edittextmac);
        ctrtextmasklen.setText("0");
        byte masklen = 0;                     //掩码长度,有一张卡最大为40,一张卡为43,理论上为64

        status = ourmifare.iso15693inventory16(flags, afi, masklen, maskuidbuf, revlen,myuid);
        if (status == 0) {
            ourmifare.pcdbeep(38);
            int j=0;
            String dispinf="";
            String serialnumber = "";
            while (j<revlen[0]) {
                String dsfidstr = "00" + Integer.toHexString(myuid[j] & 0xFF);
                dsfidstr= dsfidstr.substring(dsfidstr.length() - 2, dsfidstr.length());

                serialnumber = "";
                for (int i = 1; i < 9; i++) {
                    String bytestr = "00" + Integer.toHexString(myuid[j+i] & 0xFF);
                    serialnumber = serialnumber + bytestr.substring(bytestr.length() - 2, bytestr.length());
                }
                dispinf=dispinf+"DSFID:"+dsfidstr+"  UID:" + serialnumber + "\n";
                j=j+9;

                options.add(serialnumber);
            }
            adapter = new ArrayAdapter<String>(this,android.R.layout.simple_spinner_dropdown_item,options);
            adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
            ctrspuid.setAdapter(adapter);

            EditText ctrnewuid=findViewById(R.id.edittextnewuid);
            ctrnewuid.setText(serialnumber);

            tv.setText("搜寻15693卡成功!\n\n"+dispinf);
        } else {
            PrintErrInf(status);   //错误代码提示
        }
    }

    public void read15693block(View view){
        String uidstr="";
        byte status=1;                    //存放返回值
        byte startblock = 0;              //指定读起始块地址,最大取值255(根据卡类型)
        byte blocknum = 1;                //指定读取块数,最大取值12
        byte[] myuid = new byte[8];       //8字节卡序列号缓冲
        byte[] revlen = new byte[1];      //返回读取数据长度
        byte[] mydatabuf = new byte[255]; //读卡数据缓冲共255个字节

        tv.setText(" ");
        EditText ctrtextrwdata=findViewById(R.id.editrwblockdata);
        ctrtextrwdata.setText("");

        Spinner ctrspuid=findViewById(R.id.sp_seleuid);
        if (ctrspuid.getSelectedItemId()<0){
            tv.setText("请先搜寻卡片获取需读写卡的UID!");
            return;
        }else{
            uidstr=ctrspuid.getSelectedItem().toString();
            tv.setText(uidstr);
        }

        EditText ctrtextflage=findViewById(R.id.edittextflag);
        ctrtextflage.setText("22");
        byte flags = (byte) 0x22;              //操作卡片的标识字,详细说明参看文档

        EditText ctrbeginadd = findViewById(R.id.edittextblockbegin);  //操作起始地址
        startblock=(byte)Integer.parseInt(ctrbeginadd.getText().toString().trim());

        EditText ctrrwblocks = findViewById(R.id.textreadwriteblocks);  //读写块数
        blocknum=(byte)Integer.parseInt(ctrrwblocks.getText().toString().trim());

        for(int i=0;i<8;i++) {
            myuid[i]=(byte)Integer.parseInt(uidstr.substring(i*2,i*2+2),16);//只有用Integer.parseInt才能杜绝大于128时的错误
        }

        int j=0;
        String readdatastr="";
        while (j<blocknum){
            status = ourmifare.iso15693readblock( flags, (byte)(startblock+j), (byte)1, myuid,revlen, mydatabuf) ;
            if (status==0){
                for (int i=0;i<revlen[0];i++ ){
                    String bytestr = "00" + Integer.toHexString(mydatabuf[i] & 0xFF);
                    readdatastr = readdatastr + bytestr.substring(bytestr.length() - 2, bytestr.length())+" ";
                }
                j++;
            }else{ j=blocknum;}
        }

        if (status == 0) {
            ourmifare.pcdbeep(38);
            ctrtextrwdata.setText(readdatastr);
            tv.setText("读取15693标签数据操作成功!");
        } else {
            PrintErrInf(status);   //错误代码提示
        }
    }

    public void write15693block(View view){
        String uidstr="";
        byte status=1;                    //存放返回值
        byte startblock = 0;              //指定读起始块地址,最大取值255(根据卡类型)
        byte blocknum = 1;                //指定读取块数,最大取值12
        byte[] myuid = new byte[8];       //8字节卡序列号缓冲
        byte[] revlen = new byte[1];      //返回读取数据长度
        byte[] mydatabuf = new byte[255]; //读卡数据缓冲共255个字节

        tv.setText("");

        Spinner ctrspuid=findViewById(R.id.sp_seleuid);
        if (ctrspuid.getSelectedItemId()<0){
            tv.setText("请先搜寻卡片获取需读写卡的UID!");
            return;
        }else{
            uidstr=ctrspuid.getSelectedItem().toString();
            tv.setText(uidstr);
        }

        EditText ctrtextflage=findViewById(R.id.edittextflag);
        ctrtextflage.setText("22");
        byte flags = (byte) 0x22;              //操作卡片的标识字,详细说明参看文档

        EditText ctrbeginadd = findViewById(R.id.edittextblockbegin);  //操作起始地址
        startblock=(byte)Integer.parseInt(ctrbeginadd.getText().toString().trim());

        EditText ctrrwblocks = findViewById(R.id.textreadwriteblocks);  //读写块数
        blocknum=(byte)Integer.parseInt(ctrrwblocks.getText().toString().trim());

        for(int i=0;i<8;i++) {
            myuid[i]=(byte)Integer.parseInt(uidstr.substring(i*2,i*2+2),16);//只有用Integer.parseInt才能杜绝大于128时的错误
        }

        Spinner spls = findViewById(R.id.sp_seletagtype);
        int tagtype =(int)(spls.getSelectedItemId());   //标签类型
        int blockbytes=4;
        if (tagtype==0) {
            blockbytes=4;
        }else {
            if (tagtype==1){
                blockbytes=8;     //
            } else{blockbytes=32;}
        }

        EditText ctrrwdata=findViewById(R.id.editrwblockdata);
        String rwdatahex=ctrrwdata.getText().toString().trim();
        String[] strArr = rwdatahex.split("\\ ");    /*分割接收到的数据后再分析、处理、返回指令*/
        if (strArr.length<blocknum*blockbytes) {
            tv.setText("写入数据不足,请输入" + Integer.toString(blocknum*blockbytes * 2) + "位16进制写入数据!");
            return;
        }

        int j=0;
        while (j<blocknum) {
            String disps="";
            for (int i=0;i<blockbytes;i++){
                mydatabuf[i]=(byte)(Integer.parseInt(strArr[j*blockbytes+i],16));
                disps=disps+strArr[j*blockbytes+i];
            }
            tv.setText(disps+"\n");
            status = ourmifare.iso15693writeblock( flags, (byte)(startblock+j), (byte)1, myuid,(byte)blockbytes, mydatabuf) ;
            if (status==0){
                j++;
            }else{j=blocknum;}
        }
        if (status==0){
            ourmifare.pcdbeep(38);
            tv.setText("写15693标签数据操作成功!");
        } else {
            PrintErrInf(status);   //错误代码提示
        }
    }

    public void write15693uid(View view){
        byte afi;
        byte myctrlword = 0;              //读写控制字,一般取0 就行了
        byte[] olduid = new byte[8];       //8字节卡序列号缓冲
        byte[] newuid = new byte[8];       //8字节卡序列号缓冲

        tv.setText("");

        EditText ctrafi=findViewById(R.id.textafi) ;
        String afistr=ctrafi.getText().toString().trim();
        if (afistr.length() < 2)
        {
            tv.setText("应用标识AFI是2位16进制数据,请输入正确的AFI!");
            return;
        }else {afi=(byte) Integer.parseInt(afistr, 16);  }

        EditText ctrnewuid=findViewById(R.id.edittextnewuid) ;
        String newuidstr=ctrnewuid.getText().toString().trim();
        if (newuidstr.length() < 16)
        {
            tv.setText("UID是16位16进制数据,请输入正确的UID!");
            return;
        }else {
            for(int i=0;i<8;i++) {
                newuid[i]=(byte)Integer.parseInt(newuidstr.substring(i*2,i*2+2),16);//只有用Integer.parseInt才能杜绝大于128时的错误
            }
        }
        byte status = ourmifare.iso15693writeuid( myctrlword, afi, olduid, newuid) ;
        if (status==0){
            ourmifare.pcdbeep(38);
            tv.setText("写UID操作成功!");
        } else {
            PrintErrInf(status);   //错误代码提示
        }
    }
    public void PrintErrInf(byte errcode) {
        String dispstr="";
        switch(errcode){
            case 8:
                dispstr="错误代码:8,未寻到卡,请重新拿开卡后再放到感应区!";
                break;
            case 9:
                dispstr="错误代码:9,有多张卡在感应区,寻卡过程中防冲突失败,读序列吗错误!";
                break;
            case 10:
                dispstr="错误代码:10,该卡可能已被休眠,无法选中卡片!";
                break;
            case 13:
                dispstr="错误代码:13,读卡块失败!";
                break;
            case 14:
                dispstr="错误代码:14,写本块失败!";
                break;
            case 21:
                dispstr="错误代码:21,没有动态库!";
                break;
            case 22:
                dispstr="错误代码:22,动态库或驱动程序异常!";
                break;
            case 23:
                dispstr="错误代码:23,发卡器尚未插入!";
                break;
            case 24:
                dispstr="错误代码:24,操作超时,一般是动态库没有反映!";
                break;
            case 25:
                System.out.print("错误代码:25,发送字数不够!");
                break;
            case 26:
                System.out.print("错误代码:26,发送的CRC错!");
                break;
            case 27:
                System.out.print("错误代码:27,接收的字数不够!");
                break;
            case 28:
                System.out.print("错误代码:28,接收的CRC错!");
                break;
            case 41:
                System.out.print("错误代码:41,选中卡操作失败!");
                break;
            case 42:
                System.out.print("错误代码:42,让卡从静止中重起准备失败!");
                break;
            case 44:
                System.out.print("错误代码:44,一次写块不能超过12块!");
                break;
            case 46:
                System.out.print("错误代码:46,写AFI失败!");
                break;
            default:
                System.out.print("未知错误,错误代码:"+Integer.toString(errcode));
                break;
        }
        tv = findViewById(R.id.sample_text);
        tv.setText(dispstr);
    }
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/298319.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

『C++成长记』日期类的实现

&#x1f525;博客主页&#xff1a;小王又困了 &#x1f4da;系列专栏&#xff1a;C &#x1f31f;人之为学&#xff0c;不日近则日退 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 目录 一、日期类的实现 &#x1f4d2;1.1日期类功能 &#x1f4d2;1.2拷贝日期 &#…

C++面试宝典第13题:计算餐厅账单

题目 假如你是一家餐厅的收银员,需要编写一个程序来计算顾客的账单。程序应该能够接受顾客点的菜品和数量,并根据菜品的单价计算出总价。另外,程序还应该能够处理折扣和优惠券,并输出最终的账单金额。 解析 这道题主要考察应聘者使用面向对象的设计方法来解决实际问题的能力…

基于旗鱼算法优化的Elman神经网络数据预测 - 附代码

基于旗鱼算法优化的Elman神经网络数据预测 - 附代码 文章目录 基于旗鱼算法优化的Elman神经网络数据预测 - 附代码1.Elman 神经网络结构2.Elman 神经用络学习过程3.电力负荷预测概述3.1 模型建立 4.基于旗鱼优化的Elman网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针…

Pandas DataFrame中将True/False映射到1/0

在本文中&#xff0c;我们将看到如何在Pandas DataFrame中将True/False映射到1/0。True/False到1/0的转换在执行计算时至关重要&#xff0c;并且可以轻松分析数据。 1. replace方法 在这个例子中&#xff0c;我们使用Pandas replace()方法将True/False映射到1/0。在这里&…

网络知识-以太网技术的发展及网络设备

目 录 一、背景介绍 &#xff08;一&#xff09;网络技术的时代 &#xff08;二&#xff09;以太网技术脱颖而出 二、以太网的工作原理 &#xff08;一&#xff09;、载波侦听多路访问&#xff08;CSMA/CD&#xff09; 1、数据发送流程 2、发送过程解析 3、…

Mathtype7.4安装与嵌入WPS

文章目录 Mathtype安装教程&#xff08;7.4&#xff09;Mathtype简介Mathtype下载安装软件下载软件安装运行MathType.exe运行注册表 Mathtype嵌入wps Mathtype安装教程&#xff08;7.4&#xff09; Mathtype简介 MathType是一款强大的数学公式编辑器&#xff0c;适用于教育教…

【Sublime Text】| 01——下载安装注册

系列文章目录 【Sublime Text】| 01——下载软件安装并注册 【Sublime Text】| 02——常用插件安装及配置 失败了也挺可爱&#xff0c;成功了就超帅。 文章目录 前言1. 下载2. 安装3. 注册3.1 通过修改应用程序注册3.2 通过替换应用程序注册 感谢 前言 轻量代码编辑器有很多 之…

Python课程设计基于python的人脸识别佩戴口罩系统设计

wx供重浩&#xff1a;创享日记 对话框发送&#xff1a;python口罩 获取完整论文报告源码源文件 1 研究背景与意义 新型冠状病毒展现出全球化流行和蔓延的趋势&#xff0c;这提醒我们&#xff1a;传染病防治在今后相当长时间内仍是疾病预测控制工作的重点。戴口罩是预防呼吸道…

Linux|服务器|简单记录备忘VMware虚拟机开启桌面失败报错:VMware: No 3D enabled (0, Success).的解决

一&#xff0c; VMware虚拟机 Linux操作系统&#xff0c;centos7版本&#xff0c;安装完桌面后&#xff0c;执行startx 命令后 &#xff0c;报错&#xff1a;VMware: No 3D enabled (0, Success). 桌面没有启动成功 完整日志输出如下&#xff1a; [rootnode4 ~]# startx x…

超实用的测试万能法则 —— 帕累托分析!

20/80原则来源于意大利经济学家维弗雷多•帕累托&#xff08;Villefredo Pareto&#xff09;提出的财富占比帕累托原则&#xff1a;80%的财富是掌握在20%的人手中的&#xff0c;而余下的80%的人只占那剩余的20%财富&#xff0c;而后这个理论延伸为&#xff1a;至关重要的少数和…

uniapp 创建组件组件

组件&#xff1a;用于将某个功能的 HTML、CSS、JS 封装到一个文件中&#xff0c;提高代码的复用性和可维护性。 创建组件 一、在根目录中创建 components 文件夹&#xff0c;右键点击新建组件。 二、输入组件名称、选择默认模板、点击创建组件。 三、在组件中正常编写内容即可…

数据结构OJ实验6-二叉树的遍历以及应用

A. DS二叉树—二叉树构建与遍历&#xff08;不含框架&#xff09; 题目描述 给定一颗二叉树的逻辑结构如下图&#xff0c;&#xff08;先序遍历的结果&#xff0c;空树用字符‘#’表示&#xff0c;例如AB#C##D##&#xff09;&#xff0c;建立该二叉树的二叉链式存储结构&…

H266/VVC多样化视频编码工具概述

全景视频编码 全景视频&#xff1a; 具有360度全包围视角的球面视频。 全景视频编码&#xff1a; 包括H266在内的视频编码算法都是以平面视频为对象的&#xff0c;为了采用传统的视频编码编码算法&#xff0c;全景视频需要转换为平面视频&#xff0c;其中经纬图等角映射&#…

适用于 Windows 的免费U盘数据恢复方法详解

笔式驱动器&#xff08;Pen Drive&#xff09;是一种方便、小巧、便于携带的数据存储设备&#xff0c;也称为U盘、拇指驱动器、U盘等。“笔式驱动器”的名称来源于其外观&#xff0c;即体积小、体积小、方便携带。与传统笔相似&#xff0c;尽管它实际上并不能书写。 有几个功能…

如何把硬盘(分区)一分为二?重装系统的小伙伴不可不看

注意事项&#xff1a;本教程操作不当会导致数据丢失 请谨慎操作 请谨慎操作 请谨慎操作 前言 相信各位小伙伴都会切土豆吧&#xff0c;本教程就是教大家如何切土豆切得好的教程。 啊哈哈哈&#xff0c;开玩笑的。 比如你有一个D盘是200GB&#xff0c;想要把它变成两个100G…

3D空间漫游技术的日趋成熟,让博物馆数字化大放异彩!

随着科技的飞速发展&#xff0c;互联网已经成为人们生活中不可或缺的一部分。在这个数字化时代&#xff0c;博物馆也紧跟时代潮流&#xff0c;将传统的实体博物馆与现代科技相结合&#xff0c;诞生了一种全新的博物馆形式——3D线上博物馆。这种新型博物馆凭借其独特的魅力&…

vue组件scoped的作用 目的: 解决多个组件样式名相同, 冲突问题

在style上加入scoped属性, 就会在此组件的标签上加上一个随机生成的data-v开头的属性&#xff0c;下面一起来看一下&#xff0c;希望对大家有帮助。 vue组件-scoped作用 需求: p标签名选择器, 设置背景色 问题: 发现组件里的p和外面的p都生效了 解决: 给Pannel.vue组件里sty…

设计模式之单例模式的懒饿汉

懒汉式 说白了就是你不叫我我不动&#xff0c;你叫我我才动。 类初始化模式&#xff0c;也叫延迟占位模式。在单例类的内部由一个私有静态内部类来持有这个单例类的实例。因为在 JVM 中&#xff0c;对类的加载和类初始化&#xff0c;由虚拟机保证线程安全。 public class Singl…

一个H3C交换机周期性断网并自动恢复的排查案例

一个朋友发我一个H3C日志&#xff0c;这个交换机是汇聚层交换机&#xff0c;1和2口是trunk口&#xff0c;其它接口是access接口&#xff0c;17-21口据说接的都是监控、终端。日志里面看到大量的拓朴改变&#xff0c;好几个网口up、down的日志&#xff0c;怀疑是环路&#xff0c…

Vue3——element-plus表格组件怎样得到当前行的id

实现方法&#xff1a; <el-table-column property"address" label"操作" show-overflow-tooltip header-align"center" v-slot"scope"><el-button type"success" click"editBtn(scope.row.id)">编辑…