Raspberry PiでFelicaのIDmを表示する

# 概要

簡単な入室管理のために、まずはRaspberry PiとPaSoRiでカードのIDmを取得する.



# 動作環境

* Mac OSX(EI Capitan)
* Raspberry Pi2 Model B
* PaSoRi RC-S380P


# Raspberry Piセットアップ

## OSダウンロード

日本のミラーサイトからダウンロード
https://www.raspbian.org/RaspbianMirrors

## イメージのインストール
https://www.raspberrypi.org/documentation/installation/installing-images/mac.md

### SD cardの刺さっている場所を調べる

```bash
$ diskutil list
/dev/disk0 (internal, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *500.1 GB   disk0
   1:                        EFI EFI                     209.7 MB   disk0s1
   2:                  Apple_HFS Macintosh HD            499.2 GB   disk0s2
   3:                 Apple_Boot Recovery HD             650.0 MB   disk0s3
/dev/disk1 (internal, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *32.2 GB    disk1
   1:             Windows_FAT_32 NO NAME                 32.2 GB    disk1s1
```
今回はdisk1。
違う人は、これ以降のdisk1を自分の相応しい値に変更。


### アンマウントしておく
```
$ diskutil unmountDisk /dev/disk1
```

### SD cardにデータをコピー
```
$ sudo dd bs=1m if=2015-11-21-raspbian-jessie.img of=/dev/rdisk1
```
Ctrl+Tを押すと途中経過が見える


### 動作確認

Micro SDカードを基盤に刺して、優先LANを接続し、USBから給電

#### ip 確認し、ssh接続
```
$ arp -a
$ ssh pi@[ipアドレス]  #パスワードはraspberry
```

## 初期設定

```
$ sudo raspi-config
```

### Expand Filesystem

3.5GBしか認識してないので、必要なら拡張を行う

### Change User Password

piのパスワード変更（多分passwdでも大丈夫）

### Internationalisation Options 

Timezoneを変更 Asia/Tokyoへ 

## リポジトリサーバーの変更

/etc/apt/sources.list を編集
ミラーリストをコメントアウトし、日本のリポジトリサーバーを追加

```
deb http://ftp.jaist.ac.jp/raspbian jessie main contrib non-free rpi
```

```
$ sudo apt-get update
$ sudo apt-get upgrade
```

## MicroSDカードの寿命を延ばす

以下を参考にさせてもらった

http://denshikousaku.net/extend-life-expectancy-of-raspberry-pi-sd-card

### スワップをゼロにしておく

In Raspberry PI

```
pi@raspberrypi:~ $ free
             total       used       free     shared    buffers     cached
Mem:        948108     158008     790100      12796      13480      84156
-/+ buffers/cache:      60372     887736
Swap:       102396          0     102396
pi@raspberrypi:~ $ sudo swapoff --all
pi@raspberrypi:~ $ free
             total       used       free     shared    buffers     cached
Mem:        948108     158604     789504      12796      13500      84648
-/+ buffers/cache:      60456     887652
Swap:            0          0          0
```

再起動後もスワップを設定しないようにする

```
$ sudo apt-get remove dphys-swapfile
```

電源をぶっこぬいてチェック

```
pi@raspberrypi:~ $ free
             total       used       free     shared    buffers     cached
Mem:        948108     157400     790708      12748      13448      83668
-/+ buffers/cache:      60284     887824
Swap:            0          0          0
```

# PaSoRi

以下の記事を参考にさせてもらいました

http://blog.shibayan.jp/entry/20150427/1430067533

## PaSoRiを接続

```
pi@raspberrypi:~ $ lsusb 
Bus 001 Device 004: ID 054c:06c3 Sony Corp. 
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
```
Sonyデバイスを発見

## nfcpyをインストール

http://nfcpy.readthedocs.org/en/latest/topics/get-started.html

```
$ sudo apt-get install python-pip
$ sudo pip2 install --upgrade pip
$ sudo pip2 install nfcpy
$ pip show nfcpy
Name: nfcpy
Version: 0.11.1
Summary: Python module for Near Field Communication
Home-page: https://launchpad.net/nfcpy
Author: Stephen Tiedemann
Author-email: stephen.tiedemann@gmail.com
License: EUPL
Location: /usr/local/lib/python2.7/dist-packages
Requires: pyserial, libusb1
```

pipを更新してインストール

## IDmの取得(サンプルを実行してみる)

```
$ git clone https://github.com/nfcpy/nfcpy.git
$ cd nfcpy
$ git checkout stable/0.11
$ sudo python examples/tagtool.py show
[nfc.clf] searching for reader on path usb
[nfc.clf] using SONY RC-S380/P NFC Port-100 v1.11 at usb:001:005
** waiting for a tag **
```

試しにSuica をタッチすると、IDmとかが表示される
 
## sudoを使わずに実行できるようにする

lsusb で確認したReaderのIDをつかって実行すると、打つべきコマンドが表示される(nfcpy 0.10以降)

```
$ python examples/tagtool.py --device usb:054c:06c3
[nfc.clf] searching for reader on path usb:054c:06c3
[main] access denied for device with path usb:054c:06c3
[main] first match for path usb:054c:06c3 is usb:001:005
[main] usb:001:005 is owned by root but you are pi
[main] members of the root group may use usb:001:005
[main] you may want to add a udev rule to access this device
[main] sudo sh -c 'echo SUBSYSTEM==\"usb\", ACTION==\"add\", ATTRS{idVendor}==\"054c\", ATTRS{idProduct}==\"06c3\", GROUP=\"plugdev\" >> /etc/udev/rules.d/nfcdev.rules'
[main] no contactless reader available
```
指定されたコマンドを実行した後、ReaderのUSBを抜き差しをするとsudo をつけなくても実行できるようになります。


# example以外で実行

## simple sample
IDmだけとれればいいので、exampleを参考にIDmだけとるスクリプトを作成.
止めるためには、別ターミナルからプロセスをkillする必要あり
とりあえず、SuicaのIDmはとれました

```python
import binascii
import nfc


class MyCardReader(object):

    def on_connect(self, tag):
        print "touched"
        self.idm = binascii.hexlify(tag.idm)
        return True

    def read_id(self):
        clf = nfc.ContactlessFrontend('usb')
        try:
            clf.connect(rdwr={'on-connect': self.on_connect})
        finally:
            clf.close()

if __name__ == '__main__':
    cr = MyCardReader()
    while True:
        print "touch card:"
        cr.read_id()
        print "released"
        print cr.idm
```