にほんブログ村 その他趣味ブログ 電子工作へ

2010年12月13日

Ethernet Shield

モッパーです。


Arduino の Ethernet Shield 手に入れて遊んでます。これは RCJ とは関係ない私のプロジェクトです。


目的は 10 年前くらいに作って、いまだに我が家の玄関を焦電型赤外線センサーで監視して treva で撮影した画像を携帯に送り続けてくれているコントローラ君の置き換えです。


このコントローラ君、このようなプロジェクトに10年ほど前にちょっとだけ参加した結果作成したものです。8 bit マイコンに ipv6 スタックの実装と java でのネットワークアプリケーションプラットフォームを構築するという、当時では結構驚愕の野心的なプロジェクトでした。
問題は i-mode からの web アクセスで、i-mode は IP パケットの送り方が少〜し変態(RFC からするとOKなんですけど)で、このコントローラ君の TCP/IP スタックが受け付けてくれないことでした。i-mode からの web アクセスによるアプリケーション上の設定変更が出来ず、出先でメールの送信の可否等のコントロールが出来ないので今でも苦労しています。

Arduino については SMTP メール送信は成功例が少ないようですが私は特定のサーバーとユーザー/パスワードを固定出来れば Authorization をスルーしてメール送信出来るところまで確認出来ました。従って、上記コントローラ君とほぼ同等のことが出来るであろうところまで確認済みです。全部成功すれば、セキュリティー面を除いて情報を公開しようと思います。
ただし、最も大きな問題はArduino君 も上記コントローラ君とほぼ同じ拒否反応を i-mode からの web アクセスに対しては示していることです。どなたか、i-mode からの http プロトコルによる Arduino へのアクセスに成功した方はいらっしゃいますでしょうか ? (他力本願....)


RCJ な方にはお答えを期待出来ない領域の質問だと思います。通りすがりの方でも良いので、情報を気長に待ちます。

posted by モッパー at 23:45| Comment(2) | TrackBack(0) | Arduino
この記事へのコメント
モッパーです。

自己レスです。

i-mode の IP パケット送出の仕方云々ではなく、i-mode クライアントはサーバーへの http リクエストに対する応答で Content-Length: を返さないと表示しないためだと分かりました。

Arduino + i-mode で検索すると本サイトがトップになってしまった事実に恐れを感じて(笑)、以下に Arduino の標準の Web Server サンプルを改造して i-mode に対応した暫定版のソースコードを提示しておきます。

以下のサンプルでは Content-Length: はてきとーです。i-mode と Internet Explorer は実態より Content-Length: が長くても表示出来ますが、Google Chrome はダメみたい。

時間があればそのうち、きちんとした Content-Length: を算出するライブラリを作って公開したいと思います。(いつになることやら...(汗))




#include <SPI.h>
#include <Ethernet.h>

// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192,168,0, 7 };

// Initialize the Ethernet server library
// with the IP address and port you want to use
// (port 80 is default for HTTP):
Server server(80);

void setup()
{
// start the Ethernet connection and the server:
Ethernet.begin(mac, ip);
Serial.begin(9600);
server.begin();
}

void loop()
{
// listen for incoming clients
Client client = server.available();
if (client) {
// an http request ends with a blank line
boolean currentLineIsBlank = true;
while (client.connected()) {
if (client.available()) {
char c = client.read();
Serial.print(c);
// if you've gotten to the end of the line (received a newline
// character) and the line is blank, the http request has ended,
// so you can send a reply
if (c == '\n' && currentLineIsBlank) {
// send a standard http response header
client.println("HTTP/1.1 200 OK");
Serial.println("HTTP/1.1 200 OK");
client.println("Content-Length: 300");

client.println();

client.println("<html>");

client.println("<head>");
client.println("<title>Test</title>");
client.println("</head>");

client.println("<body>");

// output the value of each analog input pin
for (int analogChannel = 0; analogChannel < 6; analogChannel++) {
client.print("analog input ");
client.print(analogChannel);
client.print(" is ");
client.print(analogRead(analogChannel));
client.println("<br />");
}

client.println("</body>");
client.println("</html>");

break;
}
if (c == '\n') {
// you're starting a new line
currentLineIsBlank = true;
}
else if (c != '\r') {
// you've gotten a character on the current line
currentLineIsBlank = false;
}
}
}
// give the web browser time to receive the data
delay(1);
// close the connection:
client.stop();
}
}
Posted by モッパー at 2010年12月15日 20:34
モッパーです。

またも自己レスですみません。

自分でライブラリ開発しなくとも、i-mode を含めて広範囲なブラウザに対応出来そうな既存ライブラリを見つけました。

その名は webduino ( http://code.google.com/p/webduino/ )。
とりあえず、サンプルの Hello, World! ぱ i-mode, google chrome, IE8 で表示できることを確認しました。

unix や windows での web サーバープログラミングと、お作法がかなり異なるので慣れが必要そうですが、ある程度複雑な web サイト作るなら、arduino 標準の web サーバースケッチ例からスタートするよりも楽が出来そうです。

プログラムのサイズが心配でしたが、サンプルの Hello, World! は 7K。こいつならイケそうです。
Posted by モッパー at 2010年12月22日 22:23
コメントを書く
お名前: [必須入力]

メールアドレス: [必須入力]

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
※ブログオーナーが承認したコメントのみ表示されます。
この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/42081724
※ブログオーナーが承認したトラックバックのみ表示されます。
※言及リンクのないトラックバックは受信されません。

この記事へのトラックバック
にほんブログ村 その他趣味ブログ 電子工作へ