Read Without Encryptionコマンド
最後に読み出しです。先ほど書き込んだデータを、「Read Without Encryption」コマンドで読み出してみましょう。
| パラメータ名 | サイズ | データ | 備考 |
|---|---|---|---|
| コマンドコード | 1 | 0x06 | - |
| IDm | 8 | - | - |
| サービス数 | 1 | m | m=1 |
| サービスコードリスト | 2m | - | リトルエンディアン |
| ブロック数 | 1 | n | 1≦n≦4 |
| ブロックリスト | N | - | 2n≦N≦3n |
パラメータは、「Write Without Encryption」コマンドとほとんど同じです。ただし、「サービスコードリスト」には「0x000B」をリトルエンディアンで指定します。つまり、「0x0B」「0x00」となります。サービスコード0x000Bは、読み出し専用または読み書き可能なブロックへのアクセスを意味します。
S_PAD3ブロック、つまりブロック番号0x03のデータを読み出すプログラムは、次のようになります。
unsigned char pCom[] = {
0x11, // データ長
0x06, // コマンドコード
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // IDm
0x01, // サービス数
0x0B, 0x00, // サービスコード
0x01, // ブロック数
0x00, 0x03, 0x00 // ブロック
};
unsigned char pRes[512];
unsigned short usComLen = 0x11;
unsigned short usResLen = sizeof(pRes);
// 配列 unsigned char pIDm[8] に、
// 目的のシステムの IDm が格納されているものとする
memcpy_s(&pCom[2], sizeof(pCom) - 2, pIDm, 8);
bSuccess = felicalib_nfc_thru(pCom, usComLen, pRes, &usResLen);
if (! bSuccess)
{
// エラー処理...
}
コマンドの発行に成功すると、実行結果がレスポンスとして第3引数に格納されます。
| パラメータ名 | サイズ | データ | 備考 |
|---|---|---|---|
| レスポンスコード | 1 | 0x07 | - |
| IDm | 8 | - | - |
| ステータスフラグ1 | 1 | - | 読み出し成功時は0x00 |
| ステータスフラグ2 | 1 | - | - |
| ブロック数 | 1 | n | ステータスフラグ1が0x00の場合のみ |
| ブロックデータ | 16n | - | ステータスフラグ1が0x00の場合のみ |
「レスポンスコード」の前に、自分自身を含むデータ長が1バイト付加されます。読み出しに失敗した場合のデータ長は12、1ブロックの読み出しに成功した場合のデータ長は29になります。
「ステータスフラグ1」には、読み出しの成否が格納されます。成功時は「0x00」、失敗時はそれ以外の値になります。
読み出しに成功した場合、「ブロックデータ」に読み出した結果が格納されます。この例では"codezine.jp\0\0\0\0\0"が格納されているはずです。
「felica_lite_s_dump」ツールで本カードのダンプを取っても、次のように、S_PAD3ブロックの内容が書き換えられたことが確認できます。
...... Block[00], S_PAD0 =00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 Block[01], S_PAD1 =00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 Block[02], S_PAD2 =00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 Block[03], S_PAD3 =63 6f 64 65 7a 69 6e 65 2e 6a 70 00 00 00 00 00 Block[04], S_PAD4 =00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 Block[05], S_PAD5 =00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 Block[06], S_PAD6 =00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ......
おわりに
「SDK for NFC」に関するチュートリアル的な解説を見たことがなかったので、本記事を書いてみました。FeliCaプログラミングの取っ掛かりがつかめず困っている方の手助けとなれば幸いです。
参考文献
- Visual Studio Express 2012,Microsoft
- SDK for NFC,SONY
- FeliCaトップページ,SONY
- FeliCa Lite-Sカード通販ページ,ステルス・ネットワークス(株)
- FeliCa Liteカード通販ページ,(株)オレンジタグス
- FeliCa Lite-Sユーザーズマニュアル,SONY
- FeliCa Lite-Sスターターマニュアル,SONY
