EspruinoをWiFiに繋ぐ - POSTリクエストを送る


以前の記事で CC3000 wifiモジュールでgetリクエストを投げることに成功したので、今度はPOSTリクエストを投げてみます。GETリクエストの場合はHttp#getというラッパーメソッドが用意されていたので楽でしたが、POSTリクエストを投げるにはHttp#requestメソッドを直接たたく必要があります。
イメージはnode.js的な感じなので、触った事ある方には馴染みある書き方かもしれません。

目標

Espruino&CC3000にてPOSTリクエストを投げる!

結線

以前の記事と全く同じです。

プログラム

POSTリクエストを試せるサーバを立てたので、そこにリクエストを投げます。POSTリクエストをなげると、レスポンスとして送ったデータをエコーしてくれるので、今回はそれをコンソールに出せれば成功とします。


// wifi接続情報
var accessPointName = "######"; //SSID
var WPA2Key = "#######"; //PASSWORD

function postSample(){

  // オプションを設定
  var payload = {
    sample_arg: "1",
    sample_arg2: "2"
  };
  var queryString = 
      "sample_arg=" + payload.sample_arg +
      "&sample_arg2=" + payload.sample_arg2;

  var host = "node-test-rocky.herokuapp.com";
  var port = 80;
  var path = "/post_sample";
  var options = {
    host: host,
    port: port,
    path: path,
    method: "POST",
    headers: {
      'Content-Type': 'application/x-www-form-urlencoded',
      'Content-Length': queryString.length
    }
  };

  var http = require("http");
  var dataAsString = "";
  var req = http.request( options, function(res) {
    res.on('data', function(data){ 
        // data chunkを繋ぎ込む
        dataAsString += data;
    });
    res.on('close', function(){ 
      console.log( 'from server' ); 
      console.log( dataAsString ); 
    });
  });  
  req.write( queryString );
  req.end();
}

// wifi繋ぎます
LED3.write(true);
var wlan = require("CC3000").connect();
LED2.write(true);
wlan.connect( accessPointName , WPA2Key , function (s) { 
  LED1.write(true);
  console.log('connected');
  if (s=="dhcp") {
    postSample();
  }
});

実行

GETリクエスト同様、完了まで時間がかかります。おまけにサーバもherokuを使っているので、30秒くらいかかるかもしれません。(こいつ、アクセスが一定時間無いとサーバが寝てしまうので立ち上がるのに時間がかかるんです)

下のように送ったデータがコンソールに出力されれば成功です。

まとめ

これでEspruino、wifi経由でセンサーの情報をWEBにPOSTすることができるようになりました。ちなみに毎回これ書くのは大変なので、ちょっとしたラッパーメソッドを作り、Gistに上げてあります。
sample_usage.jsにあるような使い方でPOSTリクエストを投げられます。