2015-09-29 35 views
1

最近我試圖閱讀MifareClassic 1K卡。在閱讀了這個事實之後,只有某些採用恩智浦芯片的手機才能夠讀取這些標籤,並獲得其中一個我正面臨新問題的手機。
我試圖讀取的卡會引發標題中提到的錯誤,但僅在運行時未執行代碼。 這裏的一些細節: 起初,我從Xamarin接過NFCSample和改變了一些東西:閱讀MifareClassic標籤拋出java.io.IOException:收發失敗

protected override void OnNewIntent(Intent intent) 
    { 
     if(_inWriteMode) 
     { 
      _inWriteMode = false; 
      var tag = intent.GetParcelableExtra(NfcAdapter.ExtraTag) as Tag; 

      if(tag == null) 
      { 
       return; 
      } 
      MifareClassic mifc = MifareClassic.Get(tag); 
      DisplayMessage("NFC recognized"); 
      try 
      { 
       mifc.ConnectAsync().Wait(); 
       DisplayMessage("Connected to Mifare Tag"); 
       DisplayMessage("SectorCount:" + mifc.SectorCount); 
       DisplayMessage("BlockCount in Sector 1:" + mifc.GetBlockCountInSector(1)); 
       byte[] blargh = new byte[6]; 
       MifareClassic.KeyDefault.CopyTo(blargh,0); 
       if(Task.Factory.StartNew<bool>(() => mifc.AuthenticateSectorWithKeyA(1, blargh)).Result) 
       { 
        DisplayMessage("Auth A Complete"); 
        blargh = new byte[6]; 
        MifareClassic.KeyDefault.CopyTo(blargh, 0); 
        if(Task.Factory.StartNew<bool>(() => mifc.AuthenticateSectorWithKeyB(1, blargh)).Result) 
        { 
         DisplayMessage("Auth B Complete"); 
         DisplayMessage("Read All Blocks of Section 1 ..."); 
         int firstBlock = mifc.SectorToBlock(1); 
         int lastBlock = firstBlock + 3; 
         List<byte[]> lstBlocks = new List<byte[]>(); 
         for(int i = firstBlock; i < lastBlock; i++) 
         { 
          DisplayMessage("Read Block " + i); 
          byte[] block = mifc.ReadBlockAsync(i).Result; //fails without stepping through in Debug mode 
          lstBlocks.Add(block); 
         } 
         string BlockData = string.Empty; 
         foreach(var item in lstBlocks) 
         { 
          BlockData += Encoding.ASCII.GetString(item) + "\r\n"; 
         } 
         DisplayMessage(BlockData); 
        } 
       } 
       DisplayMessage("Close Connection"); 
       mifc.Close(); 
      } 
      catch(Exception ex) 
      { 
       DisplayMessage(ex.ToString()); 
      } 
     } 
    } 

所以,如果我通過代碼讀出數據塊步驟/ ReadBlockAsync工作完全正常。沒有斷點就會拋出上述異常。這裏有什麼問題?

編輯: 例外的蹤跡: 外層的異常:

One or more errors occurred. 
at System.Threading.Tasks.Task.ThrowIfExceptional (Boolean includeTaskCanceledExceptions) [0x00014] in <filename unknown>:0 
at System.Threading.Tasks.Task`1[System.Byte[]].GetResultCore (Boolean waitCompletionNotification) [0x00034] in <filename unknown>:0 
at System.Threading.Tasks.Task`1[System.Byte[]].get_Result() [0x0000b] in <filename unknown>:0 
at NfcXample.MainActivity.OnNewIntent (Android.Content.Intent intent) [0x001d0] in c:\\Users\\user\\Desktop\\monodroid-samples-master\\NfcSample\\MainActivity.cs:94 " 

內部異常:

Exception of type 'Java.IO.IOException' was thrown. 
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() [0x0000b] in <filename unknown>:0 
at Android.Runtime.JNIEnv.CallObjectMethod (IntPtr jobject, IntPtr jmethod, Android.Runtime.JValue* parms) [0x00064] in /Users/builder/data/lanes/monodroid-mavericks-monodroid-5.1-series/d419c934/source/monodroid/src/Mono.Android/src/Runtime/JNIEnv.g.cs:195 
at Android.Nfc.Tech.MifareClassic.ReadBlock (Int32 p0) [0x00044] in /Users/builder/data/lanes/monodroid-mavericks-monodroid-5.1-series/d419c934/source/monodroid/src/Mono.Android/platforms/android-10/src/generated/Android.Nfc.Tech.MifareClassic.cs:360 
at Android.Nfc.Tech.MifareClassic+<ReadBlockAsync>c__AnonStorey2.<>m__0() [0x00000] in /Users/builder/data/lanes/monodroid-mavericks-monodroid-5.1-series/d419c934/source/monodroid/src/Mono.Android/platforms/android-10/src/generated/Android.Nfc.Tech.MifareClassic.cs:367 
at System.Threading.Tasks.Task`1[System.Byte[]].InnerInvoke() [0x00012] in <filename unknown>:0 
at System.Threading.Tasks.Task.Execute() [0x00016] in <filename unknown>:0 
--- End of managed exception stack trace --- 
java.io.IOException: Transceive failed 
at android.nfc.TransceiveResult.getResponseOrThrow(TransceiveResult.java:52) 
at android.nfc.tech.BasicTagTechnology.transceive(BasicTagTechnology.java:151) 
at android.nfc.tech.MifareClassic.readBlock(MifareClassic.java:425) 
at dalvik.system.NativeStart.run(Native Method) 
+0

哪一行引發異常?向我們展示堆棧跟蹤...還要注意,使用密鑰A和密鑰B進行身份驗證是非常沒有用的,因爲只有最後的身份驗證命令纔會生效。通常情況下,您會嘗試使用密鑰B進行身份驗證,並且只有在使用密鑰A進行身份驗證失敗時(或者甚至只使用兩者中的一個)。 –

+0

好吧,不知道認證的事情。我花了一些時間試圖從卡上獲取一些數據,並且在兩次驗證之後通過代碼工作。失敗的路線是閱讀街區的路線。 'byte [] block = mifc.ReadBlockAsync(i).Result;' – EaranMaleasi

+0

@MichaelRoland您對認證的看法似乎是錯誤的,因爲每次嘗試僅使用B進行身份驗證時連接都會中斷。 – EaranMaleasi

回答

0

IT的速度太快!
該設備正在讀取該卡,該死的速度很快。插入System.Threading.Thread.Sleep(100)後終於奏效了! for循環現在看起來像這樣:

for(int i = firstBlock; i < lastBlock; i++) 
{ 
    if(mifc.IsConnected) 
    { 
     DisplayMessage("Read Block " + i); 
     System.Threading.Thread.Sleep(100); 
     byte[] block = mifc.ReadBlockAsync(i).Result; 
     lstBlocks.Add(block); 
    } 
    else 
    { 
     DisplayMessage("Card Disconnected"); 
    } 
} 
+1

每當你在'Task'上使用'.Result',上帝殺死一隻小貓。 – Cheesebaron

+0

好吧...當我發佈這個,我不知道如何正確使用async/await。現在我知道了。這是爲什麼?大多數時候我必須使用不存在異步/等待的.NET4。不改變事實,這是現在最終的代碼獲得運輸。 – EaranMaleasi