W5100 картинки на карте памяти

kpachbiy
Offline
Зарегистрирован: 08.11.2015

Здравствуйте! 

Хочу сделать веб-сервер, который будет управлять светодиодами.

index.htm удалось разместить на SD-карте, а вот картинки выводить не выходит.

Посмотрел много решений, копировал код себе, но что-то никак не показыавется картика!

В 40 строке в Сериал приходит подтверждение, что клиент запросил картинку, а сервер нашёл её на карте памяти.

Возможно, ошибка в 41-43 строках.

 

 

EthernetClient client = server.available();
if (client) {
    while (client.connected()) {
		if (client.available()) {
		  char c = client.read();
		  
		  if (readString.length() < 30) {
			readString.concat(c); }
			if (c == '\n') {
				//Проверяем строку от клиента и моргаем светодиодами
				if(readString.indexOf("bedLevel1=1") >=0) {
					digitalWrite(bedPin1, HIGH);
					BEDLEDON1 = true;
				}else if(readString.indexOf("bedLevel1=0")>=0){
					digitalWrite(bedPin1, LOW);
					BEDLEDON1 = false; 
				}else if(readString.indexOf("bedLevel2=1") >=0) {
					digitalWrite(bedPin2, HIGH);
					BEDLEDON2 = true;
				}else if(readString.indexOf("bedLevel2=0")>=0){
					digitalWrite(bedPin2, LOW);
					BEDLEDON2 = false; 
				}
				
				//отправляем HTML страницу с SD карты
				client.println("HTTP/1.1 200 OK");
				client.println("Content-Type: text/html");
				client.println();
				webFile = SD.open("index.htm");
				if (webFile) {
					while(webFile.available()) {
						client.write(webFile.read());
					}
					webFile.close();
				}
				//узнаём, запросил ли клиент картинку, если да, отправляем
				if (readString.indexOf("GET /images/on.png HTTP/1.1") >=0) {
					webFile = SD.open("images/on.png");
					if(webFile){
						Serial.println("file ok"); // подтверждение картинки
						client.println("HTTP/1.1 200 OK");
						client.println("Content-Type: image/gif");
						client.write(webFile.read());
					}
					webFile.close();
				}
				readString="";
				client.stop();
			}
		}
    }
}

 

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

Любой файл нужно отдавать побайтно. У вас, насколько я понял - попытка отдать его за раз (фактически - первый байт). Сделайте так-же, как отдаете index.htm.

kpachbiy
Offline
Зарегистрирован: 08.11.2015

Сделал!

Картинка весит 149 байт, но страница очень долго думает и выводится без картинки.

				if (readString.indexOf("GET /images/on.png HTTP/1.1") >=0) {
				webFile = SD.open("images/on.png");
				if(webFile){
					Serial.println(webFile.size());
					client.println("HTTP/1.1 200 OK");
					client.println("Content-Type: image/gif");
					while(webFile.available()) {
						client.write(webFile.read());
					}
					webFile.close();
				}
				
					
			}

 

kpachbiy
Offline
Зарегистрирован: 08.11.2015

Судя по логам в хроме, картинку браузер получает, и даже определяет её размер, но всё равно не отображает

kpachbiy
Offline
Зарегистрирован: 08.11.2015

Разобрался, вот так заработало!

if (readString.indexOf("GET /images/off.png HTTP/1.1") >=0) {
				client.println("HTTP/1.1 200 OK");
				client.println();  // забыл эту строку
				webFile = SD.open("images/off.png");
			}