AWS IoT CoreはIoTデバイスの管理であったり、メッセージ送受信、ステータス管理などを行うIoTプロジェクト管理サービスになります。isaaxではIoT開発を高速化させることができ、AWS IoT Coreを使うことで運用フェーズでもセキュアな管理が可能になります。

今回はそんなAWS IoT Coreをisaaxプロジェクトと組み合わせて利用する方法を紹介します。

デバイスの登録

まずAWS IoT Coreにてデバイスを登録します。ウィザード方式なので難しくないでしょう。言語はNode.jsとしています。

最終的に connect_device_package.zip というファイルをダウンロードします。これをRaspberry Piなどのデバイスに配備し、インストールを行うことでAWS IoT Coreとつながる仕組みです(今回はやりません)。

Zipファイルを解凍すると raspberrypi.private.keyraspberrypi.cert.pem といったファイルが確認できます。これらのファイルはIoTデバイスに配備する必要があるので、一旦何らかのクラウド(今回はAmazon S3を利用)にアップロードしておきます。ファイルは大事なものなので公開しないようにしてください。

そして start.sh というファイルを見ると --host-name--client-id というパラメータが確認できます。これらの情報をまとめて config.json に保存しておきます。

{
  "clientId": "YOUR_CLIENT_ID",
  "hostName": "YOUR_HOST_NAME.us-east-1.amazonaws.com"
}

これで準備完了です。

isaaxプロジェクトの準備

まずデバイスをセットアップします。今回のプログラミング言語はNode.jsになります。 aws-iot-device-sdk はnpmでインストールできます。

const deviceModule = require('aws-iot-device-sdk').device;

const config = require('./config');

const device = deviceModule({
   keyPath: 'raspberrypi.private.key',
   certPath: 'raspberrypi.cert.pem',
   caPath: 'root-CA.crt',
   clientId: config.clientId,
   baseReconnectTimeMs: 4000,
   keepalive: 300,
   protocol: 'mqtts',
   host: config.hostName
});

今回はセンサーのデータではなくCPUの温度をアップロードします。AWS IoT Coreのデバイスでpublishメソッドを実行するだけでとても簡単です。これでメッセージが送信されます。

setInterval(async () => {
  const {stdout, stderr} = await promisify(exec)('vcgencmd measure_temp');
  const temp = parseFloat(stdout.replace(/temp=([0-9\.]*)'C/, '$1'));
  device.publish('topic_2', JSON.stringify({
    temprature: temp
  }));
}, 5000);

逆に受信する場合はトピックを指定して購読します。

device.subscribe('topic_2');

購読していると message イベントでメッセージを受信できます。

device
  .on('message', function(topic, payload) {
    console.log('message', topic, payload.toString());
  });

そしてそれ以外のイベントも用意されています。

device
  .on('connect', function() {
    console.log('connect');
  });
device
  .on('close', function() {
    console.log('close');
  });
device
  .on('reconnect', function() {
    console.log('reconnect');
  });
device
  .on('offline', function() {
    console.log('offline');
  });
device
  .on('error', function(error) {
    console.log('error', error);
  });

証明書をダウンロードする

isaaxプロジェクトのpre-updateやpre-installスクリプトを使って、さきほどアップロードした証明書などをダウンロードします。例えば以下のようになります。こうやってスクリプトからダウンロードさせることで、証明書などの重要なファイルをリポジトリに入れずに済みます。npm installなども記述して、ライブラリのインストールも自動化すると良いでしょう。なお、タイムアウトはデフォルトの30秒では短いので、600秒くらいにした方が良さそうです。

wget "https://example.s3-ap-northeast-1.amazonaws.com/config.json" -O config.json

メッセージを送受信する

プロジェクトをデプロイするとisaaxの管理画面でメッセージが確認できます。これは message イベントで console.log (標準出力)しているためです。

そしてAWS IoT Coreの管理画面でデバイスに対してメッセージを送ると、同じようにisaaxの管理画面で確認できます。

さらにAWS IoT Coreの管理画面ではデバイスの接続状態やメッセージの送受信量なども確認できます。


このようにしてAWS IoT Coreではデバイスの運用がコストダウンできます。通常、各IoTデバイスと繋いでステータスを確認したり、更新するような開発は大変です。AWS IoT Coreはそういった面倒さから開放してくれます。同様にIoTプロジェクトにおけるデバイスへのコードデプロイはとても面倒ですが、isaaxを使うことでとても簡単になります。双方のサービスを使いこなし、皆さんのIoTプロジェクトを高速化、便利にしてください。

今回のコードはgoofmint/isaax-aws-iot-demoにアップロードしてあります。実装時の参考にしてください。


Leave a Reply

Your email address will not be published. Required fields are marked *