Android Studio安卓读写NFC Ntag标签源码

本示例使用的发卡器: https://item.taobao.com/item.htm?spm=a1z10.5-c-s.w4002-21818769070.11.3513789erHXVGx&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=".NtagActivity"><androidx.appcompat.widget.Toolbarandroid: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"><TextViewandroid: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" /><TextViewandroid:id="@+id/TextViewlabelDisp"android:layout_width="match_parent"android:layout_height="match_parent"android:text="ntag213、215、216卡、复旦11rf32测试页"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><TextViewandroid:id="@+id/sample_text"android:layout_width="fill_parent"android:layout_height="120dp"android:padding="3dp"android:text="操作结果"android:background="@drawable/shape4border"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintBottom_toBottomOf="parent"/><ScrollViewandroid:id="@+id/scrollViewIC"android:layout_width="fill_parent"android:layout_height="0dp"android:layout_marginBottom="5dp"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintTop_toBottomOf="@+id/toolbar"app:layout_constraintBottom_toTopOf="@+id/sample_text"android:scrollbars="horizontal"><androidx.constraintlayout.widget.ConstraintLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:padding="3dp"><Buttonandroid:id="@+id/butt_requestntag"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="5dp"android:text="搜寻Ntag卡获取卡号"android:textSize="12sp"android:onClick="RequestNtag"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintTop_toTopOf="parent"  /><TextViewandroid:id="@+id/textViewtitleuid"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="10dp"android:text="UID:"app:layout_constraintBottom_toBottomOf="@+id/butt_requestntag"app:layout_constraintLeft_toRightOf="@+id/butt_requestntag"app:layout_constraintTop_toTopOf="@+id/butt_requestntag" /><TextViewandroid:id="@+id/textViewuid"android:layout_width="130dp"android:layout_height="wrap_content"android:layout_marginLeft="5dp"android:background="@drawable/shape4border"android:gravity="center"android:textColor="#FF0000"android:text=""app:layout_constraintBottom_toBottomOf="@+id/textViewtitleuid"app:layout_constraintLeft_toRightOf="@+id/textViewtitleuid"app:layout_constraintTop_toTopOf="@+id/textViewtitleuid" /><Buttonandroid:id="@+id/butt_getversiontype"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="5dp"android:onClick="getversiontype"android:text="卡片版本及型号"android:textSize="12sp"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintTop_toBottomOf="@+id/butt_requestntag" /><Buttonandroid:id="@+id/butt_getsign"android:layout_width="wrap_content"android:layout_height="wrap_content"android:onClick="getcardsign"android:text="卡片签名信息"android:textSize="12sp"app:layout_constraintBottom_toBottomOf="@+id/butt_getversiontype"app:layout_constraintLeft_toRightOf="@+id/butt_getversiontype"app:layout_constraintTop_toTopOf="@+id/butt_getversiontype" /><Buttonandroid:id="@+id/butt_getcountervalue"android:layout_width="wrap_content"android:layout_height="wrap_content"android:onClick="getcountervalue"android:text="卡片单向计数器值"android:textSize="11sp"app:layout_constraintBottom_toBottomOf="@+id/butt_getsign"app:layout_constraintLeft_toRightOf="@+id/butt_getsign"app:layout_constraintTop_toTopOf="@+id/butt_getsign" /><Buttonandroid:id="@+id/butt_getStaticlock"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="5dp"android:onClick="getStaticlock"android:text="读取卡片静态锁值"android:textSize="12sp"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintTop_toBottomOf="@+id/butt_getversiontype" /><TextViewandroid:id="@+id/textViewtitlelock"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="10dp"android:text="静态锁标识:"app:layout_constraintBottom_toBottomOf="@+id/butt_getStaticlock"app:layout_constraintLeft_toRightOf="@+id/butt_getStaticlock"app:layout_constraintTop_toTopOf="@+id/butt_getStaticlock" /><EditTextandroid:id="@+id/edit_Staticlock"android:layout_width="120dp"android:layout_height="wrap_content"android:layout_marginLeft="2dp"android:background="@drawable/shape4border"android:digits="01"android:gravity="center"android:inputType="textCapCharacters"android:maxLength="16"android:text="0000000000000000"android:textColor="#0000FF"android:textSize="12sp"app:layout_constraintBottom_toBottomOf="@+id/textViewtitlelock"app:layout_constraintLeft_toRightOf="@+id/textViewtitlelock"app:layout_constraintTop_toTopOf="@+id/textViewtitlelock" /><Buttonandroid:id="@+id/butt_Staticlock"android:layout_width="wrap_content"android:layout_height="wrap_content"android:onClick="Staticlock"android:text="将卡片加上静态锁"android:textSize="12sp"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintTop_toBottomOf="@+id/butt_getStaticlock" /><TextViewandroid:id="@+id/textViewtitlenote"android:layout_width="250dp"android:layout_height="wrap_content"android:layout_marginLeft="10dp"android:text="警告:16位静态锁标识代表0-15块的锁定状态,0表示块未锁定、1表示块锁定,块如果锁定将不能再次修改!"android:textColor="#FF0000"app:layout_constraintBottom_toBottomOf="@+id/butt_Staticlock"app:layout_constraintLeft_toRightOf="@+id/butt_Staticlock"app:layout_constraintTop_toTopOf="@+id/butt_Staticlock" /><CheckBoxandroid:id="@+id/check_seleauthkeyen"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="20dp"android:text="选择先认证密钥再继续以下操作,8位16进制认证密钥:"android:textColor="#0000FF"android:textSize="11sp"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintTop_toBottomOf="@+id/butt_Staticlock" /><EditTextandroid:id="@+id/edit_authkey"android:layout_width="70dp"android:layout_height="wrap_content"android:layout_marginLeft="4dp"android:background="@drawable/shape4border"android:digits="0123456789ABCDEFabcdef"android:textColor="#FF0000"android:gravity="center"android:inputType="textCapCharacters"android:maxLength="8"android:maxLines="1"android:text="12345678"android:textSize="12sp"app:layout_constraintBottom_toBottomOf="@+id/check_seleauthkeyen"app:layout_constraintLeft_toRightOf="@+id/check_seleauthkeyen"app:layout_constraintTop_toTopOf="@+id/check_seleauthkeyen" /><Buttonandroid:id="@+id/butt_initntag"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="10dp"android:onClick="InitNtagCard"android:text="设置Ntag卡密钥机制"android:textSize="12sp"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintTop_toBottomOf="@+id/check_seleauthkeyen" /><Spinnerandroid:id="@+id/spin_seleopencloskey"android:layout_width="220dp"android:layout_height="wrap_content"android:layout_marginLeft="8dp"android:entries="@array/NtagKeyEn"android:theme="@style/my_spinner_style"app:layout_constraintLeft_toRightOf="@+id/butt_initntag"app:layout_constraintTop_toTopOf="@+id/butt_initntag" /><Spinnerandroid:id="@+id/spin_selereadauth"android:layout_width="220dp"android:layout_height="wrap_content"android:layout_marginLeft="8dp"android:entries="@array/NtagReadAuthEn"android:theme="@style/my_spinner_style"app:layout_constraintBottom_toBottomOf="@+id/butt_initntag"app:layout_constraintLeft_toRightOf="@+id/butt_initntag" /><TextViewandroid:id="@+id/textViewtitlefrom"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="3dp"android:textSize="12sp"android:text="选择从第:"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintTop_toBottomOf="@+id/butt_initntag" /><EditTextandroid:id="@+id/edit_initbeginblock"android:layout_width="50dp"android:layout_height="wrap_content"android:layout_marginLeft="4dp"android:background="@drawable/shape4border"android:digits="0123456789"android:gravity="center"android:textColor="#FF0000"android:inputType="textCapCharacters"android:maxLength="4"android:maxLines="1"android:text="20"android:textSize="12sp"app:layout_constraintBottom_toBottomOf="@+id/textViewtitlefrom"app:layout_constraintLeft_toRightOf="@+id/textViewtitlefrom"app:layout_constraintTop_toTopOf="@+id/textViewtitlefrom" /><TextViewandroid:id="@+id/textViewtitle0"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="2dp"android:layout_marginTop="3dp"android:text="块开始有密钥保护功能,卡片新密钥:"android:textSize="12sp"app:layout_constraintBottom_toBottomOf="@+id/edit_initbeginblock"app:layout_constraintLeft_toRightOf="@+id/edit_initbeginblock"app:layout_constraintTop_toTopOf="@+id/edit_initbeginblock" /><EditTextandroid:id="@+id/edit_newkey"android:layout_width="70dp"android:layout_height="wrap_content"android:layout_marginLeft="4dp"android:background="@drawable/shape4border"android:digits="0123456789ABCDEFabcdef"android:textColor="#FF0000"android:gravity="center"android:inputType="textCapCharacters"android:maxLength="8"android:maxLines="1"android:text="12345678"android:textSize="12sp"app:layout_constraintBottom_toBottomOf="@+id/textViewtitle0"app:layout_constraintLeft_toRightOf="@+id/textViewtitle0"app:layout_constraintTop_toTopOf="@+id/textViewtitle0" /><TextViewandroid:id="@+id/textViewpack"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="3dp"android:textSize="12sp"android:text="PACK密钥确认码:"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintTop_toBottomOf="@+id/textViewtitlefrom" /><EditTextandroid:id="@+id/edit_packkey"android:layout_width="40dp"android:layout_height="wrap_content"android:layout_marginLeft="4dp"android:background="@drawable/shape4border"android:digits="0123456789ABCDEFabcdef"android:gravity="center"android:textColor="#FF0000"android:inputType="textCapCharacters"android:maxLength="4"android:maxLines="1"android:text="1616"android:textSize="12sp"app:layout_constraintBottom_toBottomOf="@+id/textViewpack"app:layout_constraintLeft_toRightOf="@+id/textViewpack"app:layout_constraintTop_toTopOf="@+id/textViewpack" /><TextViewandroid:id="@+id/textViewtitle1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="2dp"android:layout_marginTop="3dp"android:text=",允许密钥认证失败次数(0不限制):"android:textSize="12sp"app:layout_constraintBottom_toBottomOf="@+id/edit_packkey"app:layout_constraintLeft_toRightOf="@+id/edit_packkey"app:layout_constraintTop_toTopOf="@+id/edit_packkey" /><EditTextandroid:id="@+id/edit_limitauthfailed"android:layout_width="40dp"android:layout_height="wrap_content"android:layout_marginLeft="4dp"android:background="@drawable/shape4border"android:digits="0123456789"android:gravity="center"android:inputType="textCapCharacters"android:maxLength="4"android:maxLines="1"android:text="0"android:textColor="#FF0000"android:textSize="12sp"app:layout_constraintBottom_toBottomOf="@+id/textViewtitle1"app:layout_constraintLeft_toRightOf="@+id/textViewtitle1"app:layout_constraintTop_toTopOf="@+id/textViewtitle1" /><Buttonandroid:id="@+id/butt_readntag"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="20dp"android:text="轻松从Ntag卡读数据"android:textSize="12sp"android:onClick="ReadNtagCard"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintTop_toBottomOf="@+id/textViewpack" /><Buttonandroid:id="@+id/butt_writentag"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="轻松写数据到Ntag卡"android:textSize="12sp"android:onClick="WriteNtagCard"app:layout_constraintBottom_toBottomOf="@+id/butt_readntag"app:layout_constraintLeft_toRightOf="@+id/butt_readntag"app:layout_constraintTop_toTopOf="@+id/butt_readntag" /><TextViewandroid:id="@+id/textViewtitle2"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="3dp"android:text="本次读写操作起始块:"android:textSize="12sp"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintTop_toBottomOf="@+id/butt_readntag" /><EditTextandroid:id="@+id/edit_RWbeginblock"android:layout_width="48dp"android:layout_height="wrap_content"android:layout_marginLeft="4dp"android:background="@drawable/shape4border"android:digits="0123456789"android:gravity="center"android:inputType="textCapCharacters"android:maxLength="4"android:maxLines="1"android:text="4"android:textColor="#FF0000"android:textSize="12sp"app:layout_constraintBottom_toBottomOf="@+id/textViewtitle2"app:layout_constraintLeft_toRightOf="@+id/textViewtitle2"app:layout_constraintTop_toTopOf="@+id/textViewtitle2" /><TextViewandroid:id="@+id/textViewtitle3"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="40dp"android:layout_marginTop="3dp"android:text="本次读写块数:"android:textSize="12sp"app:layout_constraintBottom_toBottomOf="@+id/edit_RWbeginblock"app:layout_constraintLeft_toRightOf="@+id/edit_RWbeginblock"app:layout_constraintTop_toTopOf="@+id/edit_RWbeginblock" /><EditTextandroid:id="@+id/edit_RWblocks"android:layout_width="48dp"android:layout_height="wrap_content"android:layout_marginLeft="4dp"android:background="@drawable/shape4border"android:digits="0123456789"android:gravity="center"android:inputType="textCapCharacters"android:maxLength="4"android:maxLines="1"android:text="10"android:textColor="#FF0000"android:textSize="12sp"app:layout_constraintBottom_toBottomOf="@+id/textViewtitle3"app:layout_constraintLeft_toRightOf="@+id/textViewtitle3"app:layout_constraintTop_toTopOf="@+id/textViewtitle3" /><TextViewandroid:id="@+id/textViewtitle4"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="3dp"android:text="读写标签内数据:"android:textSize="12sp"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintTop_toBottomOf="@+id/textViewtitle2" /><EditTextandroid:id="@+id/edit_rwdata"android:layout_width="match_parent"android:layout_height="130dp"android:background="@drawable/shape4border"android:digits="0123456789ABCDEFabcdef "android:inputType="textCapCharacters"android:maxLines="8"android:gravity="left"android:text="00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00"android:textSize="12sp"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintTop_toBottomOf="@+id/textViewtitle4" /></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.CheckBox;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.TextView;import com.reader.ourmifare;public class NtagActivity extends AppCompatActivity {private TextView tv;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_ntag);androidx.appcompat.widget.Toolbar toolbar=findViewById(R.id.toolbar);setSupportActionBar(toolbar);tv = findViewById(R.id.sample_text);tv.setText("操作结果");Spinner spls = findViewById(R.id.spin_seleopencloskey);spls.setSelection(1);}@Overridepublic void onBackPressed(){super.onBackPressed();finish();}@Overridepublic 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 RequestNtag(View view){byte status;                          //存放返回值byte[] mypiccserial = new byte[7];    //7字节卡号tv.setText("");TextView ctruid=findViewById(R.id.textViewuid);ctruid.setText("");status = ourmifare.piccrequestul(mypiccserial);//& 0xff用于转为无符号行数据if (status == 0) {ourmifare.pcdbeep(38);String uidstr = "";for (int i = 0; i < 7; i++) {String bytestr = "00" + Integer.toHexString(mypiccserial[i] & 0xff);uidstr = uidstr + bytestr.substring(bytestr.length() - 2, bytestr.length()) ;}ctruid.setText(uidstr);tv.setText("获取7字节卡序号:" + uidstr);} else {PrintErrInf(status);   //返回代码提示}}public void getversiontype(View view){byte status;                          //存放返回值byte[] mypiccserial = new byte[7];    //7字节卡号byte[] mypiccversiondata=new byte[8];tv.setText("");TextView ctruid=findViewById(R.id.textViewuid);ctruid.setText("");status = ourmifare.piccrequestul(mypiccserial);if (status == 0) {String uidstr = "";for (int i = 0; i < 7; i++) {String bytestr = "00" + Integer.toHexString(mypiccserial[i] & 0xff);uidstr = uidstr + bytestr.substring(bytestr.length() - 2, bytestr.length()) ;}ctruid.setText(uidstr);status = ourmifare.piccgetversionntag(mypiccversiondata);if (status == 0) {ourmifare.pcdbeep(38);String verdstr = "";for (int i = 0; i < 8; i++) {String bytestr = "00" + Integer.toHexString(mypiccversiondata[i] & 0xff);verdstr = verdstr + bytestr.substring(bytestr.length() - 2, bytestr.length()) + " ";}tv.setText("读取卡片版本型号成功!"+"\n卡片序号:" + uidstr+"\n"+"版本型号:"+verdstr);}else {PrintErrInf(status);   //返回代码提示}} else {PrintErrInf(status);   //返回代码提示}}public void getcardsign(View view){byte status;                          //存放返回值byte[] mypiccserial = new byte[7];    //7字节卡号byte[] piccsigdata=new byte[32];tv.setText("");TextView ctruid=findViewById(R.id.textViewuid);ctruid.setText("");status = ourmifare.piccrequestul(mypiccserial);if (status == 0) {String uidstr = "";for (int i = 0; i < 7; i++) {String bytestr = "00" + Integer.toHexString(mypiccserial[i] & 0xff);uidstr = uidstr + bytestr.substring(bytestr.length() - 2, bytestr.length()) ;}ctruid.setText(uidstr);status = ourmifare.piccgetversionntag(piccsigdata);if (status == 0) {ourmifare.pcdbeep(38);String verdstr = "";for (int i = 0; i < 32; i++) {String bytestr = "00" + Integer.toHexString(piccsigdata[i] & 0xff);verdstr = verdstr + bytestr.substring(bytestr.length() - 2, bytestr.length()) + " ";}tv.setText("读取卡片签名信息成功!"+"\n卡片序号:" + uidstr+"\n"+"签名信息:"+verdstr);}else {PrintErrInf(status);   //返回代码提示}} else {PrintErrInf(status);   //返回代码提示}}public void getcountervalue(View view){byte status;                          //存放返回值byte[] mypiccserial = new byte[7];    //7字节卡号byte[] mypicccntdata=new byte[3];tv.setText("");TextView ctruid=findViewById(R.id.textViewuid);ctruid.setText("");status = ourmifare.piccrequestul(mypiccserial);if (status == 0) {String uidstr = "";for (int i = 0; i < 7; i++) {String bytestr = "00" + Integer.toHexString(mypiccserial[i] & 0xff);uidstr = uidstr + bytestr.substring(bytestr.length() - 2, bytestr.length()) ;}ctruid.setText(uidstr);status = ourmifare.piccreadcntntag(mypicccntdata);if (status == 0) {ourmifare.pcdbeep(38);String verdstr = "";for (int i = 0; i < 3; i++) {String bytestr = "00" + Integer.toHexString(mypicccntdata[i] & 0xff);verdstr = verdstr + bytestr.substring(bytestr.length() - 2, bytestr.length()) + " ";}tv.setText("读取卡片单向计数器值成功!"+"\n卡片序号:" + uidstr+"\n"+"计数器值:"+verdstr);}else {tv.setText("读取卡片单向计数器值失败!错误代码:"+Integer.toString(status)+"\n卡片序号:" + uidstr+"\n"+"可能是计数器功能尚未启用或卡本身不支持计数功能!");}} else {PrintErrInf(status);   //返回代码提示}}public void getStaticlock(View view){byte status;                          //存放返回值byte[] mypiccserial = new byte[7];    //7字节卡号byte[] mypiccdata=new byte[16];tv.setText("");TextView ctruid=findViewById(R.id.textViewuid);ctruid.setText("");status = ourmifare.piccrequestul(mypiccserial);if (status == 0) {String uidstr = "";for (int i = 0; i < 7; i++) {String bytestr = "00" + Integer.toHexString(mypiccserial[i] & 0xff);uidstr = uidstr + bytestr.substring(bytestr.length() - 2, bytestr.length());}ctruid.setText(uidstr);status = ourmifare.piccreadul((byte) 0,mypiccdata);if (status == 0) {ourmifare.pcdbeep(38);String verdstr = "";for (int i = 10; i < 12; i++) {String bytestr = "00000000" + Integer.toBinaryString(mypiccdata[i] & 0xff);verdstr = verdstr + bytestr.substring(bytestr.length() - 8, bytestr.length()) ;}EditText ctrstationlock=findViewById(R.id.edit_Staticlock);ctrstationlock.setText(verdstr);String tagtypestr="";switch(mypiccdata[14]){case 0x12:tagtypestr="Ntag213,144 Bytes";break;case 0x3e:tagtypestr="Ntag215,504 Bytes";break;case 0x6D:tagtypestr="Ntag216,888 Bytes";break;default:tagtypestr="OtherNtag";break;}tv.setText("读取卡片静态锁标识成功!"+"\n卡片序号:" + uidstr+"\n芯片类型:"+tagtypestr+"\n静态锁标识:"+verdstr);}else {PrintErrInf(status);   //返回代码提示}} else {PrintErrInf(status);   //返回代码提示}}public void Staticlock(View view){byte status;                          //存放返回值byte[] mypiccserial = new byte[7];    //7字节卡号byte[] mypiccdata=new byte[4];tv.setText("");TextView ctruid=findViewById(R.id.textViewuid);ctruid.setText("");EditText ctrstaticlock=findViewById(R.id.edit_Staticlock);String staticlockstr=ctrstaticlock.getText().toString().trim();if (staticlockstr.length()!=16){tv.setText("静态锁标识输入错误,请输入16位2进制静态锁标识值!");return;}status = ourmifare.piccrequestul(mypiccserial);if (status == 0) {String uidstr = "";for (int i = 0; i < 7; i++) {String bytestr = "00" + Integer.toHexString(mypiccserial[i] & 0xff);uidstr = uidstr + bytestr.substring(bytestr.length() - 2, bytestr.length());}ctruid.setText(uidstr);mypiccdata[0]=0;mypiccdata[1]=0;mypiccdata[2]=(byte)Integer.parseInt(staticlockstr.substring(0,8),2);mypiccdata[3]=(byte)Integer.parseInt(staticlockstr.substring(staticlockstr.length() - 8, staticlockstr.length()),2);status = ourmifare.picclockntag((byte) 0,mypiccdata);if (status == 0) {ourmifare.pcdbeep(38);tv.setText("卡片加入静态锁成功!"+"\n卡片序号:" + uidstr+"\n");}else {PrintErrInf(status);   //返回代码提示}} else {PrintErrInf(status);   //返回代码提示}}public void InitNtagCard(View view){byte status;                          //存放返回值byte[] mypicckey = new byte[4];      //4个字节的卡旧密码byte[] newPickey = new byte[44];     //4个字节的新密码byte[] mypiccserial = new byte[7];   //7字节卡号byte ReadNeedKey = 0;                //取值0读卡不需要认证密码,非0读卡也要认证密码byte myctrlword ;                    //取值0不需要认证密码,16要认证卡密码  对卡操作byte KeyErrNum=0;                    //对卡操作允许密码错误次数(0为不限次)byte[] mypiccdata=new byte[16];      //本次对卡的配置信息tv.setText("");TextView ctruid=findViewById(R.id.textViewuid);ctruid.setText("");CheckBox ctrauthen=findViewById(R.id.check_seleauthkeyen);if (ctrauthen.isChecked()){myctrlword=16;EditText ctrauthkey=findViewById(R.id.edit_authkey);String authkeystr=ctrauthkey.getText().toString().trim();if (authkeystr.length() != 8){tv.setText("认证密钥是8位16进制数据,请输入正确的认证密钥!");return;}else {for (int i = 0; i < 4; i++) {mypicckey[i] = (byte) Integer.parseInt(authkeystr.substring(i * 2, i * 2 + 2), 16);//只有用Integer.parseInt才能杜绝大于128时的错误}}}else{myctrlword=0;}EditText ctrbeginblock=findViewById(R.id.edit_initbeginblock);byte beginblock=(byte) Integer.parseInt(ctrbeginblock.getText().toString().trim());EditText ctrliminub=findViewById(R.id.edit_limitauthfailed);KeyErrNum=(byte) Integer.parseInt(ctrliminub.getText().toString().trim());Spinner ctrreadkeyen=findViewById(R.id.spin_selereadauth);ReadNeedKey=(byte)ctrreadkeyen.getSelectedItemId();Spinner spls = findViewById(R.id.spin_seleopencloskey);if (spls.getSelectedItemId()==0){       //卡片开启密码保护功能,开启后要记住卡密码,否则卡报废!!!myctrlword=(byte)(myctrlword+4);mypiccdata[3]=beginblock;           //配置:密码保护起始页,要根据不同类型的卡来设置myctrlword=(byte)(myctrlword+1);mypiccdata[4]=(byte)(KeyErrNum % 8); //配置:最大卡密码认证错误次数if(ReadNeedKey>0){                   //配置:读卡时需要认证卡密码mypiccdata[4]=(byte)(mypiccdata[4]+(byte)(0x80));}myctrlword=(byte)(myctrlword+2);   //配置:启用计数器EditText ctrnewkey=findViewById(R.id.edit_newkey);String newkeystr=ctrnewkey.getText().toString().trim();if (newkeystr.length() != 8){tv.setText("密钥是8位16进制数据,请输入正确的新密钥!");return;}else {for (int i = 0; i < 4; i++) {newPickey[i] = (byte) Integer.parseInt(newkeystr.substring(i * 2, i * 2 + 2), 16);//只有用Integer.parseInt才能杜绝大于128时的错误mypiccdata[8+i]= (byte) Integer.parseInt(newkeystr.substring(i * 2, i * 2 + 2), 16);//只有用Integer.parseInt才能杜绝大于128时的错误}}EditText ctrpack=findViewById(R.id.edit_packkey);String packkeystr=ctrpack.getText().toString().trim();if (packkeystr.length() != 4){tv.setText("PACK密钥确认码是4位16进制数据,请输入正确的密钥确认码!");return;}else {for (int i = 0; i < 2; i++) {mypiccdata[12+i] = (byte) Integer.parseInt(packkeystr.substring(i * 2, i * 2 + 2), 16);//只有用Integer.parseInt才能杜绝大于128时的错误}}}else{   //卡片取消密码保护功能mypiccdata[3]=(byte)(0xff);myctrlword=(byte)(myctrlword+1);myctrlword=(byte)(myctrlword+2);}status = ourmifare.piccinitntag(myctrlword,mypiccserial,mypicckey,mypiccdata) ;if (status == 0) {ourmifare.pcdbeep(38);String uidstr = "";for (int i = 0; i < 7; i++) {String bytestr = "00" + Integer.toHexString(mypiccserial[i] & 0xff);uidstr = uidstr + bytestr.substring(bytestr.length() - 2, bytestr.length()) ;}ctruid.setText(uidstr);tv.setText("设置卡密码及保护机制成功!"+"\n卡片序号:" + uidstr);} else {PrintErrInf(status);   //返回代码提示}}public void ReadNtagCard(View view){byte status=1;                       //存放返回值byte[] mypiccserial = new byte[7];   //7字节卡号byte[] mypicckey=new byte[4];        //4个字节的卡密码byte[] mypiccdata=new byte[48];      //48个字节读卡的数据缓冲byte myblockaddr;                    //读起始页地址byte myblocksize;                    //读卡页数byte myctrlword;                     //取值0不认证密码,16要认证卡密码tv.setText("");TextView ctruid=findViewById(R.id.textViewuid);ctruid.setText("");EditText ctrrwdata=findViewById(R.id.edit_rwdata);ctrrwdata.setText("");CheckBox ctrauthen=findViewById(R.id.check_seleauthkeyen);if (ctrauthen.isChecked()){myctrlword=16;EditText ctrauthkey=findViewById(R.id.edit_authkey);String authkeystr=ctrauthkey.getText().toString().trim();if (authkeystr.length() != 8){tv.setText("认证密钥是8位16进制数据,请输入正确的认证密钥!");return;}else {for (int i = 0; i < 4; i++) {mypicckey[i] = (byte) Integer.parseInt(authkeystr.substring(i * 2, i * 2 + 2), 16);//只有用Integer.parseInt才能杜绝大于128时的错误}}}else{myctrlword=0;}EditText ctrblokadd=findViewById(R.id.edit_RWbeginblock);myblockaddr=(byte)Integer.parseInt(ctrblokadd.getText().toString().trim());EditText ctrbloknum=findViewById(R.id.edit_RWblocks);myblocksize=(byte)Integer.parseInt(ctrbloknum.getText().toString().trim());//使用循环的方式读取,每次读一个块,这样可以连续读取标签N个块数据if (myblocksize<1){tv.setText("请输入本次读写块数!");return;}int j=0;String readdatastr="";while (j<myblocksize){status = ourmifare.piccreadexntag(myctrlword,mypiccserial,mypicckey,(byte)(myblockaddr+j),(byte)1,mypiccdata) ;if (status==0){for (int i=0;i<4;i++ ){String bytestr = "00" + Integer.toHexString(mypiccdata[i] & 0xFF);readdatastr = readdatastr + bytestr.substring(bytestr.length() - 2, bytestr.length())+" ";}j++;}else{ j=myblocksize;}}if (status == 0) {ourmifare.pcdbeep(38);String uidstr = "";for (int i = 0; i < 7; i++) {String bytestr = "00" + Integer.toHexString(mypiccserial[i] & 0xFF);uidstr = uidstr + bytestr.substring(bytestr.length() - 2, bytestr.length()) ;}ctruid.setText(uidstr);ctrrwdata.setText(readdatastr);tv.setText("读取Ntag卡块数据成功!"+"\n卡片序号:" + uidstr);} else {PrintErrInf(status);   //返回代码提示}/*      执行一次读卡操作,每次最多可以读12个块if (myblocksize<1 || myblocksize>12){tv.setText("读写块数必须>=1,13<=");return;}status = ourmifare.piccreadexntag(myctrlword,mypiccserial,mypicckey,myblockaddr,myblocksize,mypiccdata) ;if (status == 0) {ourmifare.pcdbeep(38);String uidstr = "";for (int i = 0; i < 7; i++) {String bytestr = "00" + Integer.toHexString(mypiccserial[i] & 0xFF);uidstr = uidstr + bytestr.substring(bytestr.length() - 2, bytestr.length()) ;}ctruid.setText(uidstr);String databuf="";for (int i = 0; i < myblocksize*4; i++) {String bytestr = "00" + Integer.toHexString(mypiccdata[i] & 0xFF);databuf = databuf + bytestr.substring(bytestr.length() - 2, bytestr.length()) + " ";}ctrrwdata.setText(databuf);tv.setText("读取Ntag卡块数据成功!"+"\n卡片序号:" + uidstr);} else {PrintErrInf(status);   //返回代码提示}*/}public void WriteNtagCard(View view){byte status=1;                       //存放返回值byte[] mypiccserial = new byte[7];   //7字节卡号byte[] mypicckey=new byte[4];        //4个字节的卡密码byte[] mypiccdata=new byte[48];      //48个字节读卡的数据缓冲byte myblockaddr;                    //读起始页地址byte myblocksize;                    //读卡页数byte myctrlword;                     //取值0不认证密码,16要认证卡密码tv.setText("");TextView ctruid=findViewById(R.id.textViewuid);ctruid.setText("");CheckBox ctrauthen=findViewById(R.id.check_seleauthkeyen);if (ctrauthen.isChecked()){myctrlword=16;EditText ctrauthkey=findViewById(R.id.edit_authkey);String authkeystr=ctrauthkey.getText().toString().trim();if (authkeystr.length() != 8){tv.setText("认证密钥是8位16进制数据,请输入正确的认证密钥!");return;}else {for (int i = 0; i < 4; i++) {mypicckey[i] = (byte) Integer.parseInt(authkeystr.substring(i * 2, i * 2 + 2), 16);//只有用Integer.parseInt才能杜绝大于128时的错误}}}else{myctrlword=0;}EditText ctrblokadd=findViewById(R.id.edit_RWbeginblock);myblockaddr=(byte)Integer.parseInt(ctrblokadd.getText().toString().trim());EditText ctrbloknum=findViewById(R.id.edit_RWblocks);myblocksize=(byte)Integer.parseInt(ctrbloknum.getText().toString().trim());if (myblocksize<1){tv.setText("请输入本次读写块数!");return;}EditText ctrrwdata=findViewById(R.id.edit_rwdata);String rwdatahex=ctrrwdata.getText().toString().trim();String[] strArr = rwdatahex.split("\\ ");    /*分割接收到的数据后再分析、处理、返回指令*/if (strArr.length<myblocksize*4) {tv.setText("写入数据不足,请输入" + Integer.toString(myblocksize*4 * 2) + "位16进制写入数据!");return;}//使用循环的方式写卡,每次写一个块,这样可以连续写入N个块数据int j=0;while (j<myblocksize) {for (int i=0;i<4;i++){mypiccdata[i]=(byte)(Integer.parseInt(strArr[j*4+i],16));}status = ourmifare.piccwriteexntag(myctrlword, mypiccserial, mypicckey, (byte)(myblockaddr+j), (byte)1, mypiccdata);if (status==0){j++;}else{j=myblocksize;}}if (status == 0) {ourmifare.pcdbeep(38);String uidstr = "";for (int i = 0; i < 7; i++) {String bytestr = "00" + Integer.toHexString(mypiccserial[i] & 0xFF);uidstr = uidstr + bytestr.substring(bytestr.length() - 2, bytestr.length()) ;}ctruid.setText(uidstr);tv.setText("写入Ntag卡块数据成功!"+"\n卡片序号:" + uidstr);} else {PrintErrInf(status);   //返回代码提示}/*     //执行一次写卡操作,每次最多可以读11个块if (myblocksize<1 || myblocksize>11){tv.setText("读写块数必须>=1,12<=");return;}for (int i=0;i<strArr.length;i++){mypiccdata[i]=(byte)(Integer.parseInt(strArr[i],16));}status = ourmifare.piccwriteexntag(myctrlword, mypiccserial, mypicckey, myblockaddr, myblocksize, mypiccdata);if (status == 0) {ourmifare.pcdbeep(38);String uidstr = "";for (int i = 0; i < 7; i++) {String bytestr = "00" + Integer.toHexString(mypiccserial[i] & 0xFF);uidstr = uidstr + bytestr.substring(bytestr.length() - 2, bytestr.length()) ;}ctruid.setText(uidstr);tv.setText("写入Ntag卡块数据成功!"+"\n卡片序号:" + uidstr);} else {PrintErrInf(status);   //返回代码提示}*/}public void PrintErrInf(byte errcode) {String dispstr="";switch(errcode){case 1:dispstr="错误代码:1,0~2块都没读出来,可能刷卡太块。但卡序列号已被读出来!";break;case 2:dispstr="错误代码:2,第0块已被读出,但1~2块读取失败。卡序列号已被读出来!";break;case 3:dispstr="错误代码:3,第0、1块已被读出,但2块读取失败。卡序列号已被读出来!";break;case 8:dispstr="错误代码:8,未寻到卡,请重新拿开卡后再放到感应区!";break;case 9:dispstr="错误代码:9,有多张卡在感应区,寻卡过程中防冲突失败,读序列吗错误!";break;case 10:dispstr="错误代码:10,该卡可能已被休眠,无法选中卡片!";break;case 11:dispstr="错误代码:11,密码装载失败!";break;case 12:dispstr="错误代码:12,卡片密码认证失败!";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;default:System.out.print("未知错误,错误代码:"+Integer.toString(errcode));break;}tv = findViewById(R.id.sample_text);tv.setText(dispstr);}
}

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

