Raspberry pi + AWSで温度をスマホに出力させる

AWSど素人の私が調べながら、AWSとRaspberry piとデバイスを接続するまでの流れをまとめました。
ほとんど全部の工程を記載していくのでかなり長いですが参考になればと思います。
#参考
<a href = "https://qiita.com/Higemal/items/c817b96c3806f23b35f6">Raspberry Pi 3 Model B+の初回セットアップ（購入から起動まで）</a>
<a href="https://hirazakura.hatenablog.com/entry/raspberrypi/setup/python">Raspberry Pi（Raspbian）Python3インストール</a>
<a href="https://dev.classmethod.jp/hardware/raspberrypi/aws-iot-device-sdk-for-python-raspberrypi-aws-iot/">AWS IoT Device SDK for Pythonを使ってRaspberryPiとAWS IoTをつないでみる</a>
<a href="https://docs.aws.amazon.com/index.html?nc2=h_ql_doc_do">AWS ドキュメント</a>
<a href="https://www.sunhayato.co.jp/support/skill/AS-E405.html">AS-E405 Raspberry Pi GPIO実験ボード</a>
<a href="https://qiita.com/chigusaweb66/items/2058174713ca833361ff">ラズパイとAWS IoT連携 (Pythonで温度情報をクラウド送信)</a>
#Raspberry Piのセットアップ
まずはラズパイを使用できるようにしましょう。
##OSのダウンロード
初めはmicroSDにOS(NOOBS)を入れていきます。
お手持ちのインターネットに繋がるPCで以下のリンクから、
zipファイルをダウンロードします。
・OS(NOOBS)ダウンロード
[Raspberry] noobs Download
https://www.raspberrypi.org/downloads/noobs/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267329/808a5ea4-4c55-daa8-ba6f-02bb9a022a4e.png)
ダウンロードし終わったら、解凍してSDカードへすべて移動させます。
ダウンロードはこれで終わりです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267329/29edad70-b180-331a-0726-c228ffa6e1ae.png)
###OSセットアップ
今度は先ほどダウンロードしたOSのセットアップを行います。
OSの入ったmicroSDをラズパイに差し込みます。
microSDの場所、その他の接続は以下の画像を参考にしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267329/4177e3fd-206d-a091-a3b0-f721c54d1de0.png)
画像の通り差し込めたら電源をつけていきます。
といっても電源ボタンがなく、コンセントを差し込んだら起動するため既についているかもしれませんが...
以下の画像が出たら起動成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267329/5bc71a48-342b-3e96-d997-8a7ac740d1b7.png)
※差し込んでも起動しないよという方はモニターなどを変えてみてください。
(私は恥ずかしながら、ノートPCにHDMI端子を指してつかない！と嘆いてました)
起動したらOSのセットアップが自動で立ち上がります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267329/23ec9b1a-fd3c-7c75-9103-5f2147900e77.png)
まずは画像の場所から言語選択をしていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267329/842d872a-6d08-0a9d-2395-2d36cc13d02e.png)
次にOSを選択します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267329/3bb6ced7-d65a-aafe-aaaf-e64675408de9.png)
Raspbianを選択してインストールを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267329/a5542b2b-e67c-2ef2-3dea-36eaaff85d8e.png)
すると以下の画面に変わりダウンロードが始まります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267329/35a1a260-a453-f1c1-3037-c9ff3aa72b1e.png)
次にそのまま立ち上がるウィンドウで初期設定をしましょう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267329/5cf5b45b-ee18-93fd-bc05-3a9f77973a21.png)
言語、地域、タイムゾーンはすべてそのままで大丈夫です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267329/36119757-a467-4e7a-220f-852e33d85c35.png)
パスワードはお好きなものでかまいません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267329/15b1bb98-fc34-5cad-7211-ae914860d09f.png)
Wifi設定しない場合はSkipでも問題ありません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267329/341bfb87-774a-4af1-99fa-10a834e10d86.png)
ここまで終われば一旦Reboot(再起動)し設定を適用させます。

