« 手帳のトレンドはバーティカルから見開きセパレートに? | Main | 高城剛の著書に影響され、旅行のための情報収集を磨く »

2010.03.22

arduinoでEthernet Shield利用パターン(送信編)

Ethernet Shieldは文字通り、arduinoでイーサネットを扱えるようにするシールド。センサの値を読み取ってtwitterにアップするなど、arduinoのシールドの中では群を抜いて応用の広がるシールドだと思うが、このシールドでできることについてパターン化してみようと思う。

なお、送受信のうち「送信」のパターンについて列挙する。arduinoによる「受信」については、受信したパケットを解析させるのが面倒なので割愛する。(この考えも、arduinoの開発環境で正規表現を使えたりすると変わってくるかもしれないが)

http(get)

パソコンからIEやFirefoxで「http://www.google.com/search?q=arduino」といったURLにアクセスすることで検索する文字列を伝えることがあるが、このようにURLの中で値を渡す方法がHTTPのGETメソッドによる通信。arduinoでのデータ送信で最も簡単なパターンだと思う。

arduino.ccに示されているサンプルではarduinoからgoogleに接続し、

client.println("GET /search?q=arduino HTTP/1.0");

という箇所で「arduino」という文字列をgoogleのqというパラメータに渡している。

Webサーバ側で動くプログラムを書ければ、数行程度のプログラムを置くことで、arduinoがアップした文字列をサーバ側で参照できる。サーバは、さくらインターネットの月額500円のプランあたりで十分。Rubyで書いたサンプルを下記に置いておく。

http://gist.github.com/339016

このサンプルプログラムでは、

  • /http_get?q=testというURLから「test」という文字列を取り出し
  • http_get.txtというファイルに書き出す

といったことをしている。ファイルに書き出すところを作り替えれば、表形式やらRSSやら、お好みの形式にできる。

実物(私がさくらインターネットで動かしているもの)はこちら。

http://barcelona.sakura.ne.jp/arduino/http_get.cgi?q=test

http://barcelona.sakura.ne.jp/arduino/http_get.txt

なお、arduino.ccのサンプルを使う場合、client.printの中身を書き換える以外に

  • Ethernet.beginの引数にサブネットとデフォルトゲートウェイを追加←異なるネットワーク、例えばルータ下部からインターネットに接続する場合に必要
  • Hostヘッダを追加←さくらインターネットなど、1つのIPアドレスを持つサーバで複数のドメインを扱っている場合に必要。

といった変更を行う必要がある。こちらも下記にソースを置いた。

http://gist.github.com/339016

http(post)

パソコンでテキストボックスに値を入力して「送信」とか「Submit」とかボタンを押してデータを送るのがHTTPのPOSTメソッド。GETより大量のデータを転送出来るのがメリットだが、arduinoを使ってる限りはGETだけ使っていればいいじゃん、と思っていた。

積極的にPOSTで送るようなシーンが思いつかなかったのだが、ふと、Google Docのスプレッドシートで作ったFormに送れると楽しいかな、と試してみた。

例えば、ブラウザからであれば下記のフォームに適当な値を入れて送信すると、

http://spreadsheets.google.com/viewform?formkey=dG5pUF9za3NBYWVTblNMc3FxOGxsWHc6MA

下記のGoogle Docのスプレッドシートに反映される。

http://spreadsheets.google.com/pub?key=tniP_sksAaeSnSLsqq8llXw&single=true&gid=4&output=html

arduinoで送る場合も、GETと同じように、client.printlnで文字列を送ればよいのだが、このような注意点がある。

  • Content-Lengthにボディ部のサイズを自分で計算してあげないといけない。
  • レスポンスを掴み損ねると、同じIPアドレスから再び接続できなくなってしまう。どうせレスポンスには「Thanks」と書かれているだけなので、レスポンスは読み込まず、さっさとclient.closeした方が安定して動作する。

このあたり、プログラミングのノウハウより、プロトコルの知識が必要かもしれない。httpのソースだけでなく、Wiresharkなどでパケットをキャプチャすると、arduinoから何を送ればよいのかがわかる。

