カスタムデータ収集アプリ

PDHMSとは

OpenBlocksのIoTデータ処理は、それぞれが受け持つ処理によってマイクロサービス化されています。
センサーからのデータ受信はデバイスインターフェース毎の PD Handler、IoTクラウドとのデータ送受信は PD Repeater、下流制御機器の処理用スクリプトインターフェースには PD Agent、と言うように分かれています。
このそれぞれのマイクロサービス間をユニックスドメインソケットと言うメッセージパスによって接続されます。
OpenBlocksの場合、基本OSがLinuxであるため、ユニックスドメインソケットソケットでもファイルシステムに全く依存しない抽象名前空間での通信を行っており、これによって非常に高速なメッセージパスを実現しています。
抽象名前空間使ったユニックスドメインソケットの利用方法はファイルパスの先頭文字をNULLに置き換えてCALLします。
下図にその例を示しますがメッセージパス名の先頭文字に"@"をつけられていますが、これはコード記載上の問題で一時的に使っており、実際のユニックスドメインソケット関数をCALLする際にNULLに置き換えています。

こういった一連作業を受け持つ処理系をPDHMSと呼んでいます。

WEB-UIの一般設定のみで構成されるPDHMS構成

基本的にはPD HandelrからPD Repeaterへの一方通行のメッセージパスで構成されます。

info

Modbus関連機器は最初から双方向のメッセージパスを構成可能ですが、ここでは例外とし詳細についてはModbusハンドラの項を参照ください。

アプリケーションモジュール構成のカスタム例

ユーザーカスタムによっては複雑なメッセージパスの構成も可能になります。

ユーザー定義デバイス

ユーザー定義デバイスの実体はメッセージパスです。
つまりPD Repeaterと拡張アプリ間をつなぐメッセージパスです。
WEB-UIでは例えばPD HandlerからPD Repeaterへメッセージパスをつなぐ場合、通常、このメッセージパス名は省略されダイレクトの行先としてIoTクラウドとなりメッセージパスは意識されません。
つまり標準的なメッセージパスはそれぞれのモジュールにつながる、行先固定の専用パスが用意されているため、WEB-UIの表示上はIoTクラウドなどの行先そのものになっています。
しかしカスタマイズにおいては、行先未確定のためユーザー定義デバイスとしてメッセージパスを仮の送信先デバイスとしてWEB-UIに登録します。

こうして定義されたユーザー定義デバイスは、例えばユーザー自作のセンサーハンドラからPD Repeaterへ送る際に使われます。
例えばLUA言語でのシリアル機器センサーハンドラを作る際にこのメッセージパスを利用して通信します。

ユーザー定義デバイスはカスタマイズの必要に応じて作成してください。

ユーザー定義デバイス作成

WEB-UIのサービス基本ユーザーデバイス登録タブからユーザーメモに使用目的など自分のわかりやすい内容を記載して保存ボタンを押します。

userdev_add

登録されるとIoTデータ送受信設定タブのデバイス設定(ユーザー定義)ペインが表示され以下の様に送信先が選べる様になります。

userdev_setup

最後に、表示されたデバイス設定(ユーザー定義)ペインの送受信設定送り先にチェックをいれます。

自作アプリでのPD Repeaterへ送信

PD Repeaterへの送信はWEB-UIで設定したユーザー定義デバイスを元にした、抽象名前空間(abstract)の Unixドメインソケットに対してwriteを実行します。
このUnixドメインソケットのwriteを実行すると、書き込んだデータがクラウドへデータへ送信されます。

info

ユーザー定義デバイスは先に用意して送信先を決定した状態にしておくこと!

対象のユニックスドメインソケットのパス規則は以下の通りとなります。

\0/pd_repeater/<デバイス番号>.sock

以下に、それぞれの言語で PD Repeater への送信を Unixドメインソケットでwriteしたサンプルを記します。

コマンドラインでPD Repeater送信を試す

デバイス番号userdev_0000001としてPD Repeaterへ送信する例

コマンドラインサンプル
# echo -n '{ "x": 1}' | socat stdin abstract-connect:/pd_repeater/userdev_0000001.sock
info

socatコマンドはデフォルトではOpenBlocksにインストールされていません。
そのため、'apt-get install socat' でインストールしてください。

PHPでPD Repeater送信を試す

デバイス番号userdev_0000001としてPD Repeaterへ送信する例

PHPスクリプトサンプル
<?php
$value = '{ "x": 1 }';
$sock = socket_create(AF_UNIX , SOCK_STREAM , 0);
socket_set_nonblock($sock);
socket_set_option( $sock, SOL_SOCKET, SO_SNDTIMEO, array( "sec"=>1, "usec"=>0 ) );
socket_connect($sock , "\0/pd_repeater/userdev_0000001.sock" , 0 );
socket_write($sock, $value);
socket_close($sock);
?>

Node.jsでPD Repeater送信を試す

デバイス番号userdev_0000001としてPD Repeaterへ送信する例

Node.jsスクリプトサンプル
var absocket = require('abstract-socket');
try {
var absclient = absocket.connect('\0/pd_repeater/userdev_0000001.sock', function() {
console.log('connect ok');
});
absclient.write('{"x": 1}');
absclient.end();
} catch(e) {
console.log('fail');
}
process.exit();
info

Node.jsのabstract-socketはデフォルトではOpenBlocksにインストールされていません。
'npm install abstract-socket' にてインストールしてください。