AWSIoTとMQTTで出先から操作できるリモートカメラを作る

AWSIoTとMQTT

AWSのサービスである「IoT Core」を使用すると、MQTTプロトコルを使用して遠隔からエッジデバイスを操作することができます。MQTTはIBMが開発した非同期の通信プロトコルであり、同期コミュニケーションを前提としたHTTPなどに比べ、センサーデータ収集などを目的としたIoTに適していることや、ヘッダー情報が軽量(2bytes)であることから、IoTに都合のよいプロトコルとして注目されています。詳細は以下のページを参照ください。
www.ibm.com

今回のお題

本来、センサデータの収集で活用するMQTTですが、今回はあえて同期メッセージとして、次のことに使用したいと思います。

  • 出先から、家のカメラに対してストリーミング開始を指示
  • 家のカメラからストリーミング映像を配信し、出先のブラウザで確認
  • 出先から、カメラ台のモーターを操作して、上下左右に画角を動かす

配置図

mqttCamera配置図
mqttCamera配置図

必要なハードウェア

  • RaspberryPiを使用します。今回はRaspberryPi3 ModelB+を使用していますが Zeroでも可能です。
  • カメラの種類はUSB接続できるものであれば特に問いません。今回は以下のカメラを使用しました。
  • カメラ台の操作には、以下のサーボモータを使用したカメラパンを使用しました。

環境構築(AWS IoTCore)

AWSのIoTCoreサービスにMQTTメッセージブローカーを作成し、通信のための証明書等を取得します。

  • AWSコンソールにログインし、サービスからIoTCoreを選択します。
  • AWS IoT Coreにブローカー設定します。最初にモノの登録を行います。
  • 以下の記事を参考に、モノの登録を行っていきます。
  • qiita.com
  • 登録に併せて、RootCA証明書、1-Click証明書と秘密鍵のダウンロードを行い、ポリシーのアタッチまで進めてください。

環境構築(Raspberry Pi

Raspberry Piは、実行環境となるPythonのセットアップとして以下3つのライブラリのセットアップを行います。

  • MQTT送受信を行うためのPahoライブラリ
  • GPIOを操作するためのpigpioライブラリ
  • 画像を撮影するためのopencvライブラリ

Paho セットアップ

以下のコマンドを実行して、Paho-mqttをインストールします。

$ sudo pip3 install paho-mqtt

pigpio セットアップ

pigpioのセットアップについては、以前書いた以下の記事を参考にしてください。

camelrush.hatenablog.com

opencv セットアップ

opencvのセットアップは少し手間がかかります。

  • 最初に関連するライブラリをインストールします。
$ sudo apt-get install libhdf5-dev libhdf5-serial-dev libhdf5-103
$ sudo apt-get install libqtgui4 libqtwebkit4 libqt4-test python3-pyqt5
$ sudo apt-get install libatlas-base-dev
$ sudo apt-get install libjasper-dev
$ sudo nano /home/pi/.bashrc
  • ↓ (この一文を最終行に追記)
export LD_PRELOAD=/usr/lib/arm-linux-gnueabihf/libatomic.so.1
  • 次の一文をターミナルで実行して、編集した .bashrc を適用します。
$ source /home/pi/.bashrc
  • 最後に、以下のコマンドでopencvをインストールします。
$ sudo pip3 install opencv-python

ソースダウンロードと編集

以下のGithubに掲載しているソースを任意の場所にダウンロードしてzipを解凍してください。 github.com
ダウンロードした内容に対して、以下の変更を行います。

  • 「/awscert」フォルダに前述でAWSからダウンロードしたRootCA証明書、1-Click証明書と秘密鍵を格納します。
  • 「/mqttCamera.py」をテキストエディタで開きます。
    • 上部「# Mqtt Define」にある、「MQTT_CERT」「MQTT_PRIKEY」を格納した証明書・秘密鍵の名前に変更します。
    • 「AWSIoT_ENDPOINT」に、AWSのIoTCoreエントリポイントを設定します。IoTCoreエントリポイントは、AWSコンソールで IoTCoreサービスの「設定」メニューから確認できます。
  • 「/awss3page/static/js/control_view.js」をテキストエディタで開きこちらにも、IoTエントリポイントを設定します。
var requestUrl = SigV4Utils.getSignedUrl('xxxxxxxxxxxxx-xxx.iot.ap-northeast-1.amazonaws.com', 'ap-northeast-1', credentials);

この状態で以下のコマンドを実行してください。

$ sudo python3 mqttCamera.py

画面に「mqtt connected.」と表示されれば、ソフトウェアの準備は完了です。

配線

以下の図を参考に、配線を行ってください。サーボモータはDCモータに比べて配線数が少ないので、比較的簡単だと思います。

環境構築(AWS S3)

AWSのS3に、操作用画面であるWebページ(HTML、JavaScriptCSS等)を配置します。

  • AWSでS3サービスを選択し、新規にバケットを作成します。
  • バケットのアクセス権設定で「パブリックアクセスをすべてブロック」をOFFに設定します。
  • バケット直下に、前述の解凍フォルダにある「/awss3page」の中身をすべてアップロードしてください。
  • S3のアクセスポイントから、「control_view.html」にアクセスしてWebページが表示されればOKです。

環境構築(AWS IAM)

最後にS3のページからMQTTを操作するためのユーザを作成します。

  • AWSでIAMサービスを選択し、ユーザから新規ユーザを作成します。
  • 「アクセス許可の付与」画面で「既存のポリシーを直接アタッチ」を選択します。
  • ポリシーの一覧から、「AWSIoTDataAccess」を選択して「次へ」をクリックします。
  • 「アクセスキー」と「シークレットキー」の値を取得して控えておきます。

以上で準備完了です。

S3にアップロードしたWeb画面上部「AKey」にIAMのアクセスキー、「SKey」にIAMのシークレットキー値を入力して、「Connect」ボタンををクリックし、画面上部の「ON/OFF」を「ON」にして、カメラ画像が表示されればOKです。画面左右にあるレバーを操作することで、RaspberryPiに接続したカメラ台のサーボモータが動き、画角を変更することができます。