私はすでにスマートカードを使用しており、APDUコマンド(ISO/IEC 7816およびグローバルプラットフォーム仕様で定義されている)に精通しています。
携帯電話に挿入されているUSIM/SIMカードにAPDUコマンドを送信する方法があるかどうか知りたいですか? (Android v4.4.4 KitKatがインストールされているSamsungA3)
私はすでにGoogleで検索し、SIM Toolkit ApplicationおよびSeek for Androidという名前の関連トピックとツールをいくつか見つけました。しかし、私はこれらが何であるかを本当に理解していませんか?これらのアイテムは、携帯電話にインストールする必要がある2つのアプリケーションですか?または、USIM/SIMカードにすでにインストールされていて携帯電話からコマンドを受信する2つのツールはありますか?
プロアクティブコマンド、APDUコマンドとATコマンドの違いは何ですか?
SIMカードアプリケーションを開発するためにAndroidを学ぶ必要がありますか、それともJavaカードの仕様とETSI標準が必要ですか?
前もって感謝します。
SIMカードには2種類のアプレットが存在する可能性があります。
一般的なアプレット
プレーンなJavaCardで記述された一般的なアプレット。これは、一般的なスマートカードの世界で使用されているアプレットの種類です。 process
メソッドがあり、スマートカードは通信の受動的な対象です。アプリはAPDUコマンドとカード応答を送信します。
Android Android用SEEKと呼ばれるライブラリの特別なセットを使用してこれらのアプレットと通信できます。このような電話アプリケーションの作成方法については、これをご覧ください チュートリアル 。
APIレベル21から、 テレフォニーマネージャー を使用してSIMと通信する方法もあります。ただし、大きな障害が1つあります。アプリにはMODIFY_PHONE_STATE
権限が必要です。これは、システムアプリにのみ付与できます。通常の非システムアプリはそれを使用することを許可されていません。
SIMツールキットアプレット
SIMカードは単なる一般的なスマートカードではありません。SIMカードが提供するすべての可能性を利用したい場合、SIMカードのアプレットの作成は一般的なスマートカードよりもはるかに複雑になる可能性があります。 この論文 -を読むことをお勧めします。これは誰かの学士論文ですが、インターネットで見つけた初心者にとっては最高の概要です。私もお勧めします DefConn会議からのこのビデオ 。
SIMカードにロードされたアプレットの役割は異なります。アプレットはもはやパッシブエンティティではありません。電話はあなたのアプレットに定期的に尋ねます:「私があなたのためにできる新しいことはありますか?」アプレットは、「はい、このSMSを送信してください」または「今何時か教えてください」などと応答できます。さらに、アプレットは、着信、SMSの受信、経過時間などのイベントのリスナーになることができます。はい、SIMカードは技術的な観点からは受動的であるように見えますが、その役割は実際には能動的です。電話にコマンドを送信するのはSIMカードです。
これらのコマンドは、「プロアクティブコマンド」またはSIMアプリケーションツールキットコマンドと呼ばれます。構造は同じです-CLAINS 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を使用してAPDUをSIMカードに送信できるようになります。参照: https://developer.Android.com/reference/Android/telephony/TelephonyManager。 html#hasCarrierPrivileges()
たとえば、Google Playで配布されているモバイルネットワークオペレーター(MNO)アプリはこれを使用できます。しかし、繰り返しになりますが、誰でも利用できるわけではありません。この場合、SIMによるアクセスを許可する必要があります。 SIMのアクセスルールは、発行者MNO)によって管理されます。参照: http://source.Android.com/devices/tech/config/uicc.html