Java 在android中向USIM/SIM卡发送APDU命令

Java 在android中向USIM/SIM卡发送APDU命令,java,android,smartcard,javacard,sim-card,Java,Android,Smartcard,Javacard,Sim Card,我已经使用过智能卡,并且熟悉APDU命令(在ISO/IEC 7816和全球平台规范中定义) 现在我想知道是否有任何方法可以向插入手机的USIM/SIM卡发送APDU命令?(安装了Android v4.4.4 kitkat的三星A3。) 我已经在谷歌搜索过了,我找到了一些相关的主题和工具,名为simtoolkit Application和Seek for Android。但我真的不明白这些是什么?这是我必须安装在手机上的两个应用程序吗?或者,这两个安装在USIM/SIM卡上的工具是否已经从手机接收

我已经使用过智能卡,并且熟悉APDU命令(在ISO/IEC 7816和全球平台规范中定义)

现在我想知道是否有任何方法可以向插入手机的USIM/SIM卡发送APDU命令?(安装了Android v4.4.4 kitkat的三星A3。)

我已经在谷歌搜索过了,我找到了一些相关的主题和工具,名为simtoolkit Application和Seek for Android。但我真的不明白这些是什么?这是我必须安装在手机上的两个应用程序吗?或者,这两个安装在USIM/SIM卡上的工具是否已经从手机接收命令

主动命令、APDU命令和AT命令之间有什么区别

我应该学习android来开发SIM卡应用程序,还是只需要Java卡规范和ETSI标准


提前感谢。

您的SIM卡上可能有两种不同类型的小应用程序

常用小程序

用普通JavaCard编写的普通小程序。这是一种小程序,您习惯于使用普通智能卡。它具有
过程
方法,智能卡是通信中的被动主体:您的应用程序发送APDU命令和卡响应

您可以使用一组名为SEEK for Android的特殊Android库与这些小程序通信。看看这个,了解如何创建这样一个手机应用程序

从API级别21开始,还有一种与SIM卡通信的方法,即使用。然而,有一个巨大的障碍:你的应用程序需要
修改手机状态
权限,该权限只能授予系统应用程序。不允许reqular非系统应用程序使用它

SIM卡工具包小程序

SIM卡不仅仅是普通智能卡,如果您想利用SIM卡提供的所有可能性,为SIM卡编写小程序可能比为普通智能卡编写小程序要复杂得多。我建议你阅读——这是某人的学士学位论文,但它是我在互联网上找到的对初学者最好的概述。我也推荐

SIM卡上加载的小程序的作用不同:小程序不再是被动实体。手机会定期询问小程序:“我能为您做些什么吗?”小程序会回答:“是的,请发送此短信”或“告诉我现在几点”等。此外,小程序还可以成为一些事件的侦听器:来电、收到的短信、经过的时间间隔等。是的,从技术角度看,SIM卡似乎是被动的,但实际上它的作用是主动的:是SIM卡向手机发送命令

这些命令称为“主动命令”或SIM应用程序工具包命令。结构相同-CLA INS P1 P2 LC数据LE;意思是不同的

您可以使用名为
sim.toolkit
的特殊JavaCard包中的类从小程序发送它们

(SIM Application Toolkit是一种标准,它以与Global Platform指定小程序生命周期相同的方式指定主动命令。)

SIM Toolkit小程序示例:

import sim.toolkit.ToolkitInterface;
import sim.toolkit.ToolkitRegistry;
...
import javacard.framework.ISOException;

public class STKTest extends Applet implements ToolkitInterface {

public static void install(byte[] bArray, short bOffset, byte bLength) {
    // GP-compliant JavaCard applet registration
    new STKTest().register(bArray, (short) (bOffset + 1), bArray[bOffset]);
}
//this method handles standard APDU commands
public void process(APDU apdu) {
    // Good practice: Return 9000 on SELECT
    if (selectingApplet()) {
        return;
    }

    apdu.setIncomingAndReceive();
    final byte[] buf = apdu.getBuffer();
    switch (buf[ISO7816.OFFSET_INS]) {
    case (byte) 0x00:
        //do something
        break;
    }
}
//this method handles the SIM Toolkit commands
public void processToolkit(byte event) throws ToolkitException {
    switch (event) {

    case ToolkitConstants.EVENT_TIMER_EXPIRATION:
        //do something
        break;
    }
}

}
是的,你应该学习Android——你需要它来使用SEEK库。您的问题非常广泛,如果您愿意,请询问我任何详细信息。

从API级别22(Android 5.1)开始,还有一个选项称为“运营商特权”。它允许非系统应用程序使用Android TelephonyManager向SIM卡发送APDU。见:

例如,在Google Play上发布的移动网络运营商(MNO)应用程序就可以使用此功能。 但它也不是对所有人开放的。在这种情况下,您需要获得SIM卡的访问权限。SIM卡上的访问规则由发布该规则的MNO管理。另见:

谢谢亲爱的vojta。1-所以,SEEK for Android是一个库,我用它为我的移动设备(而不是SIM/USIM)编写小程序,以便与USIM/SIM上的小程序通信,对吗?2-你知道什么是SIM Toolkit应用程序(又称STK)吗?主动命令与常规APDU命令类似吗?我的意思是,它们是否有一个包含CLA、INS、P1和P2的4字节强制头?或者它们完全不同?在第1节中,您强调了普通智能卡在通信中的被动作用。这是正确的。但这是否意味着USIM/SIM卡可以在与手机的通信中发挥积极作用,或者它们也总是等待命令而无法启动通信?您说手机会定期询问小程序“我能为您做些什么吗?”(与使用SEEK for android library编写的应用程序相同?),SIM卡上的小程序会对此做出响应。所以SIM卡还是被动的。不是吗?我知道有很多问题,但我有点困惑,我真的需要你的指导。我感谢您的时间和考虑。:)还有一个问题,我稍后会问。再次提前感谢。亲爱的vojta,我们可以在这里进行简短的交谈吗?