次に日本語入力ができるように設定していきます。
まず左上にあるターミナルをクリックします。
システムのアップデート、アップグレードを行います。
さっき入れたばかりでも、日々更新されているので念のため行っておきましょう。

```
$ sudo apt-get update
```
と入力し、Enterで実行します。

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

続いてこちらも実行します。

```
$ sudo apt-get install ibus-mozc
```
それが終われば日本語入力ができるものをインストールします。
このインストールが終われば、先ほどと同じ手順で再起動します。
これで日本語設定は終わりです。
###Raspberry PiにPython3をインストール
まずは先ほどの2つのシステムアップデート、アップグレードに加え、
もう一つパッケージのアップグレードを行います。

```
$ sudo apt-get dist-upgrede
```
次にビルドに必要なパッケージのインストールを行います。

```
$ sudo apt-get install build-essential tk-dev libncurses5-dev libncursesw5-dev libreadline6-dev libdb5.3-dev libgdbm-dev libsqlite3-dev libssl-dev libbz2-dev libexpat1-dev liblzma-dev zlib1g-dev libffi-dev libc6-dev
```
次にPythonのダウンロードをします。
Pythonのホームページに接続するのでインターネットに繋がるようにしておいてください。

```
$ wget https://www.python.org/ftp/python/3.6.6/Python-3.6.6.tgz
$ tar -zxvf Python-3.6.6.tgz
$ cd Python-3.6.6
$ ./configure --prefix=/usr/local
$ sudo make
$ sudo make install
```
次にインストールなどに使うpipのアップデートをします。

```
$ sudo pip3 install -U pip
$ sudo pip3 install -U setuptools
```
最後に正しくインストールできているか'-v'を使用して確認します。

```
$ python3 -V
Python 3.6.6

$ pip3 -v
pip 18.0 from /usr/local/lib/python3.6/site-packages/pip (python 3.6)
```
これでPythonのインストールは終了です。
ラズパイの下順備ができたので、次にAWSと連結させていきます。
#Raspberry PiとAWS iotを繋ぐ
##AWSの設定
ラズパイとAWSを繋ぐために、まずはAWSの設定を行っていきます。
AWSの画面に行き、ユーザー登録を行います。
下画像の場所から新規登録を行ってください。

※登録にはクレジットカード(無料枠を超えた段階で料金が発生するため)が必要です。
登録できないカードもあるので一度下記リンクをご確認ください。
https://aws.amazon.com/jp/premiumsupport/knowledge-center/credit-card-declined/
ちなみに今回私が作っているもの程度なら余裕で無償の範囲内です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267329/c9242c28-b2df-d6dd-517c-50e272c2737e.png)
「アカウント」→「アカウント設定」から新規登録です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267329/f8d986e2-d6f5-bded-2eb5-6974056e984e.png)
次にログインできればこのような画面に行くと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267329/130fea96-ab27-882d-e973-da8421db27f0.png)
左上の「サービス」から「IoT Core」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267329/7d403fa9-1124-4b46-5570-6aa425b3c212.png)
選択すると以下の画面が出てきます。
「今すぐ始める」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267329/5c6583a6-6bb2-cbe6-46e2-c34fa83f52c7.png)
まずは左のバーから「管理」→「モノ」を選択し、モノを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267329/f493a6e1-0ddb-d783-1f3f-30e08512c0dc.png)
今回は「単一のモノを作成する」にチェックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267329/cde32fed-499e-b316-f398-5bcd8c5805b8.png)
次にモノの名前、タイプ、グループですが、好きなものをお使いください。
今回私は「test-raspberry」としています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267329/0b6348ba-5f42-86cf-8ac4-f34d198ca30d.png)
次に一番重要な証明書の発行です。
「1-Click証明書作成」の証明書を作成するを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267329/33a6061b-c088-732e-9711-50c74affefab.png)
証明書が作成されました。
「モノの証明書」「パブリックキー」「プライベートキー」「ルートCA」すべてダウンロードしておきます。(ダウンロードのボタンが押せるところは全部押してもらっていいです)
※ルートCAはリンク先のRSA 2048 ビットキー: Amazon ルート CA 1をローカルのテキストファイルにコピーして別名で保存します。
今回は「rootCA.pem」という名前で保存しています。
最後に有効化をクリックして完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267329/2919d17c-5ad7-fe5d-ff88-14d854248193.png)
次にポリシーを作っていきます。
左のバーから「安全性」→「ポリシー」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267329/25770362-4e7c-7203-f643-6a440e8c0c6a.png)
作成ボタンを選択すると、ポリシーの作成画面が出てきます。
名前は好きなものをつけます。
アクションはiot:*
リソースARNは*
で作成を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267329/611ba60d-03fd-0b82-90be-b9a0049e8be1.png)
ポリシーと証明書を紐づけます。
左のバーから「安全性」→「証明書」を選択し、
先ほど作成した証明書に対して「ポリシーのアタッチ」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267329/01222deb-bb8c-f629-4a3b-b8586baa241c.png)
すると以下の画面が出てくるため、先ほど作ったポリシーが出てくるので、
チェックを入れてアタッチを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267329/884d4167-496b-a171-9055-e3ea601084d1.png)
以上でAWS側の設定は一旦終わりです。
##Raspberry Piの設定
AWSのモジュールをダウンロードします。

