サーバーとしてイーサネットシールドを備えたArduinoUnoを持っており、インターネットを介してArduinoにリクエストを送信します。私はそれを行うために2つのライブラリ(Ethernet.hとSPI.h)を使用します。
クライアントのIPアドレスを確認したいので、オフィスの静的IPアドレスである既知のIPアドレス(たとえば、50.50.50.50)からのHTTP要求のみを受け入れます。ArduinoでクライアントのIPアドレスを取得するにはどうすればよいですか?
サーバーとしてイーサネットシールドを備えたArduinoUnoを持っており、インターネットを介してArduinoにリクエストを送信します。私はそれを行うために2つのライブラリ(Ethernet.hとSPI.h)を使用します。
クライアントのIPアドレスを確認したいので、オフィスの静的IPアドレスである既知のIPアドレス(たとえば、50.50.50.50)からのHTTP要求のみを受け入れます。ArduinoでクライアントのIPアドレスを取得するにはどうすればよいですか?
以下を見てください。これはTCPで機能します。
http://forum.arduino.cc/index.php?PHPSESSID=jh6t8omt7vrb8nget5c9j5dbk4&/topic,82416.0.html
以下は著者の投稿からの引用です、私はただ素晴らしい作品をコピーしています:
それを機能させるために、私は次のことをしました:
EthernetClient.cppファイルの最後に次の行を追加しました。
uint8_t *EthernetClient::getRemoteIP(uint8_t remoteIP[])
{
W5100.readSnDIPR(_sock, remoteIP);
return remoteIP;
}
次に、次の行(virtual void stop();行の下)をEthernetClient.hファイルに追加しました。
uint8_t *getRemoteIP(uint8_t RemoteIP[]);//adds remote ip address
最後に、スケッチで次のコードを使用してリモートIPにアクセスしました。
client.getRemoteIP(rip); // where rip is defined as byte rip[] = {0,0,0,0 };
シリアルモニターにIPを表示するために、私は以下を使用しました。
for (int bcount= 0; bcount < 4; bcount++)
{
Serial.print(rip[bcount], DEC);
if (bcount<3) Serial.print(".");
}
私はUDPを使用してこれを行いました。うまくいけば、これがお役に立てば幸いです。
ここでGoogleからUDP.hを取得します:UDP.h
コード:
#include <SPI.h>
#include <Ethernet.h>
#include <Udp.h>
// ***** ETHERNET VARS *****
// MAC address and IP for arduino
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192,168,1,98};
unsigned int localPort = 8888; // local port to listen on
// SenderIP and SenderPort are set when message is received
byte SenderIP[IP_LENGTH]; // holds received packet's originating IP
unsigned int SenderPort; // holds received packet's originating port
// buffer for receiving data
char packetBuffer[UDP_TX_PACKET_MAX_SIZE]; //buffer to hold incoming packet
int packetSize = 0;
void setup()
{
Ethernet.begin(mac,ip); //start Ethernet
Udp.begin(localPort); //start UDP
}
void loop()
{
if(NewPortMessage())
{
// Do stuff, SenderIP is the IP where the UDP message was received from
}
}
boolean NewPortMessage()
{
packetSize = Udp.available();
if(packetSize > 0)
{
packetSize -= 8; //subtract UDP 8-byte header
// read the packet into packetBufffer and get the senders IP addr and port number
Udp.readPacket(packetBuffer,UDP_TX_PACKET_MAX_SIZE, SenderIP, SenderPort);
return true;
}
clearPacketBuffer();
return false;
}
void clearPacketBuffer()
{
for(int i=0; i < packetSize; i++)
packetBuffer[i] = 0;
}
アプローチを変えるのはどうですか?SOAを使用して、arduinoをWebサーバーの代わりにWebクライアントにすることができます.......その後、WebサービスをホストするWebサーバーでこのすべての制限を処理でき、このWebサービスがコアになりますあなたのアプリの、そしてこの方法であなたはあなたが望むどんなモバイルデバイスからでもそれを呼び出すことができます:D
ただのアイデアarduinoWebサーバーはあまり役に立ちません。このアプローチでは、LANのみを使用する代わりにインターネットを使用できます。
あなたのプロジェクトで頑張ってください