OpenBlocks IoTの設定

0. はじめに

OpenBlocks IoT の設定では、OpenBlocksにてAWS IoT Device Shadowにシリアル・デバイスのステータスを送信、およびAWS IoT Device Shadowからの制御メッセージを受け取るための設定を行います。
OpenBlocks IoT の設定には、次の7つの作業があります。

  1. OpenBlocksの初期設定
  2. IoTデータ制御パッケージのインストール
  3. Userデバイスの登録
  4. Luaスクリプト ファイルの準備
  5. モジュールの起動制御
  6. 証明書のアップロード
  7. 送受信設定

また、本チュートリアルには次の機材が用いられています。

1. OpenBlocksの初期設定

  1. WEB-UIを使うスタートアップについてはWEB-UI接続準備をご覧下さい。
  2. OpenBlocksのFW(Frame Work)をLinuxコンピュータとして動作させるための必要最小限の設定については初期設定をご覧下さい。

2. IoTデータ制御パッケージのインストール

OpenBlocks では、デバイスからメッセージを受け取りクラウドに送信する一連のサービスをIoTデータ制御パッケージとして提供しています。
IoTデータ制御パッケージをインストールしていない場合は、 メンテナンス⇒機能拡張タブからインストールします。

機能拡張

  1. インストール機能ペインのプルダウンメニューでIoTデータ制御を選択します。
  2. 実行ボタンをクリックします。
  3. インストールが完了したら、メンテナンス⇒停止・再起動タブから OpenBlocks を再起動します。

インストール状況の確認方法など詳しくは、サービスの追加をご覧下さい。

3. Userデバイスの登録

OpenBlocks では、複数の様々なデバイスを扱うため使用するデバイスを登録し、デバイス番号ローカル名)を割り振る必要があります。
WEB-UIで設定を行う限り、デバイス番号の割り振りはWEB-UIにより自動的に行われるため、ユーザーがその採番を意識する必要はありませんが、 データ処理のカスタマイズを行う場合などに必要となる事項です。

Dev登録⇒User登録タブにて、チュートリアルで使用するシリアル・デバイスのデバイス登録を行います。
上の黒いタブ列にDev登録タブが表示されていない場合は、サービスタブにあるデバイス登録機能のリンクをクリックして下さい。

本チュートリアルに用いるPD Handler RS-SERIALLuaスクリプト ファイルの準備で用意する Luaスクリプトに基づき動作するため、 そのデバイス番号はユーザーが定義するデバイスとして、その枠組み(ユーザ定義デバイス)の中から採番されます。

User登録

  1. ユーザーメモフィールドにはユーザーがデバイスを識別するための適当な文字列を入力して下さい。
    チュートリアルではSERIALとしています。
  2. 保存ボタンをクリックします。

デバイス番号が自動的に割り振られ一覧に追加されます。

User登録

デバイス登録についての詳細は、デバイス登録機能をご覧下さい。

4. Luaスクリプト ファイルの準備

4-1. Luaスクリプト ファイルの作成

以下の Luaスクリプトをコピー・アンド・ペーストして、ファイル名test_device_shadow.luaとして保存して下さい。