```
$ sudo pip install AWSIoTPythonSDK
$ git clone https://github.com/aws/aws-iot-device-sdk-python.git
$ cd aws-iot-device-sdk-python
```
ダウンロードしてきた「Samples」の中に「cert」というフォルダを作成して、
先ほどダウンロードしてきた証明書を入れます。

```
$ cd samples
$ mkdir cert
```
手動で移動させてもらって構いません。
移動できたら、入っているか確認します。

```
ls　cert
xxxxxxxxxx-certificate.pem.crt  xxxxxxxx-private.pem.key  rootCA.pem
```
xxxxxxxxxxは自身のものと一致していれば問題ありません。
これでラズパイ側の設定もいったん終了です。
###テストしてみる
実際にデータが送信できるかテストしてみます。

```aws.py
from AWSIoTPythonSDK.MQTTLib import AWSIoTMQTTClient
import json

# 初期化
myMQTTClient = AWSIoTMQTTClient("raspi-zero")

# MQTTクライアントの設定
myMQTTClient.configureEndpoint("エンドポイントURL", 443)
myMQTTClient.configureCredentials("./cert/rootCA.pem", "./cert/xxx-private.pem.key", "./cert/xxx-certificate.pem.crt")
myMQTTClient.configureOfflinePublishQueueing(-1)
myMQTTClient.configureDrainingFrequency(2)
myMQTTClient.configureConnectDisconnectTimeout(10)
myMQTTClient.configureMQTTOperationTimeout(5)

# Connect to AWS IoT endpoint and publish a message
myMQTTClient.connect()
print ("Connected to AWS IoT")
myMQTTClient.publish("test", json.dumps({"test": "test message!"}), 0)
myMQTTClient.disconnect()
```
まずはこのコードを丸パクリでいいのでSamplesの中においておきます。
エンドポイントURLと記載のあるところはAWS Iotの左バー「管理」→「モノ」で今回作成したモノを選択し、その中の操作にあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267329/89ae7a0f-2b5d-e63c-48d2-2aa6515b3322.png)
configureCredentialsの中身は先ほど移した「cert」の中の証明書を記載します。
では実際に動かしてみます。
AWSの画面左バーから「テスト」を選択します。
今回は「test」という名前でサブスクリプトします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267329/2aaa1531-ded8-7765-9605-33abd0f7d3a1.png)
この画面になれば一旦ラズパイ側に移動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267329/595d2ed6-454b-0a1b-af4e-8cad2c7d2ccd.png)
ラズパイのターミナルでsamplesの階層まで行きます。

```
$ cd aws-iot-device-sdk-python/samples
```
ここで先ほど作ったaws.pyを実行します。

