W5100+SD вывод картинки из SD в браузер

inspiritus
Offline
Зарегистрирован: 17.12.2012

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

собственно в заголовке и сформулирован вопрос

конечно можно подсунуть браузеру картинку с внешнего ресурса

Но хочется подсовывать картинки из SD- шки 

четто искал искал и ничего не нашел, все заморачиваются только выводом на разные дисплеи.

кинте ссылкой , кто встречал тему

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

Вывод картинки в браузер ничем не отличается от вывода в браузер html-файла.

Ваш Ардуино-сервер, получив и распарсив запрос, просто отдает клиенту (браузеру) то, что он просит.

inspiritus
Offline
Зарегистрирован: 17.12.2012

Спасибо конечно, ответ очевиден, дьявол как всегда в мелочах кроется.

Вопрос в том, как осуществить пересылку файла с SD в клиентпринт или клиентврайт, в каком формате должен быть файл. 

И собственно если кто то встречал примеры просьба кинуться ссылкой, или поисковым контекстом, мне нечего найти не удалось по этому вопросу.

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

Дьявол можент крыться в вашем ТЗ. А так - никаких серьезных нюансов.

Если конечно мы говорим об одном и том-же.

Гриша
Offline
Зарегистрирован: 27.04.2014

Gippopotam пишет:

Дьявол можент крыться в вашем ТЗ. А так - никаких серьезных нюансов.

Если конечно мы говорим об одном и том-же.

карты таро говорят: так-так-так... похоже нужна ссылка на ресурс, где обсуждают пересылку данных с SD в браузер....

я не встречал...

но, вот передача данных в браузер и чтение с SD гдето было, правда это уже 2 разные темы :)

inspiritus
Offline
Зарегистрирован: 17.12.2012

хмм тогда какого нюанса не хватает ?

пытаюсь передать файл с SD в браузер, никак не соображу, как указать, что это картинка по аналогии с img src=

Только вот в качестве пути src  что указывать то, файловой системы то нет.

с print аутстринга проблем нет. С внешнего урла картинка тоже погружается без проблем, неужели с SD  это невозможно ?

          client1.println(F("<BODY bgcolor='white'>"));
                  client1.print(outstring);
                  myFile = SD.open("test1.gif");
          if (myFile) {
                        Serial.println("opened");
                        while (myFile.available()) {
                        client1.print(myFile.read());  //так выводится в браузер, как последовательность байтов ака символов
                                                   }
                      //client.println("<img src=тут сидит урл>");// так работает как положено
                        myFile.close();
                      }   
           Serial.println("closed");
          client1.println(F("</BODY>"));

результат тут , аутстринг заканчивается звездочкой

у меня есть дурное предчуствие, что на стороне браузера этот, фактически массив, должен принимать какой-нибудь javascript :)

или я вообще не в ту сторону смотрю, куда надо ?

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014

 

Хм...в книге по РНР и майсиквеле рассматривался вариант хранения аватаров в базе майсиквела в двоичном формате, для отображения там сначала передавали заголовок типа йа фото а потом массив данных

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

Не в тусторону смотрите.

Клиент обращается к серверу, с просьбой показать конкретный файл. Если имя файла не указано - тогда это имя принимается на усмотрение сервера, но обычно index.php, index.htm, index.html и т.д. Допустим вы (Ардуино) отдали клиенту файл index.htm. В этом файле встречается строка " img src=image.gif", тогда клиент снова обращается к Ардуино с просьбой отдать ему файл image.gif. И он (клиент) уже сам отобразит этот файл.

Задача сервера - отвечать на запросы клиента.

У вас скорее всего реализован частный случай - отдавать одну и туже информацию клиенту на любой запрос. Т.е. запрос клиента не разбирается (не парсится) а Ардуино реагирует на сам факт обращения.

Ваша задача - сделать парсинг GET-запросов. Т.е. вам нужно узнавать, какой именно файл просит клиент и этот файл уже отдавать.

inspiritus
Offline
Зарегистрирован: 17.12.2012

Запросы я парсю, именно так реализованы кнопки управления здесь

Хмм если я указал в BODY src=test1.gif то полагаю клиент ждет именно этот файл и он подхватывается по указанному в src локальному или внешнему пути. Но ведь в арде пути как такового нет

вариант client.print(myFile); и client.print("<img src=test1.gif>"); после открытия файла не прокатили

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

вариант в коде моего предыдущего поста  отсылает побайтово весь гиф, только вот клиент не понимает, что это картинка.

Насколько я понимаю в чистом html есть единственный способ запостить изображение - подать клиенту сигнал, что это картинка тэгом img

Или Вы имеете в виду что то вроде этого

