まぁ、たいしたことをするわけではないのですが、Linuxで利用出来るようにしてくれた素晴らしいドライバを使ってPaSoRiを使ってみます。
ただ、通常のデスクトップのLinuxではなくて、arm上で動いてるSmartQV5のLinux上で動かしてみます。これができればとっても安価なタッチパネル画面付きのPaSoRiで遊べます。
実現したいこと
- ICカードを近づけてIDを読み取らせて、時間とIDを記録する。
- 携帯を近づけたらブラウザで指定のURLを開く
必要なモノ
- SmartQ V5(Linux)
- SONY 非接触 ICカードリーダ/ライタ USB 対応 パソリ RC-S330
- USB変換ケーブル pasoriとsmartq v5をつなぐため。
手順
ドライバの用意
ドライバは、libpafeを使います。
libusbが必要なので、apt-get install libusb-devでインストールします。
ダウンロードしてクロスコンパイル・・・がうまくいかなかったので、SmartQに転送して./configure、make、make installします。
以下を/etc/udev/pasori.rulesに保存します。
[text]
CTION!="add", GOTO="pasori_rules_end"
SUBSYSTEM=="usb_device", GOTO="pasori_rules_start"
SUBSYSTEM!="usb", GOTO="pasori_rules_end"
LABEL="pasori_rules_start"
ATTRS{idVendor}=="054c", ATTRS{idProduct}=="006c", MODE="0664", GROUP="plugdev"
ATTRS{idVendor}=="054c", ATTRS{idProduct}=="01bb", MODE="0664", GROUP="plugdev"
ATTRS{idVendor}=="054c", ATTRS{idProduct}=="02e1", MODE="0664", GROUP="plugdev"
LABEL="pasori_rules_end"
[/text]
/etc/udev/rules.d/にシンボリック・リンクを張ります。
[bash]
cd /etc/udev/rules.d
ln -s ../pasori.rules 010_pasori.rules
[/bash]
udevadm control –reload-rulesします。
これでplugdev グループに属しているユーザがPaSoRiを使えるようになるみたいなのだが、SmartQのデフォルトユーザーuserはplugdevに属しているはずだけど利用できませんでした。
(SheevaPlugでも同じ状態だったので、まー何か根本的に私がわかってないのでしょう。とりあえず、sudoするってことでこれは放置)
ひとまず、ここで動作確認
PaSoRiを接続して以下を実行してみる。
[bash]
sudo felica_dump
[/bash]
ちゃんと動けばOK。
プログラム作成
ここまでできればあとは好きなようにプログラムを作ればOK。
というわけで、GTKでGUIインタフェースを・・・と思ったら、SmartQでどうやって作っていいんだかわからない。
libpafeみたいにSmartQ上でコンパイルできるかなー、と考えたがGTKのパッケージをインストール出来ない。ソースから・・・と思ったが依存関係も沢山あるし、SmartQ上で全部やる気にはなれなかったので諦め。
でも、GUIがないと寂しい(というか、SmartQで端末操作するのはやりずらい)ので、XlibとAthena?でとっても適当に作ってみた。
三者間通信は「PaSoRi「パソリ」(RC-S320/RC-S330)三者間通信 サンプル」を参考に。そのままでは動かなかったような気もするが、エラーを追って修正できるレベル。
IDmの取得は適当に。pasori_open、pasori_init、f=felica_polling、felica_get_idm、free(f)、pasori_closeって感じ。
・IDmの取得はこんな感じ
[cpp]
pasori *p;
felica *f;
uint8 idm[16];
unsigned char ic_id[16 + 1];
p = pasori_open();
if (!p) {
// error
} else {
setCaption(lblLog, "");
pasori_init(p);
pasori_set_timeout(p, C_PASORI_TIMEOUT);
if((f = (felica*)felica_polling(p, FELICA_POLLING_ANY, 0, 0)) != NULL){
felica_get_idm(f, idm);// こっちでも同じ memcpy(idm,f->IDm,8);
// IDm文字列を作成stdlib
sprintf(ic_id, "%02x%02x%02x%02x%02x%02x%02x%02x", idm[0], idm[1], idm[2], idm[3], idm[4], idm[5], idm[6], idm[7]);
free(f);
}
pasori_close(p);
}
[/cpp]
参考
メモ
・RC-S330からFelia専用ではなく、NFC準拠?になったらしい。
なのでFelicaでなくてもそれっぽいICカードなら読める。
・三者間通信とは、FeliCaのリーダライタ、ケータイ、モバイルFeliCaチップの間で通信を行うもの
よくあるのは、FeliCaに携帯をかざすとホームページを開く、など。