長かった。。。でも、予定よりも早い完成で、嬉しい限りです。
苦労したのは、WiPort + Rails + マイコン(moxa)が、うまく連携してくれなかったこと。
WiPort + マイコンが上手くいっていないのか、Rails + WiPortが上手くいっていないのか、WiPort + Rails + マイコンを連携させる時に、不具合が起こるのか、どこで失敗するのかもうぐちゃぐちゃに。
そんなとき、Iさんに相談した所、以下のようなアドバイスを頂きました。
>足場を固めながら、論理的に問題を切り分けて行かないと、
>決してゴールにはたどり着けませんよ。
いい言葉です。。。自分の大雑把さを反省しました。コードはたった一文字で動かなかったりするんですよね。
そんなわけで、手順に関してもアドバイスを頂いたので、それをたどる事にしました。
>1 googleサーバから正しい反応が貰えるようなリクエスト文字列をTeratermで確認
>2 Processingでgoogleサーバに「全く同じ」リクエスト文字列を作り、確認
>3 moxaから「全く同じ」リクエスト文字列を送って確認
>4 Railsサーバから正しい反応が貰えるようなリクエスト文字列をTeratermで確認
>5 ProcessingでRailsサーバに「全く同じ」リクエスト文字列を作り、確認
>6 moxaから「全く同じ」リクエスト文字列を送って確認
それでは、手順をひとつずつ見て行きましょう。
[1]SFCサーバから正しい反応が貰えるようなリクエスト文字列をTeratermで確認
googleにリクエストを出すと、上手くいかない時があったので、大学のwebサイトのindexにGET要求を出す事にしました。
まずはSFCのIPアドレスを調べます。
$ dig www.sfc.keio.ac.jp
digでIPアドレスを調べることが出来ますよ。調べたら、TeraTermで、HTTPリクエストを出してみます。
C133.27.4.221:80
GET /index.html HTTP/1.1<^M^J>
HOST: www.sfc.keio.ac.jp<^M^J><^M^J>
MakingThingsTalkという本を参考に、やってみました。
ポート指定の前は、MakingThingsTalkでは/を使っていました。/ではなく:ではないだろうか?という意見を頂いたのですが、/を使っても、:を使っても同じくサーバーと接続できました。なので、ひとまず:で統一することにしました。
少し気になっているのは、サーバーに接続した後は、Enterではなく^M^J(Ctrl-M,Ctrl-J)でCRLFを行っている事。MakingThingsTalkには書かれていたのですが、なぜ^M^Jでなくてはダメなのかは設定の問題と書いてありました。ちょっと気になる所でしたが、ともあれ、上記のリクエスト文で間違いなくGETできていました(200 OKも出ているので)
[2]ProcessingでSFCサーバに「全く同じ」リクエスト文字列を作り、確認
MakingThingTalkではTeraTermからではなく、Proce55ingから、シリアル接続でWiPortにリクエストを出せるプログラムが載っています。Processingのコードの中に大学のサイトのIPアドレスを入れます。
ちなみにこれは、何でもいいので、ボタンを押すと、イベントシーケンスを1つずつ実行してくれるプロジェクトです。
import processing.serial.*;
Serial myPort; // Serial object
int step = 0; // which step in the process you're on
char linefeed = 10; // ASCII linefeed character
void setup()
{
println(Serial.list());
myPort = new Serial(this, Serial.list()[0], 9600);
myPort.bufferUntil(linefeed);
}
void draw()
{
}
void serialEvent(Serial myPort) {
print(myPort.readString());
}
void keyReleased() {
switch (step) {
case 0:
myPort.write("C133.27.4.221:80\n");
step++;
break;
case 1:
myPort.write("GET /index.html HTTP/1.1\r\n");
myPort.write("HOST: www.sfc.keio.ac.jp\r\n\r\n");
step++;
break;
}
}
200 OKと出て、処理が行われました。改行は\nで良さそうです。MakingThingsTalkでは、Cの後は\rになっていたのでちょっと気になっていましたが、\nに変えても結果は変わらなかったので、\nで統一することにしました。(TeraTermで入力した文字列に忠実であるため)また、GET以降はTeraTermと合わせるため、\r\nとしましたが、\nでも問題なく動いていました。
myPort.write("GET /index.html HTTP/1.1\n");
myPort.write("HOST: www.sfc.keio.ac.jp\n\n");
ひとまずは\r\nで行く事にします。
[3]moxaから「全く同じ」リクエスト文字列を送って確認
確認の方法が少し面倒だったので、(MakingThingsTalk > Processingでサーバーを作る方法)
後回しにして、railsの方を進めてみました。
[4]Railsサーバから正しい反応が貰えるようなリクエスト文字列をTeratermで確認
mainページだと、かえってくるhtmlが長過ぎるので、loginページにリクエストを出して分かりやすくしました。
C192.168.0.111:3000
GET /login HTTP/1.1<^M^J>
HOST: 192.168.0.111<^M^J><^M^J>
200 OKが出て、きちんとかえってきました。
[5]ProcessingでRailsサーバに「全く同じ」リクエスト文字列を作り、確認
Processingのコード・以下の三カ所を変更。
myPort.write("C192.168.0.111:3000\n");
myPort.write("GET /encounter HTTP/1.1\r\n");
myPort.write("HOST: 192.168.0.111\r\n\r\n");
なんと今度は成功!ずっと失敗してたのに、、、、。
200 OKとでて、きちんと返してくれました。こちらはSFCの場合と異なり、\r\nとしなければ失敗するようです。(試しに\nでリクエストを出したところ、同じようなエラーが出ました。)
ひとつずつ確認していった事が功を奏したようです。POSTも同様に確かめてみました。
myPort.write("C192.168.0.111:3000\n");
myPort.write("GET /encounter HTTP/1.1\r\n");
myPort.write("HOST: 192.168.0.111\r\n\r\n");
こちらも成功していました。これは期待できるかも、、、、?!
[6] moxaから「全く同じ」リクエスト文字列を送って確認
長いので、全文は後ほど掲載します。
前回からの変更点のみ抜粋。
var CR = String.fromCharCode(13);
var CRLF = String.fromCharCode(13, 10);
var c = "C192.168.0.111:3000";
var h = "HOST: 192.168.0.111";
var con = "Content-Type: application/x-wwwform-urlencoded";
var p1 = "POST /encounter/ab HTTP/1.1";
var p2 = "POST /encounter/ac HTTP/1.1";
var p3 = "POST /encounter/ad HTTP/1.1";
変数の宣言で、文字列指定しちゃいます。ポイントはString.fromCharCode。アスキーコードからCR(改行)とLF(復帰)を引っ張ってきます。
あとは、なんらかの信号を受け取った時(Muliusの場合、他のmoxa基盤からZigBeeで値を受け取った時)にserialSendでWiPortに上記の文字列を送るようにします。
serialSend(c + CR);
serialSend(p1 + CRLF);
serialSend(h + CRLF);
serialSend(con + CRLF + CRLF);
いざ、、、moxaに書き込み、WiPortの電源を入れて、通信させてみます。
すると、railsサーバー側では以下の結果が!
ブラウザから見てみると、
出来てた〜!!!!!
ここまで丸三日間、、、本当にがんばりました。あとはガワやサイトのCSSを整えたりって感じです。もうちょっとだけがんばりますが、今日はblogを書いたりしてのんびり過ごします(笑)
0 件のコメント:
コメントを投稿