ブログ

Armadillo-640:USBカメラで撮影した画像をMQTT通信でAWS(S3)に保存してみた

at_yukari.hara
2021年4月7日 15時43分

※注意事項※
このブログは2021年3月30日時点のものです。
AWSの環境を構築する手順の一例としてご紹介していますので、設定や手順等を推奨するものではありません。
また、仕様等が変更されていたとしても、弊社ではお問い合わせには対応できかねますので、ご了承願います。
詳しい手順や説明等は、公式のドキュメントをご参照願います。

以下の動画のように、Armadillo-640を使って、USBカメラで撮影した画像をAWSにMQTTで送信し、S3に保存してみました。
今回、設定方法などRaspberry Pi内の画像をbase64でエンコードして→AWS IoT→S3に保存を参考にさせていただきました。
※動画ではArmadillo-IoT A6を使用していますが、Armadillo-640もArmadillo-IoT A6も同様の手順で構築可能です。

使用したもの

手順

1. 事前準備

Armadillo-640:USBカメラで撮影した画像を定期的にダッシュボードに表示してみた(Node-RED)の「2.必要なパッケージのインストール」までを実行し、USBカメラを動作する環境を構築してください。

2.必要なパッケージ、ライブラリをインストールします

下記コマンドを実行して、必要なパッケージ、ライブラリをインストールします。

[armadillo ~]# apt-get update && upgrade
[armadillo ~]# apt-get install python3
[armadillo ~]# apt-get install python3-pip
[armadillo ~]# pip3 install AWSIoTPythonSDK
[armadillo ~]# git clone https://github.com/aws/aws-iot-device-sdk-python.git

3.USBカメラで撮影し、MQTTで画像データを送信するプログラムを作成します。

先程ダウンロードしたサンプルコードを修正して作成します。 まず、カレントディレクトリに「basicPubSub.py」をコピーしてください。

[armadillo ~]# cp aws-iot-device-sdk-python/samples/basicPubSub/basicPubSub.py ~/

わかりやすいように、証明書を格納するディレクトリもカレントディレクトリに配置しておきましょう。

[armadillo ~]# ls
basicPubSub.py certs

「basicPubSub.py」をテキストエディタで開き、下記を追記/修正します。

import logging
import time
import argparse
import json
import subprocess ★ここを追加
=省略=

# 以下、コメントアウト
# while True:
#    if args.mode == 'both' or args.mode == 'publish':
#        message = {}
#        message['message'] = args.message
#        message['sequence'] = loopCount
#        messageJson = json.dumps(message)
#        myAWSIoTMQTTClient.publish(topic, messageJson, 1)
#        if args.mode == 'publish':
#            print('Published topic %s: %s\n' % (topic, messageJson))
#        loopCount += 1
#    time.sleep(1)

# 以下、追加
        cmd = "fswebcam -i 0 -d v4l2:/dev/video0 -r 640x480 --jpeg 85 test.jpg"
        subprocess.call(cmd, shell=True)
        binary = open('test.jpg', 'rb').read()
        myAWSIoTMQTTClient.publish(topic, bytearray(binary), 1)

AWS側の設定

1.ルールの作成

AWS IoTから「ACT」→「ルール」へ移動し、ルールを作成します。 IoTCore→ACT→ルール→作成
 -名前:任意
 -ルールクエリステートメント:SELECT * FROM 'sdk/test/Python'
 -アクション:Amazon S3 バケットにメッセージを格納する
    [S3バケット]バケットの作成、または任意のバケット
    [キー]${topic()}/${timestamp()}.jpg
    [ロール]新しいロールの作成

確認

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

引数にエンドポイントや証明書の格納先を指定して実行します。

# python3 basicPubSub_base64.py \
> --endpoint XXXXXXXXXXXXXX.iot.XXXXXXXX.amazonaws.com \ ★エンドポイント指定
> --rootCA ~/certs/*.pem  \ ★格納先指定
> --cert ~/certs/*-certificate.pem.crt  \ ★格納先指定
> --key ~/certs/*-private.pem.key ★格納先指定

2.S3で確認

S3バケットに移動して、「sdk/test/Python」に移動すると、以下のようにArmadilloで撮影した画像データが格納されていることが確認出来ました。