“语言服务40人论坛2023年年会”在北京举行

为充分发挥区域合作优势&#xff0c;深度推进翻译专业学位研究生培养模式和路径建设&#xff0c;提升翻译人才培养质量&#xff0c;推动京津冀地区教育协同发展&#xff0c;为中国高质量发展提供语言服务智慧和方案&#xff0c;1月13日至14日&#xff0c;“语言服务40人论坛202…

嵌入式学习-网络编程-Day1

Day1 思维导图 作业 实现一下套接字通信 代码 #include<myhead.h>int main(int argc, const char *argv[]) {//1、创建套接字int sfd socket(AF_INET, SOCK_STREAM, 0);//参数1&#xff1a;通信域&#xff1a;使用的是ipv4通信//参数2&#xff1a;表示使用tcp通信//参…

继承、修饰符、工具类、jar包

目录 1.继承 2.修饰符 3.工具类 4.jar包的制作与使用 1.继承 是什么 1.面向对象的三大特征之一&#xff08;封装、继承、多态&#xff09; 2.可以使得子类具有父类的属性和方法&#xff0c;还可以在子类中重新定义&#xff0c;追加属性和方法。 继承的格式 public class F…

并发编程(一)线程基础知识与线程控制

进程与线程 进程&#xff1a;如任务管理器中各种程序叫做正在运行的进程。对于操作系统来说&#xff0c;仅仅是一个数据结构&#xff0c;并不真实的执行代码 线程&#xff1a;真实执行代码的 每个进程启动的是时候会同步启动一个主线程即main函数&#xff0c;当main函数结束…

