pic ror heroku
Post on 30-Jul-2015
685 Views
Preview:
TRANSCRIPT
PICとRoR・herokuの無茶な関係
@mgwsuzuki
自己紹介
• 本職はLSI設計とかデジタル無線通信とか組み込みソフト開発とか
• 小さいマイコンとか電子部品が好き
• Low Layer好き、というか好き
PICマイコン
• 32bit 80MHz CPU • 128KB Flash Memory, 32KB RAM
– MBじゃない、KB
• OS無し
マイコンとセンサ
• 小さいマイコンに興味を持つと大体センサに手を出す • 今回は気圧センサ
ネットワーク??
• これは?? • 10Mbpsのイーサネット
PICマイコン
• 32bit 80MHz CPU • 128KB Flash Memory, 32KB RAM
– MBじゃない、KB
• OS無し • でもEthernetでDHCP, DNS, TCP, UDP, Webサーバまでできる
– 製造メーカーがライブラリを無償提供
妄想
• 気圧センサで取得したデータを
• Ethernet使って
• 今はやりのRuby on Railsで作ったサーバに
• PCを使わずにPICだけで
• 自動的に投稿してみようじゃないか
困難
• PICでjavaやrubyが動くわけじゃない
• 文字列処理に便利な正規表現があるわけじゃない
• HTTPライブラリがあるわけじゃない
• 要するに無いないづくしorz
楽観
• TCPあれば80番ポート叩けばいいよね
• HTTPなんて”GETなんちゃら”って送ればいいよね
• セッションもcookieをオウム返しすればいいよね
• authenticity_tokenだってオウム返しでしょ?
• BASIC認証だって(ry
• なんとかなるよね、きっと
とりあえず現物
• senslogs.herokuapp.com/senslogs
Ruby on Rails
• Scaffoldingでひな形作って改造
• BASIC認証追加
• データがPOSTされたときの時間を記録する
• Herokuへdeploy
HTTP GET
• GETで得た文字列をどうにかして解析しないといけない • そのための文字列操作関数を作る
GET /senslogs/new HTTP/1.0 <- PICから送信 HTTP/1.1 200 OK Content-Type: text/html; charset=utf-8 … <- 途中省略 Set-Cookie: _sensor_session=BAh7B0kiD3Nlc3Npb25faWQGOgZFRkkiJWE2MzJmMGVhNDkzNGNjZTI0ZWZlYzZiYWRkOTI2NjRjBjsAVEkiEF9jc3JmX3Rva2VuBjsARkkiMUpmT1hzOHZJa1RDSHdoZDVBbC9lQTlWRkRkRHJScVdOcE5aSDRjc0pUMjA9BjsARg%3D%3D--7f1dc20e289a0a5bc0cb5dbe1bc2522cee8fb0bd; path=/; HttpOnly … <form accept-charset="UTF-8" action="/senslogs" class="new_senslog" id="new_senslog" method="post"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="✓" /><input name="authenticity_token" type="hidden" value="nFgUyFamqODtURZ0W81UcofMPDh1Esx1hurNDC/Jt04=" /></div>
作ったライブラリ • 可変長の文字列を扱う文字列クラス
• いわゆるString
作ったライブラリ • HTTPサーバと会話するためのクラス
受信と送信
Content-Type: text/html; charset=utf-8
Content-Ty
pe: text/h
tml; chars
set=utf-8
文字列が細切れになって時間差で到着する これを連結して1つの文字列に直す 送信はその逆を行う
HTTP POST
• POSTするためにはGETが必要 – Cookie, Authenticity_token
• HTTPサーバに受け付けられるか見ながらヘッダを追加していった • BASIC認証のヘッダはとにかく付けておけばo.k.
POST /senslogs HTTP/1.1 Host: senslogs.herokuapp.com これが無いと接続できなかった Connection: close Cookie: _sensor_session=BAh7B… GETで得たCookieを返す Authorization: Basic XXXXXXXX BASIC認証の文字列 Content-Length: XXX BODYの文字列長 utf8=%E2%9C%93&authenticity_token=8r3AJu9wnUoZRL5iRG%2Ffc3TLdYRVJPcPO86PCMaeZE0%3D&senslog%5Btempature%5D=23&senslog%5Bpressure%5D=429&commit=Create+Senslog
まとめ
• ネタとして
• 2W以下の低消費電力で動作する
• 外部のサーバに指令を書いておけば… – スマホでエアコンをオンすることだって可能
• 小さなマイコンでもネットにつながる
• 最近は無線LANボードも安くなった
• Low Layerは楽しいのでオイデオイデ
top related