본문 바로가기

RaspberryPi/RP2350

[RP2350_W6100] Arduino - W6100을 이용한 웹서버 테스트

Arduino IDE에서 Iperf TCP Throughput 측정 테스트 에서 18Mbps 의 전송률이 빠르기 때문에 다양한 웹관련 예제를 작성해 볼 수 있을것 같다.

 

우선 [RP2040_W6100] 웹서버 테스트 - Base64 인코딩 방식 이미지 출력하기 테스트 코드를 수정해서 좀더 사이즈가 큰 이미지를 전송할 수 있도록 수정해 보자

 

 

RP2350에서 W6100을 이용한 웹페이지 출력 코드

기존에 사용하던 코드에서 좀더 쉽게 코드를 수정할 수 있는 구조로 변경하였다.

우선 라이브러리 관련 설정 파일을 defines.h 파일로 분리해서 다양한 옵션을 적용 할수 있도록 수정했다.

 

defines.h

웹서버의 이미지 전송 속도를 높이기 위해  DMA를사용하도록 했다.

#define ETHERNET_USE_RPIPICO_DMA  true

#define USE_W5100                           false
//#define USE_THIS_SS_PIN                     12    //RP2350 EXP
#define USE_THIS_SS_PIN                       2    //RP2350 SM


#define DEBUG_ETHERNET_GENERIC_PORT         SerialDebug
#define DEBUG_ETHERNET_WEBSERVER_PORT       SerialDebug
#define USE_UIP_ETHERNET   false

#define USE_ETHERNET_GENERIC  true
#define USE_ETHERNET_ESP8266  false
#define USE_ETHERNET_ENC      false
#define USE_CUSTOM_ETHERNET   false


#define SPI_ETHERNET_SETTINGS SPISettings(37500000, MSBFIRST, SPI_MODE0)

#define ETHERNET_USE_RPIPICO      true
#define SPI_HAS_TRANSFER_BUF      true

#define USING_W6100               true

#define ETHERNET_USE_RPIPICO_DMA  true

byte mac[] =	{ 0x00, 0x08, 0xDC, 0x00, 0x00, 0x00 };

 

 

웹페이지는 별도의 헤더파일을 두어서 쉽게 페이지를 변경하고 테스트 할수있도록 했다.

참고로 Base64이미지는 하기 사이트에서 변환가능하다.

https://www.base64encode.net/base64-image-encoder

 

html_base64_img_test1.h

#define STR_LED_ON_IMG F("iVBORw0KGgoAAAANSUhEUgAAAQgAAAHaCAIAAABzYkCMAAD24UlEQVR42uy9h3/cOLagC7KiVAql6Cw5dHD3uKd74...")
#define STR_LED_OFF_IMG F("iVBORw0KGgoAAAANSUhEUgAAAQgAAAHaCAIAAABzYkCMAADx2UlEQVR42uy9DZBdWX3gd+7H+1S31FJLmpFGGmkk...")

const char index_html[] PROGMEM = R"rawliteral(
<!DOCTYPE html>
<html>
    <meta name="viewport" content="width=device-width, initial-scale=1">
<body>
    <h1><center>$LED_STATUS$</h1><br>
    <p style="text-align: center;">
    <a href="$LED_URL$">
  <center>
    <div>
<img alt="led_on1.jpg" 
src="data:image/jpeg;base64,$IMAGE_LED1$">
    </div>
    </center>
    </a>        
</center>
</script>
</div>
</body>
</html>
)rawliteral";

 

 

나머지 수정해야 하는 함수와 기본이되는 뼈대코드만 두여 가독성이 좋게 수정하였다.

#include "defines.h"
#include "html_base64_img_test1.h"

#include <SPI.h>
#include "Ethernet_Generic.h"
#include <EthernetWebServer.h>

EthernetWebServer server(80);

const int Led1Pin = 25;
int SendWebValue = 0;


void handle_root()
{
  String str_new_page = index_html;

  str_new_page.replace("$LED_STATUS$", "LED - ON");
  str_new_page.replace("$LED_URL$", "On");
  
  str_new_page.replace("$IMAGE_LED1$", STR_LED_ON_IMG);

  server.send(200, "text/html", str_new_page);
}


void handleNotFound()
{
  String message = F("File Not Found\n\n");

  message += F("URI: ");
  message += server.uri();
  message += F("\nMethod: ");
  message += (server.method() == HTTP_GET) ? F("GET") : F("POST");
  message += F("\nArguments: ");
  message += server.args();
  message += F("\n");

  for (uint8_t i = 0; i < server.args(); i++)
  {
    message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
  }

  server.send(404, F("text/plain"), message);

  digitalWrite(Led1Pin, 0);
}

//On 버튼 페이지 처리함수
void SetLedStatusOn()
{
  Serial.println("On");
  digitalWrite(Led1Pin, 1);

  String str_new_page = index_html;

  server.send(200, "text/html", str_new_page);
}

//Off 버튼 페이지 처리함수
void SetLedStatusOff()
{
    Serial.println("Off");
    digitalWrite(Led1Pin, 0);

  String str_new_page = index_html;

  str_new_page.replace("$LED_STATUS$", "LED - ON");
  str_new_page.replace("$LED_URL$", "On");
  
    server.send(200, "text/html", str_new_page);
}



void initWebServer() 
{
  //페이지 요청 처리 함수 등록
  server.on("/", handle_root);
  server.on("/On", HTTP_GET, SetLedStatusOn);
  server.on("/Off", HTTP_GET, SetLedStatusOff);

  server.onNotFound(handleNotFound);

  server.begin();
}



void setup()
{
  pinMode(Led1Pin, OUTPUT);
  
  digitalWrite(Led1Pin, 1);

  // Open serial communications and wait for port to open:
  SerialDebug.begin(115200);

  while (!SerialDebug && millis() < 5000);

  Ethernet.init (USE_THIS_SS_PIN);


  // start the ethernet connection and the server:
  Ethernet.begin(mac);

  SerialDebug.print(F("Connected! IP address: "));
  SerialDebug.println(Ethernet.localIP());

  initWebServer();
}


void loop()
{
  handleSerial();
}

 

 

 

반응형