智慧公厕:引领城市卫生管理新时代

在智慧城市建设中&#xff0c;智慧公厕作为城市环境卫生信息化的重要组成部分&#xff0c;扮演着关键角色。它不仅可以提升城市管理水平&#xff0c;满足人民群众的需求&#xff0c;还能提高公厕使用体验和城市环境卫生水平。如广州中期科技有限公司自主研发的智慧公厕管理系统…

第10章 通信业务

文章目录 10.1.1 通信行业1、通信行业的界定2、通信行业的特点 10.1.2 通信企业10.1.3 通信终端1、通信终端的分类2、终端发展趋势 10.2.1 通信业务的定义及分类10.2.2 基础电信业务1、第一类基础电信业务A11 固定通信业务A12 蜂窝移动通信业务A13 第一类卫星通信业务A14 第一类…

代码随想录 Leetcode1. 两数之和

题目&#xff1a; 代码&#xff08;首刷看解析 2024年1月15日&#xff09;&#xff1a; class Solution { public:vector<int> twoSum(vector<int>& nums, int target) {int another 0;unordered_map<int,int> hash;for(int i 0; i < nums.size();…

为什么有人说PMP是水证,它的含金量到底怎么样?

在我国大陆&#xff0c;有好多证书被商业化得太重了&#xff0c;甚至演变成了个人或一些公司摇钱的工具。所以有些证书受人吹捧它崛起的快&#xff0c;但是活不长&#xff0c;甚至“夭折”&#xff0c;比如以前微软系列的证书&#xff1b; 而PMP认证从国外引进大陆这么多年了&…

