ブログ

Armadillo-IoTシリーズ:接続した機器やスイッチへの遠隔制御

at_takuma.fukuda
2022年9月29日 17時17分

IoTゲートウェイを様々なセンサや機器と接続して使用する際、 データを収集してサーバへアップロードするだけでなく、接続された機器への遠隔制御を行う場合、
Armadilloシリーズ製品ではどのようにその機能を実装すれば良いかをご紹介します。

基本的な考え方

機器を制御するための処理を実装しておき、この処理を実行するためのトリガを遠隔から与えるという考え方です。
トリガの種別ごとにいくつかの方法をご紹介します。

サーバに常時接続していない場合

Armadilloがサーバに常時接続していない場合、サーバで何らかの操作を行ってもArmadilloにはすぐには反映されません。
そこで、別途Armadilloにアクセスする手段を考える必要があります。

SMS制御

IoTゲートウェイがインターネットを使ってサーバに常時接続していない場合、遠隔からIoTゲートウェイにトリガを与える方法はSMSのみとなります。 Armadilloシリーズ製品に搭載されているLTEモジュールではSMSを受信することが出来ます。
受信したSMSの内容や、SMSを受信したことそのものをトリガにして、特定の処理を実行するよう実装することが出来ます。
例えばArmadillo-IoT A6では、aiot-sleep-smsコマンドを実行することで、スリープ(SMS 起床可能)モードに遷移することができます。
スリープ(SMS 起床可能)モードからSMS受信によって起床した場合に特定のシェルスクリプトを実行するよう設定することが可能なので、
この機能を使って、SMSを受信した際に特定の処理を実行させるようにすることが出来ます。
具体的な方法は以下のマニュアルを参考にしてください。 Armadillo-IoT A6製品マニュアル 7.1.4. スリープ(SMS 起床可能)モード

Armadilloをサーバとしてクライアントから操作を行う

Armadillo自身をサーバとして、他のクライアントからアクセス、操作を行うという方法があります。
IoTゲートウェイにグローバルIPを持たせられる場合 具体的な方法を説明したものとしては下記のブログ記事がありますので、ご参考下さい。
Armadillo-640/IoT(A6):Webブラウザの画面から制御(lighttpd+php-cgiを使用)
この例では、クライアントが手動で操作を行っていますが、
サーバに対してGET/POSTメソッドでコマンドを送信し、サーバ側が受け取ったコマンドに応じて動作を取る、というような処理を実装して自動化させることが出来ます。

サーバに常時接続時している場合

サーバからの指令をArmadilloが受け取る

サーバからの指令をArmadilloが受け取るようにするにあたって最も実装しやすい方法は、
Armadilloがサーバ上の特定の値をウォッチし続けさせるというものになります。この値の変化を処理を実行させるトリガとします。
IoT向けのクラウドサービスでは、このような処理を想定した機能があらかじめ用意されていることもあります。
例えば、AWS IoT Coreには、AWS IoT Device Shadow サービスがあります。
AWS IoT Device Shadow サービスは AWS IoT Thing オブジェクトにシャドウを追加します。シャドウは、アプリやその他のサービスでデバイスの状態を利用できるようにします。
] IoTデバイスの状態を管理するためのサービスですが、サーバで設定した値をデバイスに反映させることも出来ます。
AWS IoT Device Shadow サービスを使って、ArmadilloのLEDランプ点灯・消灯させるアプリケーションを実装したので、ご紹介します。
作成にあたっては、この記事を参考にしました。
DeveloppersIO:Raspberry PiとAWS IoTでLチカしてみた

環境

使用した製品:Armadillo-IoT A6 OS環境:記事執筆時点での最新のインストールディスク(install-disk-buster-aiota6-20220926.img)を使って初期化した状態 インターネットへの接続方法:LTE-M(Soracom Plan DのSIMを使用)

AWS IoT Coreの設定

まず、AWS IoT Coreでモノの登録を行って、証明書や鍵情報を作成する必要があります。
基本的な手順は上記サイトを参考にしてください。
AWSの画面構成や操作手順などは適宜変更される可能性がありますので、ご注意ください。

Node.jsのインストール

ArmadilloにNode.jsをインストールして使用可能な状態にします。
依存パッケージのインストール等も行う必要がありますので、以下のようなスクリプトを作成し、一括で実行させます。

[armadillo]$ cat setting.sh
#/bin/bash
apt-get update --allow-releaseinfo-change
apt-get -y upgrade
apt-get install -y curl unzip
update-ca-certificates --fresh
curl -fsSL https://deb.nodesource.com/setup_lts.x | bash -
apt-get install -y gcc g++ make
curl -sL https://dl.yarnpkg.com/debian/pubkey.gpg | gpg --dearmor | tee /usr/share/keyrings/yarnkey.gpg >/dev/null
echo "deb [signed-by=/usr/share/keyrings/yarnkey.gpg] https://dl.yarnpkg.com/debian stable main" | tee /etc/apt/sources.list.d/yarn.list
apt-get install -y nodejs
npm install aws-iot-device-sdk --save

処理を実行するためのJavaScriptファイルを実装します。
大筋は上記サイトのサンプルコードそのままですが、LEDの点灯・消灯処理をArmadillo-IoT A6向けに作り込んでいます。

[armadillo]$ cat main.js
const awsIot = require("aws-iot-device-sdk");
const exec = require('child_process').exec;
 
const device = awsIot.device({
  keyPath: "XXXXXXXX-private.pem.key", // 秘密鍵
  certPath: "XXXXXXXX-certificate.pem.crt", // 証明書
  caPath: "AmazonRootCA1.pem", // CA証明書
  clientId: "Armadillo-IoTA6", // ClientID
  host: "XXXXXXXX-ats.iot.ap-northeast-1.amazonaws.com",
});
 
 device.on("connect", function () {
  console.log("connect");
 
  device.subscribe("$aws/things/Armadillo-IoTA6/shadow/update/delta");
 
  device.publish(
    "$aws/things/Armadillo-IoTA6/shadow/update",
    JSON.stringify({
      state: {
        reported: {
          led: "off",
        },
      },
    })
  );
  exec('echo 0 > /sys/class/leds/red/brightness');
});
 
device.on("message", function (topic, payload) {
  console.log("message", topic, payload.toString());
 
  const shadow = JSON.parse(payload.toString());
 
  if (shadow.state && shadow.state.led) {
    console.log("led", shadow.state.led);
 
    const led = shadow.state.led == "on";
    var ledonoff = 0
    if (led) {
        ledonoff = 1;
    }
    else {
        ledonoff = 0;
    }
    var command = "echo "+String(ledonoff)+" > /sys/class/leds/red/brightness";
    exec(command);
 
    device.publish(
      "$aws/things/Armadillo-IoTA6/shadow/update",
      JSON.stringify({
        state: {
          reported: {
            led: shadow.state.led,
          },
        },
      })
    );
  }
});

作成したコードを実行し、AWS IoT Coreのshadowのステータスを編集し、desiredの中の値を変更すると、これに応じてLEDが点灯・消灯します。

[armadillo]$ node main.js
connect
message $aws/things/Armadillo-IoTA6/shadow/update/delta {"version":72,"timestamp":1665907495,"state":{"led":"on"},"metadata":{"led":{"timestamp":1665907495}}}
led on
message $aws/things/Armadillo-IoTA6/shadow/update/delta {"version":74,"timestamp":1665907542,"state":{"led":"off"},"metadata":{"led":{"timestamp":1665907542}}}
led off

desiredを「"led":"on"」とすると赤いLEDが点灯します。 desiredを「"led":"off"」とすると赤いLEDが消灯します。