ラベル beaglebone の投稿を表示しています。 すべての投稿を表示
ラベル beaglebone の投稿を表示しています。 すべての投稿を表示

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って切り出されるのが普通なので、気づくのに時間がかかりました…。

2015年2月11日水曜日

Beaglebone black(bonescript)からメールを送る

サランラップ+お湯で柔らかくなるプラスチックによる雑な仕事w

まず、SMTPサーバを入れてその設定、次にBoneScriptを書く。

SMTPサーバの入れ方はこちら。とても参考になりました、ありがとうございます。
記事との相違点はMacではなくBeagleboneなので「brew/aptitudeの替わりに apt-get を使う」ことと、設定ファイルの中身です。蛇足ですが、fromとuserは同じでOKです。設定したら記事にあるように、テストしてみてください。

で、BoneScriptで書いてみます。Node.jsから直接SMTPを呼び出せるmailなどのモジュールも試してみたのですが、エラーの山を解決することができなかったので、child processとして呼び出す方式にしました。




メール系のテストをするとこうなるよねw

さて。

この度、玄関にもPIRセンサーを取り付けました。恐ろしいことに15mのワイヤ(余ってた6芯の電話線)による有線接続ですw センサーをほどよくナナメに固定するのは結構難しいのですが、玩具として売られているお湯で柔らかくなるプラスチックを使いました。80度のお湯に3分ほどつけておくと練り消しゴム状態になり、好きな形に成型してから冷します。プラスチックというよりもスーパーゴムのような素材なので、パッキングがわりに使ったり、断線しやすいiPhoneコネクタの補強、壊れた自転車用パーツの補修などに使えると思います。これでまた3Dプリンタの購入が遠ざかってしまいました(笑)。

これだけ入って1080円

なお、お湯を保温性のあるカップにいれて作業場所まで持っていくのがコツです。PIRセンサーを覆うように形を作っておき、反対側を冷たいドアに押し付けると丁度いい角度に調整することができます。私は面倒くさいので養生テープで止めちゃいましたが、プラスチックの中に磁石埋め込めばそのまま固定できると思います。電子工作において、「ナナメ固定」は結構鬼門ですが、これはホントに便利です。安いし。

養生テーブが泣かせます
先日の「自室での人間の動きを記録するアプリ」をちょっと改造して、来客を検知したらメールを送るようにしてみました。

これで留守番中に間違ってドアチェーンをかけてしまって外出中のヨメを締め出してしまっても大丈夫だ(ごめん)。

うちは宅配便ぐらいしか来ない&廊下の端で他の住民が通らないから通知ごとに送るようにしていますが、人通りの多いところでは一度送ったら数分間は検出しても送らない、などの工夫が必要かもしれないですね。