```
$ python aws.py
```
ターミナル上でConnected to AWS IoTが出力されていればOKです。
さてAWS側に戻ってみましょう。
下記部分にtest:test message!と出力があれば接続成功です。
#温度をAWSに表示させる
###Raspberry Piに温度を出力させる。
今回は温度を測るセンサにサンハヤトのAS-E405を使用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267329/0e7a6c17-21e4-a83b-f618-aebf36192399.png)
温度データをI2Cという形式で渡すため、I2Cライブラリをインストールします。

```
$ sudo apt-get install i2c-tools libi2c-dev python-smbus
```
I2Cライブラリインストール後、「Menu→設定→Raspberry Piの設定」から「インターフェイス」を選択しI2Cの項目を有効に変更してください。

設定が反映されるように再起動を行ったのちI2Cが有効になっていることを確認します。

では続いて温度を取得するプログラムを書いていきます。
これはサンハヤトのHPに載っているものをコピペでOKです。
あげるとするならコピペした場合、一番下の出力時間が1秒になっているので、
お好みの時間に合わせることを推奨します。
今回は10秒に設定します。

```ondo.py

#!/usr/bin/python
# coding: utf-8
 
import smbus
import time
 
bus = smbus.SMBus(1)    #I2Cバス番号
address = 0x48          #TMP102のI2Cアドレス
 
#I2C data write (1byte)
def write(reg, value):
    bus.write_byte_data(address, reg, value)
 
#I2C data read (1byte)
def read(reg):
    value = bus.read_byte_data(address, reg)
    return value
 
#I2C data write (block)
def blockread(reg, value):
    value = bus.read_i2c_block_data(address, reg, value)
    return value
 
while 1:
    temp_raw = blockread(0x00, 2)   #I2Cで温度データ(2byte)を取得
    #温度データを整形
    temp = ((temp_raw[0] << 8) | temp_raw[1]) >> 4
    #分解能（0.0625℃）倍する
    temp = temp * 0.0625
    #表示出力
    print("temp = " + str(temp) + "*C")
 
    time.sleep(10)   #10秒
```
一旦このソースコードを実行してみます。
下のように出力されていれば成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267329/2f2352c3-b9da-7926-e6cc-e02f6cfa71ad.png)
次にAWSに飛ばせる形にしていきます。
先ほどのテストで使用したソースと今回の温度情報を取得するソースを合体させます。

```grip.py


#!/usr/bin/python
# coding: utf-8
from AWSIoTPythonSDK.MQTTLib import AWSIoTMQTTClient
import json
import smbus
import time
import sys

myMQTTClient = AWSIoTMQTTClient("raspi-zero")

myMQTTClient.configureEndpoint("a3r6ipupo6zx5v-ats.iot.us-west-2.amazonaws.com", 443)
myMQTTClient.configureCredentials("./cert/rootCA.pem", "./cert/e6e3d9969f-private.pem.key", "./cert/e6e3d9969f-certificate.pem.crt")
myMQTTClient.configureOfflinePublishQueueing(-1)
myMQTTClient.configureDrainingFrequency(2)
myMQTTClient.configureConnectDisconnectTimeout(10)
myMQTTClient.configureMQTTOperationTimeout(5)


myMQTTClient.connect()
print ("Connected to AWS IoT")
 
bus = smbus.SMBus(1)    
address = 0x48          
try:
    def write(reg, value):
        bus.write_byte_data(address, reg, value)
 
    def read(reg):
        value = bus.read_byte_data(address, reg)
        return value
 
    def blockread(reg, value):
        value = bus.read_i2c_block_data(address, reg, value)
        return value
 
    while 1:
        temp_raw = blockread(0x00, 2)   
        temp = ((temp_raw[0] << 8) | temp_raw[1]) >> 4

        temp = temp * 0.0625
        
        print("temp = " + str(temp) + "*C")
        
        myMQTTClient.publish("test", json.dumps({"default": (temp)}), 0)
 
        time.sleep(10)   
except eyboardInterrupt:
        myMQTTClient.disconnect()
        sys.exit(0)
```
乱雑ですがこのようになりました。
それでは先ほどと同様テストしてみましょう。
AWSのテストからサブスクリプト「test」を作成。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267329/39c375ea-256a-9403-230c-0cf4f8a4b0af.png)
ラズパイ側でソースコードを実行します。

