第4章 IoTを体験しよう

Armadillo-IoTを使い、データをクラウド上のサーバーにアップロードするサンプルアプリケーションを動かし、IoTの基本部分を体験してみましょう。

4.1. サンプルアプリケーションの概要

サンプルアプリケーションは、Armadillo-IoT(クライアント)からデータを AWS(サーバー) にアップロードする機能と、AWS(サーバー)から Armadillo-IoT(クライアント)に対して操作指示を行う機能の二つを備えています。

クライアントからサーバーへのデータアップロードの例として、Armadillo-IoT が本体の状態監視用に内蔵している温度センサの値をアップロードします。また、サーバーからの操作指示の例として、AWS から LED の状態を示すドキュメントの値を変更すると、その状態(ON または OFF)を Armadillo-IoT に通知して LED の状態を変更します。

また、データの可視化をするサービスとして、Amazon OpenSearch Service を使用して、Armadillo-IoT から受け取ったデータを Web ブラウザからリアルタイムに変化を確認できます。

本サンプルアプリケーションのシステムは以下の様に様々な AWS サービスを連携させることにより実現しています。

サンプルアプリケーションの構成

図4.1 サンプルアプリケーションの構成


[ティップ]AWS

AWS(アマゾン ウェブ サービス)は、Amazonが提供する200以上のクラウドサービスの総称です。

一昔前の Web アプリケーション開発現場では、まず開発環境に Linux や Apache、MySQL、PHP(LAMP)をインストールして開発を行い、開発がうまくいったら公開用のサーバーを購入するなり、レンタルサーバーを借りるなりして、また色々インストールして、一般公開するためにドメインを購入して、というようにアプリケーションの実装以外に多くの付随する作業が必要でした。

AWS を使用すると、1. AWS アカウントを作成する、2. アプリケーションを実装する(アプリケーションの実行に必要なサーバーやデータベースの設定は、AWS のツールが面倒を見てくれるので、開発者は何を使うか指定するだけです)、3. サーバーに「push」する、という単純なステップで、アプリケーションを一般公開できます。また、サーバーで使用する CPU の数やメモリサイズ、データベース容量を動的に変更できるなど、急にアクセスが増えた場合でも、簡単にスケールアウトできるような仕掛けがなされています。

また、Web アプリケーションを開発する際に必要となる様々な機能が「SDK」として用意されており、それらを活用することで、アプリケーションの本質的な部分に開発リソースを集中することができます。サンプルアプリケーションでは、Amazon から提供されている Boto3 という AWS SDK を使用しています。

[ティップ]REST API

REST(REpresentational State Transfer)は、Web アプリケーションの API に関するアーキテクチャスタイル(設計思想)の一つです。

ネットワーク上のリソースに対し一意の URI を割り当て、リソースに対する操作を HTTP GET(取得)/ POST(新規作成)/ PUT(更新)/ DELETE(削除)で行います。REST の原則に従い API を設計すると、クライアントからのリクエストをステートレスにできるため、サーバー側の実装をスケールアウトしやすいと言われています。サンプルアプリケーションでは、時々刻々と変化する温度センサデータのアップロードは、常にリソース(温度データの時系列情報)の新規作成となるため HTTP POST で行っています。

なお、厳密にはREST原則に従っていないAPIもREST APIと称することが多くなっているため、原則に忠実に従って設計されたAPIのことを、RESTful APIということもあります。

4.2. 電源投入から起動まで

Armadillo-IoTに電源を投入する前に、USBシリアル変換アダプタのスライドスイッチを次のように外側になるようにしてください。[6]

スライドスイッチの設定

図4.2 スライドスイッチの設定


Armadillo-IoTに電源を接続すると、シリアル通信ソフトウェアには次のように表示されます。

U-Boot SPL 2016.07-at16 (Jun 18 2018 - 12:04:02)
Trying to boot from MMC2


U-Boot 2016.07-at16 (Jun 18 2018 - 12:04:02 +0900)

CPU:   Freescale i.MX7D rev1.3 at 996MHz
CPU:   Extended Commercial temperature grade (-20C to 105C) at 45C
Reset cause: POR
       Watchdog enabled
