Espruino - コタツの温度を教えてくれるWebサーバを立てる

今回のテーマは **EspruinoをWiFiに繋ぐ- Webサーバとして動かす** です。

[15日目](http://qiita.com/rockymanobi/items/1dd62833b4c055a71460)/[16日目](http://qiita.com/rockymanobi/items/d50fcaf26cb59afb586b)の記事ではEspruinoをWebのクライアントとして、サーバにGET/POSTリクエストを投げる方法を紹介しました。今回はその逆で、EspruinoをWebサーバとして動作させることに挑戦しようと思います。

# 目標

まずは[公式](http://www.espruino.com/CC3000)のやり方を踏襲し、Espruinoを単純なWebサーバとして動かします。その後、センサーデバイスならではのちょっとした遊びを組み込んだWEBサーバを作ります。コタツの温度を返してくれるWEBサーバを立ててみましょう。

# 単純なWEBサーバ

とりあえず、アクセスすると`Hello World`と返してくれるWebサーバを立てます。

## プログラム

```js

// wifi接続情報
var wifiConf = {
  ssid: "xxxxxxx",
  key: "pppppp"
};

// wifiに繋ぎます
var wlan = require("CC3000").connect();
wlan.connect( wifiConf.ssid, wifiConf.key, function (s) { 
  if (s=="dhcp") {
    console.log("My IP is "+wlan.getIP().ip);
    // webサーバとしての動きを定義します
    require("http").createServer(function (req, res) {
      res.writeHead(200, {'Content-Type': 'text/plain'});  
      res.write("Hello World!");
      res.end();
    }).listen(80);
  }
});

```

いかにも、という感じですね。
`http#createServer`のコールバックに外部リクエストを受け取った時の挙動を記述します。上記の場合はいかなるurlでもとにかく「Hello World!」という文字列を返します。

## 実行

WebIDEを使って実行します。これまでのWifiの手順同様、少し待ちます（10~20秒程度)。接続し、サーバの立ち上げが完了すると、EspruinoのIPアドレスがコンソールに表示されます。

![image](https://qiita-image-store.s3.amazonaws.com/0/51384/c5fa3d01-8054-f339-d087-00757297d8c6.png)

表示されたIPにPCやスマホのブラウザでアクセスしてみましょう。このとき、Espruinoが繋いでいるのと同じネットワークに繋がっていることを忘れずに。

![image](https://qiita-image-store.s3.amazonaws.com/0/51384/ab30a86e-1cdb-92ba-912c-bab1c88122f6.png)

Hello Worldと表示されました！成功です。

# 少しだけ応用

せっかくEspruinoがWEBサーバになっているのに、テキストやHTMLを返すだけでは面白くありません。とりあえず、[５日目の記事](http://qiita.com/rockymanobi/items/6e1dad4ffb1644b60b51)で使った温度センサを組み合わせて、アクセスするとコタツの温度を返してくれるような玩具を作りましょう。

## 配線

[15日目の記事のWifi配線](http://qiita.com/rockymanobi/items/1dd62833b4c055a71460)と[５日目の記事の温度センサの配線](http://qiita.com/rockymanobi/items/6e1dad4ffb1644b60b51)を単純に組み合わせます(ピンは被っていないのでそのままできます）。

![image](https://qiita-image-store.s3.amazonaws.com/0/51384/19cb7da7-2e59-5d4c-78c6-9f43cf2d4e0b.png)

## プログラム

先ほどのプログラムと大差はないですが、`req.url`による分岐と、アクセスがあったときに温度センサの値を読んで返す処理が追加されています。

```js
// wifi接続情報
var wifiConf = {
  ssid: "xxxxxxx",
  key: "ppppppp"
};

// 温度センサをセットアップ
var ow = new OneWire(A1);
var sensor = require("DS18B20").connect(ow);
sensor.getTemp();


// wifiに繋ぎます
var wlan = require("CC3000").connect();
wlan.connect( wifiConf.ssid, wifiConf.key, function (s) { 
  if (s=="dhcp") {
    console.log("My IP is "+wlan.getIP().ip);
    require("http").createServer(function (req, res) {
      res.writeHead(200, {'Content-Type': 'text/plain'});  
      res.write("Hello. ");
      // URLがkotatsuの場合、コタツの温度を表示する
      if( req.url === "/kotatsu"){
        res.write( sensor.getTemp() + "degrees Celcius" );
      }
      res.end();
    }).listen(80);
  }
});
```

## 実行

コタツの中に温度センサを突っ込んで

![image](https://qiita-image-store.s3.amazonaws.com/0/51384/0a5368ed-3711-7b2e-ef92-c475716a7c5d.png)

ブラウザから`URL/kotatsu`にアクセスすると...

![image](https://qiita-image-store.s3.amazonaws.com/0/51384/1ef63b8a-6745-b339-d1ea-1db0fbf05de1.png)

コタツの温度が表示されました。暖かそうですね！

# まとめ

ここまでで、EspruinoからGET/POSTリクエストを発行する方法、更にはEspruinoをWebサーバとして動作させるやり方について紹介する事が出来ました。Espruino-Wifiの基本としては押さえられていると思います（センサーの値をPOSTで投げてクラウドに溜め込む、とかできますよね）。

次回以降はより実運用といいますか、実際に私がEspruino&CC3000でとあるサービスを運用してみてネックになった安定感やらエラーハンドリングやらについて触れていければと思います。

アドベントカレンダーというか、連載になってますよね。はい。