본문 바로가기

[ST_MICRO]/STM32F4

[STM32F4-RP] W5300을 이용한 웹서버 테스트

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\">&nbsp;</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>&nbsp;</DIV>\
<br><br><a href='cam.html'>Get Camera Image</a>\
<DIV>\
<HR style=\"COLOR: red; BACKGROUND-COLOR: red\">\
&nbsp;</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\">&nbsp;</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>&nbsp;</DIV>\
<DIV>\
<HR style=\"COLOR: red; BACKGROUND-COLOR: red\">\
&nbsp;</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\">&nbsp;</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>&nbsp;</DIV>\
<DIV>\
<HR style=\"COLOR: red; BACKGROUND-COLOR: red\">\
&nbsp;</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

 

 

반응형