2015年8月16日日曜日

合計1000円以下のArduino+Etherからサーバへデータを送る:サーバ編

エラーメッセージがベタっと出てきて頭を抱える

■初めに■

前の記事でArduinoなどから簡単に使える400円のEthernetインタフェースを使ってみたもののhttpsに対応していなくて挫折、というネタを書きました。httpsに対応していないと外のサービスは使えないことが多いけど、でも400円でEtherがつながるのはやっぱり捨てがたい。ということで、どこのご家庭にもあるBeagleboneやRaspberry piを中継サーバとし、Arduinoからhttpで送ったデータを一度Beagleboneで受け、あらためてhttpsで外のサービスに送る…という工作をしてみます。

■サーバ側■

ごく単純にRESTを受けるだけのサーバアプリを作ります。

Beagleboneを使いましたが、Raspberry pi / pi2でも同じです。というかnodeが入っていればLinuxはもちろんMacOS Xでも同じ。

参考にしたのはこの辺(ありがとうございます)
http://qiita.com/hoshi-takanori/items/2128a6cf1dbb533379a2
http://yutapon.hatenablog.com/entry/2014/04/29/124657

まず作業ディレクトリを作り、その中に移動します。
mkdir restRelay
cd restRelay
次に以下のソースファイルを作ります。
app.js:
var express    = require('express');
var bodyParser = require('body-parser');
var app = express();
app.use(bodyParser.urlencoded({extended: true}));
app.use(bodyParser.json());
app.get('/', function (req, res) {
  res.send('Hello, World!');
});
app.post('/weather', function(req, res) {
  console.log(req.body);
  res.send('ok');
});
app.listen(2999);

package.json:
{
  "name": "restRelay",
  "version": "0.0.1",
  "private": true,
  "dependencies": {
    "body-parser": "^1.12.2",
    "express": "^4.12.3"
  }
}

パッケージをインストールします。
npm install
サーバ起動
node app

まず簡単にブラウザから試してみます。ブラウザに サーバ名:2999 と入力して、以下のような表示が出ればOKです。
JSONのテストは別のコンソールからcurlで。
curl -H "Content-Type: application/json" \-d '{"temperature":30.0, "humidity":52.3, "pressure":1023.4}' \http://localhost:2999/weather
これで「ok」が返ってきて、サーバ側に
{ temperature: 30, humidity: 52.3, pressure: 1023.4 }
が表示されていればOKです。

いやー、簡単ですね。こんなに簡単なRESTサーバ見たことないです。Play! Framework良い勝負。

で。

…こう書くと10分ぐらいで終わったみたいだけど、curlのパラメータを
-d '{temperature:30.0, humidity:52.3, pressure:1023.4}' \
って書いたらsyntax errorが出てしまい、悩みまくりました。
SyntaxError: Unexpected token t
    at Object.parse (native)
    at parse (/root/restRelay/node_modules/body-parser/lib/types/json.js:88:17)
    at /root/restRelay/node_modules/body-parser/lib/read.js:108:18
    at done (/root/restRelay/node_modules/body-parser/node_modules/raw-body/index.js:239:14)
    at IncomingMessage.onEnd (/root/restRelay/node_modules/body-parser/node_modules/raw-body/index.js:285:7)
    at IncomingMessage.g (events.js:180:16)
    at IncomingMessage.emit (events.js:92:17)
    at _stream_readable.js:944:16
    at process._tickCallback (node.js:419:13)
こんな表示だったからライブラリの問題かと思って、バージョンを入れ替えたりnpm installをやり直したり。

結局JSON書式の問題でした。エラーメッセージの「token t」ってのは { の直後のtemperatureのt。普通tokenというとtemperatureって切り出されるのが普通なので、気づくのに時間がかかりました…。

0 件のコメント:

コメントを投稿