ethernet shield + web access
- Войдите на сайт для отправки комментариев
Втр, 24/05/2011 - 12:26
День добрый!
Пишу курсовой по удаленному управлению на основе Arduino + ethernet shield
Перерыл весь инет, но нигде не могу найти как ограничить доступ к веб морде.
Есть предложения с ограничением по IP, с защитой по паролю указанному в коде странички
и доступному для чения по "View Page Source" :-( т.е. расчитанному на дурака
Хотелось бы что-то хоть чуть серьезнее, ну хотя бы типа htpasswd в Apache
Помогите, может кто сталкивался
Спасибо
Можно подробнее? Как сделана веб-морда? Сервер на arduino?
Сервер должен отдать http-ответ с заголовком WWW-Authenticate. Тогда браузер выдаст своё стандартное окно авторизации. После этого произойдёт повторный http-запрос c заголовками, содержащими имя и пароль.
Как указать этот заголовок ?
Как указать этот заголовок ?
В поисковике первые пример по-моему выглядит доходчиво, хоть и на php linux.yaroslavl.ru/docs/www/php/t_php/http-auth.html
Я весь гугл исколисил в долю и поперёк ,такие примеры пробывал но ничего не вышло ,как именно для arduino написать заголовок . вот начало моего скетча:
//--------------------------HTML------------------------
client.println("HTTP/1.1 200 OK");
//----------------------------------------------
client.println("Content-Type: text/html");
client.println();
client.print("<HEAD>");
client.print("<meta http-equiv=\"refresh\" content=\"x; url=x.x.x.x\">");
client.print("<html><head>");
Я весь гугл исколисил в долю и поперёк ,такие примеры пробывал но ничего не вышло ,как именно для arduino написать заголовок . вот начало моего скетча:
я вам ссылку дал, вы ее даже не открыли, заголовок должен быть другой на PHP так выглядит:
header("WWW-Authenticate: Basic realm=\"My Realm\"");
header("HTTP/1.0 401 Unauthorized");
Извинте за глупый вопрос, а что в езернет шилде есть встроенный хттп-сервер?
2 ТС:
вот так надо, как я понимаю:
Извинте за глупый вопрос, а что в езернет шилде есть встроенный хттп-сервер?
как бы там есть TCP/IP, а на нем можно хоть web, хоть smtp и т.д.
я брал пример вэб сервера из библиотеки - работает, только я купил не стандартный шилд, а www.dealextreme.com/p/ethernet-shield-v1-1-for-arduino-66908
к ней нужна своя библиотека, по ссылке в форуме есть информация о библиотеке
Да вообщем-то HTTP сервера нет. Правдо не понятно что вы понимаете под словом HTTP-сервер.
Вообщем-то HTTP сервер это что-то что отвечает, если его спрашивают, "магическими словами" описанными в стандарте HTTP. Типа "HTTP/1.0 401 Unauthirized" - пример таких магических слова. Если так умеет отвечать ваш скетч - значит он и есть HTTP сервер. А Ethernet Shild только обеспечивает связь между вашим скетчем-сервером и клиентом-браузером.
HTTP это "все лишь протокол", язык. http://www.w3.org/Protocols/rfc2616/rfc2616.html
Если в скетче реализовать ответы описаны в стандарте FTP, то он будет FTP-сервером и т.д. и т.п.
Научить свой скетч "прикидываться HTTP сервером" можно двумя путями:
1. Читать стандарт и реализоваться его серверную часть, по мере надобности.
2. Поставить что-то типа proxy-снифера. Например http://www.fiddler2.com/fiddler2/, зайни на какой-нибудь сайт и посмотреть "что шлет ваш браузер" и "что ему отвечают". Вот это "что ему отвечают" и нужно повторить в скетче.
Кстати fiddler2 пригодится в любом случае. Смотреть что браузер шлет ардуине и что она отвечает - тоже будет нужно.
Я весь гугл исколисил в долю и поперёк ,такие примеры пробывал
Вы не поверите, но тот пример что вы привели тоже посылает хедер:
это и есть посылка хедера типа "Content-Type". Он сообщает браузеру что "дальше я буду передавать текстовые или html данные". Хедер это не что-то "очень умное". Это обыкновенная строчка определенного вида.
А Zveruga дал вам пример как послать хедер "требуется авторизация" и вернуть http-статус "в доступе отказано".
Кстати, на всякий случай. Преждем чем привинчивать "защиту", у вас вообще семл web-сервера уже работает, нормально отвечает?
И еще, многие (если не большинство) сайтов используют авторизацию через куки, а не через хедеры (хотя это более кошерно, но пугает пользователя). Хедеры больше используются для сервисов (грубо говоря когда нужно програмно обратится к защищеному сервису).
Если же "по ту сторону браузера" сидит человек, то часто делают примерно такую логику:
Но нужно помнить, что все подобные защиты "весьма условны". Сам протокол Http (и через куки, и через хедеры) шлет логины-пароли в открытом виде. Перехватить/подделать их - совершенно не проблема. Более защищеный вариант это https протокол (это тот же http, только зашифрованый публичными-приватными ключами). Но вряд ли вы сможете его реализовать. К тому же есть большие сомнения что ресурсов ардуины хватит на него. Так что делать на арудине "удаленное управление ядерной кнопкой" - точно не стоит. :) Даже в качестве курсовой.
как бы там есть TCP/IP, а на нем можно хоть web, хоть smtp и т.д.
я брал пример вэб сервера из библиотеки - работает, только я купил не стандартный шилд, а www.dealextreme.com/p/ethernet-shield-v1-1-for-arduino-66908
к ней нужна своя библиотека, по ссылке в форуме есть информация о библиотеке
Опять таки не понял. Есть библиотека, которая импортируется в скетч и на андруине (или на самом езернет-шилде? там есть каокй-то микроконтроллер?) поднимается вебсервер? А откуда он (этот сервер) берет контент?
Да вообщем-то HTTP сервера нет. Правдо не понятно что вы понимаете под словом HTTP-сервер.
Вообщем-то HTTP сервер это что-то что отвечает, если его спрашивают, "магическими словами" описанными в стандарте HTTP.
Ну да, именно так я и понимаю хттп-сервер, разве что дополню - слушает определенный тсп порт. А что, дейстительно реально в эту маленькую микросхемку всунуть хттп-сервер?
>поднимается вебсервер? А откуда он (этот сервер) берет контент?
шилд и библиотека выполняют функцию связи между http-сервером и браузером-клиентом.
http-сервером, в данном случае, является сам скетч который должны написать вы. Откуда ваш скет будет брать контент - это ваше дело. Из флеша, с SD карты, с датчиков или его ответы будут "жестко закожены" в самом скетче - решать вам.
Вообщем web-сервера на арудуине нет. Его должны написать вы. Или ждать-искать пока "кто-то напишет". Но "универсальный web-сервер" вряд ли кто-то будет писать под нее.
Примеры "узкоспециализированных" web-серверов есть в семплах библиотеки. Cкетч WebServer.pde на все вопросы отвечает страничкой состояния аналоговых пинов ардуины, или BarometricPressureWebServer.pde который умеет отвечать страничкой с данными с барометрического датчика.
Если вы хотите что-то более интелектуальное. Вроде клиент попросил страницу с именем page1.htm - отдать такой контент, если с page2.htm - отдать другой. То реализация этого целиком ложится на ваши плечи. Нужно самому анализировать запрос от клиента, подготавливать данные и отвечать. В соотвествии стандартам http и html.
>дейстительно реально в эту маленькую микросхемку всунуть хттп-сервер
А что нереального в том что-бы написать код который формирует и отправляет несколько обыкновенных текстовых строк?
У вас видимо "ассоциативная путаница" с серверами типа apache, iis и т.п. Это "универсальные монстры". Это частный случай реализации http сервера. Их задача - убрать много черновой работы с плеч web-программиста. Вопросы типа "распарсить запрос", "проверить права доступа", "запустить процесс", "интерпретировать скрипт", "передать запрос соответсвующему хендлеру" и т.п. они берут на себя. web-программисту остается только писать логику уже своего приложения, абстракциями более выского уровня, меньше заморачиваясь на "технические детали".
Тут просматривается некий аналог с операционными системами. Вас же не удивляет что у нас на ардуине нет "windows/linux". А скетчи запускаются :)
Такого монстра "на ардуине" никто не поднимет (ну разве что когда выйдет ее новая версия на ARM32, но и то непонятно "зачем"?).
А вот что-то "узкоспециализированное", то что умеет, например только "включить/выключить пин" - это написать вполне реально. Принципиальных отличий от скетчей которые управляются через обыкновенный Serial порт - нет. Принцип тот же самый: "пришла какая-то строка", нужно ее разобрать, понять "что она означает", выполнить эту команду и ответить строкой.
Спасибо, стало понятней.
Меня просто смущает, что когда я пишу простенький код из 10 строк, то у меня получается скетч на 5кб из 32х возможных, вот и удивился как же можно втусовать хоть самый простенький веб-сервер, да еще и с минимальным контентом в эти 32кб.
>получается скетч на 5кб из 32х возможных
Это расплата за "низкий порог входа". Когда вы подключаете библиотеки они "кушают" место используете вы их целиком или только одну функцию. Да и за "высокоуровневость" C++ тоже платить приходится. Поэтому "истинные" микроконтрольщики с таким презрением и относятся к ардуине. Поэтому они и любят asm. Там под контролем каждый байт. Но и вещей которые "нужно учитывать самому" намного больше.
>хоть самый простенький веб-сервер, да еще и с минимальным контентом в эти 32кб.
Ну если весь контент эта две странички из пары строчек, то "влезет". Если больше, то, вы правы, конечно контент прийдется хранить где-то "снаружи". Где-то видел проект, где .html файлы хранятся на SD карточке и ардуина отдает их по http. Вообщем-то это уже можно назвать "сервером" :)
Но даже если бы памяти у вас было "побольше" (можно и чип пожирнее купить), то писать сайт на ардуине с более-менее серьезной логикой, на C++ - это головой подвинутся можно будет. И очень сложно-дорого в поддержке. Поэтому даже на PC сайты на C++ пишут только маргиналы. Есть более высоуровневые языки: C#, php, питон и т.п.
Поэтому если нужен "взрослый" веб-сайт, то есть два выхода:
1. Делаем его на PC, вся логика на PC, а ардуина только "мост для управления железом".
2. Берем ARM процессор, на котором можно уже запустить какой-нибудь линукс, там поднимаем, например, апач и пишем под него на php, java, питоне....
Поэтому "истинные" микроконтрольщики с таким презрением и относятся к ардуине. Поэтому они и любят asm. Там под контролем каждый байт. Но и вещей которые "нужно учитывать самому" намного больше.
Это значит что там надо писать на ассемблере?
Ну никаких "там" и "нужно" нет. Ардуина это обыкновенный микроконтроллер amtel, в который предварительно зашили бутлоадер, что-бы можно было заливать в нее прошивки без программатора. И все.
Если хотите можете и под нее писать на асемблере, на C. Точно так же как можно купить голый кристал и в него загонять скетчи ардуины.
В контроллер вы шьете "скомпилированную прошивку". Создает ее компилятор. Из ваших исходных кодов. На чем вы написали код - дело вашего вкуса. Если на asm, то итоговая прошивка будет содержать только команды которые вы написали, ни тактом больше. Фактически прошивка это и есть ASM, только в машинных кодах. Но и заботится обо всем нужно самому. Что-то большое на asm писать трудно, но когда ресурсов очень мало или нужно что-то очень real-time, нужен "полный контроль" - то выхода нет.
Если логики много, то приходится переходить на C. Более высокоуровневый. Но желательно представлять как компилятор будет переводить-оптимизировать это C в машинные коды. За большую "высокоуровневость" приходится платить ресурсами. Среди профи "что лучше" бесконечный холивары идут: на чем пишут "истинные", на C или на ASM. (но, как правило требуется знание и того и другого).
Для чайников взяли еще более высокоуровневый язык C++. Написали некоторое количество библиотек для популярных задач, которые скрывают часть "технической кухни". Но соотвественно "растояние" между "исходным кодом" и "командами которые в реальности выполняет процессор" еще больше увеличилось. И "накладные расходы". Вот эту связку "компилятор с C++ плюс библиотеки" и назвали Ардуиной :)
Ну и сделали некоторую стандартизацию по "железу". Где сколько пинов, размер плат (что-бы шилды подходили от разных производителей). Но, по сути, это просто "восьмибитный микроконтроллер Amtel".
Так ктонибудь может дать кусок рабочего скетча с запросом логина и пороля ? Сам сервер у меня довно без всяких проблем работает,просто через него упровляется всё в моём доме ,хотелось бы его запоролить,но не фига не получается ,браузер не реагирует на заголовок никак.Если кто может помогите.
leshak, спасибо, стало понятней.
tip777, вам выше советовали - поставьте снифер и проследите чтоб заголовки от сервера шли правильные. Может у вас там идет код ответа 200, а потом строкой ниже 401, вот он и не понимает. Типа так
client.println("HTTP/1.1 200 OK");
client.println("HTTP/1.0 401 Unauthorized");
А снифер четко покажет какой идет заголовок. Если понятней не стало - выкладывайте сюда заголовки которые шлет ардуина, посмотрим сообща.
один из вариантов
client.println("WWW-Authenticate: Basic realm=\"Welcome to my Arduino uno\"");
client.println("HTTP/1.0 401 Unauthorized");
client.println(("Authorization Required"););
client.println("<html><head></head><body>");
client.println("<h2>Welcome to my Arduino uno</h2>");
пробывал по разному но браузер или вообще молчит или не реагирует на заголовок
1. Поставте таки сниффер. Выше давал ссылку. Посмотрите что в реальности приходит от ардуины, а не "я думаю она посылает то-то". Посмотрите что именно посылает браузер.
2. Почитайте:en.wikipedia.org/wiki/Basic_access_authentication там есть примеры "что послыает клиент" и "что отвечает сервер". Как минмум видно, что в примерах вначале послается статус "HTTP 401", а потом "WWW-Authenticate" хедер. У вас же наоборот.
Ну это то что вы ему говорите слать, а снифер показал бы что он реально шлет. Из того что вы показали, пока что не вижу перевода строки между заголовком и собственно телом (<html>...)
Вот так не пробовали:
А уже если придет в запросе хидер Authorization, вот такого вида:
где cXFxOmFhYQ== это base64 кодированная пара логин:пароль, тогда уже шлите ваши <html> и пр.
Огромное СПАСИБО пароль запрашиает,теперь как зделать обработку логина и пароля
Насколько я знаю в ардуино есть какая-то библиотека для работы со строками, через нее надо распарсить запрос, получить строку начинающуюся с Authorization, вырезать из нее то что идет после Authorization: и до конца строки, убрать начальные и конечные пробелы на вский и сравнивать полученное с закодированным в base64 вашим логином-паролем разделенным двоеточием. Например в моем примере выше это qqq:aaa
ну проверить если в запросе есть строка "cXFxOmFhYQ==" (ваши логин пароль в base64 энкодинге, в данном случае это энкоженная строка ""qqq:aaa"), то отдавать ваш Html, если нет, то вернуть HTTP статус 403 - типа "мы вас поняли, но в доступе вам отказано". (ну и вообще погуглить, почитать про http статусы, узнать что какой означает).
Закодировать, ваш логин пароль можно, набрав в гугле "base64 online encoder". Например тут: base64-encoder-online.waraxe.us/
Тогда в браузере вы будете вводить его "почеловечески", а в ардуине сравнивать ужа закодированный вариант.
>Насколько я знаю в ардуино есть какая-то библиотека для работы со строками
http://arduino.cc/en/Reference/StringObject
"вырезать" и т.п. не обязательно, мы же не банк программим. Нам достаточно узнать что "строка присутсвует".
Как-то так
"вырезать" и т.п. не обязательно, мы же не банк программим. Нам достаточно узнать что "строка присутсвует".
Да, согласен, собственно нам же не надо раскодировать строку, так что можно не вырезать, достаточно проверить совпадение.
ТС: так а что за проект? Вы б описали как и что, интересно же - заинтриговала фраза "через него управляется все в моем доме"
А можете сделать "еще тупее" (хотя и чуть -чуть не по стандарту). Если пароль не совпадает, тогда возвращать http 401. В этом случае при неправильном пароле он просто будет спрашиватся еще раз.
Тогда не нужно будет делать проверки на наличие аудентификационных хедеров в запросе и проч. Вообщем тупо до горя: если пароль в запросе есть - выводить html, если нет - спрашиваем.
ничего загадочного ,уповляется свет,температура отопления,температура пола,кондиционер,ворота,калитка,температура улица дом полы и тд тп,на днях добил отправку sms, но не как не могу победить с логином и паролем
самое смешное, что топик-стартера вообще нет в теме :)
самое смешное, что топик-стартера вообще нет в теме :)
Что смешного
ругается на if(clientRequestStr.indexOf("cXFxOmFhYQ==")>-1)
нужна отдельная библиотека для string ?
Смех бывает саркастически. Человек (prokupets) задал вопрос, люди тратят время, отвечают, а он "забил на это все". Немного некрасиво.
Слава богу, что вам это пригодилось. И может кому-то следующему поможет.
Так что, заработала у вас проверка пароля?
Смех бывает саркастически. Человек (prokupets) задал вопрос, люди тратят время, отвечают, а он "забил на это все". Немного некрасиво.
Слава богу, что вам это пригодилось. И может кому-то следующему поможет.
Так что, заработала у вас проверка пароля?
браузер запрашивает логин и пороль но оброботку пароля и логина ещё не добил
>>ругается на if(clientRequestStr.indexOf("cXFxOmFhYQ==")>-1)
А как именно ругается? говорит что "незнаю имени clientRequestStr"?
Так это нормально. Туда нужно подствить то имя переменной в которой ваш скетч хранит запрос клиента. Я же не знаю как у вас эта переменная называется, вот и просто "придумал подходящие имя". Замените его на свое.
Эта переменная должна быть типа String (именно с большой буквы, объект arduino.cc/en/Reference/StringObject). Если вы данные вычитываете от клиента "посимвольно", то вначале их нужно будет собрать "в одну строку".
>>ругается на if(clientRequestStr.indexOf("cXFxOmFhYQ==")>-1)
А как именно ругается? говорит что "незнаю имени clientRequestStr"?
Так это нормально. Туда нужно подствить то имя переменной в которой ваш скетч хранит запрос клиента. Я же не знаю как у вас эта переменная называется, вот и просто "придумал подходящие имя". Замените его на свое.
Эта переменная должна быть типа String (именно с большой буквы, объект arduino.cc/en/Reference/StringObject). Если вы данные вычитываете от клиента "посимвольно", то вначале их нужно будет собрать "в одну строку".
уже дошло спасибо
А можете сделать "еще тупее" (хотя и чуть -чуть не по стандарту). Если пароль не совпадает, тогда возвращать http 401. В этом случае при неправильном пароле он просто будет спрашиватся еще раз.
Тогда не нужно будет делать проверки на наличие аудентификационных хедеров в запросе и проч. Вообщем тупо до горя: если пароль в запросе есть - выводить html, если нет - спрашиваем.
это проверка только пароля?
Не совсем понял вопрос.
Это проверка "послали нам правильный пароль", если да то "пошла обычная логика вывода страницы", если нет, если нет - то "запросить пароль".
А что вы еще хотите проверять?
Не совсем понял вопрос.
Это проверка "послали нам правильный пароль", если да то "пошла обычная логика вывода страницы", если нет, если нет - то "запросить пароль".
А что вы еще хотите проверять?
логин и пароль
на днях добил отправку sms
на днях добил отправку sms
GSM шилд,стандартные AT команды,
А где брали и по чем, если не секрет.
>>А что вы еще хотите проверять?
>логин и пароль
1. Вы можете это сами проверить (если заработало): наберите направильный логин и посмотрите "что будет".
2. Да, выше вам писали, что энкоженная строка, содержит в себе и логин и пароль (qqq:aaa). Следовательно в этом if вы проверяете и то и другое. Но есть "нюанс". Из-за такой "упрощенной проверки", логин становится "чувствительным" к большим-маленьким буквам. Кроме того, все пароли которые "начинается как ваш, но длиней его" - тоже будут подходить. То есть в данном примере подойдут пароли "aaa","aaa1","aaa12","aaab" и т.п.
Если это "напрягает", то прийдется-таки выискивать строку, обрезать (как писали выше), делать base64 декодинг и проверять логин/пароль уже "в открытом виде".
Хотя... если браузер после посылки энкоженного пароля вставляет перевод строки, то "более длинные пароли" не подойдут. Возможно я "перебдел" :)
ничего загадочного ,уповляется свет,температура отопления,температура пола,кондиционер,ворота,калитка,температура улица дом полы и тд тп,на днях добил отправку sms, но не как не могу победить с логином и паролем
интересная тема, что в качестве исполнительных устройств?
интересная тема, что в качестве исполнительных устройств?
arduino mega + GSM отвечает за sms (сработка различных датчиков)
arduino mega + internet + lcd winstar 240x128 (упровление всем описанным выше)
arduino nano взамен родных мозгов кондиционера
ну и всякой мелочёвки с ebay (модуль на 16 релюх, eeprom,ds1302 и тд и тп)
А где брали и по чем, если не секрет.
http://jt5.ru/components/M04-FL/
вечером оплотил утром принесли домой
Почему arduino не видет пароля,readString вывожу в com port все команды видны ,но когда отпровляю логи пароль
в readString проходит только GET / HTTP/1.1 ?