1. AWS IoTのグループ作成

AWSコンソールにログインし、AWSアカウントでIoTサービスを見つけ、Greengrass > Groupsに進み、任意の名前でグループを作成します。

簡単な構成でセットアップすることをお勧めします。

セキュリティリソースとGreengrass Coreソフトウェアのダウンロードを求められるまで、グループとコアの作成指示に従います。

download these resources as a tar.gz” をクリックしてください。tar.gzは hash-setup.tar.gz(例えば、4fee61fbfd-setup.tar.gz)となります。

それから以下のリンクをクリックして、Arch Linux が配布している Armv8 (AArch64) 用の Greengrass Core ソフトウェアの最新版をダウンロードして ください: https://docs.aws.amazon.com/greengrass/latest/developerguide/what-is-gg.html#gg-core-download-tab

Note: このガイドでは、Milesight UG6x ゲートウェイをテストするため、Greengrass コアソフトウェアのバージョン 1.11.0 をダウンロードします。

2. UG6x の設定

 

このセクションでは以下のリソースが必要です:

  • greengrass-linux-aarch64-[Greengrassコアソフトウェアのバージョン].tar.gz
  • ハッシュ-setup.tar.gz
  • LoRaWANゲートウェイへのSSHクライアント(Putty / XShell)アクセス

上記の3番目の要件を満たすには、ゲートウェイのウェブGUIにアクセスし、System > General Settings > General > Access Serviceと進み、 SSHポートを有効にしてください。その後、PuTTYやXshellのようなターミナルツールを開き、SSHでMilesightゲートウェイにアクセスしてください。ゲートウェイのrootパスワードを取得するには、チケットを送信してMilesightテクニカルサポートにお問い合わせください。

注: このセクションでは、四角で囲んだコマンドは全てゲートウェイのroot権限とLinuxシステム用のものです。

2.1. .tar.gz を UG6x にコピー

greengrass-linux-aarch64-[Greengrassコアソフトウェア版].tar.gzとhash-setup.tar.gzを/mnt/mmcblk0p1にコピーします:

(1)Linuxの場合は、以下のコマンドを実行してください:

cd [path-to-downloaded-files]
pscp -pw [password to root] greengrass-linux-aarch64-[Greengrass core software version].tar.gz
root@IP- address:/mnt/mmcblk0p1
pscp -pw [password to root] [hash-setup.tar.gz]

(2)そうでない場合は、以下のコマンドを実行してください。

2.2. リソースファイルの解凍

UG67/65 の管理ツールにログイン後、以下のコマンドを実行します。

cd /mnt/mmcblk0p1
tar xzvf greengrass-linux-aarch64-[Greengrass core software version].tar.gz -C /mnt/mmcblk0p1
tar xzvf [hash-setup.tar.gz] -C /mnt/mmcblk0p1/greengrass

2.3. CAルートファイルのダウンロード

このコマンドを使って、Greengrassを検証するためにAmazonからCAルートファイルをダウンロードします。UG67/65がインターネットにアクセスできることを確認してください。

cd /mnt/mmcblk0p1/greengrass/certs/
curl -o root.ca.pem https://www.amazontrust.com/repository/AmazonRootCA1.pem

2.4. 設定ファイルの変更

設定ファイル(hash-setup.tar.gz)はMilesight Gateway用に正確に書かれていないので、修正する必要があります。設定ファイルを入力してください:

cd /mnt/mmcblk0p1/greengrass/config

file:///greengrass/ を全てfile:///mnt/mmcblk0p1/greengrass/に置き換えて、vim “で証明書ディレクトリを変更します。

vim config.json
:%s#/greengrass/#/mnt/mmcblk0p1/greengrass/#g
:wq

2.5. Greengrass Core の起動

/mnt/mmcblk0p1/greengrass/ggc/core/greengrassd start

コアが既に起動しているか、以下のスクリプトが出力されているか確認してください:

Set up greengrass daemon
Validate hardlink/softlink protection
Wait for up to 1m10s for Daemon to start
Greengrass is successfully started with PID: [PID]

そうでない場合は、config.json が正しく変更されているか確認してください。

3. Greengrassで 「Hello World」

このパートでは、Lambda関数を設定し、AWS IoT Greengrassコアデバイスにデプロイする方法を示します。MQTT メッセージング、サブスクリプション、AWS IoT Greengrass でのデプロイ、Lambda 関数の構成に関する情報と、特に AWS IoT Greengrass クラウドに Hello World メッセージを送信する Lambda 関数を AWS IoT Greengrass コアにデプロイする方法が含まれています。このセクションを終えるのに30分ほどかかるかもしれません。

