PaSoRi(RC-S330)とSmartQ V5(linux)でタイムカード&三者間通信

 まぁ、たいしたことをするわけではないのですが、Linuxで利用出来るようにしてくれた素晴らしいドライバを使ってPaSoRiを使ってみます。
 ただ、通常のデスクトップのLinuxではなくて、arm上で動いてるSmartQV5のLinux上で動かしてみます。これができればとっても安価なタッチパネル画面付きのPaSoRiで遊べます。

実現したいこと

  • ICカードを近づけてIDを読み取らせて、時間とIDを記録する。
  • 携帯を近づけたらブラウザで指定のURLを開く

必要なモノ

手順

ドライバの用意

 ドライバは、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に携帯をかざすとホームページを開く、など。


コメントを残す

メールアドレスが公開されることはありません。