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

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

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

我已经在Googlesearch过,并且发现了一些名为SIM Toolkit ApplicationSeek for Android的相关主题和工具。 但我真的不明白这是什么? 这些项目是我必须在手机上安装的两个应用程序吗? 还是已经安装在USIM / SIM卡上的两个工具,并接收到手机的命令?

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

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

提前致谢。

Solutions Collecting From Web of "在android中发送APDU命令给USIM / SIM卡"

您的SIM卡上可能有两种不同types的小程序。

常见的小程序

用普通JavaCard编写的常用小程序。 这是您从普通智能卡世界习惯的types。 它具有process方法,智能卡是通信中的被动主体:您的应用程序发送APDU命令和卡片响应。

您可以使用一组称为SEEK for Android的特殊Android库与这些小程序进行通信。 看看这个教程来学习如何创build这样一个电话应用程序。

从API级别21开始,还有一种使用Telephony Manager与SIM通信的方法。 但是,有一个巨大的障碍:您的应用程序需要MODIFY_PHONE_STATE权限,只能授予系统应用程序。 一个非系统的应用程序是不允许使用它的。

SIM工具包小程序

SIM卡不仅仅是一个普通的智能卡,如果你想使用SIM卡提供的所有可能性,写一个SIM卡的小程序比普通的智能卡要复杂得多。 我build议你阅读这篇文章 – 这是一个人的学士论文,但它是我在互联网上find的初学者最好的概述。 我也从DefConn会议推荐这个video 。

加载在SIM卡上的小程序的作用是不同的:小程序不再是被动的实体。 电话定期问你的小程序:“我能为你做什么新的事情吗?” 你的小程序可以回答:“是的,请发送这个短信”或“告诉我什么时候是什么时间”等。此外,你的小程序可以成为一些事件的监听者:来电,收到的短信,时间间隔等。从技术angular度来看,SIM卡似乎是被动的,但其作用实际上是一个活跃的:SIM卡向手机发送命令。

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

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

(SIM应用程序工具包是一种标准,它以与全球平台指定小应用程序生命周期相同的方式指定主动命令。)

SIM工具包小程序的示例:

 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将APDU发送到SIM卡。 请参阅: https : //developer.android.com/reference/android/telephony/TelephonyManager.html#hasCarrierPrivileges()

例如,在Google Play上分发的移动networking运营商(MNO)应用可以使用此function。 但是,对于每个人来说,这也是不公开的 在这种情况下,您需要获得SIM卡的访问权限。 SIM上的访问规则由发布它的MNOpipe理。 另见: http : //source.android.com/devices/tech/config/uicc.html