質問
- Arduinoからwebcrowにテ゛ータ送信方法
-
本文:
ArduinoでLEDの信号を取得してLEDの状態(ONなら1、OFFなら0)をイーサネットシールドでwebcrowに送信し、LEDの状態を表示させたいです。
webcrowの接続方法とLEDの状態表示方法を
教えて頂きたいです。
現在のプログラム(接続、送信部分)
client.connect(http://アカウント名.webcrow.jp,ポート);
client.print("GET ディレクトリ/***php?LED=");
client.print(LED);
client.print("Host: ");
client.print(http://アカウント名.webcrow.jp);
client.print("Connection: close");
client.print();
宜しくお願いします。 - 緊急度:緊急投稿者:seigi01さん投稿時間:2017/04/12 11:10
回答 No.5921
-
本文:
> 2. client.print が、改行を一緒に送るような仕様だと、
もしかして、client.printだと改行無しで、client.println だと改行付きなのかな? その場合は、適宜読み替えて。
> phpファイルのプログラムは大丈夫そうでしょうか?
ま、大まかなところは良さそうですが、そこまで人に聞いてしまっては、楽しみが無くなってしまうのでは?
(ファイルのパーミッションに注意すれば。) - 投稿者:ジョバンニさん 投稿時間:2017/04/12 13:22
質問者からのコメント
>2 client.printlnで改行で合っていると思います。
あまり知識が無い為、色々試しては見たのですが、手詰まりの状態です。
間違っているところがあれば教えて頂きたいです。
回答 No.5927
-
本文:
> あまり知識が無い為、色々試しては見たのですが、手詰まりの状態です。
phpのプログラムの方の動作は、普通にブラウザで、
http://アカウント名.webcrow.jp/ディレクトリ/***php?LED=LED
にアクセスしたときと全く同じだから、
arduino抜きにいくらでもテストできるはず。
まあ、受け取った内容を表示したければ、デバグ用に
echo $strLEDVal;
とか、追加しておいた方が目に見えるので判り易いですけど。
arduino側のプログラムもデータを送りっぱなしでなく、サーバーからの返事を受け取ってどこかに表示するなりした方がいいかと。
- 投稿者:ジョバンニさん 投稿時間:2017/04/12 14:45
質問者からのコメント
php側のプログラムは正常に作動してるみたいです。
Arduino側のプログラムでwebcrowのphpに接続できてないようです。
回答 No.5928
-
本文:
> Arduino側のプログラムでwebcrowのphpに接続できてないようです。
# 一ヶ所間違いを指摘し忘れました(HTTP/1.1の追加)。
たぶん、次のサンプルコードで、いけるのではないかな?
if( client.connect("アカウント名.webcrow.jp",80)){
Serial.println("connected");
client.print("GET /ディレクトリ/***php?LED=");
client.print(LED);
client.println(" HTTP/1.1");
client.println("Host: アカウント名.webcrow.jp");
client.println("");
/* ここでサーバーの応答を読み込み */
}else{
Serial.println("connection failed");
}
本当は、この後に、サーバーからの応答があるはずなので、それを読み込まないといけないはずだけど。
- 投稿者:ジョバンニさん 投稿時間:2017/04/12 16:43
質問者からのコメント
ありがとうございます。
1回試してみます。
回答 No.5931
-
本文:
あと、もし引っ掛かるところがあるとすれば、
「ホスト名から、IPアドレスを検索する部分」
arduinoのような低レベルの機械だと、その辺の機能が抜けているかもしれない。
その場合は、アカウント名.webcrow.jp のIPアドレスを調べておいて、
たとえば、これが、157.112.191.51のような値なら、
最初の client.connect の部分を
byte server[] = { 157, 112, 191, 51 }; // 区切りはコンマ
if (client.connect(server, 80)) { ...
のように書きなおす。
client.println("Host: アカウント名.webcrow.jp") の方は、そのまま。(書きなおさない)
- 投稿者:ジョバンニさん 投稿時間:2017/04/13 08:47
質問者からのコメント
試してみましたがサーバーに接続できませんでした。
webcrowのサーバーに接続する場合、webcrowにログインが必要なんですかね?
回答 No.5920
この回答がベストアンサーです
arduinoはよく知りませんが、ちょっと見の感想では、
> client.print("GET ディレクトリ/***php?LED=");
> client.print(LED);
1. 普通は、副作用を伴う(つまり、サーバーの
内部状態を変化させる)コマンドを送る場合は、GETは使いません。
POST を使います。
( ま、GETでも動くとは思いますが。)
... とは、いっても、POSTだと、パラメータの送り方が、GETとは変わってくるので(単純にGETをPOSTに置き換えたのではダメ)、最初の動作確認の段階では、GETの方が楽かな。
( ただ、GETだと、webcrowのキャッシュがもしかしたら、悪い影響を与えるかもしれません。ON を2回送ったのに、1回しか受け取らないような。)
2. client.print が、改行を一緒に送るような仕様だと、
上の二つのコマンドは、2行に分けてはいけません。
1回のclient.print で、"GET ディレクトリ/***php?LED="とLEDを送る必要があります。
3. ディレクトリ/***php は、/ディレクトリ/***php の形でないとだめかも。
> client.print("Host: ");
> client.print(http://アカウント名.webcrow.jp);
4.ここは、http://アカウント名.webcrow.jp でなく、単に
client.print("Host: アカウント名.webcrow.jp");
じゃないですかね。上と同じく、2回に分けては多分ダメです。
> client.connect(http://アカウント名.webcrow.jp,ポート);
5. これも、client.connect(アカウント名.webcrow.jp,ポート);ではないですかね。client.connectの仕様がわからないので、http:// を付けるのが正しいのかもしれませんが。
6. もしかしたら、
client.print(host: アカウント名.webcrow.jp);
の後に、もう一つ余分な改行を送らないと返事がこないかもしれません。
client.print('');
質問者からのコメント
ご回答有難うございます。
phpファイルのプログラムは大丈夫そうでしょうか?
書き込むdatファイルには何も書かなくてよろしいのですか?
<?php
// 'white' という名前で Arduino からGET送信されたLEDの状態をGET
$strLEDVal = $_GET['LED']; //white
// データを保存するテキストファイルの相対パス
$strDataFilePath = 'ディレクトリ/**.dat';
// データを保存するテキストファイルを追記モードでオープン
$fp = fopen($strDataFilePath, "a");
// 送信された値をテキストファイルに書き込み
fwrite($fp, $strLEDVal);
// ファイルポインタをクローズ
fclose($fp);
?>