2011-07-31 16 views
0

Mifareの古典的な1kカードのデータをAndroid 2.3.3 APIレベル10のNexus Sに書き込もうとしています。エラー。送受信が失敗しました。 私のコードは、あなたが直接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

関連する問題