プログラマってこんなかんじ??

アプリ作ったり歌ったりしてます

Java で Felica いじり

あけましておめでとうございます + ひさびさの更新。

今年の目標は「健康第一、すべて自己責任」。うちらの仕事はカラダが資本。普段の生活も大事にしつつ、がんばろうと思ってる次第です。今後とも4649お願いいたします。


という年始エントリ。完全に出遅れた。


さいきん自分のまわりでハードとの連携してるのをよく見る。
以前からfelica連携でなんかやろうと思ってたので pasori 買ってきてさっそく実験。

まず pasori とは。

FeliCaポート/パソリ」はFeliCaを利用した非接触ICカードを読み書きできるUSB対応リーダー/ライターです。

公式ページ に書いてありますね。

見た目こんなかんじのやつです。

pasorijava は、JNA + felicalib.dll を使用させていただいて制御。
ソースはいろんなところに転がってるのとだいたい同じ感じ。
目新しいことは何もしてなかったりします(汗)

まずはdllの読込。

public interface FelicaLib extends Library {
    // felicalib.dll
    FelicaLib INSTANCE = (FelicaLib) Native.loadLibrary("felicalib", FelicaLib.class);
    Pointer pasori_open(String dummy);
    void pasori_close(Pointer pasoriHandle);
    int pasori_init(Pointer pasoriHandle);
    Pointer felica_polling(Pointer pasoriHandle, short systemCode, byte rfu, byte timeSlot);
    void felica_free(Pointer felicaHandle);
    void felica_getidm(Pointer felicaHandle, byte[] buf);
}

pasoriの上のedyの入ったカードを置いて以下を実行。
Idmをこんなかんじで適当に取得してみる。

/** ワイルドカード */
public static short SYSTEM_CODE_ANY = (short)0xffff;
/** edy */
public static short SYSTEM_CODE_EDY = (short)0xfe00;

public static void main(String[] args) {
    Pointer pasoriHandle = null;
    Pointer felicaHandle = null;
    try {
        // pasoriHandle取得(接続)
        pasoriHandle = FelicaLib.INSTANCE.pasori_open(null);

        // pasori初期化
        FelicaLib.INSTANCE.pasori_init(pasoriHandle);

        // felicaHandle取得
        felicaHandle = FelicaLib.INSTANCE.felica_polling(
                            pasoriHandle, SYSTEM_CODE_ANY, (byte) 0, (byte) 0);

        // Idm取得
        byte[] buf = new byte[8];
        FelicaLib.INSTANCE.felica_getidm(felicaHandle, buf);

    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if(felicaHandle != null) {
            FelicaLib.INSTANCE.felica_free(felicaHandle);
        }
        if(pasoriHandle != null) {
            FelicaLib.INSTANCE.pasori_close(pasoriHandle);
        }
    }
}

clubDAMのカード(edy付)のIDmがさくっととれた。あと、おサイフケータイ(au iida G9)も成功。

次はCで制御してみる。C書くのひさしぶり。