다른 WiFi 또는 Ethernet Shield/Board의 코드는 비슷합니다. 차이점은 라이브러리에만 있습니다.
1 | × | Arduino UNO R4 WiFi | Amazon | |
1 | × | USB Cable Type-C | 쿠팡 | Amazon | |
1 | × | (Recommended) Screw Terminal Block Shield for Arduino UNO R4 | 쿠팡 | Amazon | |
1 | × | (Recommended) Breadboard Shield For Arduino UNO R4 | 쿠팡 | Amazon | |
1 | × | (Recommended) Enclosure For Arduino UNO R4 | Amazon | |
Alternatively if using Ethernet:
1 | × | Arduino Uno | Amazon | |
1 | × | USB 2.0 cable type A/B | 쿠팡 | Amazon | |
1 | × | Arduino Ethernet Shield 2 | Amazon | |
1 | × | Ethernet Cable | Amazon | |
1 | × | (Optional) 9V Power Adapter for Arduino | Amazon | |
1 | × | (Recommended) Screw Terminal Block Shield for Arduino Uno | 쿠팡 | Amazon | |
1 | × | (Recommended) Breadboard Shield For Arduino Uno | 쿠팡 | Amazon | |
1 | × | (Recommended) Enclosure For Arduino Uno | Amazon | |
공개: 이 섹션에서 제공된 링크 중 일부는 제휴 링크입니다. 이 링크를 통해 구매한 경우 추가 비용없이 수수료를 받을 수 있습니다. 지원해 주셔서 감사합니다.
PC나 스마트폰에서 웹사이트에 접속할 때, 웹 브라우저에 웹 주소(URL)를 입력하고 잠시 기다리면, 웹페이지가 PC/스마트폰에 표시됩니다. 여러분은 PC/스마트폰이 화면 뒤에서 무엇을 하는지 모릅니다. 그럼, 화면 뒤에서는 무슨 일이 일어나는가:
귀하의 PC/스마트폰(웹 클라이언트로서)이 웹 서버에 HTTP 요청을 합니다.
웹 서버가 귀하의 PC/스마트폰에 HTTP 응답을 반환합니다.
귀하의 PC/스마트폰이 HTTP 응답을 받고 화면에 HTTP 응답을 시각화합니다.
이 튜토리얼에서는 아두이노가 웹 클라이언트가 되어 PC/스마트폰과 비슷한 작업을 수행하게 합니다.
URL은 두 부분으로 구성됩니다: 호스트네임과 경로명. 호스트네임은 웹 서버의 IP 주소로 대체될 수 있습니다. 예를 들어: example.com/test
HTTP GET 요청에서 URL은 쿼리 문자열을 포함할 수 있습니다. 예를 들어: example.com/test?temperature=20&humidity=70.
쿼리 문자열은 이름-값 쌍의 집합으로, 웹 클라이언트로부터 웹 서버로 데이터를 전송하기 위해 HTTP 요청에 포함됩니다.
이름과 값은 "=" 문자로 구분됩니다. 이름과 값의 쌍은 "&" 문자로 구분됩니다.
예를 들면: temperature=26&humidity=70&state=2
HTTP 요청은 다음으로 구성됩니다:
HTTP 요청 헤더
(선택 사항) HTTP 요청 본문
HTTP 요청 헤더와 HTTP 요청 본문은 캐리지 리턴 문자(ASCII 13, 또는 '\r')와 새 줄 문자(ASCII 10, 또는 '\n')의 두 쌍에 의해 구분됩니다.
요청 방식에는 여러 가지가 있습니다. 그 중에서도 GET과 POST가 두 가지 인기 있는 방식입니다.
보통, 웹 서버로부터 데이터를 가져올 때는 GET 방식을 사용하고, 웹 서버로 데이터를 보낼 때는 POST 방식을 사용합니다. 그러나, GET 방식은 웹 서버로부터 데이터를 가져오거나 웹 서버로 데이터를 보내는 데에도 사용될 수 있습니다.
우리는 다음 값을 결정해야 합니다:
웹 주소 (URL)은 호스트명과 경로명으로 나뉩니다.
이 부분은 HTTP와 관련된 코드만을 제시합니다. 각 실드에 대한 전체 코드는 마지막 부분에서 제시될 것입니다.
요청 메서드, HTTP 포트, 호스트명, 경로명, 쿼리 문자열을 선언하세요
int HTTP_PORT = 80;
String HTTP_METHOD = "GET";
char HOST_NAME[] = "example.phpoc.com";
String PATH_NAME = "";
웹 클라이언트 객체를 선언하다
| |
Arduino Ethernet Shield 2 | EthernetClient client; |
Arduino Uno WiFi | WiFiClient client; |
웹 서버에 연결하다
if(client.connect(HOST_NAME, HTTP_PORT)) {
Serial.println("서버에 연결되었습니다");
} else {
Serial.println("연결 실패");
}
서버에 연결되어 있으면 HTTP 요청을 보냅니다.
client.println(HTTP_METHOD + " " + PATH_NAME + " HTTP/1.1");
client.println("Host: " + String(HOST_NAME));
client.println("Connection: close");
client.println();
웹 서버에서 응답 데이터를 읽어라.
while(client.available())
{
char c = client.read();
Serial.print(c);
}
if(!client.connected())
{
Serial.println("disconnected");
client.stop();
}
HTTP 요청에 데이터를 포함할 수 있습니다. 데이터 형식은 HTTP 요청 방법에 따라 달라집니다:
HTTP GET 요청
HTTP POST 요청
우리는 HTTP 요청을 보내기 위한 코드를 수정하기만 하면 됩니다.
쿼리 문자열 생성하기
int temp =
int humi =
String queryString = String("?temperature=") + String(temp) + String("&humidity=") + String(humi);
HTTP 요청에서 데이터를 보내는 코드를 수정하십시오.
HTTP GET: 쿼리 문자열을 경로명에 추가하십시오.
client.println("GET " + PATH_NAME + queryString + " HTTP/1.1");
client.println("Host: " + String(HOST_NAME));
client.println("Connection: close");
client.println();
HTTP POST: 질의 문자열을 HTTP 본문으로 전송하세요
client.println("POST " + PATH_NAME + " HTTP/1.1");
client.println("Host: " + String(HOST_NAME));
client.println("Connection: close");
client.println();
client.println(queryString);
웹 서버에서 응답 데이터를 읽으세요.
while(client.available())
{
char c = client.read();
Serial.print(c);
}
if(!client.connected())
{
Serial.println("disconnected");
client.stop();
}
아래는 HTTP GET/POST 요청을 만들기 위한 완전한 아두이노 코드입니다.
#include <WiFiS3.h>
const char ssid[] = "YOUR_WIFI_SSID";
const char pass[] = "YOUR_WIFI_PASSWORD";
WiFiClient client;
int status = WL_IDLE_STATUS;
int HTTP_PORT = 80;
String HTTP_METHOD = "GET";
char HOST_NAME[] = "maker.ifttt.com";
String PATH_NAME = "/trigger";
void setup() {
Serial.begin(9600);
if (WiFi.status() == WL_NO_MODULE) {
Serial.println("Communication with WiFi module failed!");
while (true)
;
}
String fv = WiFi.firmwareVersion();
if (fv < WIFI_FIRMWARE_LATEST_VERSION) {
Serial.println("Please upgrade the firmware");
}
while (status != WL_CONNECTED) {
Serial.print("Attempting to connect to SSID: ");
Serial.println(ssid);
status = WiFi.begin(ssid, pass);
delay(10000);
}
Serial.print("IP Address: ");
Serial.println(WiFi.localIP());
if (client.connect(HOST_NAME, HTTP_PORT)) {
Serial.println("Connected to server");
client.println(HTTP_METHOD + " " + PATH_NAME + " HTTP/1.1");
client.println("Host: " + String(HOST_NAME));
client.println("Connection: close");
client.println();
while (client.connected()) {
if (client.available()) {
char c = client.read();
Serial.print(c);
}
}
client.stop();
Serial.println();
Serial.println("disconnected");
} else {
Serial.println("connection failed");
}
}
void loop() {
}
#include <SPI.h>
#include <Ethernet.h>
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
EthernetClient client;
int HTTP_PORT = 80;
String HTTP_METHOD = "GET";
char HOST_NAME[] = "maker.ifttt.com";
String PATH_NAME = "/trigger";
void setup() {
Serial.begin(9600);
if (Ethernet.begin(mac) == 0) {
Serial.println("Failed to obtaining an IP address using DHCP");
while(true);
}
if(client.connect(HOST_NAME, HTTP_PORT)) {
Serial.println("Connected to server");
client.println(HTTP_METHOD + " " + PATH_NAME + " HTTP/1.1");
client.println("Host: " + String(HOST_NAME));
client.println("Connection: close");
client.println();
while(client.connected()) {
if(client.available()){
char c = client.read();
Serial.print(c);
}
}
client.stop();
Serial.println();
Serial.println("disconnected");
} else {
Serial.println("connection failed");
}
}
void loop() {
}
#include <WiFiS3.h>
const char ssid[] = "YOUR_WIFI_SSID";
const char pass[] = "YOUR_WIFI_PASSWORD";
WiFiClient client;
int status = WL_IDLE_STATUS;
int HTTP_PORT = 80;
String HTTP_METHOD = "GET";
char HOST_NAME[] = "maker.ifttt.com";
String PATH_NAME = "/trigger";
String queryString = "?value1=26&value2=70";
;
void setup() {
Serial.begin(9600);
if (WiFi.status() == WL_NO_MODULE) {
Serial.println("WiFi 모듈과의 통신 실패!");
while (true)
;
}
String fv = WiFi.firmwareVersion();
if (fv < WIFI_FIRMWARE_LATEST_VERSION) {
Serial.println("펌웨어를 업그레이드하세요");
}
while (status != WL_CONNECTED) {
Serial.print("SSID에 연결을 시도중: ");
Serial.println(ssid);
status = WiFi.begin(ssid, pass);
delay(10000);
}
Serial.print("IP 주소: ");
Serial.println(WiFi.localIP());
if (client.connect(HOST_NAME, HTTP_PORT)) {
Serial.println("서버에 연결됨");
client.println(HTTP_METHOD + " " + PATH_NAME + queryString + " HTTP/1.1");
client.println("Host: " + String(HOST_NAME));
client.println("Connection: close");
client.println();
while (client.connected()) {
if (client.available()) {
char c = client.read();
Serial.print(c);
}
}
client.stop();
Serial.println();
Serial.println("연결 끊김");
} else {
Serial.println("연결 실패");
}
}
void loop() {
}
#include <SPI.h>
#include <Ethernet.h>
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
EthernetClient client;
int HTTP_PORT = 80;
String HTTP_METHOD = "GET";
char HOST_NAME[] = "maker.ifttt.com";
String PATH_NAME = "/trigger";
String queryString = "?value1=26&value2=70";;
void setup() {
Serial.begin(9600);
if (Ethernet.begin(mac) == 0) {
Serial.println("Failed to obtaining an IP address using DHCP");
while(true);
}
if(client.connect(HOST_NAME, HTTP_PORT)) {
Serial.println("Connected to server");
client.println(HTTP_METHOD + " " + PATH_NAME + queryString + " HTTP/1.1");
client.println("Host: " + String(HOST_NAME));
client.println("Connection: close");
client.println();
while(client.connected()) {
if(client.available()){
char c = client.read();
Serial.print(c);
}
}
client.stop();
Serial.println();
Serial.println("disconnected");
} else {
Serial.println("connection failed");
}
}
void loop() {
}
#include <WiFiS3.h>
const char ssid[] = "YOUR_WIFI_SSID";
const char pass[] = "YOUR_WIFI_PASSWORD";
WiFiClient client;
int status = WL_IDLE_STATUS;
int HTTP_PORT = 80;
String HTTP_METHOD = "POST";
char HOST_NAME[] = "maker.ifttt.com";
String PATH_NAME = "/trigger";
String queryString = "?value1=26&value2=70";
;
void setup() {
Serial.begin(9600);
if (WiFi.status() == WL_NO_MODULE) {
Serial.println("WiFi 모듈과의 통신 실패!");
while (true)
;
}
String fv = WiFi.firmwareVersion();
if (fv < WIFI_FIRMWARE_LATEST_VERSION) {
Serial.println("펌웨어를 업그레이드 해주세요");
}
while (status != WL_CONNECTED) {
Serial.print("SSID에 연결을 시도 중: ");
Serial.println(ssid);
status = WiFi.begin(ssid, pass);
delay(10000);
}
Serial.print("IP 주소: ");
Serial.println(WiFi.localIP());
if (client.connect(HOST_NAME, HTTP_PORT)) {
Serial.println("서버에 연결됨");
client.println(HTTP_METHOD + " " + PATH_NAME + " HTTP/1.1");
client.println("Host: " + String(HOST_NAME));
client.println("Connection: close");
client.println();
client.println(queryString);
while (client.connected()) {
if (client.available()) {
char c = client.read();
Serial.print(c);
}
}
client.stop();
Serial.println();
Serial.println("연결 끊김");
} else {
Serial.println("연결 실패");
}
}
void loop() {
}
#include <SPI.h>
#include <Ethernet.h>
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
EthernetClient client;
int HTTP_PORT = 80;
String HTTP_METHOD = "POST";
char HOST_NAME[] = "maker.ifttt.com";
String PATH_NAME = "/trigger";
String queryString = "?value1=26&value2=70";;
void setup() {
Serial.begin(9600);
if (Ethernet.begin(mac) == 0) {
Serial.println("Failed to obtaining an IP address using DHCP");
while(true);
}
if(client.connect(HOST_NAME, HTTP_PORT)) {
Serial.println("Connected to server");
client.println(HTTP_METHOD + " " + PATH_NAME + " HTTP/1.1");
client.println("Host: " + String(HOST_NAME));
client.println("Connection: close");
client.println();
client.println(queryString);
while(client.connected()) {
if(client.available()){
char c = client.read();
Serial.print(c);
}
}
client.stop();
Serial.println();
Serial.println("disconnected");
} else {
Serial.println("connection failed");
}
}
void loop() {
}
※ NOTE THAT:
이 튜토리얼에서는 동적 IP 주소(DHCP를 통해)를 사용했습니다. 정적 IP 주소를 사용하고 싶다면: