AWS IoT Device SDK for PythonをRaspberryPiで動かす

# AWS IoT Device SDK for Python
今回はAWS IoT Device SDK for Python付属のsampleをRaspberryPiで動かして、S3にデータを格納してみます。

## 用意したもの
### RaspberryPi 3
てもとにあるどのRaspberryPiでもよいでしょう

### RASPBIAN JESSIE
OSはさいしんにアップデートしました
```
pi@raspberrypi:~ $ uname -a
Linux raspberrypi 4.4.13-v7+ #894 SMP Mon Jun 13 13:13:27 BST 2016 armv7l GNU/Linux
```
### AWSアカウント

## AWS IoTの準備
AWSマネジメントコンソールから設定していきます。

### Create a thing
はじめにthingをつくります。
![q-ss01s.png](https://qiita-image-store.s3.amazonaws.com/0/107906/90e3821f-cd9a-2708-d284-e9ba4ff8f70c.png)

ここでは、名前をraspi1にしました。

### Create a rule
つぎにthingに対するruleをつくります。

さきほど作った「raspi1」thingをクリックすると右側にDetailが出てきます。さらに右下のCreate a ruleボタンを押します。
![q-ss02s.png](https://qiita-image-store.s3.amazonaws.com/0/107906/15cdbcff-f5da-a960-cf31-ad5155b2b1eb.png)

するとこんな画面。
![q-ss03s.png](https://qiita-image-store.s3.amazonaws.com/0/107906/ff3f1e8d-d2af-acb8-d74c-dd32e2de2cfd.png)

ここではルールの名前はraspi1_ruleにしました。

SQLっぽいところには、thingから送られるデータに対しフィルターをかけることができます。SDKのサンプルコードでは、「sdk/test/Python」というTopicを送ってきますので、ここでは次のように入力します。

|name|value|
|:-:|:-:|
|Attribute|*|
|Topic filter|sdk/test/Python|

画面をスクロールして、つぎに設定するChoose an actionは、受け取ったデータに対してどうするかを決めるところです。
![q-ss04s.png](https://qiita-image-store.s3.amazonaws.com/0/107906/31b1d602-ffca-6a46-5448-70e07e80d6d0.png)

ここではS3にデータを格納することにします。

S3 bucket、Key、Role nameをよしなに入力します。
Create a new resourceでその場で作って設定することもできますので、テスト用に一時的なバケットをつくりました。既存のものをつかうときはアクセス許可などお気をつけになってください。

Add Action→Createとボタンを押していくと、ruleの完成です。

### Connect a device
さいごにthingに対して実際に接続するデバイスからの認証情報を設定します。

ruleを作ったボタンの右隣りにあるConnect a deviceボタンを押します。
![q-ss05s.png](https://qiita-image-store.s3.amazonaws.com/0/107906/6f82d386-3121-4bf1-e4c1-a355ae5431da.png)

すると、どのSDKつかうのー？と選べるのですが、Pythonがみあたりません。
![q-ss06s.png](https://qiita-image-store.s3.amazonaws.com/0/107906/b527f0f2-0231-dd3f-dfbb-ba81c276781a.png)

しかたがないのでNodeJSを選ぶと、Generate certificate and policyというボタンが出てくるので押します。
![q-ss07s.png](https://qiita-image-store.s3.amazonaws.com/0/107906/490b356e-3e9b-78e9-ba6b-53ed8c767395.png)

こんどは、３つのリンクとボタンが出てきます。
![q-ss08s.png](https://qiita-image-store.s3.amazonaws.com/0/107906/13e06080-3699-9bfc-232f-a821f9bd302c.png)

まずDownload〜のリンク３つをクリックして証明書をダウンロードします。

- Download public key
- Download private key
- Download certificate

ダウンロード後、Confirm & start connectingボタンを押します。
![q-ss09s.png](https://qiita-image-store.s3.amazonaws.com/0/107906/b25703a0-d8f9-4b74-d650-b4207a9a637d.png)

ここのテキストボックス内をコピペしておいて、Return to Thing Detailボタンを押します。

## RaspberryPiの準備

### AWS IoT Device SDK for Pythonのインストール
さいしんのRASPBIAN JESSIEはpipが入ってたのでpipでインストール。
`sudo pip install AWSIoTPythonSDK`
適宜sudoしたりしなかったり。

### サンプルコードをダウンロード
ソースツリーにサンプルコードも入ってるので、githubからcloneしておきます。
`git clone https://github.com/aws/aws-iot-device-sdk-python.git`

### 証明書の準備
サンプルコード実行にあたり、証明書ファイルが３つ必要です。
今回はサンプルコードと同じディレクトリに置きます。

AWS IoTを準備した時にダウンロードした証明書をすべてRaspberryPiにscp等で送ります。

- ほにゃらら-certificate.pem.crt
- ほにゃらら-private.pem.key

つぎに、AWS IoT root CAを準備します。
`curl https://www.symantec.com/content/en/us/enterprise/verisign/roots/VeriSign-Class%203-Public-Primary-Certification-Authority-G5.pem -o rootCA.pem`

rootCA.pemという名前で保存されます。

### サンプルコードを実行
引数でendpointと各種証明書のパスを指定します。

endpointは、AWSのホスト名でAWS IoT準備の最後に出てきたテキストボックス内に「"host":"どこかの"」と出てきます。
もしくは、マネジメントコンソールにて、thingをクリックしてでてくるDetail内にもホスト名が出てきます（正しくはREST APIの送り先なので、それのホスト名部分だけ）
![q-ss10s.png](https://qiita-image-store.s3.amazonaws.com/0/107906/d73bdb09-daa3-e21a-99b0-4e24b318f94d.png)


`python basicPubSub.py -e どこかの.amazonaws.com -r rootCA.pem -c ほにゃらら-certificate.pem.crt -k ほにゃらら-private.pem.key`

実行すると、1秒間隔でメッセージを投げます。
表示されるログを確認して問題なさそうなら、10秒くらいでCtrl+Cします。

### S3バケットをみる
今回設定したバケットにファイルが出来上がります。
中身がサンプルコードを実行した秒数だけ更新されていれば成功です。
`New Message 10`