test_device_shadow.lua
package.cpath = package.cpath .. ';' .. "/opt/pd/lua/util/luarocks/lib/lua/5.3/?.so;" -- cjsonなどを置いている場所
package.path = package.path .. ';' .. "/opt/pd/lua/util/luarocks/share/lua/5.3/?/?.lua;"
package.path = package.path .. ';' .. "/opt/pd/lua/rs-serial/?.lua;"
json = require "cjson" -- JSONのエンコーダーデコーダーライブラリのLoad
DeviceShadow = require "DeviceShadow" -- DeviceShadowアクセスライブラリのLoad
function LOG_err(message)
LUA_sys_log (3, message)
end
function LOG_info(message)
LUA_sys_log (6, message)
end
function LOG_debug(message)
LUA_sys_log (7, message)
end
-- WEB-UIのUserデバイス登録のデバイス番号
local device_number = "userdev_0000001"
function LUA_main(void)
LOG_info("start test_device_shadow\n")
-- シリアルポートのオープン(RS-485の時は/dev/ttyRS485)
local fd
fd = LUA_open_serial("/dev/ttyMFD1", 115200, 8, 1, false, false)
if (0 > fd) then
LOG_err("serial port open error\n")
return
end
-- 待ち受けのユニックスドメインソケットのオープン
local uds_fd
uds_fd = LUA_open_udomain(device_number)
if (1 > uds_fd) then -- 戻り値0でオープンエラー
LOG_err("unix domain server open error\n")
return
end
-- メインループ ※基本的にはポーリング処理です。
local jo = {} -- JSON文字列をデコードしたあとに保存される連想配列テーブル
local rep = {} -- クラウドにレポートを送るための連想配列テーブル
local read_buff = ""
local read_size = 0
local res_str = ""
local res_len = 0
while (1) do -- 無限ループはCTRL-Cでも止まります。
local rbuff, rsize
rbuff, rsize = LUA_read_serial(fd)
read_buff = read_buff .. rbuff -- 前にシリアル入力された文字列に今回分を連結
read_size = read_size + rsize -- 同上
-- シリアルからデータを受信した
if rsize > 0 then
-- 入力文字のエコーバック
LUA_send_serial(fd, rbuff, rsize)
rep = {}
rep.state = {}
rep.state.reported = {}
if nil ~= string.find(read_buff, "switchAOn") then
read_buff = ""
rep.state.reported.switchA = "on"
DeviceShadow.update(device_number, uds_fd, rep)
elseif nil ~= string.find(read_buff, "switchAOff") then
read_buff = ""
rep.state.reported.switchA = "off"
DeviceShadow.update(device_number, uds_fd, rep)
end
end
-- 最後に入力された10文字だけ残して捨てる
read_buff = string.sub(read_buff, -10)
read_size = string.len(read_buff)
LUA_usleep (50000)
-- DeviceShadowのステータス変異を受け取る
jo = DeviceShadow.receive(uds_fd)
-- ステータス変異を受信
if nil ~= jo then
-- deltaトピックだけ受け付ける
if jo.type == "delta" then
-- 有効なペイロードがある場合
if jo.data ~= nil then
if jo.data.state.switchA ~= nil then
rep = {}
rep.state = {}
rep.state.reported = {}
if jo.data.state.switchA == "on" then
res_str = "\n\rswitchA on\n\r"
res_len = string.len(res_str)
LUA_send_serial(fd, res_str, res_len)
-- reportedへ変更後のステータスを入れておく
rep.state.reported.switchA = "on"
else
res_str = "\n\rswitchA off\n\r"
res_len = string.len(res_str)
LUA_send_serial(fd, res_str, res_len)
-- reportedへ変更後のステータスを入れておく
rep.state.reported.switchA = "off"
end
-- DeviceShadowへレポートする
DeviceShadow.update(device_number, uds_fd, rep)
end
end
end
end
LUA_usleep(1000000) -- 1秒スリープ(適当に!)
end
-- 待ち受けのユニックスドメインソケットのクローズ
LUA_close_udomain(uds_fd)
-- シリアルポートのクローズ
LUA_close_serial(fd)
LOG_info("stop test_device_shadow\n")
end

20行目のuserdev_0000001Userデバイスの登録で登録したデバイス番号が異なる場合は、スクリプトを修正して下さい。

local device_number = "userdev_0000001"

シリアル・デバイスの接続構成(クロスケーブル)についてに示す通り、 チュートリアルをOpenBlocks IoT EX1の RS232Cポート以外で試す場合は、 27行目のデバイスファイル名 /dev/ttyMFD1 を修正する必要があります。

fd = LUA_open_serial("/dev/ttyMFD1", 115200, 8, 1, false, false)

Luaスクリプトについての詳細は、RS-SERIAL Luaをご覧下さい。

4-2. Luaスクリプト ファイルのアップロード

IoTデータ⇒SERIAL Luaタブにて作成した Luaスクリプト ファイル test_device_shadow.luaをアップロードします。
上の黒いタブ列にIoTデータタブが表示されていない場合は、サービスタブにあるIoTデータのリンクをクリックして下さい。

Luaファイルのアップロード

  1. ファイル選択にてtest_device_shadow.luaを選択します。
  2. アップロードボタンをクリックします。

アップロードが完了するとSERIAL Luaペインにtest_device_shadow.luaに追加されます。

Luaファイルのアップロード

5. モジュールの起動制御

