Raspbisn と AWS IoT Core を連携してみる

AWS IoT

AWS IoT Core ではデバイスをクラウドや他のデバイスに簡単に接続できます。AWS IoT Core では、断続的な接続を許容し、デバイスのコードフットプリントを削減し、必要なネットワーク帯域幅を削減するよう特別に設計された HTTP、WebSocket、MQTT といった軽量の通信プロトコルをサポートしています。また、AWS IoT Core では他の業界標準およびカスタムプロトコルをサポートしており、別のプロトコルを使用しているデバイス間でも相互に通信できます。

料金

AWS IoT Core 料金

接続料金: 0.096USD (接続 100 万分あたり)
メッセージ 10 億件まで: 1.20USD (メッセージ 100 万件あたり)
トリガーされたルール: 0.18USD (トリガーされたルール 100 万件あたり/実行されたアクション 100 万件あたり)
実行されたアクション: 0.18USD (トリガーされたルール 100 万件あたり/実行されたアクション 100 万件あたり)

AWS IoT Core と接続して、メッセージを送り、Lambda 等実行すればそれぞれに料金が発生するイメージか
各項目とも100万件あたり~とあるように小規模で運用する場合はほぼ数ドルで済む

IoT Core の開始

AWS IoT の使用開始

モノの登録


単一のモノを作成します


モノと AWS IoT Core を接続させる認証鍵を作成します

作成した有効化し証明書はダウンロードしておく
ルートCA「RSA 2048 ビットキー: Amazon ルート CA 1」のみ下記からダウンロード
サーバー認証 - サーバー認証用の CA 証明書

モノにポリシー、IAMのようなアクセス権限を設定する

作成してないので無く、ここから作成出来ないのでサイドメニューの「安全性」から作成する


テストなのでかなり自由な権限を与える

作成したポリシーはモノに設定した証明書と紐付ける


これで AWS IoT Core 側の初期設定は完了

デバイスの設定

Raspberry Pi で AWS IoT SDKを使用する

SDKのインストール

AWS IoT SDK - AWS IoT Device SDK for Python
SDKは C か c++ か Java か Javascript か Python がある JS版を入れてみる

$ sudo apt-get install -y nodejs npm
$ git clone https://github.com/aws/aws-iot-device-sdk-python.git  
$ cd aws-iot-device-sdk-js/
$ npm install

サンプルアプリケーションの実行

IoT Core と通信するための 必要情報を確認する

  • AWS リージョン
    ap-northeast-1

  • クライアントID
    IoT モノの名前と同じ

  • ユーザーのプライベートキー
    /home/pi/aws-iot-device-sdk-js/certs/private.pem.key

  • 証明書
    /home/pi/aws-iot-device-sdk-js/certs/certificate.pem.crt

  • ルートCA
    /home/pi/aws-iot-device-sdk-js/certs/Amazon-root-CA-1.pem

  • AWS IoT エンドポイント

  • AWS IoT メッセージブローカーがリッスンするポート
    8883

  • IoT モノの名前
    AWS IoT に登録したときに使用した名前

AWS SDK に用意されているサンプルを実行してみる

$ cd aws-iot-device-sdk-js/examples
$ node device-example -k "../certs/private.pem.key" -c "../certs/certificate.pem.crt" -i "vIoT-study" -a "../certs/Amazon-root-CA-1.pem" -H "************.iot.ap-northeast-1.amazonaws.com" -p 8883 -T "vIoT-study" --test-mode 1

connect

デバイスは1台しか無いので相互メッセージの通信は確認できないが、
コンソール上で確認してみると接続が出来ていることを確認できる

エッジコンピュータのゲートウェイ側はこんな感じでつながってるのね

AWS IoT Core にメッセージを送る

AWS IoT Core 側で MQTT トピックを作成

適当なプッシュを作り

// AWS IoT SDK
const awsIot = require('../aws-iot-device-sdk-js')

// AWS IoT Core 認証情報
const device = awsIot.device({
        region: 'ap-northeast-1',
        clientId: 'vIoT-study',
        keyPath: 'certs/private.pem.key',
        certPath: 'certs/certificate.pem.crt',
        caPath: 'certs/Amazon-root-CA-1.pem',
        host: '**************.iot.ap-northeast-1.amazonaws.com',
});

// 接続
device.on('connect', function() {
        console.log('connect');
        setInterval( function() {
                device.publish('study_topic1', JSON.stringify({ value: 'hogehoge' }));
        }, 5000);
});

実行すると

$ node push.js

トピック側にメッセージが来ていることを確認できる

ルールの作成

AWS IoT - AWS Lambda ルールを作成する
メッセージを送った際に AWS IoT Core で Lambda をキックさせる
Lambda関数を作成し

ルールを作成する


ルールのクエリーステートメントはどの Topic に対してこのルールを適用するかを定義している
IoT 機器毎に処理を分けたい場合は Topic 名で分ける
Topic 名で分けるだけなら SQL である必要が無い気がするので、細かい条件処理をすることもできるってことなのかな?


ルールによってアクションできるサービスは現在下記

  • DynamoDB テーブルにメッセージを挿入する
  • DynamoDBv2 データベーステーブルの複数列にメッセージを分割する
  • Lambda関数を呼び出す
  • SNS通知
  • SQSキューにメッセージを送る
  • Kinesis ストリームにメッセージを送信
  • IoT トピックにメッセージを再パブリッシュ
  • S3 バケットにメッセージを格納
  • Kinesis Firehose ストリームメッセージを送信
  • CloudWatchにメッセージを送信
  • CloudWatchアラームの状態を変更
  • Elasticsearch にメッセージを送信
  • Salseforce IoT 入力ストリームにメッセージを送信
  • IoT Analytics にメッセージ送信
  • IoT Events 入力いメッセージ送信
  • Step Function ステートマシンの実行を開始する


テストなのでエラー処理は入れていない
以上でルールを作成完了

AWS IoT + Lambda 連携確認

連携だけであれば AWS IoT の画面だけでテストできる

lambda コード
受け取ったメッセージを Googlehungout Chat に送る

// modules
const request = require('request');

// function
exports.handler = function(event, context) {
    let message = event.message;
    let options = {
        url: process.env['hungoutChat'],
        method: 'POST',
        headers: 'Content-Type : application/json',
        json: {
           "text": message
        }
    };
    console.log(message);
    
    request(options, function(error, response, body){
        console.log(body);
    });
};

アクションにて設定した Topic に対して メッセージをサブスクライブ

無事 Lamdba も動いて 送信したメッセージ内容が Google Hungout Chat に通知された

IoTの基本・仕組み・重要事項が全部わかる教科書
Share Comments
comments powered by Disqus