当前位置: 首页 > 知识库问答 >
问题:

读取MifareClassic标签抛出Java . io . io异常:收发失败

微生阳平
2023-03-14

最近我在读一张MifareClassic 1K卡。在阅读了事实之后,只有某些带有恩智浦芯片的手机才能读取这些标签,而获得这些标签中的一个,我面临着一个新的问题
我试图阅读的卡片会抛出标题中提到的错误,但只有在运行时没有逐行检查代码。这里有一些细节:起初,我从Xamarin那里取了NFCSample,并做了一些改变:

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

因此,如果我单步执行代码ReadBlock/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)

共有1个答案

田兴怀
2023-03-14

太快了
设备正在快速读取卡。插入<code>System.Threading.Thread后。睡眠(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");
    } 
}
 类似资料:
  • 抛出异常的行为是否可能抛出不同的异常? 为了抛出异常,必须(可选地)分配新对象,并调用其构造函数(隐式调用fillinstacktrace)。在某些情况下,听起来像addSupressed也被称为。那么如果没有足够的内存会发生什么呢?JVM是否需要预分配内置异常?例如,(1/0)会抛出OutOfMemoryError而不是ArithmeticException吗? 此外,构造函数是一个方法调用,因

  • 问题内容: 考虑以下代码: 无需添加方法签名即可编译该代码。(它与同样表现到位,太)。 我理解为什么 可以 安全地运行它,因为实际上不能将其引发在块中,因此不能引发已检查的异常。我有兴趣知道在何处指定此行为。 并非永远都不会达到目标:以下代码也会编译: 但是,如果抛出一个检查的异常,它不会像我期望的那样编译: 在JLS Sec 11.2.2中 ,它说: 一,其抛出的表达式语句(§14.18)具有静

  • 在你可以捕获异常之前,一些代码必须抛出一个异常。任何代码都可能会抛出异常:您的代码,来自其他人编写的包(例如Java平台附带的包)或Java运行时环境的代码。无论是什么引发的异常,它总是通过 throw 语句抛出。 您可能已经注意到,Java平台提供了许多异常类。所有类都是Throwable类的后代,并且都允许程序区分在程序执行期间可能发生的各种类型的异常。 您还可以创建自己的异常类来表示在您编写

  • 问题内容: 我试图在Netbeans中重构一个大型程序,但我有点迷茫。我从来没有非常模块化,但是现在通过实际学习如何做到这一点来尝试纠正这种情况,并在将来纠正这种情况。不幸的是,我在将某些教程翻译成我的程序时遇到了麻烦。所以我希望这里有人可以帮忙。目前,我正在尝试分解一部分采用特定格式的文件并制成表格的代码。我知道我需要创建一个类并使用它来创建表对象,但是我不确定如何做。我有一个主文件,用于获取文

  • 问题内容: 我目前正在使用play2框架。 我有几个正在抛出的类,但是play2s全局处理程序使用throwable而不是异常。 例如我的一门课是抛出一个。我是否可以检查可抛物体(如果是)? 问题答案: 您可以使用它来检查它是否存在。 例: 假设是参考。

  • throw 关键字表示发生了异常,称为抛出异常。throw 通常指定一个操作数(我们将介绍不指定操作数的特殊情况)。throw 的操作数可以是任何类型,如果操作数是个对象,则称为异常对象。也可以抛出条件表达式而不是抛出对象,可以抛出不用于错误处理的对象。 抛出异常时,指定相应类型的最近一个异常处理器(对抛出该异常的try块)捕获这个异常。try块的异常处理紧接在try块后面。 抛出异常时,生成和初