安卓Android studio读写EM4305卡源码

安卓Android studio读写EM4305卡源码_第1张图片

本示例使用的发卡器: https://item.taobao.com/item.htm?id=718720660087&spm=a1z10.5-c.w4002-21818769070.15.57dc6f89txUhXE




    

        

        

    

    


    

        

            

            

            


            

            

            


            

            

            

package com.usbreadertest;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;

import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.TextView;

import com.reader.ouridr;
import com.reader.ourmifare;
public class EM4305Activity extends AppCompatActivity {
    private TextView tv;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_em4305);
        androidx.appcompat.widget.Toolbar toolbar=findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

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

        //增加输入监听事件
        // EM4305
        ((EditText)findViewById(R.id.editTextMaxBlockEM4305)).setOnFocusChangeListener(new View.OnFocusChangeListener(){

            @Override
            public void onFocusChange(View v,boolean FocusState) {
                if(FocusState){//进入焦点

                }
                else{//离开焦点
                    updateset4305();
                }

            }
        });

        //数据速率
        Spinner spls;
        spls = findViewById(R.id.SpinnerDateRateEM4305);
        spls.setSelection(2);//RF/16

        spls.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView parent, View view, int position, long id) {
                updateset4305();
            }

            @Override
            public void onNothingSelected(AdapterView parent) {

            }
        });


        //调制模式
        ((Spinner)findViewById(R.id.SpinnerEncoderEM4305)).setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView parent, View view, int position, long id) {
                updateset4305();
            }

            @Override
            public void onNothingSelected(AdapterView parent) {

            }
        });

        //加密模式
        ((Spinner)findViewById(R.id.SpinnerLoginModeEM4305)).setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView parent, View view, int position, long id) {
                updateset4305();
            }

            @Override
            public void onNothingSelected(AdapterView parent) {

            }
        });
    }
    @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 textclear4305(View view)
    {
        TextView tvls;
        tvls = findViewById(R.id.TextViewRetDataEM4305);
        tvls.setText("");
    }
    public void changepwd4305(View view)
    {
        byte i;
        byte j;
        byte status;//存放返回值

        byte myctrlword;//控制字

        byte[] oldpicckey = new byte[4];//旧密码
        byte[] mypiccserial = new byte[4];//卡序列号
        byte[] newpicckey = new byte[4];//新密码

        myctrlword = 0; //NEEDSERIAL:需要只对指定系列号的卡操作,NEEDKEY:需要用密码认证,LOCKBIT:锁定块,KEYENABLE:启用本卡的密码功能

        String strls;

        CheckBox cbls;
        EditText etls;

        cbls = findViewById(R.id.chkPwdEM4305);
        if(!cbls.isChecked()) {//本次操作需要密码验证
            tv.setText("EM4305卡修改卡密码必须带密码操作");
            return;
        }

        etls = findViewById(R.id.editTextPwdEM4305);
        strls = etls.getText().toString().trim();
        if(strls.length() < 8)
        {
            tv.setText("旧密码长度不足8位");
            return;
        }
        for (i = 0; i < 4; i++) {
            oldpicckey[i] = (byte)Integer.parseInt(strls.substring(i*2,i*2+2),16);//只有用Integer.parseInt才能杜绝大于128时的错误
        }
        myctrlword += ouridr.NEEDKEY;

        cbls = findViewById(R.id.chkUidNeedEM4305);
        if(cbls.isChecked()) {//仅操作指定卡号的卡
            etls = findViewById(R.id.editTextUidEM4305);
            strls = etls.getText().toString().trim();
            if(strls.length() < 8)
            {
                tv.setText("卡号长度不足8位");
                return;
            }

            for (i = 0; i < 4; i++) {
                mypiccserial[i] = (byte)Integer.parseInt(strls.substring(i*2,i*2+2),16);//只有用Integer.parseInt才能杜绝大于128时的错误
            }
            myctrlword += ouridr.NEEDSERIAL;

        }

        etls = findViewById(R.id.editTextPwdNewEM4305);
        strls = etls.getText().toString().trim();
        if(strls.length() < 8)
        {
            tv.setText("新密码长度不足8位!");
            return;
        }

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

        status = ouridr.em4305changekey(myctrlword,mypiccserial,oldpicckey,newpicckey);

        if(status == 0)
        {

            strls = "卡号[";

            strls += String.format("%02X%02X%02X%02X",mypiccserial[0],mypiccserial[1],mypiccserial[2],mypiccserial[3]);

            strls += "]";

            TextView tvls = findViewById(R.id.TextViewRetDataEM4305);
            tvls.setText(strls);

            strls = "EM4305卡修改卡密码成功";

            ouridr.beep(38);



        }
        else
        {

            if(status == 8)
            {
                strls = "请将卡放在感应区";
            }
            else if(status == 23)
            {
                strls = "错误代码:23,读卡器未插入";
            }
            else if(status == 1)
            {
                strls = "错误代码:1,卡放得远 或 需要密码才能写卡";
            }
            else if(status == 12)
            {
                strls = "错误代码:12,卡放得远 或 密码错误";
            }
            else
            {
                strls = "错误代码:" + Integer.toString(status);
            }

        }

        tv.setText(strls);
    }
    public void read4305(View view)
    {
        byte i;
        byte status;//存放返回值

        byte myctrlword;//控制字

        byte[] oldpicckey = new byte[4];//密码
        byte[] mypiccserial = new byte[4];//卡序列号
        byte[] mypiccdata = new byte[64];//读卡数据缓冲:卡无线转输分频比、卡内容长度(字节数),及最多返回12块的数据
        byte[] mypiccblockflag = new byte[2];//指定读哪一块

        myctrlword = 0; //NEEDSERIAL:需要只对指定系列号的卡操作,NEEDKEY:需要用密码认证,LOCKBIT:锁定块,KEYENABLE:启用本卡的密码功能

        String strls;

        CheckBox cbls;
        EditText etls;

        cbls = findViewById(R.id.chkPwdEM4305);
        if(cbls.isChecked()) {//本次操作需要密码验证
            etls = findViewById(R.id.editTextPwdEM4305);
            strls = etls.getText().toString().trim();
            if(strls.length() < 8)
            {
                tv.setText("密码长度不足8位");
                return;
            }
            for (i = 0; i < 4; i++) {
                oldpicckey[i] = (byte)Integer.parseInt(strls.substring(i*2,i*2+2),16);//只有用Integer.parseInt才能杜绝大于128时的错误
            }
            myctrlword += ouridr.NEEDKEY;

        }

        cbls = findViewById(R.id.chkUidNeedEM4305);
        if(cbls.isChecked()) {//仅操作指定卡号的卡
            etls = findViewById(R.id.editTextUidEM4305);
            strls = etls.getText().toString().trim();
            if(strls.length() < 8)
            {
                tv.setText("卡号长度不足8位");
                return;
            }

            for (i = 0; i < 4; i++) {
                mypiccserial[i] = (byte)Integer.parseInt(strls.substring(i*2,i*2+2),16);//只有用Integer.parseInt才能杜绝大于128时的错误
            }
            myctrlword += ouridr.NEEDSERIAL;

        }

        //操作块标志
        mypiccblockflag[0] = 0;

        cbls = findViewById(R.id.chkB0EM4305);
        if(cbls.isChecked()) {
            mypiccblockflag[0] += 1;
        }

        cbls = findViewById(R.id.chkB1EM4305);
        if(cbls.isChecked()) {
            mypiccblockflag[0] += 2;
        }

        cbls = findViewById(R.id.chkB3EM4305);
        if(cbls.isChecked()) {
            mypiccblockflag[0] += 8;
        }

        cbls = findViewById(R.id.chkB4EM4305);
        if(cbls.isChecked()) {
            mypiccblockflag[0] += 16;
        }

        cbls = findViewById(R.id.chkB5EM4305);
        if(cbls.isChecked()) {
            mypiccblockflag[0] += 32;
        }

        cbls = findViewById(R.id.chkB6EM4305);
        if(cbls.isChecked()) {
            mypiccblockflag[0] += 64;
        }

        cbls = findViewById(R.id.chkB7EM4305);
        if(cbls.isChecked()) {
            mypiccblockflag[0] += 128;
        }

        mypiccblockflag[1] = 0;

        cbls = findViewById(R.id.chkB8EM4305);
        if(cbls.isChecked()) {
            mypiccblockflag[1] += 1;
        }

        cbls = findViewById(R.id.chkB9EM4305);
        if(cbls.isChecked()) {
            mypiccblockflag[1] += 2;
        }

        cbls = findViewById(R.id.chkB10EM4305);
        if(cbls.isChecked()) {
            mypiccblockflag[1] += 4;
        }

        cbls = findViewById(R.id.chkB11EM4305);
        if(cbls.isChecked()) {
            mypiccblockflag[1] += 8;
        }

        cbls = findViewById(R.id.chkB12EM4305);
        if(cbls.isChecked()) {
            mypiccblockflag[1] += 16;
        }

        cbls = findViewById(R.id.chkB13EM4305);
        if(cbls.isChecked()) {
            mypiccblockflag[1] += 32;
        }

        cbls = findViewById(R.id.chkB14EM4305);
        if(cbls.isChecked()) {
            mypiccblockflag[1] += 64;
        }

        cbls = findViewById(R.id.chkB15EM4305);
        if(cbls.isChecked()) {
            mypiccblockflag[1] += 128;
        }

        status = ouridr.em4305read(myctrlword,mypiccserial,oldpicckey,mypiccblockflag,mypiccdata);

        if(status == 0)
        {

            strls = "卡无线转输分频比[" + Integer.toString(mypiccdata[0]) + "],卡号[";

            strls += String.format("%02X%02X%02X%02X",mypiccserial[0],mypiccserial[1],mypiccserial[2],mypiccserial[3]);

            strls += "],卡数据[";

            for (i = 0; i < mypiccdata[1]; i++) {
                strls += String.format("%02X",mypiccdata[i+2]);
            }

            strls += "]";

            TextView tvls = findViewById(R.id.TextViewRetDataEM4305);
            tvls.setText(strls);

            strls = "读EM4305卡成功";

            ouridr.beep(38);



        }
        else
        {

            if(status == 8)
            {
                strls = "请将卡放在感应区";
            }
            else if(status == 23)
            {
                strls = "错误代码:23,读卡器未插入";
            }
            else if(status == 4)
            {
                strls = "错误代码:4,卡放得远 或 需要密码才能读卡";
            }
            else if(status == 12)
            {
                strls = "错误代码:12,卡放得远 或 密码错误";
            }
            else
            {
                strls = "错误代码:" + Integer.toString(status);
            }

        }

        tv.setText(strls);
    }
    public void write4305(View view)
    {
        byte i;
        byte j;
        byte status;//存放返回值

        byte myctrlword;//控制字

        byte[] oldpicckey = new byte[4];//密码
        byte[] mypiccserial = new byte[4];//卡序列号
        byte[] mypiccdata = new byte[64];//读卡数据缓冲:卡无线转输分频比、卡内容长度(字节数),最多12块的数据
        byte[] mypiccblockflag = new byte[2];//指定读哪一块

        myctrlword = 0; //NEEDSERIAL:需要只对指定系列号的卡操作,NEEDKEY:需要用密码认证,LOCKBIT:锁定块,KEYENABLE:启用本卡的密码功能

        String strls;

        CheckBox cbls;
        EditText etls;

        cbls = findViewById(R.id.chkPwdEM4305);
        if(cbls.isChecked()) {//本次操作需要密码验证
            etls = findViewById(R.id.editTextPwdEM4305);
            strls = etls.getText().toString().trim();
            if(strls.length() < 8)
            {
                tv.setText("密码长度不足8位");
                return;
            }
            for (i = 0; i < 4; i++) {
                oldpicckey[i] = (byte)Integer.parseInt(strls.substring(i*2,i*2+2),16);//只有用Integer.parseInt才能杜绝大于128时的错误
            }
            myctrlword += ouridr.NEEDKEY;

        }

        cbls = findViewById(R.id.chkUidNeedEM4305);
        if(cbls.isChecked()) {//仅操作指定卡号的卡
            etls = findViewById(R.id.editTextUidEM4305);
            strls = etls.getText().toString().trim();
            if(strls.length() < 8)
            {
                tv.setText("卡号长度不足8位");
                return;
            }

            for (i = 0; i < 4; i++) {
                mypiccserial[i] = (byte)Integer.parseInt(strls.substring(i*2,i*2+2),16);//只有用Integer.parseInt才能杜绝大于128时的错误
            }
            myctrlword += ouridr.NEEDSERIAL;

        }

        //操作块标志
        j = 0;
        mypiccblockflag[0] = 0;

        cbls = findViewById(R.id.chkB0EM4305);
        if(cbls.isChecked()) {
            mypiccblockflag[0] += 1;
            j++;
        }

        cbls = findViewById(R.id.chkB1EM4305);
        if(cbls.isChecked()) {
            tv.setText("块1为只读,不允许写");
            return;
        }

        cbls = findViewById(R.id.chkB3EM4305);
        if(cbls.isChecked()) {
            mypiccblockflag[0] += 8;
            j++;
        }

        cbls = findViewById(R.id.chkB4EM4305);
        if(cbls.isChecked()) {
            tv.setText("块4为配置区,只能在初始化函数中操作");
            return;
        }

        cbls = findViewById(R.id.chkB5EM4305);
        if(cbls.isChecked()) {
            mypiccblockflag[0] += 32;
            j++;
        }

        cbls = findViewById(R.id.chkB6EM4305);
        if(cbls.isChecked()) {
            mypiccblockflag[0] += 64;
            j++;
        }

        cbls = findViewById(R.id.chkB7EM4305);
        if(cbls.isChecked()) {
            mypiccblockflag[0] += 128;
            j++;
        }

        mypiccblockflag[1] = 0;

        cbls = findViewById(R.id.chkB8EM4305);
        if(cbls.isChecked()) {
            mypiccblockflag[1] += 1;
            j++;
        }

        cbls = findViewById(R.id.chkB9EM4305);
        if(cbls.isChecked()) {
            mypiccblockflag[1] += 2;
            j++;
        }

        cbls = findViewById(R.id.chkB10EM4305);
        if(cbls.isChecked()) {
            mypiccblockflag[1] += 4;
            j++;
        }

        cbls = findViewById(R.id.chkB11EM4305);
        if(cbls.isChecked()) {
            mypiccblockflag[1] += 8;
            j++;
        }

        cbls = findViewById(R.id.chkB12EM4305);
        if(cbls.isChecked()) {
            mypiccblockflag[1] += 16;
            j++;
        }

        cbls = findViewById(R.id.chkB13EM4305);
        if(cbls.isChecked()) {
            mypiccblockflag[1] += 32;
            j++;
        }

        cbls = findViewById(R.id.chkB14EM4305);
        if(cbls.isChecked()) {
            tv.setText("块14为锁定标志块,只能在初始化函数中操作");
            return;
        }

        cbls = findViewById(R.id.chkB15EM4305);
        if(cbls.isChecked()) {
            tv.setText("块15为锁定标志块,只能在初始化函数中操作");
            return;
        }

        //写卡数据准备
        if(j == 0)
        {
            tv.setText("请先选择需要写入的块");
            return;
        }
        etls = findViewById(R.id.editTextDataEM4305);
        strls = etls.getText().toString().trim();
        if(strls.length() < (j*8))
        {
            tv.setText("写入数据长度不足,请补足数据!");
            return;
        }

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

        status = ouridr.em4305write(myctrlword,mypiccserial,oldpicckey,mypiccblockflag,mypiccdata);

        if(status == 0)
        {

            strls = "卡号[";

            strls += String.format("%02X%02X%02X%02X",mypiccserial[0],mypiccserial[1],mypiccserial[2],mypiccserial[3]);

            strls += "]";

            TextView tvls = findViewById(R.id.TextViewRetDataEM4305);
            tvls.setText(strls);

            strls = "写EM4305卡成功";

            ouridr.beep(38);



        }
        else
        {

            if(status == 8)
            {
                strls = "请将卡放在感应区";
            }
            else if(status == 23)
            {
                strls = "错误代码:23,读卡器未插入";
            }
            else if(status == 1)
            {
                strls = "错误代码:1,卡放得远 或 需要密码才能写卡";
            }
            else if(status == 12)
            {
                strls = "错误代码:12,卡放得远 或 密码错误";
            }
            else
            {
                strls = "错误代码:" + Integer.toString(status);
            }

        }

        tv.setText(strls);
    }
    public void default4305(View view)
    {
        EditText etls;
        Spinner spls;

        etls = findViewById(R.id.editTextConfigWordEM4305);
        etls.setText("5F800100");
        etls = findViewById(R.id.editTextMaxBlockEM4305);
        etls.setText("6");

        spls = findViewById(R.id.SpinnerDateRateEM4305);//数据速率
        spls.setSelection(2);
        spls = findViewById(R.id.SpinnerEncoderEM4305);//调制模式
        spls.setSelection(0);
        spls = findViewById(R.id.SpinnerLoginModeEM4305);//加密模式
        spls.setSelection(0);
    }

    public void updateset4305()
    {
        EditText etls;
        EditText etMaxBlock;
        Spinner spls;
        String strls;
        byte i;

        byte[] Configdata = new byte[4];//配置值

        etls = findViewById(R.id.editTextConfigWordEM4305);
        strls = etls.getText().toString().trim();
        if(strls.length() < 8){
            strls = "5F800100";
            Configdata[0] = 0x5F;
            Configdata[1] = (byte)0x80;
            Configdata[2] = 0x01;
            Configdata[3] = 0x00;
        }
        else {
            for (i = 1; i < 4; i++) {
                Configdata[i] = (byte)Integer.parseInt(strls.substring(i * 2, i * 2 + 2),16);//只有用Integer.parseInt才能杜绝大于128时的错误
            }
        }

        spls = findViewById(R.id.SpinnerDateRateEM4305);//数据速率
        i = (byte)(spls.getSelectedItemId());
        Configdata[0] = 0x00;

        if(i == 0){//RF/32
            Configdata[0] |= 0x0f;
        }
        else if(i == 1) {//RF/40
            Configdata[0] |= 0x13;
        }
        else {//RF/64或其他
            Configdata[0] |= 0x1f;
        }

        spls = findViewById(R.id.SpinnerEncoderEM4305);//调制模式
        i = (byte)(spls.getSelectedItemId());
        if(i == 0){//曼切斯特码
            Configdata[0] |= 0x40;
        }
        else if(i == 1) {//Biphase码
            Configdata[0] |= 0x80;
        }
        else {//其他

        }

        Configdata[1] &= 0x3c;
        Configdata[2] &= 0x80;
        //自动发送最大块
        etMaxBlock = findViewById(R.id.editTextMaxBlockEM4305);
        strls = etMaxBlock.getText().toString().trim();
        if(strls.length() < 1){
            i = 6;
            etMaxBlock.setText("6");
        }
        else {
            i = (byte)Integer.parseInt(strls,10);
            if((i < 5) || (i > 13)){
                i = 6;
                etMaxBlock.setText("6");
            }
        }

        Configdata[1] |=  ((i % 4) * 64);
        Configdata[2] |= ((i / 4) % 4);

        spls = findViewById(R.id.SpinnerLoginModeEM4305);//密码规则(也就是读登陆或写登陆)
        i = (byte)(spls.getSelectedItemId());
        if(i == 1){//0-1块任意读,3-15块需密码读,0-13块任意写,14-15块需密码写
            i = 0x01;
        }
        else if(i == 2) {//0-15任意读,0-15块需密码写
            i = 0x04;
        }
        else if(i == 3) {//0-1块任意读,3-15块需密码读,0-15块需密码写
            i = 0x05;
        }
        else {//0-15块任意读.0-13块任意写,14-15块需密码写
            i = 0x00;
        }

        Configdata[2] |= (i * 4);

        etls.setText(String.format("%02X%02X%02X%02X",Configdata[0],Configdata[1],Configdata[2],Configdata[3]));

    }
    public void init4305(View view)
    {
        byte i;
        byte status;//存放返回值

        byte myctrlword;//控制字

        byte[] oldpicckey = new byte[4];//密码
        byte[] mypiccserial = new byte[4];//卡序列号
        byte[] mypiccdata = new byte[4];//写入数据缓冲

        myctrlword = 0; //NEEDSERIAL:需要只对指定系列号的卡操作,NEEDKEY:需要用密码认证,LOCKBIT:锁定块,KEYENABLE:启用本卡的密码功能

        String strls;

        CheckBox cbls;
        EditText etls;

        updateset4305();

        cbls = findViewById(R.id.chkPwdEM4305);
        if(cbls.isChecked()) {//本次操作需要密码验证
            etls = findViewById(R.id.editTextPwdEM4305);
            strls = etls.getText().toString().trim();
            if(strls.length() < 8)
            {
                tv.setText("密码长度不足8位");
                return;
            }
            for (i = 0; i < 4; i++) {
                oldpicckey[i] = (byte)Integer.parseInt(strls.substring(i*2,i*2+2),16);//只有用Integer.parseInt才能杜绝大于128时的错误
            }
            myctrlword += ouridr.NEEDKEY;

        }


        cbls = findViewById(R.id.chkUidNeedEM4305);
        if(cbls.isChecked()) {//仅操作指定卡号的卡
            etls = findViewById(R.id.editTextUidEM4305);
            strls = etls.getText().toString().trim();
            if(strls.length() < 8)
            {
                tv.setText("卡号长度不足8位");
                return;
            }

            for (i = 0; i < 4; i++) {
                mypiccserial[i] = (byte)Integer.parseInt(strls.substring(i*2,i*2+2),16);//只有用Integer.parseInt才能杜绝大于128时的错误
            }
            myctrlword += ouridr.NEEDSERIAL;

        }

        //配置值:
        etls = findViewById(R.id.editTextConfigWordEM4305);
        strls = etls.getText().toString().trim();
        if(strls.length() < 8)
        {
            tv.setText("配置值输入长度不足8位");
            return;
        }
        for (i = 0; i < 4; i++) {
            mypiccdata[i] = (byte)Integer.parseInt(strls.substring(i*2,i*2+2),16);//只有用Integer.parseInt才能杜绝大于128时的错误
        }

        status = ouridr.em4305init(myctrlword,mypiccserial,oldpicckey,mypiccdata);

        if(status == 0)
        {

            strls = "卡号[";

            strls += String.format("%02X%02X%02X%02X",mypiccserial[0],mypiccserial[1],mypiccserial[2],mypiccserial[3]);

            strls += "]";

            TextView tvls = findViewById(R.id.TextViewRetDataEM4305);
            tvls.setText(strls);

            strls = "配置EM4305卡成功";

            ouridr.beep(38);

        }
        else
        {

            if(status == 8)
            {
                strls = "卡不在感应区 或 密码不正确";
            }
            else if(status == 23)
            {
                strls = "错误代码:23,读卡器未插入";
            }
            else if(status == 1)
            {
                strls = "错误代码:1,卡放得远 或 需要密码才能写卡";
            }
            else if(status == 12)
            {
                strls = "错误代码:12,卡放得远 或 密码错误";
            }
            else
            {
                strls = "错误代码:" + Integer.toString(status);
            }

        }

        tv.setText(strls);
    }

}

源码下载:AndroidstudioRFIDNFC读写源码资源-CSDN文库

你可能感兴趣的:(18002295132,QQ:954486673,android,EM4305,安卓,java,动物标签)