Googleのサーバは、色々試したところ、Host、Content-type、Content-Lengthを残しておけば動いてくれたので、keepaliveなど面倒そうなのは除外することにした。

実際に動くソースはこちら。

http://gist.github.com/339201

【追記】

この手法、Open Electronicsの方々が修正して、わかりやすいチュートリアルにしてましたので、こちらを参照してください。

http://www.open-electronics.org/how-send-data-from-arduino-to-google-docs-spreadsheet/

こちら経由で知りました。

http://blog.makezine.com/archive/2011/07/how-to-save-arduino-output-to-google-docs-spreadsheets.html

twitter

arduinoからtwitterに投稿するなんて、なんとも可能性が広がりそうだが、下記のライブラリを使うと本当に簡単に実現できる。

ArduinoからTwitterにPOSTするライブラリ - Okiraku Programming
はてなユーザーの評価 

ただ、しょっちゅうtwitterで「arduino」関連の話題を検索してる身としては、twitterから数分おきに自動投稿してるのを見ると、ちょっとうざいというかなんというか。別に個人の自由だとは思うけど、頻繁に投げるときは「arduino」という文字列をPOSTするのはやめたほうがいいのではないかと。

※追記

twitterのBASIC認証が廃止され、幾つか改良版が出ていますね。

http://d.hatena.ne.jp/NeoCat/20100314/1268516097

http://arms22.blog91.fc2.com/blog-entry-296.html

IP Messenger

LANの中で最も簡単にメッセージの送受信ができるのは、IP Messengerではないかと思う。サーバ不要で、PCにクライアントをインストールするだけで、arduinoからのメッセージをPCにポップアップさせることができる。

TCPではなくUDPというプロトコルを使うが、arduinoの標準ライブラリでサポートされていないので、そのライブラリを探してインストールする必要がある。手順とかは、前にブログに書いたので、こちらを。

arduinoでIP Messenger: uessay
はてなユーザーの評価

im.kayac.com経由でiPhoneやGmailへ

im.kayac.comはNotifycation HUB APIということで、メールやHTTP POSTをim.kayac.comに送ると、iPhone(+専用アプリ)やらGoogleトークやらにメッセージ変換してくれるサービス。

im.kayac.com
はてなユーザーの評価

HTTP POSTは前述の通り簡単に実装できるので、送信先をim.kayac.comにするだけでiPhoneやGmailで受け取れる。認証レベルが3段階あって、最も高いレベル(SHA-1)はarduinoでは厳しいと思うが、パスワード認証なら、ぜんぜんできるレベル。

ソースコードはこちら。usernameのところは、ちゃんと書き換えて使ってください。

http://gist.github.com/339809

Mail(SMTP)

最後にメールの話題。メールもHTTP同様にclient.printlnでサーバに色々と送信すればいいわけだが、スパム対策やら何やらで、簡単に使えるメールサーバを探す方が大変だったりするので、いまいち試す動機が見当たらない。

一応、こちらにはarduinoで動作を確認したらしきコードがある。

http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1235534880/3

--

まとめ

「送信」については、PCから送ってる信号をWiresharkでキャプチャして、同じようにarduinoのclient.printで出力すればよいので、変に隠蔽されている言語より、いろいろ作りやすい。

ただ、暗号化とか相当厳しそうなので、arduinoで全て実装しようとするのは諦めて、適当にプロキシを立てた方が楽かもということで、arduinoproxyというサーバを立ててみたので、興味があれば、こちらもどうぞ。

http://goodsite.cocolog-nifty.com/uessay/2010/11/arduinoproxy.html

|

« 手帳のトレンドはバーティカルから見開きセパレートに? | Main | 高城剛の著書に影響され、旅行のための情報収集を磨く »

Arduino」カテゴリの記事

TrackBack

TrackBack URL for this entry:
http://app.cocolog-nifty.com/t/trackback/4282/47828657

Listed below are links to weblogs that reference arduinoでEthernet Shield利用パターン(送信編):

« 手帳のトレンドはバーティカルから見開きセパレートに? | Main | 高城剛の著書に影響され、旅行のための情報収集を磨く »