из этого вот это :

         myFile = SD.open("test1.gif");         
          client1.println(F("HTTP/1.1 200 OK"));
          client1.println("Content-Type: image/gif");
          client1.println();
            byte cB[64];
           int cC=0;
    while (myFile.available())
       {
         cB[cC]=myFile.read();
         cC++;
       if(cC > 63)
        {
         client1.write(cB,64);
        cC=0;
        }
       }
   myFile.close();

прокатило, однако оно выволит картинку на отдельной странице

inspiritus
Offline
Зарегистрирован: 17.12.2012

ок, получилось

создаем  сервер по порту 1 и засылаем им

    myFile = SD.open("test1.gif");         
          client2.println(F("HTTP/1.1 200 OK"));
          client2.println("Content-Type: image/gif");
          client2.println();
            byte cB[64];
           int cC=0;
    while (myFile.available())
       {
         cB[cC]=myFile.read();
         cC++;
       if(cC > 63)
        {
         client2.write(cB,64);
        cC=0;
        }
       }
   myFile.close();
         delay(1);
          //stopping client
          client2.stop();

 

создаем сервер по порту 2 и засылаем им основную страницу :

          client1.println(F("HTTP/1.1 200 OK")); //send new page
          client1.println(F("Content-Type: text/html"));
          client1.println(F("<HTML>"));
          client1.println();
          client1.println(F("<HEAD>"));
          client1.println(F("<TITLE>Rectification monitoring system 1.4</TITLE>"));
          client1.println(F("<meta content=text/html charset=utf-8 />"));
          client1.println(F("</HEAD>"));
          client1.println(F("<BODY bgcolor='white'>"));
        client1.print(outstring);
        client1.print("<img style=-webkit-user-select: none src=http://77.37.208.83:8889/>");
         Serial.println("closed");
         client1.println(F("</BODY>"));          
         client1.println(F("</HTML>"));
         delay(1);
          //stopping client
          client1.stop();

тэгом img  ссылаемся на тот же IP с портом1 , где слушает сервер , отсылающий картинку, далее бравзер сам ее запрашивает и получает

результат по-прежнему тут  , щас только вот еще один порт проброшу через роутер...пробросил

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

Вы "Горе от ума" читали?

inspiritus пишет:

Хмм если я указал в BODY src=test1.gif то полагаю клиент ждет именно этот файл и он подхватывается по указанному в src локальному или внешнему пути. Но ведь в арде пути как такового нет

Что значит подхватывается? Клиент не умеет сам брать, он может попросить, а отдаст сервер.

Когда клиент видит код вставки картинки он посылает по указанному адресу, HTTP запрос, а сервер перешлет ему эту картинку, если это возможно.

Повторю - клиент пошлет еще один запрос (Ардуино увидит "new client"). И каждый раз будет посылать новый запрос, если ему нужно что-то "подхватить".

GraninDm
Offline
Зарегистрирован: 01.08.2013

Вот то, что нужно: https://github.com/ovidiucp/TinyWebServer

Есть видео http://www.youtube.com/watch?v=qZXKk6nCYuM

Я с помощью этой библиотеки делал http://robocraft.ru/blog/3126.html

У меня на google disk есть вторая версия своего проекта, если есть желание можете посмотреть.

TinyWebServer отдает любые файлы с флешки.

inspiritus
Offline
Зарегистрирован: 17.12.2012

То Gippopotam    спасибо, собственно это я и сделал в итоге.

То GraninDM спасибо.

Главной проблемой было непонимание того, что указывать в качестве пути в тэге img и как запрашиваемое в нем отдавать. В результате помог инструмент разработчика в хроме. Когда я отправил только картинку 

03 client2.println("Content-Type: image/gif");

то инструментом разработчика увидел, куда сформирован запрос на ее получение, что собственно и стало главной подсказкой.

 

GraninDm
Offline
Зарегистрирован: 01.08.2013

При использовании TinyWebServer ваш скетч будет в 5 раз меньше и понятнее.

inspiritus
Offline
Зарегистрирован: 17.12.2012

Кто помнит, как назывался топик, где человек выложил вебморду с каким то теплоузлом и накидаными на него значениями?

Там кажется еще можно было светики включать/выключать.

Radjah
Offline
Зарегистрирован: 06.08.2014

> #include <SD.h>

По идее и с SdFat должно завестись.

pastry777
Offline
Зарегистрирован: 16.01.2014

inspiritus пишет:

Кто помнит, как назывался топик, где человек выложил вебморду с каким то теплоузлом и накидаными на него значениями?

Там кажется еще можно было светики включать/выключать.

 

http://arduino.ru/forum/programmirovanie/arduinoethernethtml

inspiritus
Offline
Зарегистрирован: 17.12.2012

Спасибо, но ето не она, там фотка была выложена в инете и поверх нее выводились значения