NLP(十八):LLM 的推理优化技术纵览

原文&#xff1a;NLP&#xff08;十八&#xff09;&#xff1a;LLM 的推理优化技术纵览 - 知乎 目录 收起 一、子图融合&#xff08;subgraph fusion&#xff09; 1.1 FasterTransformer by NVIDIA 1.2 DeepSpeed Inference by Microsoft 1.3 MLC LLM by TVM 二、模型压…

Grind75第10天 | 133.克隆图、994.腐烂的橘子、79.单词搜索

133.克隆图 题目链接&#xff1a;https://leetcode.com/problems/clone-graph 解法&#xff1a; 这个题是对无向图的遍历&#xff0c;可以用深度优先搜索和广度有限搜索。 下面这个图比较清楚的说明了两种方法的区别。 DFS&#xff1a;从A开始克隆&#xff0c;遍历两个邻居…

数据结构期末复习(C语言版)

一、绪论 1.数据结构的术语 数据&#xff1a;所有能输入计算机并被计算机程序处理的符号的总称&#xff1b;数据元素&#xff1a;数据的基本单位&#xff1b;数据项&#xff1a;组成数据元素的、有独立含义的、不可分割的最小单位&#xff1b;数据对象&#xff1a;是性质相同…

springboot基于WEB的旅游推荐系统设计与实现