I2C:   ready
DRAM:  1 GiB
Boot Source: eMMC
Board Type: Armadillo-IoT G3 M1(0a000003)
Revision: 0000
S/N: 4
DRAM: 00001e05
XTAL: 00
MMC:   FSL_SDHC: 0, FSL_SDHC: 1
Loading Environment from MMC... *** Warning - bad CRC, using default environment

Failed (-5)
Loading Environment from MMC... *** Warning - bad CRC, using default environment

Failed (-5)
In:    serial
Out:   serial
Err:   serial
Found PFUZE300! deviceid 0x30, revid 0x11
Net:   FEC0
=>

図4.3 電源を投入直後のログ


Linuxシステムを起動するには、次のように "boot"コマンドを実行してください。コマンドを実行するとブートローダーがLinuxシステムを起動させます。シリアル通信ソフトウェアにはLinuxの起動ログが表示されます。

=> boot
switch to partitions #0, OK
mmc1(part 0) is current device
switch to partitions #0, OK
mmc1(part 0) is current device
reading boot.scr
** Unable to read file boot.scr **
reading boot.scr
** Unable to read file boot.scr **
reading uImage
12009840 bytes read in 291 ms (39.4 MiB/s)
Booting from mmc ...
reading armadillo_iotg_g3_m1.dtb
53984 bytes read in 19 ms (2.7 MiB/s)
## Booting kernel from Legacy Image at 82000000 ...
   Image Name:   Linux-4.9.107-at1
   Image Type:   ARM Linux Kernel Image (uncompressed)
   Data Size:    12009776 Bytes = 11.5 MiB
   Load Address: 80008000
   Entry Point:  80008000
   Verifying Checksum ... OK
## Flattened Device Tree blob at 84800000
   Booting using the fdt blob at 0x84800000
   Loading Kernel Image ... OK
   Using Device Tree in place at 84800000, end 848102df

Starting kernel ...

Booting Linux on physical CPU 0x0
Linux version 4.9.107-at1 (atmark@atde7) (gcc version 6.3.0 20170516 (Debian 6.3.0-18) ) #2 SMP PREEMPT Mon Jun 18 12:02:51 JST 2018
CPU: ARMv7 Processor [410fc075] revision 5 (ARMv7), cr=10c53c7d
CPU: div instructions available: patching division code
CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instruction cache
OF: fdt:Machine model: Atmark-Techno Armadillo-IoT Gateway G3 M1 Board
Reserved memory: created CMA memory pool at 0xac000000, size 320 MiB
OF: reserved mem: initialized node linux,cma, compatible id shared-dma-pool
Memory policy: Data cache writealloc
percpu: Embedded 15 pages/cpu @ab719000 s30604 r8192 d22644 u61440
Built 1 zonelists in Zone order, mobility grouping on.  Total pages: 260096
Kernel command line: console=ttymxc4,115200 root=/dev/mmcblk2p2 rootwait rw
PID hash table entries: 4096 (order: 2, 16384 bytes)
Dentry cache hash table entries: 131072 (order: 7, 524288 bytes)
Inode-cache hash table entries: 65536 (order: 6, 262144 bytes)
Memory: 687940K/1048576K available (12288K kernel code, 978K rwdata, 5308K rodata, 3072K init, 500K bss, 32956K reserved, 327680K cma-reserved, 0K highmem)
Virtual kernel memory layout:
    vector  : 0xffff0000 - 0xffff1000   (   4 kB)
    fixmap  : 0xffc00000 - 0xfff00000   (3072 kB)
    vmalloc : 0xc0800000 - 0xff800000   (1008 MB)
    lowmem  : 0x80000000 - 0xc0000000   (1024 MB)
    pkmap   : 0x7fe00000 - 0x80000000   (   2 MB)
    modules : 0x7f000000 - 0x7fe00000   (  14 MB)
      .text : 0x80008000 - 0x80d00000   (13280 kB)
      .init : 0x81300000 - 0x81600000   (3072 kB)
      .data : 0x81600000 - 0x816f4b50   ( 979 kB)
       .bss : 0x816f6000 - 0x817731a4   ( 501 kB)
SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=2, Nodes=1
Preemptible hierarchical RCU implementation.
	Build-time adjustment of leaf fanout to 32.
	RCU restricting CPUs from NR_CPUS=4 to nr_cpu_ids=2.
RCU: Adjusting geometry for rcu_fanout_leaf=32, nr_cpu_ids=2
NR_IRQS:16 nr_irqs:16 16
arm_arch_timer: Architected cp15 timer(s) running at 8.00MHz (phys).
clocksource: arch_sys_counter: mask: 0xffffffffffffff max_cycles: 0x1d854df40, max_idle_ns: 440795202120 ns
sched_clock: 56 bits at 8MHz, resolution 125ns, wraps every 2199023255500ns
Switching to timer-based delay loop, resolution 125ns
Ignoring duplicate/late registration of read_current_timer delay
clocksource: mxc_timer1: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 637086815595 ns
Console: colour dummy device 80x30

(省略)

Debian GNU/Linux 9 armadillo ttymxc4

armadillo login:
     

図4.4 bootコマンドでLinuxを起動


ここでは、rootユーザーでログインします。デフォルトのパスワードは、"root"となっています。

Debian GNU/Linux 9 armadillo-iotg ttymxc4

armadillo-iotg login: root
Password:
root@armadillo-iotg ~# 

図4.5 rootユーザーでログイン


4.3. 前準備

サンプルアプリケーションを実行する前に環境構築を行います。

4.3.1. AWS アカウントを作成する