```
$ Python testondo.py
```
テストの画面で温度が表示されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267329/edf57c2b-7e60-01ef-d866-006221880455.png)
これで、温度の取得からAWSにデータを飛ばすことができました。
#AWS SNSを利用してデバイスに送信する
##AWS SNSの設定
AWSのサービス画面からSimple Notification Serviceを選択します。
※似たようなものにSMSというのがあるので間違えないように！
SNSの設定は簡単です。
まずは、トピックの名前を設定しましょう。
ここは好きな名前で構いません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267329/15f4c223-03c5-63f2-1882-a82e163849d1.png)
いろいろ出てきますが全部無視して、トピックの作成を行います。
これでトピックができました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267329/38705a0f-82cb-e43a-0dc1-4969df6df017.png)
次にサブスクリプションを作成します。
ここで先ほどのモノと紐づけます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267329/3db0cca1-8f9b-2660-e67f-8025780fcea6.png)
ここから作成に入ります。
まずトピックARN。これは先ほど作成したトピックのARNと紐づけます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267329/063f459b-b2ba-e6e5-0b22-2cd031fbaa6d.png)
ARNはトピックの画面位置に書いてあります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267329/85259c02-e1bf-8680-a57d-135202daaf82.png)
次にプロトコルですが、今回はEMAIL形式を選択します。
最後にデータを送りたいデバイスのメールアドレスを記入して、サブスクリプションの作成は終了です。
作成が完了すると設定したメールアドレス宛に確認メールが飛んでくるので、URLをクリックし確認できれば、サブスクリプションのステータスが以下のように変化します。
ステータスが確認済みになっていればOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267329/3d0b4ab6-05e5-1e31-6416-16265ab37dd2.png)
##AWS IoTの設定
IoT画面左バーの「ACT」からルールを作成します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267329/8bd72947-aecd-7523-d9b1-c93e1626b014.png)
まずは名前を決めます。
ここはなんの名前でも大丈夫です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267329/b2652044-979f-dba0-d3c7-847feff20dc4.png)
次に下にちょろっと見えているルールクエリステートメントの設定です。
ここではデータを取得する条件を記述します。
今回はテストの名前を'test'とするため

```
select * from 'test'
```
と記載します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267329/cd153293-5e87-25e4-3000-38733a7612b0.png)
次にアクションの追加を行います。
今回はメッセージで送るのでSNSプッシュ通知を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267329/d1125fd9-06cb-c504-80d1-0224eea2c03b.png)
次の画面でターゲットを選択します。
ターゲットは先ほど作成した、SNSのターゲットを選択します。
メッセージ形式はJSONです。
そのままロールの作成も行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267329/7d70ae0c-6958-9216-b355-838c90fb35a5.png)
作成をクリックすると以下の画面が出てくるので、適当な名前を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267329/cb27a477-e82a-5f28-4e35-d48743a0dc87.png)
作成を押せば下のような画面になっていると思います。
アクションの追加を押して、ルールは完成です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267329/c42bf192-7112-70f7-9450-e61abe50df9a.png)
#動かしてみる
例によってテストからtestを作成して、プログラムを実行してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267329/8b898477-65e8-e45b-d5b2-6e0f4a90d15b.png)
データが取れました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267329/0d8a352f-4769-ab7e-821f-89ce2e0ec6de.png)
そしてメールにも送られました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267329/9bc74316-1c92-6596-b4c1-88dc3613e000.png)

###終わりに
今回初めてAWSを使用してみて、クラウドの有用性を実感しました。
今後もっといろいろなものを試してみようと思います。
長くなりましたが、読んでいただきありがとうございました。