&#x1f345;点赞收藏关注 → 私信领取本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345;一 、设计说明 1.1选题动因 当前…

云原生微服务之分布式锁框架 Redisson

&#x1f339;作者主页&#xff1a;青花锁 &#x1f339;简介&#xff1a;Java领域优质创作者&#x1f3c6;、Java微服务架构公号作者&#x1f604; &#x1f339;简历模板、学习资料、面试题库、技术互助 &#x1f339;文末获取联系方式 &#x1f4dd; 系列专栏目录 [Java项目…

阿里云国际服务器设置安全防护程序

阿里云云服务器&#xff08;ECS&#xff09;提供弹性、安全、高性能、高性价比的虚拟云服务器&#xff0c;满足您的所有需求。立即在这里免费注册&#xff01; 常见 Web 应用程序 请勿对 Web 服务控制台&#xff08;如 WDCP、TOMCAT、Apache、Nginx、Jekins、PHPMyAdmin、Web…

陪诊小程序开发|陪诊软件定制|陪诊系统成品功能包含哪些?

陪诊小程序是一种便捷的工具&#xff0c;为用户提供一系列服务和功能&#xff0c;方便患者在就医过程中获得更好的体验和效果。接下来我们将介绍几个主要的陪诊小程序功能。 陪诊小程序开发功能&#xff1a; 一、预约挂号功能。陪诊小程序能够连接用户和医疗机构的系统&#x…

