Intel Edisonで iotkit-commを使うその2:ServerとClientについて.

前回のiotki-commチュートリアルの "4.もっと詳しいことを学ぶ" の続きです.

もっと詳しいことを学ぶその1. server(Service)の書き方

iotkit-commのチュートリアルその1,Clientについて

以下の3つのステップでService(Server)を作成する

  1. Service Specificationを記述する
  2. 1で決めたSpecificationにもとづいてServiceを作成する
  3. Serviceを実行する

以下でその例について述べる ※以下で示すサンプルコードは,/usr/share/iotkit-comm/examples/node/basic-client-serverに配置されています.

1. Service Specificationを記述する

Service SpecificationはJSONとして記述する.このJSONには,Serivceが動作するポート,Serviceの名前,通信時に利用するプロトコルといったAttributesを記述する.ここでは例として,以下の “server-spec.json”を記述してみる.

{
    “name”: “/ndg/temperature/cpuTemp”,
    “type:”: {
        “name”:”zmqreqrep”,
        “protocol”: “tcp”
    },
    “port”: 8333,
    “properties”: {“dataType”: “float”, “unit”: “F”},
    “advertise”: {“locally”: true, “cloud”: false}
}

2. 1で決めたSpecificationにもとづいてServiceを作成する

例として以下のServiceを作成する(server.js)

var iotkit-comm = require(‘iotkit-comm’);
var path = require(‘path’);
var spec = new iotkit.ServiceSpec(path.join(__dirname, “server-spec.son”);

iotkit.createService(spec, function(service){
    service.comm.setReceivedMessageHandler(function(client, msg, context){
        cnosole.log(“received from client: “ + msg.toString());
        service.comm.sendTo(client, “hi”);
    });
});

※Serviceでは,どのような内容のメッセージかのみを記述するため,そのメッセージが届くかどうかは気にする必要がありません. type.nameフィールドでの記述があれば,iotkit-commはどのようにメッセージを送信すればよいかを判断することができます.(今回の例でいうと”zmqreqrep”) ※ zmqreqrep: ZeroMQ is a high-performance asynchronous messaging library

通信の詳細は,通信プラグインによって処理されます.今回の例で言うと,通信プラグイン(service.comm)は, zmqreqrepプラグインインスタンスです.通信プラグインの詳細は後述しますが,ここでは,通信プラグインは send や,sendTo といったファンクションを提供すると考えてください.
様々な通信プラグイン間の主な違いは,send や, sendTo といったファンクションのコールによって何が起こるかである(例えば,パケットフォーマットやヘッダが異なる).標準でいくつかの通信プラグインがiotkit-commにバンドルされているが,必要に応じて独自の通信プラグインを書くことも簡単にできる.

3. Serviceを実行する

これまでに記述した server-spec.json と, server.js を同じディレクトリに置き,以下のコマンドを実行すればServiceが起動します

node server.js

もっと詳しいことを学ぶその2. client の書き方

iotkit-commのチュートリアルその2,Clientについて

以下の3つのステップでClientを作成する

  1. Service queryを記述する
  2. ServiceのためのQueryにもとづいてClientを作成する
  3. Clientを実行する

以下でその例について述べる ※以下で示すサンプルコードは,/usr/share/iotkit-comm/examples/node/basic-client-serverに配置されています.

1. Service queryを記述する

Service QueryはJSONとして記述する.このJSONには,Clientが接続したいServerのAttributesが記述されている.ここでは例として,以下の “server-query.json”を記述してみる.

{
    "name": "/ndg/temperature/cpuTemp",
    "type": {
        "name": "zmqreqrep",
        "protocol": "tcp"
    },
    "properties": {"dataType": "float", "unit": "F"}
}

2. ServiceのためのQueryにもとづいてClientを作成する

例として以下のclientを作成する(client.js)

var iotkit = require('iotkit-comm');
var path = require('path');
var query = new iotkit.ServiceQuery(path.join(__dirname, "server-query.json"));
iotkit.createClient(query, function (client) {
    client.comm.setReceivedMessageHandler(function (message, context) {
        console.log("received from server: " + message.toString());
        client.comm.send("hello");
    });
    client.comm.send("hello");
});

※ ServiceのIPアドレスや,Serviceとの通信方法をClientが知っている必要はありません.代わりに,Service queryがそのような詳細について管理してくれます.例えば,ClientではServiceの名前とServiceが利用するプロトコル(この場合zmqreqrep)を記述します.Serviceが見つかると,iotkit-commは適切に初期化された通信ハンドル(client.comm)をClientオブジェクトとともに返します.このハンドルは,Serviceに接続されたzmqreqrepプラグインインスタンスです.
通信プラグインの詳細は後述しますが,ここでは,通信プラグインは send や,sendTo といったファンクションを提供すると考えてください.
様々な通信プラグイン間の主な違いは,send や, sendTo といったファンクションのコールによって何が起こるかである(例えば,パケットフォーマットやヘッダが異なる).標準でいくつかの通信プラグインがiotkit-commにバンドルされているが,必要に応じて独自の通信プラグインを書くことも簡単にできる.

3. Clientを実行する

これまでに記述した server-query.json と, client.js を同じディレクトリに置き,以下のコマンドを実行すればClientが起動します

node server.js

動作確認

Tutorial: Server で作成したServerと,このセクションで作成したClientを起動させると,以下のような実行結果が得られます.

f:id:concre_shiitake:20141026234929p:plain