AWS アカウントの作成方法については、 AWS 公式サイトの AWS アカウント作成の流れ (https://aws.amazon.com/jp/register-flow/) を参照してください。

4.3.2. IAM ユーザーを作成する

AWS IAM (Identity and Access Management) は、AWS リソースへのアクセスを安全に管理するためのウェブサービスです。IAM により、誰を認証(サインイン)し、誰にリソースの使用を承認する(アクセス許可を持たせる)かを管理することができます。

手順4.1 IAM ユーザーを作成する

  1. IAM へ移動し、「アクセス管理」→「ポリシー」を開き、「ポリシーを作成」をクリックします。

  2. 「JSON」を選択し、以下のように入力して、「次のステップ: タグ」をクリックします。ポリシードキュメントは https://download.atmark-techno.com/armadillo-iot-g3/startup-guide/IAM_policy.json からダウンロードすることも出来ます。

    {
      "Version": "2012-10-17",
      "Statement": [
          {
              "Sid": "VisualEditor0",
              "Effect": "Allow",
              "Action": [
                  "iam:List*",
                  "iam:Get*",
                  "iam:PassRole",
                  "iam:CreateRole",
                  "iam:UpdateRole",
                  "iam:DeleteRole",
                  "iam:CreatePolicy",
                  "iam:DeletePolicy",
                  "iam:AttachRolePolicy",
                  "iam:PutRolePolicy",
                  "cloudformation:*",
                  "iot:List*",
                  "iot:Get*",
                  "iot:Connect",
                  "iot:Subscribe",
                  "iot:Describe*",
                  "iot:*Publish",
                  "iot:Receive",
                  "iot:CreatePolicy",
                  "iot:Attach*Policy",
                  "iot:*RoleAlias",
                  "iot:CreateThing",
                  "iot:UpdateThing",
                  "iot:RegisterThing",
                  "iot:UpdateThingShadow",
                  "iot:AttachThingPrincipal",
                  "iot:CreateKeysAndCertificate",
                  "iot:UpdateCertificate",
                  "apigateway:GET",
                  "s3:GetObject",
                  "s3:PutObject",
                  "s3:ListBucket",
                  "s3:CreateBucket",
                  "cognito-idp:*List*",
                  "cognito-idp:*Get*",
                  "cognito-idp:Describe*",
                  "cognito-idp:AdminCreateUser",
                  "cognito-idp:AdminEnableUser",
                  "es:List*",
                  "es:Get*",
                  "es:Describe*",
                  "es:ESHttp*"
              ],
              "Resource": "*"
          }
      ]
    }
            

    図4.6 ポリシードキュメント


  3. 何も選択せずに、「次のステップ: 確認」をクリックします。

  4. ポリシー名を入力し、「ポリシーの作成」をクリックします。ここでは、ポリシー名を "policy_for_AWS_test" としています。

  5. IAM から、「アクセス管理」→「ユーザー」を開き、「ユーザーを追加」をクリックします。

  6. 下記の通り入力、選択し、「次のステップ: アクセス権限」をクリックします。

    • ユーザー名を入力する

    • AWS 認証情報タイプは両方選択する

    • コンソールのパスワードは「自動生成パスワード」を選択する

    • パスワードのリセットが必要にチェックを入れる

  7. 「既存のポリシーを直接アタッチ」をクリックし、先程作成したポリシーを選択して、「次のステップ: タグ」をクリックします。

  8. 何も選択せずに、「次のステップ: 確認」をクリックします。

  9. 内容を確認し、「ユーザーの作成」をクリックします。

  10. 「.csvのダウンロード」をクリックし、 "new_user_credentials.csv" をダウンロードして、「閉じる」をクリックします。

4.3.3. ポリシーの設定をする

ポリシーは、AWSの JSON ドキュメントで、AWS リソースへのアクセスの許可または拒否を設定することが出来ます。ここでは、Cloud Formation というサービスを用いて自動で設定を行います。

手順4.2 ポリシーの設定をする

  1. 作業用PCにポリシー設定用のテンプレートファイルをダウンロードします。

    [PC /]$ wget https://download.atmark-techno.com/armadillo-iot-g3/startup-guide/create_policy.template
            

    図4.7 テンプレートファイルのダウンロード


  2. Cloud Formation へ移動し、「スタックの作成」→「新しいリソースを使用(標準)」をクリックします。

  3. 「テンプレートファイルのアップロード」を選択し、「ファイルの選択」で先程ダウンロードしたテンプレートファイルをアップロードして、「次へ」をクリックします。

  4. スタック名を入力し、「次へ」をクリックします。

  5. そのまま「次へ」をクリックします。

  6. チェックボックスを選択し、「スタックの作成」をクリックします。

  7. 作成したスタックのステータスが “CREATE_COMPLETE” になったら作成完了です。ステータスは更新ボタンを押すと反映されます。

4.3.4. エンドポイントを確認する

Armadillo を IoT Core と連携するためにはデバイスデータエンドポイントを使用します。

手順4.3 エンドポイントを確認する

  1. IoT Core へ移動し、サイドバー下部にある設定をクリックします。

  2. ここで表示されるエンドポイントは後ほど使用しますので、メモしておいてください。

4.3.5. モノを作成する

ArmadilloをAWS IoTと連携するためにデバイスを登録し、証明書の生成、ポリシーのアタッチを行います。

手順4.4 モノを作成する

  1. IoT Coreから、「管理」→「すべてのデバイス」→「モノ」を開き、「モノを作成」をクリックします。

  2. 「1つのモノを作成」を選択し、「次へ」をクリックします。

  3. モノの名前を “my_test_armadillo” と入力します。

  4. 「名前のないシャドウ (クラシック)」を選択し、シャドウステートメントを以下のように入力して、「次へ」をクリックします。

    {
    	"state": {
    		"desired": {
    		"LED_state": 0
    		},
    		"reported": {
    		"LED_state": 0
    		}
    	}
    }
    				

    図4.8 シャドウステートメント


  5. 「新しい証明書を自動生成 (推奨)」を選択し、「次へ」をクリックします。

  6. “PolicyForThing” を選択し、「モノを作成」をクリックします。

  7. ポップアップで表示された画面で、デバイス証明書、パブリックキーファイル、プライベートキーファイルをそれぞれダウンロードし、「完了」をクリックします。

  8. ダウンロードしたファイルは、デバイス証明書が "[ハッシュ値64桁]-certificate.pem.crt"、パブリックキーファイルが "[ハッシュ値64桁]-public.pem.key"、プライベートキーファイルが "[ハッシュ値64桁]-private.pem.key" という名前で保存されます。以下の例では各ファイルを「Downloads ディレクトリ」に保存しています。

    [PC ~/Downloads]# ls
    [ハッシュ値64桁]-certificate.pem.crt
    [ハッシュ値64桁]-private.pem.key
    [ハッシュ値64桁]-public.pem.key
    				

4.3.6. 証明書と秘密鍵を転送する

USB や SD カードを使用して Armadillo に証明書と秘密鍵を転送します。

手順4.5 証明書と秘密鍵を Armadillo に転送する

  1. 先程ダウンロードした証明書と秘密鍵を USB や SD カードに入れ、Armadillo に接続します。

  2. Armadillo のホームディレクトリに 「certs ディレクトリ」を作成します。

    [armadillo ~]# mkdir certs
    [armadillo ~]# cd certs
    			
  3. 「certs ディレクトリ」内に証明書と秘密鍵を転送し、それぞれ以下のようにリネームします。

    [armadillo ~/certs]# mv [ハッシュ値64桁]-certificate.pem.crt certificate.pem.crt
    [armadillo ~/certs]# mv [ハッシュ値64桁]-private.pem.key private.pem.key
    [armadillo ~/certs]# ls
    certificate.pem.crt	private.pem.key
    			

4.3.7. サンプルアプリケーションの環境を構築する

ここでは、Cloud Formation を用いてサンプルアプリケーションの環境を自動構築します。

手順4.6 サンプルアプリケーションの環境を構築する

  1. 作業用PCに環境構築用のテンプレートファイルをダウンロードします。

    [PC /]$ wget https://download.atmark-techno.com/armadillo-iot-g3/startup-guide/sample_application.template
            

    図4.9 テンプレートファイルのダウンロード


  2. Cloud Formation へ移動し、「スタックの作成」→「新しいリソースを使用(標準)」をクリックします。

  3. 「テンプレートファイルのアップロード」を選択し、「ファイルの選択」で先程ダウンロードしたテンプレートファイルをアップロードして、「次へ」をクリックします。

  4. スタック名を入力し、「次へ」をクリックします。

  5. “RoleForCloudFormation” を選択し、「次へ」をクリックします。

  6. チェックボックスを選択し、「スタックの作成」をクリックします。

  7. 作成したスタックのステータスが “CREATE_COMPLETE” になったら作成完了です。この環境構築には30分ほど時間を要します。

4.4. サンプルアプリケーションの実行

ここでは、構築したサンプルアプリケーション環境を用いて Armadillo と AWS のデータのやり取りのテストを行います。

4.4.1. データを IoT Core へ送る

サンプルプログラムを使用して IoT Core へデータを送信してみましょう。

手順4.7 データを IoT Core へ送る

  1. IoT Core へ移動し、「テスト」→「MQTT テストクライアント」をクリックします。

  2. “topic/sensors”と入力し、「サブスクライブ」をクリックします。

  3. Armadillo に戻って、サンプルコードを実行します。[endpoint] は「エンドポイントを確認する」で確認したエンドポイントを入力してください。

    [armadillo ~]# wget https://download.atmark-techno.com/armadillo-iot-g3/startup-guide/publish.py
    [armadillo ~]# python3 publish.py [endpoint]
    				

    図4.10 サンプルコードを実行する


  4. IoT Core を確認すると、送信されたデータが表示されます。

4.4.2. LED を操作する

先程のサンプルプログラムの中では、シャドウの LED_state の値を5秒置きに確認し、Armadillo の LED3 に反映させています。ここでは REST API を用いて LED_state の値を変更することで Armadillo の LED を操作します。

手順4.8 LED を操作する

  1. API Gateway を開き、”operateLED_API” をクリックします。

  2. 「ステージ」から ”dev” を開き、URL を確認します。

  3. 「API キー」から “my_APIkey” を開き、「表示」をクリックして API キーを確認します。

  4. Armadillo に戻って、publish.py を終了させた場合は、もう一度実行します。

  5. 作業用 PC から、以下のコマンドを実行すると、Armadillo の LED3 が点灯します。ここで、[URL] と [APIキー] の部分を先程確認した URL と API キーに置き換えてください。

              [PC /]$ curl -X POST "[URL]/data?LED=1" -H "x-api-key: [API キー]"
            

    図4.11 LEDを点灯させる


  6. 作業用 PC から、以下のコマンドを実行すると、Armadillo の LED3 が消灯します。

              [PC /]$ curl -X POST "[URL]/data?LED=0" -H "x-api-key: [API キー]"
            

    図4.12 LEDを消灯させる


4.4.3. 送信したデータを可視化する

ここでは、AWS IoT Core へ送信した CPU 温度や LTE 電波強度をグラフ化する方法を説明します。

4.4.3.1. 前準備

手順4.9 前準備

  1. Cognito へ移動し、「ユーザープール」から “MyTestUserPool” をクリックします。

  2. 「ユーザーを作成」をクリックします。

  3. ユーザー名とパスワードを入力し、「ユーザーを作成」をクリックします。このユーザー名とパスワードは後ほど使用しますので、メモしておいてください。

  4. Amazon OpenSearch Service から「ドメイン」を開き、”mytest-opensearch” をクリックします。

  5. 「OpenSearch Dashboards の URL」をクリックします。

  6. 先程作成したユーザー名と仮パスワードを入力し、 “Sign in” をクリックします。

  7. 新しいパスワードを入力し、 “Send” をクリックします。

  8. “Manage” をクリックします。

  9. “Index Patterns” を開き、“Create index pattern” をクリックします。

  10. “server_timestamp” と入力し、“Next step” をクリックします。

  11. “server_timestamp” を選択し、”Create index pattern” をクリックします。

4.4.3.2. ダッシュボードを作成する

手順4.10 ダッシュボードを作成する

  1. サイドバーから、“Dashboard” をクリックします。

  2. “Create new dashboard” をクリックします。

  3. “Save” をクリックします。

  4. ダッシュボード名を入力し、”Save” をクリックします。ここでは、ダッシュボード名を “my_test_dashboard” としています。

  5. “Edit” をクリックします。

  6. “Create_new” をクリックします。

4.4.3.3. CPU 温度を可視化する

手順4.11 CPU 温度を可視化する

  1. ”Line” を選択します。

    可視化方法の選択

    図4.13 可視化方法の選択


  2. “server_timestamp” を選択します。

    データの選択

    図4.14 データの選択


  3. “Metrics” を以下の通りに選択します。

    • ”Aggregation” は “Median” を選択する

    • ”Field” は “sensor.temperature” を選択する

    Y軸の設定

    図4.15 Y軸の設定


  4. “Buckets” を以下の通りに選択し、”Update” をクリックします。

    • ”X-axis” を選択する

    • ”Aggregation” は “Data Histogram” を選択する

    • ”Field” は “server_timestamp” を選択する

    • ”Minimum interval” は “Minute” を選択する

    X軸の設定

    図4.16 X軸の設定


  5. “Save” をクリックします。

  6. タイトルを入力し、”Save and return” をクリックします。ここでは、タイトルを “Temperature” としています。

4.4.3.4. LTE 電波強度を可視化する

手順4.12 LTE 電波強度を可視化する

  1. ”Gauge” を選択します。

    可視化方法の選択

    図4.17 可視化方法の選択


  2. “Metric” を以下の通りに選択します。

    • ”Aggregation” は “Top Hit” を選択する

    • ”Field” は “sensor.signal_quality” を選択する

    • ”Aggregate with” は “Max” を選択する

    データの表示方法の設定

    図4.18 データの表示方法の設定


  3. “Options” を開き、”Reverse schema” を選択して、”Update” をクリックします。

    オプションの設定

    図4.19 オプションの設定


  4. “Save” をクリックします。

  5. タイトルを入力し、”Save and return” をクリックします。ここでは、タイトルを “Signal_quality” としています。

  6. “Save” をクリックします。



[6] スライドスイッチ機能の詳細については、製品マニュアルに記載されています。