- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
在我的 Android 应用程序中,我实现了 HostApduService
。这是它的一个实现 fragment :
public final class MyHostApduService extends HostApduService {
private boolean disconnected = false;
@Override
public byte[] processCommandApdu(byte[] commandApdu, @Nullable Bundle extras) {
//process apdu in a background thread and call sendResponseApdu() when ready
Single.fromCallable(() -> processInternal(commandApdu))
.subscribeOn(nfcScheduler)
.subscribe(this::sendResponseApdu, t -> Log.e("could not create response", t));
return null;
}
...
@Override
public void onDeactivated(int reason) {
disconnected = true;
}
private void processInternal(byte[] apdu) {
//business logic
if(!disconnected) {
//last message was probably received by the terminal
}
}
}
所以根据我的观察,onDeactivated()
回调可以恰好出现在 processCommandApdu()
的中间,即便如此,操作系统似乎更早地认识到调用 onDeactivated()
后 NFC 字段丢失。
这是一个在通信过程中丢失字段的例子:
16:21:16.808 I/MyHostApduService : processApdu[request|13bytes] 0A4040007A000000004306000
16:21:16.811 D/MyHostApduService : do business logic
16:21:16.890 D/HostEmulationManager: notifyHostEmulationDeactivated
16:21:16.890 D/HostEmulationManager: Unbinding from service ComponentInfo{app.debug/internal.MyHostApduService}
16:21:16.890 I/MyHostApduService : onDeactivated LINK_LOSS
16:21:16.898 I/MyHostApduService : processApdu[response|2bytes|90ms] 6A82
问题是我需要自信地检查最后一条消息是收到还是丢弃,因为必须执行一些重要的终结代码(但前提是终端收到消息)。有没有比使用 onDeactivated()
(它的时间似乎非常不确定)更好的方法来检查是否收到消息?
最佳答案
你不能。相反,如果您确实需要可靠地检测这种情况,则需要调整您的通信协议(protocol)。
问题不在于 Android,而在于底层通信协议(protocol)(ISO/IEC 7816-4 优于 ISO/IEC 14443-4)。这些协议(protocol)是为与常规智能卡通信而构建的。智能卡是完全无源的设备,当从读卡器中拔出或远离 NFC 射频场时无法继续处理(由于缺乏能量)。
协议(protocol)栈专为询问器驱动的通信而设计(询问器是终端)。通信以命令-响应顺序执行。原则上,每个命令-响应序列都包含以下步骤(还有一些额外的极端情况):
应用协议(protocol) (ISO/IEC 7816-4) 和传输协议(protocol)(ISO/IEC 14443-4 又名 ISO-DEP)均未通过任何形式的确认来确认智能卡响应。一旦智能卡发送了它的响应,它就被认为已经完成了处理。
实际上,这对于经典智能卡(接触式或非接触式)来说不是问题。中断的通信会导致卡重新通电(因为链路丢失也意味着断电,或者因为终端执行明确的重置)。因此,此时智能卡将无法依赖清理序列。
然而,这并不意味着没有办法克服这个限制。经典智能卡即使在电源循环期间也能保持持久状态。关键操作作为原子事务执行。在断电的情况下,清理/回滚通常在重置(启动)时执行。然而,这并不容易映射到 Android,因为链接丢失不会导致 HCE 端的执行中断。因此,在将响应发送回读卡器之前,无法检测到 HCE 智能卡是否已拔出。尽管如此,也没有会被链接丢失中断的原子事务。因此,重置(即接收选择您的应用程序的 SELECT(按 DF 名称)命令)仍然是执行清理(例如重置应用程序状态)的正确位置。
关于您的特定要求,典型的方法是调整应用程序级协议(protocol)并添加确认命令以确认收到(然后是第二次)最后一个响应。 IE。如果您目前有类似的东西:
T---> SELECT APPLICATION<---C FCI | 9000T---> PERFORM CRITICAL OPERATION<---C CRITICAL OPERATION RESULT
您可以调整协议(protocol)以包含最终确认:
T---> SELECT APPLICATION<---C FCI | 9000T---> PERFORM CRITICAL OPERATION<---C CRITICAL OPERATION RESULTT---> CONFIRM RECEPTION OF RESULT<---C 9000
现在您不会真正关心最终响应 (9000) 是否在发送到终端的途中丢失了。
关于android - 有没有办法检查终端是否收到主机卡仿真中的最后一条消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48119004/
我在这里想做的是将所有连接转发到机器一上端口 3306 上的本地主机到本地主机上端口 3306 上的机器二。因此,如果您连接到机器一上的 mysql,它的行为就像您正在连接一样在二号机器上。 我认为
通过Kibana界面,如何获得 flex IP /主机? 我的意思是,与kibana连接的Elastic主机。 那有可能吗?我在这个上挣扎了好几个小时,却一无所获:( 附:不确定此问题是否是题外话,应
我知道这听起来很奇怪,但我有一个情况,Deno 需要关闭自己的主机(并因此杀死自己的进程)。这可能吗? 我特别需要这个用于 linux (lubuntu),如果相关的话。我想这需要 sudo 权限,这
我知道这听起来很奇怪,但我有一个情况,Deno 需要关闭自己的主机(并因此杀死自己的进程)。这可能吗? 我特别需要这个用于 linux (lubuntu),如果相关的话。我想这需要 sudo 权限,这
我有一个基本问题,但谷歌并没有为我产生很多结果(反正不是英文的)。基本上我想做的就是: 我有一个图形需要用作整个应用程序的持久 header ,例如:我不能让它在新的 Intent 调用时从屏幕上滑出
您好,我正在使用 xampp,我正在尝试使用 php 进行连接。 $sql_connections = mysql_connect("$server, $username, $password")
我目前正在尝试一些多人游戏的想法,并正在尝试创建一个 Java 应用程序来为基于网络浏览器的多人游戏提供服务。 我的开发环境是主机上的Eclipse, native 上的notepad + Googl
今天为大家分享一篇关于SSH 的介绍和使用方法的文章。本文从SSH是什么出发,讲述了SSH的基本用法,之后在远程登录、端口转发等多种场景下进行独立的讲述,希望能对大家有所帮助。 什么是SSH?
我已经完成了在裸机 Centos 7 上运行的测试 Kubernets 主机的设置。这将用作测试系统,因为我们将在 IBM Bluemix Kubernetes 服务中部署所有内容。 从 Bluemi
我正在尝试通过带有 4.2(果冻 bean )的 android 设备“nexus 7”通过 USB 与我的 freeduino 板进行通信,该板类似于 arduino uno。 几个月后,我使用开发
我正在使用 nginx,但在设置反向代理时遇到问题。 我的 nginx.conf 是默认的(没有对其进行任何更改),我的站点可用配置是: upstream backend_hosts { se
我在 projectlocker(免费 svn 主机)上有一个帐户,但我不知道如何将我的项目文件上传到它。 我在我的仪表板中找不到任何选项。 我在我的电脑上使用tortoiseSvn,那么如何上传文件
设置batchSize = 1有意义吗?如果我想一次处理一个文件? 尝试过batchSize = 1000和batchSize = 1 - 似乎具有相同的效果 { "version": "2.0"
我只想知道.. docker中现在有任何可用的工具吗?我已经阅读了Docker中有关多主机功能的一些文档,例如, Docker群 Docker服务(带有副本) 我也知道群模式下的volume问题,容器
我想将文件从 Docker 的容器挂载到我的 docker 主机。 数据卷不是我的解决方案,因为它们是从 docker 主机到 docker 容器的装载,我需要相反的方法。 谢谢 最佳答案 当 doc
我是新手。我无法正确理解RMI。互联网上有大量教程,但据我所知,它们都是针对本地主机的。服务器和客户端都运行在同一台机器上。 我想在任何计算机上运行客户端,并且主机将位于一台计算机上,让我们考虑IP
我无法从客户端“A”SSH 到服务器“B”(但我可以从同一子网上的许多其他 ssh 客户端而不是“A”——所有都是 *nux 机器) serverA>ssh -v -p 端口用户@serverB Op
设置batchSize = 1有意义吗?如果我想一次处理一个文件? 尝试过batchSize = 1000和batchSize = 1 - 似乎具有相同的效果 { "version": "2.0"
由于我不是天生的编码员,请多多包涵。 这是我尝试使用HAproxy来实现的目标,但是经过数小时的检查后,我无法以某种方式使其工作。 从 domain.com/alpha domain.com/beta
我正在使用 tomcat 运行 Java Web 应用程序,通过电子邮件将生成的报告发送给用户。我可以发送电子邮件,但几个小时后服务器停止发送电子邮件,并出现以下错误。 javax.mail.Mess
我是一名优秀的程序员,十分优秀!