RaspberrypiでAmazonDashButtonをハンドリングする

# はじめに
みなさんこんにちわ。
mixiメディア事業部の田代です。
主にSwiftやObjective-Cをメインに開発していますが、今AmazonDashButtonが自分の中で話題なのでその環境構築をまとめてみました。

![Raspi-PGB001.png](https://qiita-image-store.s3.amazonaws.com/0/89215/a69de6d9-cf36-dcfa-c607-99ee1e97b035.png)

# やりたいこと
* 同一の無線Wifi環境内でラズパイを使ってAmazonDashButtonが押されたことをハンドリングする
* Macだけでも簡単にできるけど、複数人でデプロイしたかったのでサーバーを立てることにしました

# 用意するもの
## RaspberryPi
* RaspberryPi（引き出しにしまってあったラズパイBを使います）
* SDカード（ラズパイのOSのイメージをいれます）
* ディスプレイとHDMIケーブル
* USBケーブル（ラズパイの電源用）
* Wifiドングル（ラズパイ３以降であれば不要ですｗ）
  * Wifiドングルは簡単に設定できる[BUFFALO WLI-UC-GNM](https://www.amazon.co.jp/exec/obidos/ASIN/B003NSAMW2/denshikosaku-22/)を使ってます
  * 昔適当に買ったドングルが認識できずすごく苦労したので、簡単に設定できるのがオススメです

## AmazonDashButton
* 適当なAmazonDashButtonを買います

# AmazonDashButtonの設定
* Wifi設定後の注文画面でキャンセルすれば、押しても注文されなくなります
  * Wifiはラズパイでつなぐ予定のものと同じにしておきましょう
* 参考： [Amazonの注文を行わずにIoTボタンとして使う方法
](http://qiita.com/jsoizo/items/3b8bba4160f41aef20f4#%E6%9C%AC%E9%A1%8C--amazon%E3%81%AE%E6%B3%A8%E6%96%87%E3%82%92%E8%A1%8C%E3%82%8F%E3%81%9A%E3%81%ABiot%E3%83%9C%E3%82%BF%E3%83%B3%E3%81%A8%E3%81%97%E3%81%A6%E4%BD%BF%E3%81%86%E6%96%B9%E6%B3%95)

# RasberryPiの環境構築
* 公式: https://www.raspberrypi.org

## 手順
### ガイドライン
* 公式の手順： https://www.raspberrypi.org/documentation/installation/installing-images/mac.md

### SDカードのフォーマット
* 公式にはSDFormatter使えってなってましたが、MacであればDiskUtilitiyでもできました

### イメージのダウンロード

* https://www.raspberrypi.org/downloads/raspbian/
  * 今回は**Rasbian**を使います
  * Javaとかpythonの開発環境なんて必要ない！という方はNOOBでも大丈夫だと思います
* ダウンロードするのは**torrentのほうが断然早い**です
  * 自分の環境では２０分ぐらいで終わりました
  * ダウンロードZIPだと１２時間かかる予想でした…


### SDカードへimgファイルの転送
* ダウンロードが終わったら解凍します
* 解凍すると`2016-11-25-raspbian-jessie.img`が出力されると思います


### SDカードのマウント先を調べます
```
$ diskutil list

/dev/disk2 (internal, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *15.8 GB    disk2
   1:                  Apple_HFS SDCARD                  15.8 GB    disk2s1
```

自分の環境では`disk2`にありました
それからSDカードをアンマウントします
アンマウントしないとエラーがでてしまいます…

```
$ diskutil unmountDisk /dev/disk2
Unmount of all volumes on disk2 was successful
```

そして最後に`dd`コマンドでimgファイルをSDカードに転送します
転送には30分近くかかりますので気長に待ちましょう。。。

```
$ sudo dd 2016-11-25-raspbian-jessie.img of=/dev/disk2 bs=1m
4169+0 records in
4169+0 records out
4371513344 bytes transferred in 2109.358009 secs (2072438 bytes/sec)
```

念のため転送されているか確認します

```
$ diskutil list
/dev/disk2 (internal, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *15.8 GB    disk2
   1:             Windows_FAT_32 boot                    66.1 MB    disk2s1
   2:                      Linux                         4.3 GB     disk2s2
```

大丈夫そうですね

## ラズパイの初期設定
* SDカードやWifiドングル、HDMIケーブルなどを指してから電源を入れます
* SSH接続してCUIでもできますが、GUIでやると早いのでさくっと設定

### 言語・地域環境
* 設定 > RaspberryPiの設定からSetLocaleとSetTimezoneを設定 > 再起動
* なんかキーボード設定が日本語にならずにちょっとはまるが、何度か設定してるうちに設定されるようになる（謎）

### Wifiネットワーク設定
* デスクトップの右上のネットワーク設定から簡単にできます

### apt-get
* ここからはターミナルで作業します
* 公式の設定方法にもあるように最新に更新します

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

* デフォルトで入っているエディターが微妙なので自分はvimをいれました

```
$ sudo apt-get install vim
```

## Node環境の構築
* 今回は `dash-button` というnpmをつかってハンドリングしたいと思います
* https://github.com/ide/dash-button

### nodejsの更新
* ラズパイにデフォルトでインストールされているnodeのバージョンは**v0.10.29とかなり古い**ので最新のをいれます
* dash-buttonを使うには**v4以上**でないと依存moduleが解決できないようです
* apt-getからでは最新のnodejsがインストールが出来ないので`npm`をインストールして対応します
* 参考： [Ubuntuに最新のNode.jsを難なくインストールする](http://qiita.com/seibe/items/36cef7df85fe2cefa3ea)

### npmインストール
```
$ sudo apt-get install -y npm

$ sudo npm cache clean
$ sudo npm install n -g

$ sudo n stable

$ node -v
v7.2.1

$ sudo apt-get purge -y nodejs npm
```

* これで最新のnode.jsが使えるようになりました

### dash-buttonのインストール
```
$ mkdir dash
$ cd dash

# dash-buttonがつかうパケットキャプチャのライブラリをいれます
dash$ sudo apt-get install libpcap-dev

dash$ npm install --save dash-button
```

### dash-buttonの動作確認
package.jsonに以下のように書いて `sudo npm run scan` するとAmazonDashButtonを探しに行きます

```
{
  "scripts": {
    "scan": "dash-button scan"
  }
}
```

* 探し始めたらAmazonDashButtonのボタンを押してあげるとMACアドレスを拾ってくれるはずです

```
dash$ sudo npm run scan

> @ scan /home/pi/dash
> dash-button scan

Scanning for DHCP requests and ARP probes on wlan0...
Detected a DHCP request or ARP probe from 34:d2:70:31:08:92
```

* あとはdash-buttonのreadmeを参考に、ハンドリングの実装をすればボタンをフックできるはずです！