3.1. Lambda 関数の作成とパッケージ化

AWS IoT Greengrassコア上でPythonでLambda関数を実行するには、AWS IoT Greengrass Core SDK for Pythonが必要です。Python のサンプルコードと共に GitHub からダウンロードできます。

リンク: https://github.com/aws/aws-greengrass-core-sdk-python/

ファイルを解凍し、greengrassHelloWorld.pyを探します。

greengrassHelloWorld.pyとgreengrasssdkフォルダを含むhello_world_python_lambda.zipというラムダ関数デプロイパッケージを作成します。これで Lambda 関数を作成し、デプロイパッケージをアップロードする準備ができました。

Lambda Consoleを開き、https://console.aws.amazon.com/lambda、Author from Scratchを選択して関数を作成し、ランタイムをPython 3.7に設定し、Permissionsはデフォルトのままにしておきます。これで、基本的なLambda権限を付与する実行ロールが作成されます。ロールはIAMコンソールで管理できます。

リンク: https://console.aws.amazon.com/iam/home?%22%20%5Cl%20%22%2Froles=#/roles.

注意

異なるゲートウェイ・グリーングラスのファームウェアは、異なるPythonバージョンと互換性があります。

UG8x: ファームウェアバージョン 80.0.3000.43.1 (Python 2.7), 80.0.3000.59.1 (Python 3.7)

UG6x: ファームウェアバージョン60.0.3000.33以上(Python 3.7)

コンフィギュレーションタブのファンクションコードで、コードファイルをアップロードします。(hello_world_python_lambda.zipファイルのサイズは、ここでの例とは異なるかもしれません。10MBを超える場合は、Amazon S3を使ってアップロードすることを検討してください)。

アップロード後、ファイル 「UG_Test_Function 」の下にファイル 「hello_world_python_lambda」があります。

ファイル「hello_world_python_lambda」のすべてのサブファイルをルートファイル 「UG_Test_Function 」に移動し、空のファイル 「hello_world_python_lambda 」を削除します

そして、デフォルトのハンドラ名を変更します。

注意

AWSはHandlerの命名にfilename.handlerメソッドを使用します。例えば、「main.handler 」はmain.pyで定義されたハンドラメソッドを呼び出し、greengrassHelloWorld.pyで定義されたハンドラメソッドはgreengrassHelloWorld.function_handlerです。

Save をクリックすると、関数のバージョンを公開する準備が整います。

システムは自動的にバージョンIDを作成しますが、ユーザはいつでもその記述を変更することができます。

次にエイリアスを作成します。

注意:Greengrass グループでは、エイリアス(推奨)またはバージョンによってラムダ関数を参照することができます。エイリアスを使うと、関数コードが更新されたときにサブスクリプションテーブルやグループ定義を変更する必要がないので、コードの更新管理が簡単になります。代わりに、エイリアスを新しい関数に参照するだけです。

エイリアスには、その関数がすぐにわかるように名前を付け、公開したバージョンに対応するバージョンを1に設定し、Createを選択します。このガイドでは、バージョンを 「HalloWelt 」と呼びます。

3.2. AWS IoT Greengrass 用 Lambda Function の設定

このステップでは、Lambda関数がAWS IoTと通信するためのサブスクリプションを設定し、Greengrassグループのローカルロギングを設定する必要があります。そこで、AWS IoTにアクセスし、ステップ1で作成したグループ設定ページに入ります。左のLambdaを探し、Add Lambdaを選択します。

Use existing Lambda」を選択し、3.1で設定した関数名、エイリアスを探します。

前のステップで設定したように、alias: HalloWeltはバージョン1に接続されているので、ここではどちらかを選択します。finish “をクリックして、関数をグループに追加します。

省略記号(…)をクリックして選択し、「Edit Configuration 」を選択します。

Group-specific Lambda configuration 「ページで、」Timeout 「を25秒に設定し、このLambda関数を各呼び出しの前に20秒間スリープさせ、」Lambda lifecycle “を設定し、この関数を長寿命にして無期限に実行し続けます。その他のフィールドはデフォルト値のままにして、「Update 」をクリックします。

次に、グループ構成に戻り、LambdaがAWS IoTにMQTTメッセージを送信するためのサブスクリプションを作成します。左側のパネルで 「Subscriptions」を見つけ、「Add your first Subscription」を選択します。

