質問
- ウェフ゛クロウ接続時ホ゜ートについて
-
本文:
Arduinoという機器でイーサネットシールドから
ウェブクロウに接続する際にIPアドレスとポートが
必要なのですがポートが何番なのかわかりません。
教えて頂きたいです。 - 緊急度:急ぎ投稿者:seigi01さん投稿時間:2017/04/14 09:29
回答 No.5936
-
本文:
IPアドレスは、ウェブクロウのサーバー管理ツールのサーバー情報を見れば書いてあると思いますが、(ポートはサンプル通り 80)、それ以前に、arduino自体のネットワーク設定は、ちゃんとできていますか?
要は、arduino自身の IPアドレス設定とか、デフォールトルートの設定とか。
○arduinoと同じネットワークの別のPCから、arduino向けの ping したときに、ちゃんと反応が返ってきますか?
○ arduinoに ping コマンドがあるとして、例えば、arduinoから、8.8.8.8辺りに ping をしたときに、ちゃんと反応が返ってきますか?
(ping は、イーサネットシールドを買ったときにおまけでついてくるユーティリティの中に入っているんじゃないですかね???)
○サンプルプログラムでは、ネットワークの初期化コマンドなどは省略してありますが、ちゃんと初期化していますか?
https://www.arduino.cc/en/Reference/ClientConnect をみると、
Ethernet.begin(mac, ip);
が必要みたいですが、その辺は大丈夫?
(これに、多分デフォールトルートの設定の追加がさらに必要かと)
○ちなみに、arduino自身のデフォルトルートは、インターネット接続用のルータのLAN側のIPアドレス(192.168.0.1 とかが多い)。
arduinoで DHCPclientが動いていれば、勝手に設定されるけれども、動いていない可能性もあるので、その場合は手動で設定する必要がある。 - 投稿者:ジョバンニさん 投稿時間:2017/04/14 10:22
質問者からのコメント
昨日から色々と有難うございます。
難しいですね… 知識薄で申し訳ありません。
現在のプログラムです。ArduinoのIPアドレス等は取得してあります。
何か気になる部分があれば宜しくお願いします。
//-----LED_webcrow-----
#include <SoftwareSerial.h>
#include <Ethernet2.h>
#include <SPI.h>
byte mac[] = { 0x**, 0x**, 0x**, 0x**, 0x**, 0x** };
byte gateway[] = { ***,**, *, ***}; // Default Gateway IP address
byte ip[] = { ***, **, *, ** }; // Arduino EtherShield IP address
byte subnet[] = { ***, ***, *, * }; // Subnet Mask
byte server[] = { ***,**,***,** }; // webcrow server address
char URL = "http://アカウント名.webcrow.jp/";
EthernetClient client;
int LED = 0; // LEDの状態と格納(0ならOFF、1ならON)
//---------- set up ----------
void setup() {
Ethernet.begin(mac, ip ,subnet,gateway ); //Arduino 1.0 http://arduino.cc/forum/index.php?topic=83800.0
Serial.begin(9600); // 通信速度
//---------- white ----------
LED = digitalRead(7); //LEDの状態を見ている
if(LED == LOW){ //if LED_LOWなら
LED=0; //LED = 0 (OFF)
}else{ //if LED_HIGHなら
LED=1; //LED = 1 (ON)
}
delay(100);
//---------- webcorw 接続 ----------
if (client.connect("server",80)) {
Serial.println("Connect");
client.println("GET /ディレクトリツリー/***.php?LED");
client.println(LED);
client.println("HTTP/1.1");
client.println("Host URL");
client.println("Connection: close");
client.println("");
} else {
// if you didn't get a connection to the server:
Serial.println("Connection failed to Server");
}
}
//---------- loop ----------
void loop() {
}
回答 No.5937
-
本文:
初めに、一言言っておくと、『隠さなくてもいい情報を隠すと嫌われます。』
どれが隠していい情報で、どれが隠したほうがいいかの判断は、あなたにはまだ無理のように見えます。(情報を隠して質問するには、10年早い)
> byte mac[] = { 0x**, 0x**, 0x**, 0x**, 0x**, 0x** };
こんなもの伏せずに書いても、ICチップのメーカー名が判るくらいのものです。
きちんと書いてあって、それが普通と違っていれば、「普通のハード以外の部品を使っているのかな?」という判断をすることができます。
隠してもいいことはありません。
> byte gateway[] = { ***,**, *, ***}; // Default Gateway IP address
これは、よくある 192.168.xx.xx なんでしょうかね?
これを隠してなにかいいことがありますか?
一方で、
> byte subnet[] = { ***, ***, *, * }; // Subnet Mask
と上の、byte gateway[] の説明とは、矛盾しています。
* の数から想像すると、
byte subnet[] = { 255, 255, 0, 0 }
でしょうが、gateway[] が、192.168.x.xxx なら、間違っています。
> byte server[] = { ***,**,***,** }; // webcrow server address
こういうのまで隠すと、『秘密主義者』の烙印を押されます。
こういうのは、個人情報でもなんでもありません。
同じIPアドレスを使っているユーザーはおそらく500人以上、(多分、1000人以上)いるんですよ。
(そもそも、質問者が、匿名で質問している限り、こういう情報は個人情報の保護の対象にすらなりません。)
> if (client.connect("server",80)) {
server を "" で括ってはいけません。
( サンプルではそうなっていないでしょ? 言語の文法を勉強をやりなおした方がいい。)
> client.println("GET /ディレクトリツリー/***.php?LED");
○ここは、 println でなく、print 。説明が理解できませんでしたか?
○LEDの後の '=' が抜けています。
(これも、URLの書き方から勉強しなおした方がいい)
> client.println(LED);
ここも、println でなく、print 。
サンプルには、そう書いてないでしょ?
> client.println("HTTP/1.1");
HTTP の前に空白が一つ入っていたのに気がつきませんでしたか?
(注意力散漫です。)
> client.println("Host URL");
Hostの後には':' が、必要。
URL と Host を同じ "" の中に入れてはいけない。
( 言語の文法を勉強を(以下同文))
> client.println("Connection: close");
これは、多分要らない。
( あっても、無視されるだけだと思うけれど、場合によってはエラーになるかも。)
> void loop() {
loopは、どうでもいいけれど、肝心の setup()がどこからも呼び出されていない。これでは、よくても『何もしないで、即終了する』だけにしかならない。
一見、C のサブセットのように見えるけれど、C なら main() が必要。
言語の文法書をもうちょっとちゃんと読んだ方がいい。
- 投稿者:ジョバンニさん 投稿時間:2017/04/14 12:51
質問者からのコメント
情報の隠す判断が出来ない為、全て隠しました。
色々と勉強になります。
gatewayとsudnetは下記の通りです。
byte gateway[] = { 172,16, 0, 252};
byte subnet[] = { 255, 255, 0, 0 };
言語はC/C++です。
指摘部部分を修正しました。
//---------- webcorw 接続 ----------
if (client.connect(server,587)) {
Serial.println("Connect");
client.print("GET /ディレクトリツリー/test.php?LED=");
client.print(LED);
client.println(" HTTP/1.1");
client.println("Host: ");
client.println(URL);
} else {
Serial.println("Connection failed to Server");
}
回答 No.5938
-
本文:
//---------- webcorw 接続 ----------
if (client.connect(server,587)) {
だからさ、ポートは、80 だってば。
Serial.println("Connect");
client.print("GET /ディレクトリツリー/test.php?LED=");
client.print(LED);
client.println(" HTTP/1.1");
client.println("Host: ");
ここは、println でなく、print
client.println(URL);
この後に、もう一つ余分な改行が必要。
} else {
Serial.println("Connection failed to Server");
}
昔、「だろうクッキング」というコメディアンの番組のコーナーがあったけれど、あまり「こんなもんだろ」的に書いても、まず動きませんよ。
- 投稿者:ジョバンニさん 投稿時間:2017/04/14 16:12
回答 No.5942
この回答がベストアンサーです
HTTP でのパラメータの渡し方は、
http://cai.cs.shinshu-u.ac.jp/sugsi/Lecture/php/http/2-arg.html
に簡潔に書かれているから、参考にするといいですよ。
上のページの GET のサンプルで使われているデータ
>>
GET /index.html?abc=1234&def=5678 HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*
Accept-Language: ja
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)
Host: www.test.org
Connection: Keep-Alive
<<
のうち、必須なのは、GET で始まる行と、Host: で始まる行と、区切り部分の改行だけ。残りはすべて省略できます。
最初のプログラムで言えば、
>>
GET /ディレクトリツリー/***.php?LED=ON HTTP/1.1
Host: アカウント名.webcrow.jp
(改行)
<<
だけ送れば、最低限の動作はする。
POSTでデータを送りたい場合は、上のページのサンプルの
>>
POST /index.html HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*
Accept-Language: ja
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)
Host: www.test.org
Connection: Keep-Alive
abc=1234&def=5678
<<
から、必須部分を抜き出して、
>>
POST /ディレクトリツリー/***.php HTTP/1.1
Host: アカウント名.webcrow.jp
(改行)
LED=ON
<<
だけ送ればいい。
client.println("GET /ディレクトリツリー/***.php?LED");
client.println(LED);
client.println("HTTP/1.1");
が駄目な理由もわかるでしょ?
質問者からのコメント
ご回答有難うございます。
ウェブクロウにphpファイルを設置してphpファイルに接続したら
ファイルを作成するプログラムが書いてあるのですが
URLでhttp://アカウント名.webcrow.jp/ディレクトリツリー/test.php
で接続するとファイルが作成されますがArduinoで接続すると
ファイルが作成されません。
ご回答の内容を参考にプログラムを修正しました。
//---------- webcorw 接続 ----------
if (client.connect("http://アカウント名.webcrow.jp",80)) {
Serial.print("Connect");
client.println("POST /EP_iot/test.php HTTP/1.1");
client.println("Hos: orionseigi01.webcrow.jp");
client.println("");
client.print("LED=");
client.println(LED);
client.println("");
} else {
Serial.println("Connection failed to Server");
}