IoTデータ⇒モジュール設定タブにて、IoTデータの送受信に用いるモジュールの起動制御を行います。
上の黒いタブ列にIoTデータタブが表示されていない場合は、サービスタブにあるIoTデータのリンクをクリックして下さい。

チュートリアルでは、シリアル・デバイスのデータをハンドリングするPD Handler RS-SERIALとクラウドとのハンドリングを行うPD Repeater使用するに設定します。

アプリ起動制御

左上のデフォルト使用モジュール表示チェックボッククスをクリックします。
デフォルトモジュール起動制御ペインが表示されます。

5-1. デフォルトモジュール起動制御の設定

デフォルトアプリ起動制御

  1. デフォルトモジュール起動制御ペインのPD Repeater使用するに設定します。
  2. デフォルトモジュール起動制御ペインのPD Handler RS-SERIAL使用するに設定します。

5-2. モジュール起動制御の設定

モジュール起動制御

  1. モジュール起動制御ペインのPD Repeater使用するに設定します。
  2. モジュール起動制御ペインのPD Handler RS-SERIAL使用するに設定します。
  3. PD Handler RS-SERIAL指定LuaファイルプルダウンメニューでLuaスクリプト ファイルのアップロードでアップロードしたtest_device_shadow.luaを選択します。

5-3. 設定の保存

設定を完了したら、画面左下の保存ボタンをクリックし設定を保存します。

モジュールの起動制御についての詳細は、モジュール設定をご覧下さい。

6. 証明書のアップロード

証明書のダウンロードでダウンロードした次のファイルを OpenBlocks へアップロードします。

  • デバイス証明書 (<32bitのハッシュコード>-certificate.pem.crt)
  • プライベートキー (<32bitのハッシュコード>-private.pem.key)
  • ルート CA 証明書 (AmazonRootCA1.pem)

ここで <32bitのハッシュコード>とは64文字の16進数です。(e.g. f308184f4d6216a23003b517d60a3ab439f6f3607fe4ebee4cec14677a3f5098)

ファイルのアップロードは、システム⇒ファイル管理タブにて行います。
上の黒いタブ列にファイル管理タブが表示されていない場合は、ダッシュボートタブをクリックして下さい。

6-1. アップロード先サブディレクトリの作成

チュートリアルではデバイスを1しか登録しないため意味の無い作業に思われるかも知れませんが、 複数のデバイスを接続し管理して行く上でデバイス証明書はデバイス番号毎にサブディレクトリを設け振り分けて置くことをお勧めします。

システム⇒ファイル管理タブの作成ペインにてサブディレクトリを作成します。

ファイル管理

  1. 新規ディレクトリ生成フィールドに ./awsiot/userdev_0000001と入力します。
  2. 作成ボタンをクリックします。

ここで、userdev_0000001Userデバイスの登録で割り振られたデバイス番号です。

6-2. ファイルのアップロード

システム⇒ファイル管理タブアップロードペインにてファイルをアップロードします。

ファイル管理

  1. アップロードプレフィックスパス入力フィールドに ./awsiotと入力します。
  2. ファイル選択にて AmazonRootCA1.pem を選択します。
  3. アップロードボタンをクリックします。
  4. アップロードプレフィックスパス入力フィールドに ./awsiot/userdev_0000001と入力します。
  5. ファイル選択にて <32bitのハッシュコード>-certificate.pem.crtを選択します。
  6. アップロードボタンをクリックします。
  7. アップロードプレフィックスパス入力フィールドに ./awsiot/userdev_0000001と入力します。
  8. ファイル選択にて <32bitのハッシュコード>-private.pem.keyを選択します。
  9. アップロードボタンをクリックします。

アップロードが完了したらファイル管理ペインのawsiot/userdev_0000001フォルダアイコンをクリックします。 awsiot/userdev_0000001フォルダ内のファイルが表示されます。

ファイル管理

アップロードされたファイルのOpenBlocks上のパス名は次の通りです。

  • /var/webui/upload_dir/awsiot/AmazonRootCA1.pem
  • /var/webui/upload_dir/awsiot/userdev_0000001/<32bitのハッシュコード>-certificate.pem.crt
  • /var/webui/upload_dir/awsiot/userdev_0000001/<32bitのハッシュコード>-private.pem.key

ファイルの管理機能についての詳細は、ファイル管理をご覧下さい。

