raspberrypiでFeliCaのIDmを読み取る（pasori RC-S320版）

FeliCaのIDm読み取りに当初はnfcpyの使用を考えていたが、手持ちのpasori RC-S320では対応していないことが判明したため、代わりにlibpafeを使用した。

2016/10/16追記：
pasori RC-S380でIDmを読み込みたい場合は[こちら](http://qiita.com/t114/items/f735b900ad8a8c52597e)

# 環境
ハード：raspberrypi3
OS：raspbian
リーダ：pasori RC-S320

# 準備
  - ディレクトリ作成

```
$ mkdir pasori
$ cd pasori
```

  - raspberrypi3のUSBにpasoriを接続する。
  - 下記コマンドで認識されていることを確認する。

```
$ lsusb
Bus 001 Device 004: ID 054c:01bb Sony Corp. FeliCa S320 [PaSoRi]
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Fast Ethernet Adapter
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
```

  - libusbのインストール

```
$ sudo apt-get install libusb-dev
```

# libpafeのインストール

  - ダウンロードとコンパイル

```
$ git clone https://github.com/rfujita/libpafe.git 
$ cd libpafe
$ ./configure
$ make
$ sudo make install
```

  - インストール結果確認  
    libpafe.so.0.0.8があることを確認する

```
$ cd /usr/local/lib
$ ls
libpafe.a   libpafe.so    libpafe.so.0.0.8  python2.7  site_ruby
libpafe.la  libpafe.so.0  pypy2.7           python3.4
```

# 動作確認

```
$ cd ~/pasori/libpafe-0.0.8
$ sudo ./tests/pasori_test
PaSoRi (RC-S320)
 firmware version 1.40
Echo test... success
EPROM test... success
RAM test... success
CPU test... success
Polling test... success
```

# udevの設定

 - 60-libpafe.rulesを新規作成する

```
$ sudo nano /lib/udev/rules.d/60-libpafe.rules
```

  - 60-libpafe.rules編集内容

```:60-libpafe.rules
ACTION!="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"
```

```
$ udevadm control --reload-rules
root privileges required
$ sudo udevadm control --reload-rules
$ sudo reboot
```
  - reboot後sudoなしで実行できることを確認する。

```
$ ./pasori/libpafe-0.0.8/tests/pasori_test
```


# FeliCaのIDmを読むPythonスクリプト

サンプルは[こちら](http://thinkami.hatenablog.com/entry/2015/06/16/212600)から引用させていただいてます。
引用元のままだとIDmが下４桁しか表示されないため１６桁表示させるため一部手を入れさせていただいてます。

```py
# -*- coding: utf-8 -*-

from __future__ import print_function
from ctypes import *

# libpafe.hの77行目で定義
FELICA_POLLING_ANY = 0xffff

if __name__ == '__main__':

    libpafe = cdll.LoadLibrary("/usr/local/lib/libpafe.so")

    libpafe.pasori_open.restype = c_void_p
    pasori = libpafe.pasori_open()
    
    libpafe.pasori_init(pasori)

    libpafe.felica_polling.restype = c_void_p
    felica = libpafe.felica_polling(pasori, FELICA_POLLING_ANY, 0, 0)

    idm = c_ulonglong() #←16桁受けとるために変更
    libpafe.felica_get_idm.restype = c_void_p
    libpafe.felica_get_idm(felica, byref(idm))

    # IDmは16進表記
    print("%016X" % idm.value) #←16桁表示させるために変更

    # READMEより、felica_polling()使用後はfree()を使う
    # なお、freeは自動的にライブラリに入っているもよう
    libpafe.free(felica)

    libpafe.pasori_close(pasori)
```



# 参考
[Raspberry Pi + libpafe + Python + ctypesで、FeliCaのIDmを読む](http://thinkami.hatenablog.com/entry/2015/06/16/212600)