Amazon Web Services資料一覧

AWS IoTでMQTTブローカーを作りArduinoからのセンシングデータをSNS通知する手順

2017/06/09更新

AWS IoTでMQTTブローカーを作り、ArduinoでセンシングしたデータをPub/Sub通信してAmazon SNSでメール通知する手順を示す。

データの流れは以下の通り。

作業の流れは以下のようになる。

Amazon SNS

Topic作成
通知先(Email)設定

AWS IoT

ArduinoをThingとして登録
センシングデータを処理するルールを設定
ポリシーを作成
デバイス証明書の作成と有効化
ポリシーおよびThingをデバイス証明書にアタッチ

ここではAWS IoTの設定はGUI(ダッシュボード)を使う。CLIを使った場合の手順は以下に示す。

関連資料・記事

Arduino

センシング用の回路を作成
Arduinoでセンシングを行いAWS IoT上のMQTTブローカーにPublishするプログラムを用意

テスト

尚ここで使用するArduinoはUNOとするが、直接IP通信ができないため母艦としてLinux(Ubuntu 16.04)を使用し、Pub/Sub通信やセンシングを行うプログラムはRubyで作成する。

Amazon SNS

まずセンサーデータを通知する通知先を作成する。手順としては最初にTopicを作成してそれに実際のメールアドレスをひも付ける。

Topic作成

Amazon SNSのダッシュボードから[Topics] > [Create new topic]をクリックし、Topic nameに任意の名前を付けてTopicを作成する。(ここでは「mqtt_test」とする)

メールアドレスのひも付け

作成したTopicにチェックを付け[Actions] > [Subscribe to topic]をクリックする。

Protocolを「Email」としてEndpointに通知先のメールアドレスを指定する。

確認用のメールが届くので「Confirm subscription」をクリックしてこのメールアドレスを有効にする。

ダッシュボードの[Subscriptions]をクリックすると通知先が作成されているのが確認できる。

AWS IoT

通知先が作成できたらAWS IoTの設定に移る。

流れとしてはまずAWS IoT上にArduinoをThingとして登録し、次にセンシングデータを処理するルールを設定したうえでデバイス証明書とポリシーを作成してArduinoにひも付ける。

Thing作成

AWS IoTのダッシュボードから[Registry] > [Things]をクリックして[Create]をクリックする。

Thingに任意の名前を付けて[Create thing]をクリックする。(ここでは「Arduino」とする)

センシングデータを処理するルールを設定

[Rules]をクリックして[Create]をクリックする。

ルールに任意の名前を付け(ここでは「sendEmail」とする)、Message source欄のAttributeに取得対象として全てのデータを表す「*」を、Topic filterに購読するトピック(ここでは「topic/test」とする)をそれぞれ指定して[Add action]をクリックする。

アクションを選択する画面が表示されるので「Send a message as an SNS push notification」を選択し[Configure action]をクリックする。

「SNS target」で先ほど作成したTopic(ここでは「mqtt_test」)を選択し、「IAM role name」で[Create a new role]をクリックする。

IAMロール名を入力できるようになるので任意の名前を付け(ここでは「mqtt_test_role」とする)、[Create a new role]をクリックする。

「Configure action」画面に戻るので[Add action]をクリックする。

「Create a rule」画面で[Create rule]をクリックするとアクションが作成され、ルールの作成が完了する。

ポリシー作成

[Security] > [policies]をクリックし、[Create]をクリックする。

Nameに任意のポリシー名を入力し(ここでは「mqtt_policy」とする)、Thingからの操作を全て許可することとして[Action]に「iot:*」、[Resource ARN]に「*」を入力して[Effect]の[Allow]をチェックして[Create]をクリックする。これでポリシーが作成される。

デバイス証明書作成

[Security] > [Certificates]をクリックし、[Create]をクリックする。

一番上の[Create certificate]をクリックする。

証明書と鍵ペアが作成されるのでこのうち証明書(A certificate for this thing: xxxxx.cert.pem)と秘密鍵(A private key: xxxxx.private.key)をダウンロードして[Activate]をクリックする。これで証明書が有効になる。

ルート証明書も必要になるので入手しておく。この作業はAWS IoTのコンソールでできないのでコマンドで実行する。

% wget https://www.symantec.com/content/en/us/enterprise/verisign/roots/VeriSign-Class%203-Public-Primary-Certification-Authority-G5.pem -O rootCA.pem

ポリシーおよびThingをデバイス証明書にアタッチ

[Security] > [Certificates]をクリックし、先ほど作成した証明書の「・・・」をクリックして[Attach policy]を選択する。

作成済ポリシーをチェックして[Attach]をクリックする。

同様に先ほど作成した証明書の「・・・」をクリックして[Attach thing]を選択する。

作成済Thingをチェックして[Attach]をクリックする。

Arduino

AWS IoTの設定が終わったら残りはArduino側の設定となる。

Arduino IDEを動かす母艦はUbuntu 16.04とする。

最初にArduinoにセンサーを接続してセンシングを行う回路を作成する。ここでは温度センサーを使って室温を計測することとする。

またArduinoの母艦となるOS(ここではUbuntu 16.04)上にAWS IoTのMQTTブローカーに対してSubscribeを行うプログラムとセンサーからのデータを取得してPublishするプログラムをそれぞれ用意する。言語はここではRubyを使用する。

センシング用の回路を作成

温度センサーとして精度はあまり高くないものの安価に調達できるLM61BIZを使用する。

センサーのピンは3つで刻印面に向かって左から

+Vs(電源電圧)
Vout(出力電圧)
GND(グランド)

という配列になっているのでこれをArduinoの5V、A0、GNDにそれぞれ接続する。

結線イメージは以下のようになる。

関連資料・記事

Arduinoでセンシングを行いAWS IoT上のMQTTブローカーにPublishするプログラムを用意

まずRubyからArduinoを操作するためのarduino_firmataパッケージと、MQTTのPub/Sub通信を行うためのmqttパッケージをインストールする。

% sudo gem install arduino_firmata
% sudo gem install mqtt

次に温度センサーからの値を1秒おきに取得して値を温度に変換したうえで前回取得値と異なる場合はAWS IoT上のMQTTブローカーにPublishするプログラムを用意する。

% vi pub.rb
require 'rubygems'
require 'arduino_firmata'
require 'mqtt'

arduino = ArduinoFirmata.connect "/dev/ttyACM0"

client = MQTT::Client.connect(
           host: '<Thing ARN>',
           port: 8883,
           ssl: true,
           cert_file: '<証明書ファイル>',
           key_file: '<秘密鍵ファイル>',
           ca_file: 'rootCA.pem')

before_temp = 0

while true
  temp = arduino.analog_read 0
  temp = ((temp.to_f * 5 / 1024) - 0.6) * 100
  temp = temp.round
  if before_temp != temp
    puts temp
    before_temp = temp
    client.publish('topic/test', "temp = #{temp}")
  end
  sleep 1
end

arduino.close

関連資料・記事

テスト

上記で用意したプログラムを実行すると、温度が変わる度にAWS IoT上のMQTTブローカーに温度が送信(Publish)される。

% ruby pub.rb
22
22
22
23 <- 温度センサーに手を触れて温度を変化させる
23
23

AWS IoTはこのデータを受け取るとルール設定に従ってAmazon SNS経由でメール通知を行う。通知先には以下のようなメールが届く。

今回はデバイスから取得したデータをアウトプットするまでの一連の動きを見るためにシンプルな実装を行ったが、AWS IoTでは他にも目的に応じて様々な制御が可能である。

参考サイト