サブスクリプションは、メッセージがソースからターゲットへ特定の方向に流れるという意味で、指示されます。双方向通信を可能にするには、2つのサブスクリプションを設定する必要があります。greengrassHelloWorld.pyでは1つのサブスクリプションで十分です。なぜならhello world Lambda関数はAWS IoTのhello/worldトピックにのみメッセージを送信するからです。トピックは以下のように定義されています:

def greengrass_hello_world_run():
if not my_platform:
client.publish(topic='hello/world', payload='Hello world! Sent from Greengrass Core.')
else:
client.publish(topic='hello/world', payload='Hello world! Sent from Greengrass Core running on platform:{}'.format(my_platform))
Timer(5, greengrass_hello_world_run).start()

メッセージはソースからターゲットに流れるので、パブリッシュするのはコンテンツとしてのLambda関数です。ここではLambda関数をソースとして設定します。

AWS IoTのTest機能にはMQTTクライアントが組み込まれているので、フロー先として利用します。

Next をクリックして、トピックとして 『hello/world』 を入力し、」Finish” をクリックすれば、サブスクリプションの設定は完了です。

最後に、ストリームマネージャーを無効にします。下にスクロールしてストリームマネージャーを見つけ、「Edit」 を選択し、「Disable と Save」 をクリックします。

ゲートウェイ上でどのように動作しているかを確認したい場合は、AWS IoT GreengrassのシステムコンポーネントとLambda関数がコアデバイスのファイルシステムにログを書き込むように、グループのロギング設定を行います。同じ設定構成ページで、スクロールダウンして Local logs configuration を見つけ、Edit を選択します。

Configure Group loggingページで、「Add another log type」を選択します。

イベントソースは、User LambdasとGreengrass systemを選択し、「Update」を選択してください。

ロギングレベルとディスク容量制限のデフォルト値を維持し、「Save」を選択します。

3.3. AWS IoT Greengrass コアデバイスへのクラウド設定のデプロイ

AWS IoT クラウドと Milesight LoRaWAN ゲートウェイ間の通信を設定するには、ゲートウェイがインターネットにアクセスできることを確認する必要があります。Web GUI上で 「www.milesight-iot.com 」にpingを打って確認してください(Maintenance > Tools > Ping )。

次に、ゲートウェイは AWS IoT Greengrass デーモンを実行する必要があります。これを確認するには

ps w | grep -E 'greengrass.*daemon'

出力に /mnt/mmcblk0p1/greengrass/ggc/packages/[Greengrass Core Software version]/bin/daemon のルートエントリがあれば、デーモンは動作しています。以下のような出力は、まだデーモンが起動していないことを意味します。

このガイドでは、Greengrassコアソフトウェアのバージョン1.11.0を使用します。デーモンを起動するには

cd /mnt/mmcblk0p1/greengrass/ggc/core/
./greengrassd start

これで、AWS IoT GreengrassコアデバイスにLambda関数とサブスクリプション構成をデプロイする準備ができました。

次に、AWS IoT Consoleに戻り、グループ構成ページに入り、Actionsを見つけ、Deployを選択します。

自動検出を選択します。これにより、IP アドレス、DNS、ポート番号など、コアの接続情報をデバイスが自動的に取得できるようになります。これは推奨ですが、AWS IoT Greengrass は手動で指定したエンドポイントもサポートします。グループが最初にデプロイされるときのみ、検出方法のプロンプトが表示されます。

最初のデプロイには数分かかるかもしれません。デプロイが完了すると、ページに 「Successfully completed in the Status」 というメッセージが表示されるはずです:

3.4. デバイス上で Lambda 関数が実行されているか確認

AWS IoT のホームに戻ります。

青字の 「Subscribe to a topic」を選択し、「Subscription topic」をhello/world(まだ 「Subscribe to topic」ボタンはクリックしないでください。)、「Quality of Service」、「MQTT payload display 」を以下のように設定します。

UG65/67 で動作している Greengrass core が AWS IoT に hello world と言うのを待ちます。

4. Milesight LoRaWAN ゲートウェイに MQTT を組み込んだ Lambda 関数の開発

4.1. Pythonコードの置き換え

Lambda関数をLoRa Remote I/O(UC11xx)にサブスクライブし、LoRaWAN Gateway(UG6x)にパブリッシュするためのPythonプログラムです。

import json
import time

import paho.mqtt.client as mqtt

HOST="localhost"
PORT=1883
client_id="[UG6x SN]"
def on_connect(client, userdata, flags, rc):
print("Connected with result code "+str(rc))
client.subscribe("application/+/device/+/join")
client.subscribe("application/+/device/+/rx")
client.subscribe("application/+/device/+/ack")
client.subscribe("application/+/device/+/error")

