Ola Kae Tode Tai

すべてのエンジニアに、追い風を祈る。

Electric ImpでRockyを使ってみる

この投稿は Electric Imp Advent Calendar 2015 の6日目の記事です。

f:id:kironono:20151201001226p:plain

Rockyを導入する

エージェントのコードを書くことでデバイスの遠隔操作を簡単に行うことができました。

ola.kironono.com

ですが http.onrequest を使ってHTTPリクエストを処理する方法だと複雑なリクエストを処理するのには向いてません。デバイスを遠隔操作するためのWebAPIを手軽に構築するためのアプローチとして Rocky というフレームワークを使うという選択があります。

Rocky はリクエストパスに対するコールバック関数を定義するスタイルでリクエストを処理するハンドラを書くことができます。

前回作成した、LEDの状態をON/OFFするエージェントのコードをRockyを使って書きなおしてみます。

バイスのコード

led <- hardware.pin9;

led.configure(DIGITAL_OUT, 0);

function setLedState(state) {
    server.log("Set LED to state: " + state);
    led.write(state);
}

agent.on("set.led", setLedState);

前回のデバイスのコードと同じです。

エージェントのコード

#require "rocky.class.nut:1.2.3"

app <- Rocky();

app.post("/state", function(context) {
    try {
        if (!("state" in context.req.body)) throw "Missing param: state";
    } catch (e) {
        context.send(400, e);
        return;
    }
    try {
        if (!(context.req.body.state == "1" || context.req.body.state == "0")) throw "Invalid value: state";
    } catch (e) {
        context.send(400, e);
    }    
    
    local ledState = context.req.body.state.tointeger();
    device.send("set.led", ledState);
    context.send({state = ledState});
});
#require "rocky.class.nut:1.2.3"

Rockyを利用するには require 宣言を追加します。

LEDのON、OFFを制御するエンドポイントとして /state を定義しました。POSTメソッドでリクエストを受けて、 state パラメータの値でONとOFFを切り替えます。

/state にPOSTされた値は context.req.body.xxx で取得することができます。

テスト

$ curl -XPOST https://agent.electricimp.com/XXXXX/state -d "state=1"
{ "state": 1 }

state=1/state にPOSTします。LEDが点灯します。

レスポンスは、リクエストで受け取ったステータスをJSONに変換して返却しています。

$ curl -XPOST https://agent.electricimp.com/XXXXX/state -d "state=0"
{ "state": 0 }

state=0 でPOSTするとLEDが消灯します。

Rockyを利用して、LEDを制御するWebAPIが書けました。ここまでできればあとは、HTMLとCSS、WebAPIを呼び出すJavaScriptが書ければWebUIを持ったデバイスの出来上がりです。