荣士第二代USB免驱动IC读写器IC-02支持Windows、安卓(Android)、Linux系统,为方便IC-02读写器能快速的接入安卓(Android)系统,我们提供了各种安卓版本的So库及示例源码,安卓工程师可直接拷贝以下代码使用到项目中。
读写器介绍:
RFID读写器NFC发卡器WEB可编程NDEF文本/网址/智能海报/电话/启动-淘宝网 (taobao.com)https://item.taobao.com/item.htm?spm=a1z10.5-c.w4002-17663462238.11.183d789e5MFoI2&id=615391857885
Android Studio源码:
package com.ic.ic02test;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import com.reader.ourmifare; //引入我们的读写器类
public class MainActivity extends AppCompatActivity {
private TextView tv;
//读写卡操作控制字指定,
private static final byte BLOCK0_EN = 0x01; //允许读写第0块
private static final byte BLOCK1_EN = 0x02; //允许读写第1块
private static final byte BLOCK2_EN = 0x04; //允许读写第2块
private static final byte NEEDSERIAL = 0x08; //仅读指定序列号的卡
private static final byte EXTERNKEY = 0x10; //需要指定密码
private static final byte NEEDHALT = 0x20; //休眠卡
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Example of a call to a native method
tv = findViewById(R.id.sample_text);
tv.setText("操作结果");
}
//读取IC卡卡号------------------------------------------------------------------------
public void piccrequest(View view)
{
byte status;//存放返回值
byte[] mypiccserial = new byte[4];
long cardhao;
String strls = "";
status = ourmifare.piccrequest(this,mypiccserial);
if(status == 0)
{
strls = "读取成功!卡号为";
cardhao = mypiccserial[3] & 0xff;
cardhao *= 256;
cardhao += mypiccserial[2] & 0xff;
cardhao *= 256;
cardhao += mypiccserial[1] & 0xff;
cardhao *= 256;
cardhao += mypiccserial[0] & 0xff;
String strls1 = "000000000"+Long.toString(cardhao);//0305887634 123B7992
strls = strls + strls1.substring(strls1.length()-10);
}
else
{
if(status == 8)
{
strls = "请将卡放在IC卡读卡器感应区";
}
else if(status == 23)
{
strls = "错误提示:读卡器未插入";
}
else
{
strls = "错误代码:" + Integer.toString(status);
}
}
tv.setText(strls);
}
//轻松读卡,返回4字节卡号及48字节扇区数据-----------------------------------------------
public void piccreadex(View view)
{
byte status;//存放返回值
byte myareano;//区号
byte authmode;//密码类型,用A密码或B密码
byte myctrlword;//控制字
byte[] mypiccserial = new byte[4];//卡序列号
byte[] mypicckey = new byte[6];//密码
byte[] mypiccdata = new byte[48];//卡数据缓冲
myctrlword = BLOCK0_EN + BLOCK1_EN + BLOCK2_EN + EXTERNKEY; //控制字指定
myareano = 8;//指定为第8区
authmode = 1; //批定密码模式,大于0表示用A密码认证,推荐用A密码认证
//指定密码
mypicckey[0] = (byte)0xFF;
mypicckey[1] = (byte)0xFF;
mypicckey[2] = (byte)0xFF;
mypicckey[3] = (byte)0xFF;
mypicckey[4] = (byte)0xFF;
mypicckey[5] = (byte)0xFF;
long cardhao;
String strls = "";
status = ourmifare.piccreadex(this,myctrlword,mypiccserial,myareano,authmode,mypicckey,mypiccdata);
if(status == 0)
{
strls = "读取成功!卡号为";
cardhao = mypiccserial[3] & 0xff;
cardhao *= 256;
cardhao += mypiccserial[2] & 0xff;
cardhao *= 256;
cardhao += mypiccserial[1] & 0xff;
cardhao *= 256;
cardhao += mypiccserial[0] & 0xff;
String strls1 = "000000000"+Long.toString(cardhao);//0305887634
strls += strls1.substring(strls1.length()-10);
strls += ",扇区数据为";
for(int i = 0;i < 47;i++)
{
strls1 = "0"+Integer.toHexString(mypiccdata[i] & 0xff);
strls = strls + strls1.substring(strls1.length()-2) +"-";
}
String CardShopId=new String(mypiccdata);
String CardId=CardShopId.substring(1,16) ;
String ShopId=CardShopId.substring(17,35) ;
strls1 = "0"+Integer.toHexString(mypiccdata[47] & 0xff);
strls = strls + strls1.substring(strls1.length()-2);
}
else
{
if(status == 8)
{
strls = "请将卡放在IC卡读卡器感应区";
}
else if(status == 23)
{
strls = "错误提示:读卡器未插入";
}
else
{
strls = "错误代码:" + Integer.toString(status);
}
}
tv.setText(strls);
}
//轻松写卡:8区,密码12个F,数据1-48,返回4字节卡号-----------------------------------------
public void piccwriteex(View view)
{
byte status;//存放返回值
byte myareano;//区号
byte authmode;//密码类型,用A密码或B密码
byte myctrlword;//控制字
byte[] mypiccserial = new byte[4];//卡序列号
byte[] mypicckey = new byte[6];//密码
byte[] mypiccdata = new byte[48];//卡数据缓冲
myctrlword = BLOCK0_EN + BLOCK1_EN + BLOCK2_EN + EXTERNKEY; //控制字指定,
myareano = 8;//指定区号为第8区
authmode = 1;//批定密码模式,大于0表示用A密码认证,推荐用A密码认证
//指定密码
mypicckey[0] = (byte)0xFF;
mypicckey[1] = (byte)0xFF;
mypicckey[2] = (byte)0xFF;
mypicckey[3] = (byte)0xFF;
mypicckey[4] = (byte)0xFF;
mypicckey[5] = (byte)0xFF;
String CardId="0000000000123456";
String ShopId="0000000000987654321";
String WriteStr=CardId + ShopId +" ";//写入信息补足不小于48字节
byte[] WriteBuf=WriteStr.getBytes() ;
for(int i = 0;i < 48;i++)
{
mypiccdata[i] = WriteBuf[i];
}
long cardhao;
String strls = "";
status = ourmifare.piccwriteex(this,myctrlword,mypiccserial,myareano,authmode,mypicckey,mypiccdata);
if(status == 0)
{
strls = "写卡成功!卡号为";
cardhao = mypiccserial[3] & 0xff;
cardhao *= 256;
cardhao += mypiccserial[2] & 0xff;
cardhao *= 256;
cardhao += mypiccserial[1] & 0xff;
cardhao *= 256;
cardhao += mypiccserial[0] & 0xff;
String strls1 = "000000000"+Long.toString(cardhao);//0305887634
strls += strls1.substring(strls1.length()-10);
strls += ",写入扇区数据为";
for(int i = 0;i < 47;i++)
{
strls1 = "0"+Integer.toHexString(mypiccdata[i] & 0xff);
strls = strls + strls1.substring(strls1.length()-2) +"-";
}
strls1 = "0"+Integer.toHexString(mypiccdata[47] & 0xff);
strls = strls + strls1.substring(strls1.length()-2);
}
else
{
if(status == 8)
{
strls = "请将卡放在IC卡读卡器感应区";
}
else if(status == 23)
{
strls = "错误提示:读卡器未插入";
}
else
{
strls = "错误代码:" + Integer.toString(status);
}
}
tv.setText(strls);
}
//改单区密码:8区,密码12个F,改成12个F,返回4字节卡号"-------------------------------------
public void piccchangesinglekeyex(View view)
{
byte status;//存放返回值
byte myareano;//区号
byte authmode;//密码类型,用A密码或B密码
byte myctrlword;//控制字
byte[] mypiccserial = new byte[4];//卡序列号
byte[] mypicckeyold = new byte[6];//密码
byte[] mypicckeynew = new byte[17];//卡数据缓冲
myctrlword = EXTERNKEY; //指定本次操作的控制字
myareano = 8;//指定区号为第8区
authmode = 1;//指定密码认证模式,大于0表示用A密码认证,推荐用A密码认证
//旧密码
mypicckeyold[0] = (byte)0xFF;
mypicckeyold[1] = (byte)0xFF;
mypicckeyold[2] = (byte)0xFF;
mypicckeyold[3] = (byte)0xFF;
mypicckeyold[4] = (byte)0xFF;
mypicckeyold[5] = (byte)0xFF;
//新A密码
mypicckeynew[0] = (byte)0xFF;
mypicckeynew[1] = (byte)0xFF;
mypicckeynew[2] = (byte)0xFF;
mypicckeynew[3] = (byte)0xFF;
mypicckeynew[4] = (byte)0xFF;
mypicckeynew[5] = (byte)0xFF;
//访问位,不要轻易改,改错卡将做废 FF078069
mypicckeynew[6] = (byte)0xFF;
mypicckeynew[7] = (byte)0x07;
mypicckeynew[8] = (byte)0x80;
mypicckeynew[9] = (byte)0x69;
//新B密码
mypicckeynew[10] = (byte)0x00;
mypicckeynew[11] = (byte)0x00;
mypicckeynew[12] = (byte)0x00;
mypicckeynew[13] = (byte)0x00;
mypicckeynew[14] = (byte)0x00;
mypicckeynew[15] = (byte)0x00;
//选项
mypicckeynew[16] = (byte)0x00;//为0表示只改A官密码 为1表示改A密码同时也改B密码,为3表示改AB密码及访问位,警示:不要轻易改访问位
long cardhao;
String strls = "";
status = ourmifare.piccchangesinglekeyex(this,myctrlword,mypiccserial,myareano,authmode,mypicckeyold,mypicckeynew);
if(status == 0)
{
strls = "修改密码成功!卡号为";
cardhao = mypiccserial[3] & 0xff;
cardhao *= 256;
cardhao += mypiccserial[2] & 0xff;
cardhao *= 256;
cardhao += mypiccserial[1] & 0xff;
cardhao *= 256;
cardhao += mypiccserial[0] & 0xff;
String strls1 = "000000000"+Long.toString(cardhao);//0305887634
strls += strls1.substring(strls1.length()-10);
}
else
{
if(status == 8)
{
strls = "请将卡放在IC卡读卡器感应区";
}
else if(status == 23)
{
strls = "错误提示:读卡器未插入";
}
else
{
strls = "错误代码:" + Integer.toString(status);
}
}
tv.setText(strls);
}
//读出设备全球唯一的设备编号,作为加密狗用----------------------------------------------
public void pcdgetdevicenumber(View view)
{
byte status;//存放返回值
byte[] devicenumber = new byte[4];
String strls = "";
status = ourmifare.pcdgetdevicenumber(this,devicenumber);
if(status == 0)
{
strls = "读取成功!设备编号为";
String strls1 = "0"+Integer.toHexString(devicenumber[0]);
strls = strls + strls1.substring(strls1.length()-2) +"-";
strls1 = "0"+Integer.toHexString(devicenumber[1]);
strls = strls + strls1.substring(strls1.length()-2) +"-";
strls1 = "0"+Integer.toHexString(devicenumber[2]);
strls = strls + strls1.substring(strls1.length()-2) +"-";
strls1 = "0"+Integer.toHexString(devicenumber[3]);
strls = strls + strls1.substring(strls1.length()-2);
}
else
{
if(status == 23)
{
strls = "错误提示:读卡器未插入";
}
else
{
strls = "错误代码:" + Integer.toString(status);
}
}
tv.setText(strls);
}
//让设备发出声响----------------------------------------------------------------------
public void beep(View view)
{
byte status;//存放返回值
String strls = "";
status = ourmifare.pcdbeep(this,50);
Android App源代码下载:USB-IC读写器M1IC卡Android示例源码.rar-其它文档类资源-CSDN文库https://download.csdn.net/download/zhangjin7422/20960780