7. 送受信設定

User デバイスからデータ受け、AWS IoT Core へ送るためのパラメタの設定を行います。

チュートリアルではPD Handler RS-SERIALPD Repeaterの2つのモジュールを用いており、PD Handler RS-SERIALがデバイス寄り、PD Repeaterがクラウド寄りの処理を行います。
ここで、PD Handler RS-SERIALに必要となる設定パラメータはデバイス単位のものだけですが、クラウドサービスの多くがデバイス単位での接続を基調としているため、PD Repeaterにはクラウド単位とデバイス単位の双方のパラメタが必要となります。
このため、OpenBlocks の WEB-UI はPD Handler RS-SERIALPD Repeaterの双方に関わるデバイス単位のパラメータをシームレスに扱えるよう構成されており、行う作業も次の2つに大別されます。

  1. 送受信設定 : デバイスに依存しない送受信先クラウドの設定
  2. デバイス設定(ユーザー定義) : デバイスに依存した設定

但し、PD Handler RS-SERIALの設定パラメータはLuaスクリプト ファイルの準備で用意したtest_device_shadow.luaにハードコーディングされているため、 デバイス設定(ユーザー定義)にて設定されるパラメタはPD Repeaterの設定パラメタのみとなります。

7-1. 送受信設定

IoTデータ⇒送受信設定タブの送受信設定ペインにてデバイスに依存しない送受信先クラウドの設定を行います。
上の黒いタブ列にIoTデータタブが表示されていない場合は、サービスタブにあるIoTデータのリンクをクリックして下さい。

送受信設定

  1. AWS IoT(awsiot)使用するに設定します。
    設定項目が表示されます。
  2. 送信先ホスト入力フィールドにデバイスデータエンドポイントの取得で取得したエンドポイントを入力します。
  3. ルート証明書入力フィールドに証明書のアップロードでアップロードしたルート CA 証明書のパス名 /var/webui/upload_dir/awsiot/AmazonRootCA1.pemを入力します。

その他の設定項目の詳細は、AWS IoT(awsiot)をご覧下さい。

7-2. デバイス設定(ユーザー定義)

IoTデータ⇒送受信設定タブのデバイス設定(ユーザー定義)ペインにてデバイスに依存した設定を行います。
上の黒いタブ列にIoTデータタブが表示されていない場合は、サービスタブにあるIoTデータのリンクをクリックして下さい。

デバイス設定(ユーザー定義)

デバイス番号 userdev_0000001使用するに設定します。
userdev_0000001Userデバイスの登録で割り振られたデバイス番号です。

設定項目が表示されます。

デバイス設定(ユーザー定義)

  1. 受信設定ラジオボタンを有効にします。
  2. 送受信設定にてawsiotチェックボックスをチェックします。
    AWS IoT Coreに関わる設定項目が表示されます。
  3. DeviceShadow使用設定(awsiot)プルダウンメニューにて使用するを選択します。
  4. DeviceShadowタイプ(awsiot)プルダウンメニューにてクラシックを選択します。
  5. モノの名前(awsiot)入力フィールドにモノのプロパティを指定で設定したモノの名前 SERIALを入力します。
  6. トピック(awsiot)入力フィールドにtx_serialと入力します。
    本チュートリアルではトピックによる制御は行わないため受信トピックと重複しない限り適当な文字列で構いません。
  7. 受信トピック(awsiot)入力フィールドにrx_serialと入力します。
    本チュートリアルでは受信トピックによる制御は行わないためトピックと重複しない限り適当な文字列で構いません。 
  8. 証明書(awsiot)入力フィールドに証明書のアップロードでアップロードしたデバイス証明書のパス名 /var/webui/upload_dir/awsiot/userdev_0000001/<32bitのハッシュコード>-certificate.pem.crtを入力します。
  9. プライベートキー(awsiot)入力フィールドに証明書のアップロードでアップロードしたプライベートキーのパス名 /var/webui/upload_dir/awsiot/userdev_0000001/<32bitのハッシュコード>-private.pem.keyを入力します。

その他の設定項目の詳細は、デバイス設定(ユーザー定義)並びにAWS IoT(awsiot)をご覧下さい。

7-3. 設定の保存

設定を完了したら、画面左下の保存ボタンをクリックし設定を保存します。