def on_message(client, userdata, msg):
print("Receive topic:"+msg.topic+" message: "+str(msg.payload.decode('utf-8')))

def on_subscribe(client, userdata, mid, granted_qos):
print("On Subscribed: qos = %d" % granted_qos)

def on_disconnect(client, userdata, rc):
if rc != 0: print("Unexpected disconnection %s" % rc)

client = mqtt.Client(client_id)
client.username_pw_set("[MQTT server username]", "[MQTT server password]")
client.on_connect = on_connect
client.on_message = on_message
client.on_subscribe = on_subscribe
client.on_disconnect = on_disconnect
client.connect(HOST, PORT, 60)

# update timestamp to device (2019-10-31 16:56:18)

data = {
"confirmed":True,
"data":"/xGyobpd"
}

param = json.dumps(data)
client.publish("application/[application ID]/device/[UC11xx SN]/tx", payload=param, qos=0)
client.loop_forever()

def function_handler(event, context):
return

[UG6x SN] をゲートウェイのシリアル番号に、[UC11xx SN] を UC11xx のシリアル番号に置き換えて mqtt.py として保存するか、greengrassHelloWorld.py の内容を置き換えてください。

mqtt.pyとgreengrasssdkを含む.zipファイルを作成します。

Lambda Consoleで、ステップ3.1で作成したLambda関数を入力し、Upload a .zip fileを選択してmqtt_test_python_lambda.zipをアップロードし、ハンドラの命名規則に従ってハンドラの名前を付けます。

新しいバージョンを公開し、別のエイリアスを作成します。

これでラムダ関数バージョン2の準備ができました。

4.2. AWS IoTの設定

AWS IoTのグループからSubscriptionsを探し、「Delete subscription 」を選択します。次にLambdasに移動し、Group-specific Lambda configurationで 「HalloWelt 」を削除して確認し、「Add another version 」を見つけます。エイリアスを選択します: MQTTまたはバージョン2を選択し、「Save 」をクリックします。

タイムアウトを25秒に設定し、Lambdaのライフサイクルを設定して、この関数を長寿命化し、バージョン1として無期限に実行し続けます。その他のフィールドはデフォルト値のままにして、「Update 」をクリックします。

LambdasがMQTTバージョンを使用しているか確認します。使用している場合は、Deployを選択し、成功するのを待ちます。

4.3. Milesight LoRaWAN Gateway (UG6x)のLambda関数のログを有効にします。

ターミナルツールを開き、以下のコマンドを入力し、関数の実行状況を確認します:

tail -f /mnt/mmcblk0p1/greengrass/ggc/var/log/user/[region]/[user_account_ID]/[UG_Function].log

注: [region] / [user_account_ID] / [UG_Function] は、あなたのケースでは異なるはずです。

予期しないインデントに関する致命的なエラーが表示された場合は、Lambdaコンソールに移動し、デバッグのためにスペース/タブに変換してみてください。

正常に動作していれば、以下のように表示されるはずです:

[2019-11-11T17:53:51.897+08:00][INFO]-mqtt.py:11,Connected with result code 0
[2019-11-11T17:53:51.908+08:00][INFO]-mqtt.py:21,On Subscribed: qos = 0
[2019-11-11T17:53:51.915+08:00][INFO]-mqtt.py:21,On Subscribed: qos = 0
[2019-11-11T17:53:51.923+08:00][INFO]-mqtt.py:21,On Subscribed: qos = 0
[2019-11-11T17:53:51.93+08:00][INFO]-mqtt.py:21,On Subscribed: qos = 0

UG6xのネットワークサーバにUC11xxが追加され、ネットワークに参加した状態で、mqtt.pyからUC11xxとUG6xの両方のデータが出力されたログを見ることができます。

5. UG6x PySDKを使った開発

前の例では、Lambda関数の設定をデフォルトのコンテナモードのままにしていました。しかし、この場合、Milesight python_sdkはシステムリソースに依存しているので、設定を変更する必要があります。

Containerization を見つけて、No container (always)を選択します。

Environment variablesまでスクロールダウンし、以下のように設定し、Update“を選択します。

各MQTTパケットにセルラーステータスを含める場合は、関数コードに以下の文を追加してください。

import URRouterInfo

status=URRouterInfo.get_cellular_status()
print status

変更したプログラムを実行するには、別のバージョンと別のエイリアス(必要に応じて)を公開し、新しいバージョンを Lambda 関数として選択し、グループを再度デプロイして実行する必要があります。

お読みいただきありがとうございました。AWSIoT Greengrass Developer GuideAWS Lambda Developer Guide を参照してください。