Хочу добавить на html страницу картинку. Для теста сделал PNG размером 5х5 пикселей. Добавил её в html код:
Код: Выделить всё
<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>Код: Выделить всё
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
};Спойлер
Код: Выделить всё
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;
}От безысходности установил HTTP снифер Wireshark. Удалось выяснить, что при передаче картинки сервер отправляет только её первые 8 байт. И на этом всё. 3-й день бьюсь. Не понимаю почему так происходит. Или где то функцию отправки надо изменить или с размером передаваемых данных что то не то. Гуглил и по W5100 и по W5200 и по W5500, но именно как передать изображение не нашел. Кто чем может.


