Quantcast
Channel: Royal Windows
Viewing all articles
Browse latest Browse all 288

felicalib による Visual C++ プログラミング

$
0
0

felicalib を使って,FCFキャンパスカード(FeliCa)から番号を読み取るプログラムを試作した。
・Visual C++ 2010 Express
felicalib 0.4.2
NFCポートソフトウェア(PaSoRiのドライバーソフト)
・SONY 非接触ICカードリーダー/ライター PaSoRi

image

FCFキャンパスカードは,2バイトの種別コードと最大15バイトの番号等が,リードオンリーの暗号化されてないブロックに書かれており,システムコードFE00hとサービスコード1A8Bhで読める。

felicalib に入っているFelicaDump.exeで内容が確認できる。PaSoRiにカードをかざしてFelicaDumpを実行する。

C:\Users\Owner\FelicaDump.exe > scan.txt

以下のプログラムでは200ms間隔のタイマーイベントで,随時カードを読めるようにした。
(他のコードは画面制御やファイル出力なので,掲載していない)
felica_polling() で,システムコード0xFE00のカードを見つけたらfelica_read_without_encryption02() でサービスコード0x1A8Bとブロック番号0を指定してブロックのデータを読む。
読み取るコード,番号は全部数字で,番号の後は空白で埋めていることが分かっているので,Char::IsDisit で数字かどうかを確認して,数字以外だったらbreakして番号を切り出した。
また,直前に読んだカード番号(LastReadID)と比較して,同じカードを続けて2度読まないようにした。
カードのかざし方で,ちゃんと読み取れない(前方の一部が欠落する)ことがあったので,先頭から2バイトの種別コードが数字なら,メッセージを表示,ビープ音出力,番号と時刻をファイル出力する。

System::Void Form1::timer1_Tick(System::Object^  sender, System::EventArgs^  e) {
pasori *p;
felica *f;

p = pasori_open(NULL);
if (!p) return;
//felicalib
pasori_init(p);
f = felica_polling(p, 0xFE00 , 0, 0);

if (!f) {
this->toolStripStatusLabel1->Text = L"リード可";
pasori_close(p);
return;
}
this->toolStripStatusLabel1->Text = L"リード中";
uint16 service = 0x1A8B;
char data1[16];
String ^str,^typ,^num;
//felicalib
felica_read_without_encryption02(f, service, 0, 0, (uint8 *)data1);

str = gcnew System::String(data1,0,15);

int i;
for (i=0; i<str->Length; i++) {
if(!Char::IsDigit(str, i)) break;
}
if(i > 2) {
typ = str->Substring(0,2); /*2bytes=type*/
num = str->Substring(2,i-2);
if( num != LastReadID ) {
this->label1->Text = LastReadID = num;
this->toolStripStatusLabel1->Text = L"リード終了";
System::Media::SystemSounds::Beep->Play();
DateTime date = DateTime::Now;
sw->WriteLine( String::Format("{0},{1},{2}", typ, num, date.ToLocalTime() ) );
sw->Flush();
this->label4->Text = date.ToShortTimeString();
this->label2->Text = String::Format("{0}",Int32::Parse(this->label2->Text)+1);
}
}

felica_free(f);
pasori_close(p);
}



システムコードとサービスコードはカードの仕様で決まっており,FCFキャンパスカードは上記のとおりだが,コードを変えればSuicaやEdyも読める。

felicalib で用意されてる関数では,カードのIDmとPMmのリードと,暗号化されていないブロック(非保護エリア)のリード/ライトしかできない。


暗号で保護されているブロックのアクセスプログラムを作るには有償のSDKが必要となるようだ。 また,1台のパソコンに複数台のPaSoRiをつないでパラレルに動かすことは,難しいようだ。



Viewing all articles
Browse latest Browse all 288

Trending Articles