SIMカードとマイコンとの接続ができたので、いよいよ実際の読み出しです。もちろん、読み出しのためのソフトウェアが必要となるのですが、前回の記事でも触れたSTやATMELから出ているアプリケーション・ノートにはプログラムも付属しているので、それをビルドすることで簡単に読み出し実験をおこなうことができます。
今回はSTが提供している
STSW-STM32011をベースとして用いました。このサンプルはSTの評価ボード向けのコードとなっていますが、Nucleoボードは対象ボードに含まれていません。そのため、ちょっと手を加えてやる必要があります。わたしが、加えた修正は次のようなものです。
- platform_config.hにNucleo-F103RBで使用する端子割り当ての定義を追加。
- smartcard.c にてSC_Init()の最後でSC_PowerCmd(DISABLE)が呼ばれてSIMカードの電源を落としてしまうので、SC_PowerCmd(ENABLE)に修正。カード検出端子を使わないので、SC_Detect()は常にカード検出状態を返すように修正。
- main.c からカード検出に関わる割り込み設定と処理を削除。
以上のような修正で、ターゲットであるNucleo-F103RBに対応させることができますが、サンプルのメインルーチンではSIMカードのアクセスのためのコマンド送信とレスポンス受信の処理は行っているものの、なんの表示も行ってくれません。ですので、動作状況がわかるように、適宜トレースメッセージを出力するようにしてやりました。
サンプルプログラムは、ICCIDというSIMカード固有の番号と、SIMカードに登録された電話番号(IMSI)を読み取るように作られています。上記ログでは、ICCIDの読み取りに成功して、
98 18 01 00 00 03 40 XX XX F2という値が表示されています。この番号は
Wikipediaで説明されているようにSIMカードに刻印されている製造番号の後半と似たような番号になるハズなのですが、カードに刻印されている番号は次のとおりであり、なんかちょっと違っています。
そもそも、ICCIDの最初の2桁は世界共通で89となるはずで、その後に国番号である81とドコモの事業者番号100が続くはずです。ところが、実際に読み取られた値をでは89 18 01 00となっており桁位置が入れ替わっていることがわかります。どうしてだろうかと思って調べてみると
GSM 11.11において ICCIDのコーディング方法が、このように規定されていることが確認できました。したがって、これで正しく読み取りできていることになります。
さて、ICCIDに続いてIMSIを読もうとしているのですが、それに失敗して動作を終了しています。IMSIの読み取りにはSIMカードに設定されたPIN番号の入力が必要なのですが、サンプルプログラムではこの番号が8桁の0になっていました。ドコモのピン番号はディフォルトで0000ですので、これが一致しないのでエラーになっているんだろうと想像していました。ところが、プログラムで与えるピン番号を修正してもIMSIの読み取りができずに
SW1 = 98, SW2 = 40というエラーが返ってきてしまいます。GSM11.11でこのエラーコードの意味を調べてみると、PIN番号の確認試行回数をオーバーしてしまっているというエラーのようです。
あぁ、すっかり忘れていました。PIN番号を3回間違えると、ロックがかかってしまうのですね。確かにプログラムの動作を確認するためのメッセージを追加したりしながら、何度も実行していましたから、気づかないうちにロックしてしまったようです。
どうやらSIMカードの内容のほとんどはPIN番号が正しくないと読み出せないようです。それでもGSM 11.11を調べてみると事業者名(SPN: Service Provider Name)だけはPIN番号無しでも読み出せることがわかったので、SPNを選択して、これを読み出すためのコマンドの送受処理を追加してやりました。
最後に出力されている
4E 54 54 20 44 6F 43 6F 4D 6F
の部分をASCII文字にすれば、
NTT DoCoMo
となります。
このようにして、いまどきのマイコンのUSARTを使えばSIMカードの内容を読み出すことができることを確認することができました。ただし、読み出しのためにはSIMカードに保存されている情報のファイル形式に関する情報が必要であり、それに対応するISO/IEC 7816コマンドを送り出してやる必要があります。また、ほんとんどの情報の確認にはPIN番号が必要となることもわかりました。SIMカードの仕掛けについてチョット理解することができた実験でした。