読者です 読者をやめる 読者になる 読者になる

ArduinoでHTTPリクエストをホスティングサーバに投げる方法

突然ですがArduinoの話題。

Arduinoにイーサシールドを接続してDHCPでIPを取得し、ホスト名で示したレンタルサーバへアクセスする際の接続例。
単純にPCからtelnetしてあげるのと同じですが、接続先が共有レンタルサーバ等の場合はHTTPのリクエストヘッダにHostヘッダが無いと当然ですが接続先でホスト名を利用して切り分けられないのでになるので接続できませんね。*1

#include <stdio.h>
#include <SPI.h>
#include <Ethernet.h>
 
byte mac[] = {0x00,0xAA,0xBB,0xCC,0xDE,0x02}; // イーサシールドのMacアドレス記入
char hostname[] = "***.sqale.jp"; // 契約中のレンタルサーバのホスト名

char serverName[256];
char httpHeaderHost[256];

EthernetClient client;
 
void setup()
{
    sprintf(serverName,     "%s", hostname);
    sprintf(httpHeaderHost, "Host: %s", hostname);
    
    Serial.print("Target host:");
    Serial.println(hostName);
    
    Serial.begin(9600);
    if (Ethernet.begin(mac) == 0) {
        Serial.println("Failed to configure Ethernet using DHCP");
        for (;;);
    }
    Serial.print("My IP address: ");
    for (byte n=0; n<4; n++) {
        Serial.print(Ethernet.localIP()[n], DEC);
        Serial.print(".");
    }
    Serial.println();
    delay(1000);
    Serial.println("connecting..."); 
    if (client.connect(serverName, 80)) {
        Serial.println("connected");
        client.println("GET /hoge/foo HTTP/1.1");
        client.println("User-Agent: aruduino");
        client.println(httpHeaderHost);
        client.println();
    } else {
        Serial.println("connection failed");
    }
}
 
void loop()
{
    if (client.available()) {
        char c = client.read();
        Serial.print(c);
    }
    if (!client.connected()) {
        Serial.println();
        Serial.println("disconnecting.");
        client.stop();
        while(1){}
    }
}

*1:暫く悩んでしまった…情けない