Хочу добавить на html страницу картинку. Для теста сделал PNG размером 5х5 пикселей. Добавил её в html код:
CODE
<html>
<head>
<title>Умный дом</title>
<meta http-equiv='content-type' content='text/html; charset=windows-1251'>
</head>
<body>
<br><br><br><center><b>Тестовая страница W5500</b></center><br>
<center><img src='test.png'></center>
</body>
</html>
Открыл картинку в hex редакторе и сделал массив сырых данных:
CODE
const char Img [205] =
{
0x89,0x50,0x4E,0x47,0x0D,0x0A,0x1A,0x0A,0x00,0x00,0x00,0x0D,0x49,0x48,0x44,0x52,
0x00,0x00,0x00,0x05,
0x00,0x00,0x00,0x05,0x08,0x02,0x00,0x00,0x00,0x02,0x0D,0xB1,0xB2,0x00,0x00,0x00,
0x01,0x73,0x52,0x47,
0x42,0x00,0xAE,0xCE,0x1C,0xE9,0x00,0x00,0x00,0x06,0x62,0x4B,0x47,0x44,0x00,0xFF,
0x00,0xFF,0x00,0xFF,
0xA0,0xBD,0xA7,0x93,0x00,0x00,0x00,0x09,0x70,0x48,0x59,0x73,0x00,0x00,0x0B,0x13,
0x00,0x00,0x0B,0x13,
0x01,0x00,0x9A,0x9C,0x18,0x00,0x00,0x00,0x07,0x74,0x49,0x4D,0x45,0x07,0xDF,0x05,
0x0A,0x0E,0x01,0x20,
0xA0,0x0A,0x57,0xCD,0x00,0x00,0x00,0x19,0x74,0x45,0x58,0x74,0x43,0x6F,0x6D,0x6D,
0x65,0x6E,0x74,0x00,
0x43,0x72,0x65,0x61,0x74,0x65,0x64,0x20,0x77,0x69,0x74,0x68,0x20,0x47,0x49,0x4D,
0x50,0x57,0x81,0x0E,
0x17,0x00,0x00,0x00,0x28,0x49,0x44,0x41,0x54,0x08,0xD7,0x4D,0x8B,0x41,0x0E,0x00,
0x30,0x08,0xC2,0xA8,
0xFF,0xFF,0x73,0x3D,0x18,0xDD,0xB8,0x34,0x94,0x40,0x12,0x35,0x9B,0x52,0x81,0xD7,
0x67,0x3F,0x55,0x83,
0x53,0xFC,0x67,0xA0,0x01,0x8E,0xCE,0x0F,0x06,0x6E,0x28,0x44,0x78,0x00,0x00,0x00,
0x00,0x49,0x45,0x4E,
0x44,0xAE,0x42,0x60,0x82
};
{
0x89,0x50,0x4E,0x47,0x0D,0x0A,0x1A,0x0A,0x00,0x00,0x00,0x0D,0x49,0x48,0x44,0x52,
0x00,0x00,0x00,0x05,
0x00,0x00,0x00,0x05,0x08,0x02,0x00,0x00,0x00,0x02,0x0D,0xB1,0xB2,0x00,0x00,0x00,
0x01,0x73,0x52,0x47,
0x42,0x00,0xAE,0xCE,0x1C,0xE9,0x00,0x00,0x00,0x06,0x62,0x4B,0x47,0x44,0x00,0xFF,
0x00,0xFF,0x00,0xFF,
0xA0,0xBD,0xA7,0x93,0x00,0x00,0x00,0x09,0x70,0x48,0x59,0x73,0x00,0x00,0x0B,0x13,
0x00,0x00,0x0B,0x13,
0x01,0x00,0x9A,0x9C,0x18,0x00,0x00,0x00,0x07,0x74,0x49,0x4D,0x45,0x07,0xDF,0x05,
0x0A,0x0E,0x01,0x20,
0xA0,0x0A,0x57,0xCD,0x00,0x00,0x00,0x19,0x74,0x45,0x58,0x74,0x43,0x6F,0x6D,0x6D,
0x65,0x6E,0x74,0x00,
0x43,0x72,0x65,0x61,0x74,0x65,0x64,0x20,0x77,0x69,0x74,0x68,0x20,0x47,0x49,0x4D,
0x50,0x57,0x81,0x0E,
0x17,0x00,0x00,0x00,0x28,0x49,0x44,0x41,0x54,0x08,0xD7,0x4D,0x8B,0x41,0x0E,0x00,
0x30,0x08,0xC2,0xA8,
0xFF,0xFF,0x73,0x3D,0x18,0xDD,0xB8,0x34,0x94,0x40,0x12,0x35,0x9B,0x52,0x81,0xD7,
0x67,0x3F,0x55,0x83,
0x53,0xFC,0x67,0xA0,0x01,0x8E,0xCE,0x0F,0x06,0x6E,0x28,0x44,0x78,0x00,0x00,0x00,
0x00,0x49,0x45,0x4E,
0x44,0xAE,0x42,0x60,0x82
};
А в функции tcp_http_mt добавил реакцию на запрос картинки. Т.е. при ответе к HTTP заголовку приклеиваем сырые данные картинки.
CODE
int32_t tcp_http_mt(uint8_t sn, uint8_t* buf, uint16_t port)
{
int32_t ret;
uint32_t size = 0;
char *url,*p;
switch(getSn_SR(sn))
{
case SOCK_ESTABLISHED :
if(getSn_IR(sn) & Sn_IR_CON)
{
setSn_IR(sn,Sn_IR_CON);
}
if((size = getSn_RX_RSR(sn)) > 0)
{
if(size > DATA_BUF_SIZE)
{
size = DATA_BUF_SIZE;
}
ret = recv(sn,buf,size);
HTTP_reset(sn);
if(ret <= 0)
{
return ret;
}
url =(char*) buf + 4;
if((http_state[sn]==HTTP_IDLE)&&(memcmp(buf, "GET ", 4)==0)&&((p = strchr(url, ' ')))) // extract URL from request header
{
*(p++) = 0; //making zeroed url string
sentsize[sn]=0;
if(strcmp(url,"/")==0)
{
strcpy((char*)buf,http_200);
strcat((char*)buf, http_server);
strcat((char*)buf,"Content-Type: text/html; charset=windows-1251\r\n");
strcat((char*)buf,"Cache-Control: no-cache\r\n");
strcat((char*)buf,http_connection_close);
strcat((char*)buf, http_header_end);
strcat((char*)buf,site);
size=strlen((char*)buf);
http_state[sn]=HTTP_SENDING;
}
if(strcmp(url,"/test.png")==0)
{
strcpy((char*)buf,http_200);
strcat((char*)buf, http_server);
strcat((char*)buf,"Content-Type: image/png\r\n");
//
strcat((char*)buf,"Content-Lenght: 205\r\n");
strcat((char*)buf,"Connection: keep-alive\r\n");
strcat((char*)buf,"Keep-Alive: timeout=20\r\n");
strcat((char*)buf,"Accept-Ranges: bytes\r\n");
strcat((char*)buf,"Cache-Control: no-cache\r\n");
strcat((char*)buf, http_header_end);
strcat((char*)buf,Img);
size=strlen((char*)buf);
http_state[sn]=HTTP_SENDING;
}
}
/*
Отправляем данные пока размер отправленных данных sentsize[sn] не сравняется с размером данных size
которые мы подготовили для отправки
... вроде бы...
*/
if(http_state[sn]==HTTP_SENDING)
{
while (sentsize[sn] < size)
{
//DATA_BUF_SIZE
ret = send(sn,buf,size);
if(ret < 0)
{
close(sn);
return ret;
}
sentsize[sn] += ret; // Don't care SOCKERR_BUSY, because it is zero.
}
HTTP_reset(sn);
disconnect(sn);
}
}
break;
case SOCK_CLOSE_WAIT :
HTTP_reset(sn);
if((ret=disconnect(sn)) != SOCK_OK)
return ret;
break;
case SOCK_INIT :
HTTP_reset(sn);
if( (ret = listen(sn)) != SOCK_OK) return ret;
break;
case SOCK_CLOSED:
HTTP_reset(sn);
if((ret=socket(sn,Sn_MR_TCP,port,0x00)) != sn)
return ret;
break;
default:
HTTP_reset(sn);
break;
}
return 1;
}
{
int32_t ret;
uint32_t size = 0;
char *url,*p;
switch(getSn_SR(sn))
{
case SOCK_ESTABLISHED :
if(getSn_IR(sn) & Sn_IR_CON)
{
setSn_IR(sn,Sn_IR_CON);
}
if((size = getSn_RX_RSR(sn)) > 0)
{
if(size > DATA_BUF_SIZE)
{
size = DATA_BUF_SIZE;
}
ret = recv(sn,buf,size);
HTTP_reset(sn);
if(ret <= 0)
{
return ret;
}
url =(char*) buf + 4;
if((http_state[sn]==HTTP_IDLE)&&(memcmp(buf, "GET ", 4)==0)&&((p = strchr(url, ' ')))) // extract URL from request header
{
*(p++) = 0; //making zeroed url string
sentsize[sn]=0;
if(strcmp(url,"/")==0)
{
strcpy((char*)buf,http_200);
strcat((char*)buf, http_server);
strcat((char*)buf,"Content-Type: text/html; charset=windows-1251\r\n");
strcat((char*)buf,"Cache-Control: no-cache\r\n");
strcat((char*)buf,http_connection_close);
strcat((char*)buf, http_header_end);
strcat((char*)buf,site);
size=strlen((char*)buf);
http_state[sn]=HTTP_SENDING;
}
if(strcmp(url,"/test.png")==0)
{
strcpy((char*)buf,http_200);
strcat((char*)buf, http_server);
strcat((char*)buf,"Content-Type: image/png\r\n");
//
strcat((char*)buf,"Content-Lenght: 205\r\n");
strcat((char*)buf,"Connection: keep-alive\r\n");
strcat((char*)buf,"Keep-Alive: timeout=20\r\n");
strcat((char*)buf,"Accept-Ranges: bytes\r\n");
strcat((char*)buf,"Cache-Control: no-cache\r\n");
strcat((char*)buf, http_header_end);
strcat((char*)buf,Img);
size=strlen((char*)buf);
http_state[sn]=HTTP_SENDING;
}
}
/*
Отправляем данные пока размер отправленных данных sentsize[sn] не сравняется с размером данных size
которые мы подготовили для отправки
... вроде бы...
*/
if(http_state[sn]==HTTP_SENDING)
{
while (sentsize[sn] < size)
{
//DATA_BUF_SIZE
ret = send(sn,buf,size);
if(ret < 0)
{
close(sn);
return ret;
}
sentsize[sn] += ret; // Don't care SOCKERR_BUSY, because it is zero.
}
HTTP_reset(sn);
disconnect(sn);
}
}
break;
case SOCK_CLOSE_WAIT :
HTTP_reset(sn);
if((ret=disconnect(sn)) != SOCK_OK)
return ret;
break;
case SOCK_INIT :
HTTP_reset(sn);
if( (ret = listen(sn)) != SOCK_OK) return ret;
break;
case SOCK_CLOSED:
HTTP_reset(sn);
if((ret=socket(sn,Sn_MR_TCP,port,0x00)) != sn)
return ret;
break;
default:
HTTP_reset(sn);
break;
}
return 1;
}
В итоге запрос на картинку в браузере идет, но сервер её не отдает.
Нажмите для просмотра прикрепленного файла
При этом браузер получает заголовки ответа. Но самого изображения нет.
От безысходности установил HTTP снифер Wireshark. Удалось выяснить, что при передаче картинки сервер отправляет только её первые 8 байт. И на этом всё.
Нажмите для просмотра прикрепленного файла
3-й день бьюсь. Не понимаю почему так происходит. Или где то функцию отправки надо изменить или с размером передаваемых данных что то не то. Гуглил и по W5100 и по W5200 и по W5500, но именно как передать изображение не нашел.
Нажмите для просмотра прикрепленного файла
Может есть у кого какие идеи?