проблема с записью в mifareclassic тег - PullRequest
0 голосов
/ 15 декабря 2018

Я пытаюсь читать и писать в тег MifareClassic.до сих пор я смог настроить свое приложение для получения намерений на переднем плане.чтобы прочитать тег, я сначала получаю экземпляр MifareClassic, аутентифицируюсь и читаю блок.все работает нормально.

но когда я пишу в тег, ничего не происходит.кажется, что код выполняется без проблем, но данные в теге не меняются.Самое смешное, что Я пытался записать в тег без аутентификации сначала .код выполняется снова без каких-либо исключений.но когда я попытался прочитать блок без предварительной аутентификации, я получил исключение (сбой передачи).

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        nfcAdapter = NfcAdapter.getDefaultAdapter(this);


        pendingIntent = PendingIntent.getActivity(
                this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);

        IntentFilter ndef = new IntentFilter(NfcAdapter.ACTION_TECH_DISCOVERED);
        filters =  new IntentFilter[] {ndef, };
        techListsArray = new String[][] { new String[] { MifareClassic.class.getName()} };

        if(nfcAdapter!=null && nfcAdapter.isEnabled() ){}
        else{

            Toast.makeText(this, "nfc not available", Toast.LENGTH_LONG).show();
            //finish();
        }
    }


    @Override
    protected void onResume() {
        super.onResume();
        nfcAdapter.enableForegroundDispatch(this, pendingIntent, filters, techListsArray);

    }

    @Override
    protected void onPause() {
        super.onPause();
        nfcAdapter.disableForegroundDispatch(this);

    }


protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    Tag tagFromIntent = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);



    MifareClassic mfc = MifareClassic.get(tagFromIntent);
    mfc.connect();
    byte [] data2=new byte[16];
    for(int i =0;i<16;i++)
        data2[i]=0;

   //auth = mfc.authenticateSectorWithKeyA(4, key[1]);

    int blo=mfc.sectorToBlock(4);
    mfc.writeBlock(blo,data2);
    mfc.close();}

1 Ответ

0 голосов
/ 15 декабря 2018

Я понял это.

биты доступа на карте для рассматриваемого блока данных установлены на 100. поэтому в соответствии с документацией MifareClassic, чтобы иметь возможность записи в этот блок, я должен был использовать ключB. (но я могу прочитать блок с помощью ключа A)

, очевидно, если вы используете неправильный ключ для аутентификации на карте и затем вызываете writeblock (блок, данные), вы не получитеисключение .в то же время, если вы используете неверный ключ для аутентификации, а затем вызываете readblock (block), вы получите исключение.

очевидно, что вы вообще не можете выполнять аутентификацию и вызываете функцию writeblock.и все же вы не получите исключение.но данные не будут записаны на карту.

...