从头安装与使用一个docker GPU环境

GPU版docker的安装与使用 欢迎使用GPU版docker安装使用说明使用官方教程安装docker新建一个GPU版docker环境调用docker环境执行本地python文件 欢迎使用GPU版docker安装使用说明 使用官方教程安装docker 导入源仓库的GPG key curl -fsSL https://download.docker.com/linux/…

虹科分享 | 用Redis为LangChain定制AI代理——OpenGPTs

文章速览&#xff1a; OpenGPTs简介Redis在OpenGPTs中的作用在本地使用OpenGPTs在云端使用OpenGPTsRedis与LangChain赋能创新 OpenAI最近推出了OpenAI GPTs——一个构建定制化AI代理的无代码“应用商店”&#xff0c;随后LangChain开发了类似的开源工具OpenGPTs。OpenGPTs是一…

05-微服务Sentinel流量哨兵

一、Sentinel介绍 1.1 什么是Sentinel 分布式系统的流量防卫兵&#xff1a;随着微服务的普及&#xff0c;服务调用的稳定性变得越来越重要。Sentinel以“流量”为切入点&#xff0c;在流量控制、断路、负载保护等多个领域开展工作&#xff0c;保障服务可靠性。特点&#xff1…

VSCode搭建 .netcore 开发环境

一、MacOS 笔者笔记本电脑上安装的是macOS High Sierra(10.13)&#xff0c;想要尝试一下新版本的.netcore&#xff0c;之前系统是10.12时&#xff0c;.netcore 3.1刚出来时安装过3.1版本&#xff0c;很久没更新了&#xff0c;最近.net8出来了&#xff0c;想试一下&#xff0c;…

redis夯实之路-键过期与发布订阅详解

设置键的生存时间或过期时间 Setex&#xff08;单位s&#xff09;&#xff0c;expire&#xff08;s&#xff09;&#xff0c;pexpire&#xff08;ms&#xff09;可以设置键的生存时间&#xff0c; Expirate&#xff0c;pexpirate设置键的过期时间&#xff08;timestamp的时间…