ブログ

Armadillo-IoT G3L:データをMQTTで送信してAWSで可視化してみた

at_yukari.hara
2020年2月27日 8時35分

Armadillo-IoT G3Lを使って、データをAWSに送信してkibanaで可視化してみました。

Kibanaとは?

Kibana は、ログと時系列の分析、アプリケーションのモニタリング、オペレーショナルインテリジェンスのユースケースに使われる、
オープンソースのデータの視覚化および調査ツールです。
参考:AWS-Kibana

環境

・Armadillo-IoT G3L(ネットワーク接続有)
 -AWSのアカウントが必要です。
 -ArmadilloをAWSのIoTcoreへの登録が必要です。
  (今回は下記サイトを参考にAWSのIoTCoreにArmadilloを登録させていただきました。)
  参考:[メモ] Raspberry PiをAWS IoTに接続する (とりあえずGUIで)

手順

1.必要なパッケージをインストールします

・必要なパッケージをインストールします。

[armadillo ~]# apt-get update
[armadillo ~]# apt-get install python3
[armadillo ~]# apt-get install python3-pip
[armadillo ~]# pip3 install AWSIoTPythonSDK

2.MQTTTを送信するプログラムを作成します。

以下のコードをpublish.pyという名前で保存します。

import subprocess as sub
import random
import json
import time
from datetime import datetime

# Import SDK packages
from AWSIoTPythonSDK.MQTTLib import AWSIoTMQTTClient

def support_datetime_default(o):
    if isinstance(o, datetime):
        return o.isoformat()

def get_data():

    sensor = {}
    sensor['temp'] = random.randint(20,30) #今回はテスト用でデータをランダムに生成しています。

    message = {}
    message['timestamp'] = datetime.now()
    message['sensor'] = sensor
    messageJson = json.dumps(message, default=support_datetime_default)

    return messageJson

def main():
    #while True:
        # For certificate based connection
        myMQTTClient = AWSIoTMQTTClient("myClientID")
        myMQTTClient.configureEndpoint("AWSIoTエンドポイント", 8883)
        myMQTTClient.configureCredentials("[AmazonRootCA1.pemのPATH]", "[pprivate.pem.keyのPATH]", "[certificate.pem.crtのPATH]")
        myMQTTClient.configureOfflinePublishQueueing(-1)  # Infinite offline Pubblish queueing
        myMQTTClient.configureDrainingFrequency(2)  # Draining: 2 Hz
        myMQTTClient.configureConnectDisconnectTimeout(10)  # 10 sec
        myMQTTClient.configureMQTTOperationTimeout(5)  # 5 sec

        myMQTTClient.connect()
        while True:
            messageJson = get_data()
            myMQTTClient.publish("myTopic", messageJson, 1)
            time.sleep(1)
        myMQTTClient.disconnect()


if __name__ == '__main__':
    main()

AWS側の設定

1.Elasticsearch Serviceのドメインの作成

下記サイトを参考にElasticsearch Serviceのドメインの作成をしてkibanaにアクセスするところまで行います。
参考:Kibanaの使い方 〜環境準備〜【Amazon Elasticsearch Service】

※ドメインが作成されるまで約10分かかります

2.IoTCoreのルールの作成

IoTCore→ACT→ルール→作成
 -名前:任意
 -ルールクエリステートメント:SELECT * FROM 'myTopic'
 -アクション:Amazon Elasticsearch Service にメッセージを送信する
    [ドメイン]先ほど作成したドメインを選択
    [ID]${newuuid()}
    [索引]timestamp
    [タイプ]timestamp
    [ロール]新しいロールの作成

確認

1.Armadilloでpublish.pyを実行する

# python3 publish.py

2.kibanaで確認する

kibana→index pattern→Create index pattern
 [Index pattern]timestamp*
 →Next step  [Custom index pattern ID]timestamp  Create index pattern

3.visualizationの作成

Visualize→New Visualization→Area
 [Index pattern]timestamp*
 [Y-Axis]Aggregation:Average
     Field:sensor.temp

 [X-Axis]Aggregation:Date Histogram
    Field:timestamp

4.更新をすると、グラフに反映されているのがわかります