Сбой записи карты Mifare Classic 1k с ошибкой java.ioexception transceive failed in Android Nexus S

когда я пытаюсь записать данные на карту Mifare classic 1k на Nexus S с Android 2.3.3 API уровня 10, у меня возникает эта ошибка. передать не удалось. мой код

private View.OnClickListener write_butClickListener =new View.OnClickListener() {

    @Override
    public void onClick(View v) {


        IntentFilter ndef=new IntentFilter(NfcAdapter.ACTION_TECH_DISCOVERED );
        try{
            ndef.addDataType("*/*");
        }catch(MalformedMimeTypeException e){
            throw new RuntimeException("fail",e);
        }

        mFilters=new IntentFilter[]{ndef,};
        // Setup a tech list for all NfcF tags
        mTechLists = new String[][] { new String[] { MifareClassic.class
                .getName() } };

        Intent intent=getIntent();
        String action=intent.getAction();
        if(NfcAdapter.ACTION_TECH_DISCOVERED.equals(action) ){
        String msg="Discovered Tag with Intent " + intent;
        status_Data.setText(msg);
        Tag tagFromintent=intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);

        MifareClassic mfc=MifareClassic.get(tagFromintent);
        byte[] data;
        try{
            mfc.connect();
            boolean auth = false;
            String cardData = null;
            status_Data.setText("Authenticating the Tag..");

            auth = mfc.authenticateSectorWithKeyA(1,
                    MifareClassic.KEY_DEFAULT);
            if (auth){
                status_Data.setText("Authenticated");

                 String text       = "Hello, World!";
                    String lang       = "en";
                    byte[] textBytes  = text.getBytes();
                    byte[] langBytes  = lang.getBytes("US-ASCII");
                    int    langLength = langBytes.length;
                    int    textLength = textBytes.length;
                    byte[] payload    = new byte[1 + langLength + textLength];

                    // set status byte (see NDEF spec for actual bits)
                    payload[0] = (byte) langLength;

                    // copy langbytes and textbytes into payload
                    System.arraycopy(langBytes, 0, payload, 1,              langLength);
                    System.arraycopy(textBytes, 0, payload, 1 + langLength, textLength);
                    if (!mfc.isConnected()) mfc.connect();

                                    mfc.writeBlock(1, payload);
                                    mfc.close();
                showMessage("written");
            }else{
                showMessage("Authetication Failed");
                status_Data.setText("");
            }

        }
        catch(IOException e){
            status_Data.setText(e.toString());

        }



        }else{
            showMessage("Nothing to read");
        }
    }
};

любые указатели


person sansknwoledge    schedule 31.07.2011    source источник


Ответы (1)


Похоже, вы пытаетесь напрямую записать данные NDEF в низкоуровневые блоки карты mifare.

Это не сработает по двум причинам:

  1. Перед записью в блоки mifare вы должны аутентифицировать себя для доступа на запись, используя функцию authenticationSectorWithKeyA или authenticationSectorWithKeyB. Ключи для карт mifare в формате NDEF доступны в классе MifareClassic.

  2. Вы не можете напрямую записывать данные NDEF на карту и ожидать, что другие приложения смогут интерпретировать данные. NDEF — это пользовательский формат. Данные, которые записываются на карту, содержат дополнительные данные, такие как каталоги приложений, информацию о размере и т. д.

Я предлагаю вам использовать функции записи NDEF общего интерфейса тегов. Они сделают все дополнительное форматирование за вас.

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

person Nils Pipenbrinck    schedule 31.07.2011
comment
спасибо за указатель, пожалуйста, исправьте, если я неправильно понимаю, поэтому мне нужно использовать функции записи и чтения NDEF для выполнения операций ввода-вывода для карты MIFare Classic 1k? - person sansknwoledge; 31.07.2011
comment
я могу аутентифицировать сектор, используя ключ по умолчанию, теперь я столкнулся с проблемой, возникает исключение нулевого указателя, после отладки я обнаружил, что ndef.get(tag) возвращает null. не могли бы вы направить меня? - person sansknwoledge; 01.08.2011