예전에 ENC28J60 이더넷 모듈을 이용해서 Server 만드는 방법만 설명하고 HTTP Client로 Request 날리는 방법은 자료를 올리질 않았네요. 관련 라이브러리 업데이트도 있고하니 이참에 HTTP Request 방법 포스트 하나 올립니다.

ENC28J60 이더넷 모듈을 이용해서 Server 만드는 방법은 링크를 참고하세요. 이 링크의 내용은 EtherShield 라이브러리를 사용하는데 더 이상 업데이트 되지 않습니다. 현재는 EtherCard 라이브러리로 바뀌었습니다. 그리고 결정적으로 라이브러리가 바뀌면서 핀 연결이 조금 변경되었습니다. 이 문서의 내용은 EtherCard 라이브러리를 사용하고 핀 연결 방법도 링크와는 약간 차이가 납니다. 주의하세요.

1. ENC28J60 이더넷 모듈

HTTP stack 을 활용하고 싶지만 이더넷 쉴드는 가격이 부담스러울 때, 간단하게 HTTP server 만들거나 HTTP Request 필요할 때 ENC28J60 이 딱일듯 합니다. 해외 구매시 가격이 저렴하고 동작도 나름 안정적이라 생각됩니다. WiFi 모듈 셋업하면서 실패한거 생각하면 진짜 ㅡㅡ;;; 무선이 필요한 상황이 아니라면 이 모듈 쓰시길 추천합니다.

상세 제원

ENC28j60 Ethernet Interface Module1

– ENC28J60 이더넷 칩, SOP28 패키지, 최대 10MB / s의 속도
– SPI 인터페이스
– 2×6 커넥터 와 쉽게 MCU와 연결해서 사용
– RJ45 커넥터 HR911102A 내장
– 전원 상태 LED
– 전원 공급 : 3.3V 레귤레이터가 내장 되어있어 3.3V 와 5V(VCC) 핀으로 선택해서 공급 가능
– 25Mhz 크리스탈

– 보드크기 : 4.76 x 1.88 (Cm)

2. 연결방법

12개 핀 중 6개의 핀을 다음과 같이 연결합니다.

이더넷 모듈          아두이노          
3.3V 3.3V
GND GND
MISO D12
MOSI D11
SCK D13
CS D8

라이브러리가 EtherCard 로 업데이트 되면서 CS 핀이 D8로 변경되었습니다. 기존 EtherShield 라이브러리 사용하시는 분은 이 점 주의하셔야 합니다.

3. 라이브러리 다운로드

아래 링크에서 다운로드 받아서 설치하세요.

4. 소스코드 (스케치)

EtherCard에 포함된 예제 소스 중 webClient.ino 소스를 불러오시면 됩니다.

// Demo using DHCP and DNS to perform a web client request.
// 2011-06-08 <jc@wippler.nl> http://opensource.org/licenses/mit-license.php

#include <EtherCard.h>

// ethernet interface mac address, must be unique on the LAN
static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 };

byte Ethernet::buffer[700];
static uint32_t timer;

const char website[] PROGMEM = "www.google.com";

// called when the client request is complete
static void my_callback (byte status, word off, word len) {
  Serial.println(">>>");
  Ethernet::buffer[off+300] = 0;
  Serial.print((const char*) Ethernet::buffer + off);
  Serial.println("...");
}

void setup () {
  Serial.begin(57600);
  Serial.println(F("\n[webClient]"));

  if (ether.begin(sizeof Ethernet::buffer, mymac) == 0) 
    Serial.println(F("Failed to access Ethernet controller"));
  if (!ether.dhcpSetup())
    Serial.println(F("DHCP failed"));

  ether.printIp("IP:  ", ether.myip);
  ether.printIp("GW:  ", ether.gwip);  
  ether.printIp("DNS: ", ether.dnsip);  

  if (!ether.dnsLookup(website))
    Serial.println("DNS failed");
    
  ether.printIp("SRV: ", ether.hisip);
}

void loop () {
  ether.packetLoop(ether.packetReceive());
  
  if (millis() > timer) {
    timer = millis() + 5000;
    Serial.println();
    Serial.print("<<< REQ ");
    ether.browseUrl(PSTR("/foo/"), "bar", website, my_callback);
  }
}

핵심만 소개하죠.

DHCP로 IP 가 자동 설정되니 따로 소스코드 손댈게 없습니다. loop 함수 안에 있는 코드만 보시면 됩니다.

void loop () {
  ether.packetLoop(ether.packetReceive());
  
  if (millis() > timer) {
    timer = millis() + 5000;
    Serial.println();
    Serial.print("<<< REQ ");
    ether.browseUrl(PSTR("/foo/"), "bar", website, my_callback);
  }
}

여기서 아래 코드가 HTTP request를 날리는 부분입니다.

ether.browseUrl(PSTR(“/foo/”), “bar”, website, my_callback) ;

각 파라미터에 대해 알아보죠. 만약 http://google.com/test/update.html 파일에 request를 날리고 싶다면

  • “/foo/” : 이부분이 “/test/”로 바뀌어야 합니다. 서버내의 폴더 경로를 말합니다.
  • “bar” : 폴더 안에 있는 파일을 지칭합니다. “update.html”로 바뀌어야 합니다.
  • website : 이건 “google.com” 으로 바뀌어야 합니다. 도메인을 나타냅니다.
  • my_callback : request 가 성공했을 때 호출될 callback 함수입니다. 해당 페이지의 html 내용을 이 함수에서 읽을 수 있습니다.

이 정도만으로 HTTP Request를 날릴 수 있습니다. 위 예제코드는 request 를 5초에 한 번씩 보내는 코드입니다. 본인의 프로젝트에 맞게 적당히 간격을 두고 request 날리도록 코드를 변경하면 되겠습니다.