2011-07-31 3 views
0

Mifare 클래식 1k 카드의 데이터를 Nexus S에서 android 2.3.3 API 레벨 10으로 쓰려고 할 때 다음과 같이합니다. 오류. 송수신에 실패했습니다. 내 코드는 직접 MIFARE 카드의 낮은 수준의 블록에 NDEF 데이터를 기록하려고하는 것 같다Mifare Classic 1k 카드 쓰기가 오류 java.ioexception과 함께 실패했습니다. Android Nexus S에서 송수신에 실패했습니다

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"); 
     } 
    } 
}; 

어떤 포인터

답변

0

입니다.

이 두 가지 이유로 작동하지 않습니다

  1. 는 MIFARE 블록에 기록하기 전에 당신은 authenticateSectorWithKeyA 또는 authenticateSectorWithKeyB 기능을 사용하여 쓰기 액세스를 위해 자신을 인증해야합니다. NDEF 형식의 mifare 카드 용 키는 MifareClassic 클래스에서 사용할 수 있습니다.

  2. 카드에 NDEF 데이터를 직접 쓸 수없고 다른 응용 프로그램이 데이터를 해석 할 수 있어야합니다. NDEF는 사용자 형식입니다. 카드에 기록됩니다 데이터는 등 응용 프로그램 디렉토리, 크기 정보 난 당신이 일반 태그 인터페이스의 NDEF 쓰기 기능을 사용하는 것이 좋습니다

등의 추가 데이터가 포함되어 있습니다. 이것들은 당신을위한 모든 여분의 형식화를 할 것입니다.

카드에 저수준 쓰기를 실험하려면 먼저 mifare 데이터 시트를 다운로드하고 섹터와 블록이 무엇인지 읽어보십시오. 또한 칩의 인증 및 보안 개념을 이해하는 것이 중요합니다. 그렇지 않으면 우연히 인증 블록을 덮어 쓰고 태그를 파괴하기가 쉽습니다.

+0

주셔서 감사합니다, 내 이해가 잘못되면 pls, 그래서 NDEF 쓰기 및 읽기 기능을 MIFare 클래식 1k 카드에 대한 IO 작업을 할 사용해야합니까? – sansknwoledge

+0

기본 키를 사용하여 섹터를 인증 할 수 있습니다. 이제 디버거에서 null 포인터 예외가 발생하여 ndef.get (태그)가 null을 반환한다는 것을 알았습니다. 너 나를 인도 할 수 있니? – sansknwoledge

관련 문제