STM32F4-RP 보드를 이용한 W5300 개발환경 구성하기에서 포팅한 ioLibrary 의 장점은 표준화된 코드로 다양한 네트워크 응용 프로그램을 쉽게 작성할 수 있다는 것이다. Wiz550web 예제( https://github.com/Wiznet/WIZ550web) 를 참고 하여 간단히 W5300 Web Server 로 보드를 제어 할 수 있다.
표시할 웹페이지에 들어갈 코드를 메모리에 할당한다.
const unsigned char index_page[] = {
"<HTML>\
<HEAD>\
<meta http-equiv=\"content-type\" content=\"text/html; charset=ksc5601\"/>\
</HEAD>\
<BODY>\
<DIV><STRONG>Embedded Webserver Test</STRONG></DIV>\
<DIV>\
<HR style=\"COLOR: red; BACKGROUND-COLOR: red\"> </DIV>\
<DIV><A href=\"led_on.html\"><U><FONT color=#0000ff><IMG src=\"ledr_of.jpg\" height='200' width='200'</img></FONT></U></A>\
<DIV> </DIV>\
<br><br><a href='cam.html'>Get Camera Image</a>\
<DIV>\
<HR style=\"COLOR: red; BACKGROUND-COLOR: red\">\
</DIV>\
</BODY></HTML>"
};
//<br><br><a href='img.html'>Wiznet Image Data</a>
const unsigned char led_off_page[] = {
"<HTML>\
<HEAD>\
<meta http-equiv=\"content-type\" content=\"text/html; charset=ksc5601\"/>\
</HEAD>\
<BODY>\
<DIV><STRONG>Embedded Webserver Test</STRONG></DIV>\
<DIV>\
<HR style=\"COLOR: red; BACKGROUND-COLOR: red\"> </DIV>\
<DIV><A href=\"led_on.html\"><U><FONT color=#0000ff><IMG src=\"ledr_of.jpg\" height='200' width='200' </img></FONT></U></A>\
<DIV> </DIV>\
<DIV>\
<HR style=\"COLOR: red; BACKGROUND-COLOR: red\">\
</DIV>\
</BODY></HTML>"
};
const unsigned char led_on_page[] = {
"<HTML>\
<HEAD>\
<meta http-equiv=\"content-type\" content=\"text/html; charset=ksc5601\"/>\
</HEAD>\
<BODY>\
<DIV><STRONG>Embedded Webserver Test</STRONG></DIV>\
<DIV>\
<HR style=\"COLOR: red; BACKGROUND-COLOR: red\"> </DIV>\
<DIV><A href=\"led_off.html\"><U><FONT color=#0000ff><IMG src=\"ledr_on.jpg\" height='200' width='200' </img></FONT></U></A>\
<DIV> </DIV>\
<DIV>\
<HR style=\"COLOR: red; BACKGROUND-COLOR: red\">\
</DIV>\
</BODY></HTML>"
};
웹페이지가 있는 메모리 주소를 등록하고 한다. main 에서 httpServer_run() 을 호출 해 주면 웹서버 구현 완료
void _Init_Web(void)
{
run_user_applications = true;
httpServer_init(TX_BUF, RX_BUF, MAX_HTTPSOCK, socknumlist); // Tx/Rx buffers (1kB) / The number of W5500 chip H/W sockets in use
reg_httpServer_cbfunc(NVIC_SystemReset, NULL); // Callback: NXP MCU Reset
// Index page and netinfo / base64 image demo
reg_httpServer_webContent((uint8_t *)"index.html", (uint8_t *)index_page);
reg_httpServer_webContent((uint8_t *)"led_off.html", (uint8_t *)led_off_page);
reg_httpServer_webContent((uint8_t *)"led_on.html", (uint8_t *)led_on_page);
reg_httpServer_webContentB((uint8_t *)"ledr_of.jpg", (uint8_t *)&ledr_of);
reg_httpServer_webContentB((uint8_t *)"ledr_on.jpg", (uint8_t *)&img_buf);
}
#define _WEB_PROCESS()\
do{\
if(run_user_applications)\
{\
for(i = 0; i < MAX_HTTPSOCK; i++) httpServer_run(i);\
loopback_tcps(SOCK_TCPS, RX_BUF, 5000);\
}\
}while(0)
웹페이지에서 전송되는 메시지 처리는 http_process_handler() 함수에서 ProcessUserPageCb() 함수를 호출 하도록 해서 처리 하도록 했다.
static void http_process_handler(uint8_t s, st_http_request * p_http_request)
{
:
:
//method Analyze
switch (p_http_request->METHOD)
{
case METHOD_ERR :
http_status = STATUS_BAD_REQ;
send_http_response_header(s, 0, 0, http_status);
break;
case METHOD_HEAD :
case METHOD_GET :
get_http_uri_name(p_http_request->URI, uri_buf);
uri_name = uri_buf;
if (!strcmp((char *)uri_name, "/")) strcpy((char *)uri_name, INITIAL_WEBPAGE); // If URI is "/", respond by index.html
if (!strcmp((char *)uri_name, "m")) strcpy((char *)uri_name, M_INITIAL_WEBPAGE);
if (!strcmp((char *)uri_name, "mobile")) strcpy((char *)uri_name, MOBILE_INITIAL_WEBPAGE);
find_http_uri_type(&p_http_request->TYPE, uri_name); // Checking requested file types (HTML, TEXT, GIF, JPEG and Etc. are included)
ProcessUserPageCb(uri_name, p_http_request);
웹에서 페이지 정보가 오면 ProcessUserPageCb()가 호출되고 이 함수에서 LED 제어를 할 수 있도록 했다.
unsigned int ProcessUserPageCb(unsigned char *uri_name, st_http_request * p_http_request)
{
if(strstr(p_http_request->URI, "led_off.html"))
{
Led1Off();
printf("LED ->%s\r\n", uri_name);
}
else if(strstr(p_http_request->URI, "led_on.html"))
{
Led1On();
printf("LED ->%s\r\n", uri_name);
}
return 0;
}
W5300 웹서버 테스트 페이지
W5300 테스트 동영상
https://www.youtube.com/watch?v=sXurKXYBVnc
반응형