この投稿は Electric Imp Advent Calendar 2015 の6日目の記事です。
Rockyを導入する
エージェントのコードを書くことでデバイスの遠隔操作を簡単に行うことができました。
ですが 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を持ったデバイスの出来上がりです。