GSM часть с основной частью общается через com port, в mege их хватает и кондицеонер общается через com
для пульта есть библиотека.
в чем актуальность упровления кондицеонером?
значит все-таки связка по проводам? я сам строю умный дом, основная его часть построена на z-wave, т.е. на беспроводной технологии. К ардуино пришел так как под некоторые задачи нет готовых устройств z-wave. В частности нет возможности управлять кондиционером. Сейчас прикручиваю шлюз из ethernet в IR, но он не может работать с кондиционерами так как у всех кондиционеров интерактивные дистанционные пульты.
Нужно включать-выключать как минимум так чтобы это мог делать контроллер умного дома. Я смотрю в сторону расширения умного дома за счет устройств на ардуине со связкой через Xbee/Zigbee. Но даже так не ясно как справиться с кондеем. Как в фильме Электроник "Урий, где у него кнопка???" )
Ну наверное потому что "что-то не так". Не обладая телепатическими способностями трудно ответит по другому на этот вопрос. Из того что вы написали трудно понять, кто,что, куда отправляет. Что вы ожидаете, и что у вас происходит.
Приведите код скетча который "вывожу все в компорт", "все команды" которые видны, что именно отправляет браузер, скетч который "работает неправильно"... попытаемся угадать причину (но, наверное, уже завтра).
P.S. К сожалению у меня Ethernet шилд на другом чипе, и другая библиотека юзается (кстати не такая удобная). Поэтому "написать готовый пример" для вас - затруднительно. Приходится "работать на слух". Будет время (не раньше воскресенья) попробую реализовать на своем, может тогда и ваш быстрее "запустить" получится.
Я занмаюсь ремонтом кондеев поэтому для меня это просто.я иза этого и выкинул родной контролер,ему надо
отсылать команды только чкрез пульт ,а так мы тулим туда arduino ,делаем из него простейши терморегулятор и шлём ему до кокой температуры охлождать или нагревать, но снагреванием алгоритм работы кондея чуть другой,но я обогревом не пользуюсь. Скондеями я кокретно на ТЫ
Я занмаюсь ремонтом кондеев поэтому для меня это просто.я иза этого и выкинул родной контролер,ему надо
отсылать команды только чкрез пульт ,а так мы тулим туда arduino ,делаем из него простейши терморегулятор и шлём ему до кокой температуры охлождать или нагревать, но снагреванием алгоритм работы кондея чуть другой,но я обогревом не пользуюсь. Скондеями я кокретно на ТЫ
насколько это сложно? если возможно - было бы очень занимательно посмотреть на схемотехнику и скетч.
вот бы прикрутить к кондиционеру zigbee и управлять им от умного дома
сложного не чего нету ,терморегулятор которому шлёте переменную с задонной температурой ,единственное придётся выкидовать родной контролер.с zigbee не имел дел.но если погуглить думаю вопрос можно решить
сложного не чего нету ,терморегулятор которому шлёте переменную с задонной температурой ,единственное придётся выкидовать родной контролер.с zigbee не имел дел.но если погуглить думаю вопрос можно решить
сколько в типичном кондее датчиков и цепей управления?
1. Пока вы не решили проблему с авторизацией, желательно сделать отдельный скетч. В которой никакой посторонней логики (обработка команд и проч.) кроме авторизации и простейшей Html странички типа "Ono Zarabotalo!!!" - нет. Когда заработает, тогда будете усложнять (или копировать авторизацию в свой "настоящий" скетч).
2.Немного странно выглядит строка
String readString = String(100); // string for fetching data from address
По всей видимости вы хотели, по аналогии с массивом, задать максимальную длину строки. Но, на самом деле, это тоже самое что написать String("100"). В данном случае "не смертельно" и мешать не должно, просто ко всем ваших хедерам будет впереди добавлятся префикс "100".
3. Теперь мысленно пройдите по своим ифам. Посмотрите что происходит: вы вычитали один символ. добавили его к readString. Проверили ""if HTTP request has ended" (кстати проверили неправильно, но об этом ниже), не зашли в этот if. Сделали проверку пароля, которая, естественно вернула false (пока вычитали-то только один символ), после чего вы сразу, не вычитывая все остальный символы, вернули браузеру ""HTTP/1.0 401 Unauthorized" и оборвали конекшн. Закончили loop(). И пошли его "по второму разу". Вычитали второй символ, попытались опять вернуть браузеру http 401, а так как он уже "не на связи" , то вас уже не слушает (а от пользователя опять требует пароль).
Что делать:
Первое.нужно проверять пароль и принимать решение выводит "нормальную страницу" или "http 401" уже после того как вычитали все хедеры. Внутри if-а ""if HTTP request has ended".
Второе. Проверка ""readString.length() < 100" - возможно лишняя. Тем более что все хедеры в сумме могут занимать и больше. Если пароля не будет в первых 100 символах, то вы его "никогда не увидите".
4. Вы неправильно проверяете признак ""HTTP request has ended". По вашему коду признаком является "перевод строки" ("\n"). То есть вы читаете только первую строку хедеров. Поэтому ничего кроме первой строки ""проходит только GET / HTTP/1.1 " вы в консоле и не видите (а браузер и того меньше). Правильным признаком окончания хедеров, является пустая строка. Не "перевод строки", а "строка содержащая только перевод строки". Посмотрите в примере к библиотеке семпл WebServer.pde, обратите внимание на переменную currentLineIsBlank и как они проверяют окончание хедеров.
if (c == '\n' && currentLineIsBlank) {....}
Кстати возможно замечательной идеей будет взять "за базу" этот скетч. И вначале попробовать к нему добавить авторизацию. Запихнуть проверку пароля внутрь этого if-а. А "вычитывание" добавить чуть раньше, после char c = client.read(); добавить readString = readString + c;
P.S. Не растраивайтесь. Рано или поздно вы его победите :)
P.S.S. При написание кода, желатолько тело if-ов, циклов, функций, отодвигать табуляциями вправо. Форматировать код. Тогда его и вам и другим читать легче. Видно "кто в кого вложен". Возможно вы запутались в логике именно поэтому "глазом трудно воспринимается".
М... сорри. Кажется с третим пунктом, по поводу того что "вы делаете проверку пароля вычитав только один символ" - я прогнал. Обманулся таки глаз. Подстветил редактором открывающие, закрывающие скобки и увидел что вы в правильном месте пароль проверяете, уже "после того как все хедеры получили" (вернее думаете что получили :) ).
Все остальное: "readString.length() < 100", "признак окончания хедеров" - вроде в силе.
Здравствуйте! А не подскажете, как сделать, чтобы доступ к серверу был через интернет? В смысле, подключил arduino через ethernet шилд к маршрутизатору. В локальной сети я могу зайти на него с любого устройства. А каким образов можно подключиться из внешней сети? спасибо!
Здравствуйте! А не подскажете, как сделать, чтобы доступ к серверу был через интернет? В смысле, подключил arduino через ethernet шилд к маршрутизатору. В локальной сети я могу зайти на него с любого устройства. А каким образов можно подключиться из внешней сети?
Общие требования: точка с внешним IP, на которую Вы сможете заходить снаружи. С этой точки должен быть "виден" Ваш arduino-сервер.
Это делается либо "внешний IP + проброс порта на маршрутизаторе", либо "поднятие туннеля со стороны маршрутизатора на любой подконтрольный Вам внешний сервер, а туда Ваш заход по ssh с маппингом портов из любой точки интернета"... С учетом того, что большинство современных маршрутизаторов поддерживают достаточное количество туннелей начиная от openvpn и заканчивая ipsec - второй вариант был бы более предпочтителен с точки зрения безопасности.
А можете сделать "еще тупее" (хотя и чуть -чуть не по стандарту). Если пароль не совпадает, тогда возвращать http 401. В этом случае при неправильном пароле он просто будет спрашиватся еще раз.
Тогда не нужно будет делать проверки на наличие аудентификационных хедеров в запросе и проч. Вообщем тупо до горя: если пароль в запросе есть - выводить html, если нет - спрашиваем.
if(clientRequestStr.indexOf("cXFxOmFhYQ==")>-1){ // проверяем есть правильный пароль в запросе
//--------------------------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>");
} else {
client.println("HTTP/1.0 401 Unauthorized");
client.println("WWW-Authenticate: Basic realm=\"Welcome to my Arduino uno\"");
client.println("");
client.println("Authorization Required");
}
leshak, скажите пожалуйста я правильно в clientRequestStr получаю данны?
char c = client.read();
if (clientRequestStr.length() < 30) {
clientRequestStr.concat(c);
}
Это ведь GET, а пароль насколько я понимаю проверяется не через GET, здесь нужно что-то другое. Но что?
Я же рекомендовал поставить Fiddler2, открыть какой-нибудь сайт и посмотреть что там бегает между бразуером и сервером - половина вопросов бы отпала (ну и почитать вообще про заголовки, теги и проч. нужно. Как же строить web-решение, не зная базовых вещей http протоколов?)
Если на Fiddler2 у вас - табу.
То можете просто сделать, на компе, локальный html файл с формочкой. В атррибут action - прописать адресс своей дуины, заполнить форму и послать.
Далее - со стороны дуины. Вам нужно принять этот запрос и собрать в какую-то переменную. Будет это string или String - выбирать вам.
Соберите этот запрос - и просто выведите его в Serial.
Посмотрите что вам присылает браузер.
Ну а потом уже будете думать как имея подобную строку, найти в ней данный полей, проверить пароль и т.п.
И да... почитайте прикрепленную ветку "Как вставлять код...".
возможно чере += оно красивей выглядеть будет (но это дело вкуса).
И еще "clientRequestStr.length() < 30" 30 - может быть маловато. Учитывая заголовки, base64 энкодинги и т.п. мдень.
Да и вообще, непонятно зачем вы проверяете максимальную длину. Если вы уже взяли String, а не string (вот тут проверка "не вылезти за размер буфера - была-бы нужна обязательна), он же, по идее сама следить/выделяет памяти сколько нужно.
И еще, вам нужно решить будете вы отвечить именно http 401 (что-бы выскакивал браузерный запрос пароля), или как большинство сайтов - выдвать свою собственную логин формочку. То есть http 200 и html содержащий что-то типа
А фиг его знает. Видимо у вас какая-то очень экзотичная библиотека Ethernet-карты. Лично я еще ни одной библиотеки работы с сетью не встречал, что-бы у нее в примерах небыло показанно "как делать GET запрос" (зачастую это вообще - первый пример).
Ну что вы, сложилось ощущение что это сарказм, как делать GET-запросы везде есть. Вопрос не в этом, попробую уточнить.
Сейчас делаю так:
#include <Ethernet.h>
#include <SPI.h>
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
IPAddress ip(192,168,1,200);
IPAddress gateway(192,168,1,1);
IPAddress subnet(255, 255, 255, 0);
// ip-адрес удалённого сервера в локальной сети (доступ открыт без аутентификации):
byte rserver[] = { 192, 168, 1, 20 };
// URL удаленного сервера для доступа из внешней сети (доступ только по логин/паролю):
char serverName[] = "login:password@website.dyndns.ru"; //реальный адрес изменен, этот для примера
void setup() {
SPI.begin();
Ethernet.begin(mac, ip);
Serial.begin(9600);
delay(1000); // секунда ethernet-шилду на инициализацию
}
void loop() {
EthernetClient client;
//if (client.connect(rserver, 80)) { //с этой строчкой, т.е. если соединиться с сервером по его IP-адресу (логин/пароль не требуется), то работает
if (client.connect(serverName, 80)) { //с этой строчкой соединение с сервером не происходит, serial port возвращает "connection failed"
client.println("GET /objects/?object=Arduino");
Serial.println("connection OK");
} else Serial.println("connection failed");
client.stop();
}
Если раскоментировать 22 строчку и закоментировать 23, то все работает по прямому IP-адресу, сервер настроен так что доступ из локалки к нему открыт без логин/пароля.
Хочу перенести ардуинку во внешнюю сеть, доступ к серверу оттуда доступен только по URL (IP сервера динамический и доступ из вне запаролен). Как сделать правильно?
Ну как доступатся не по IP-шнику, а по имени тоже есть в примерах Arduino - DnsWebClient
По поводу пароля. Можно, конечно, закопатся в чтение стандартов, а можно просто посмотреть на примере.
У вас браузер есть? Что вам мешает зайти браузером, посмотреть что он шлет на это login:password@website.dyndns.ru, что ему отвечает сайт. За один запрос происходит авторизация или за несколько.
Вообщем я фактически вам сейчас повторил сообщение #8 (там вы найдете и "как смотреть что шлет браузер").
Постите сюда что шлет браузер и что он получает в ответ. Посмотрим, решим что "действительно из этого нужно слать", а что "можно и пропутстить" (для упрощения скетча).
Ну либо дайте адресс сайта настоящий (логин/пароль можно не давать) - сам посмотрю что он запрашивает. Сервер-то тоже может быть настрон "очень по разному" не возможно вам "в слепую" дать рецепт.
>перечисляются много куков, думаю не столько важны.
В данном случае - нет. Но если бы сервер использовал аторизацию через логин форму - именно они бы и нужны были.
Ну что. Перед вами есть два запроса. Практически идентичные. Но на один сервер возвращает "http 401" - нужна авторизация, а на второй "http 200" - все хорошо, мы поняли кто-ты.
показывает что ip адрес по домену website.dyndns.ru=128.63.59.0, а по google.com=74.125.232.52 (этот верный). Реальный ip-адрес сервера 192.168.1.20 (в локалке) и 46.х.х.х (через роутер с пробросом 80 порта из вне), почему лезет на 128.63.59.0? Видать какаято беда с DNS? dns-маскарадинг на роутере: server=/website.dyndns.ru/192.168.1.20 не помогает.
P/s. Исследования показали, что проблема существует только с dyndns.info, если адрес сервера dyndns.tv или любой другой, то все работает прекрасно. Причем перепробовал штук 5 разных найденых в гугле сайтов с доменом dyndns.info, на всех их arduino реагирует почемуто не корректно (dnsclient возвращяет по домену не верный ip).
Проблема с неверным IP адресом для доменов типа xxxx.dyndns.info оказалась в библиотеке, не верно работает функция inet_aton(). В файле \Arduino\arduino-1.5.2\hardware\arduino\avr\libraries\Ethernet\Dns.cpp нужно заменить в 73 строке:
Спасибо за код, но у меня несколько другой вопрос. Данный скетч я так понимаю служит для подключения ардуины к какому то серверу, например dyndns. Я хочу сделать следующее. У меня есть Arduino Ethernet, и довольно таки банальный скетч для управления светодиодом через браузер. Хочу поставить авторизацию на подключение к ардуине по адресу 192.168.1.хх и что бы только после авторизации можно было управлять светодиодиком)
Есть проблема при обращении к недоступному серверу, ethernet шилд зависает на смерть до тех пор пока сервер не заработает. Может провисеть несколько дней пока сервер не появится в сети
Как сделать некий таймаут на прверку доступности сервера (arduino в роли клиента) чтобы работал arduino+ethernet шилд дальше если сервер не доступен?
arduino mega + GSM отвечает за sms (сработка различных датчиков)
arduino mega + internet + lcd winstar 240x128 (упровление всем описанным выше)
arduino nano взамен родных мозгов кондиционера
ну и всякой мелочёвки с ebay (модуль на 16 релюх, eeprom,ds1302 и тд и тп)
как все это между собой общается? провода?
прямо так взяли и заменили контроллер кондиционера? для меня очень актуально управление кондиционером, но по IR не нашел ни одного решения
как все это между собой общается? провода?
прямо так взяли и заменили контроллер кондиционера? для меня очень актуально управление кондиционером, но по IR не нашел ни одного решения
[/quote]
GSM часть с основной частью общается через com port, в mege их хватает и кондицеонер общается через com
для пульта есть библиотека.
в чем актуальность упровления кондицеонером?
GSM часть с основной частью общается через com port, в mege их хватает и кондицеонер общается через com
для пульта есть библиотека.
в чем актуальность упровления кондицеонером?
значит все-таки связка по проводам? я сам строю умный дом, основная его часть построена на z-wave, т.е. на беспроводной технологии. К ардуино пришел так как под некоторые задачи нет готовых устройств z-wave. В частности нет возможности управлять кондиционером. Сейчас прикручиваю шлюз из ethernet в IR, но он не может работать с кондиционерами так как у всех кондиционеров интерактивные дистанционные пульты.
Нужно включать-выключать как минимум так чтобы это мог делать контроллер умного дома. Я смотрю в сторону расширения умного дома за счет устройств на ардуине со связкой через Xbee/Zigbee. Но даже так не ясно как справиться с кондеем. Как в фильме Электроник "Урий, где у него кнопка???" )
Ну наверное потому что "что-то не так". Не обладая телепатическими способностями трудно ответит по другому на этот вопрос. Из того что вы написали трудно понять, кто,что, куда отправляет. Что вы ожидаете, и что у вас происходит.
Приведите код скетча который "вывожу все в компорт", "все команды" которые видны, что именно отправляет браузер, скетч который "работает неправильно"... попытаемся угадать причину (но, наверное, уже завтра).
P.S. К сожалению у меня Ethernet шилд на другом чипе, и другая библиотека юзается (кстати не такая удобная). Поэтому "написать готовый пример" для вас - затруднительно. Приходится "работать на слух". Будет время (не раньше воскресенья) попробую реализовать на своем, может тогда и ваш быстрее "запустить" получится.
Я занмаюсь ремонтом кондеев поэтому для меня это просто.я иза этого и выкинул родной контролер,ему надо
отсылать команды только чкрез пульт ,а так мы тулим туда arduino ,делаем из него простейши терморегулятор и шлём ему до кокой температуры охлождать или нагревать, но снагреванием алгоритм работы кондея чуть другой,но я обогревом не пользуюсь. Скондеями я кокретно на ТЫ
инетерестно в readString вся информация которую шлёт браузер?
Я занмаюсь ремонтом кондеев поэтому для меня это просто.я иза этого и выкинул родной контролер,ему надо
отсылать команды только чкрез пульт ,а так мы тулим туда arduino ,делаем из него простейши терморегулятор и шлём ему до кокой температуры охлождать или нагревать, но снагреванием алгоритм работы кондея чуть другой,но я обогревом не пользуюсь. Скондеями я кокретно на ТЫ
насколько это сложно? если возможно - было бы очень занимательно посмотреть на схемотехнику и скетч.
вот бы прикрутить к кондиционеру zigbee и управлять им от умного дома
сложного не чего нету ,терморегулятор которому шлёте переменную с задонной температурой ,единственное придётся выкидовать родной контролер.с zigbee не имел дел.но если погуглить думаю вопрос можно решить
сложного не чего нету ,терморегулятор которому шлёте переменную с задонной температурой ,единственное придётся выкидовать родной контролер.с zigbee не имел дел.но если погуглить думаю вопрос можно решить
сколько в типичном кондее датчиков и цепей управления?
кто б помог бы с авторизацией
сколько в типичном кондее датчиков и цепей управления?
в простейшем кондее:
датчик температуры хладогента,датчик температуры воздуха,упровление компресором,наружный вентилятор,
внутренний вентилятор + регулятор оборотов и трёхходовой клапон холод/тепло
кто б помог бы с авторизацией
Да поможем, только не понятно что не та работает. Привиди кусок кода и что именно присылает ардуино в ком-порт.
1. Пока вы не решили проблему с авторизацией, желательно сделать отдельный скетч. В которой никакой посторонней логики (обработка команд и проч.) кроме авторизации и простейшей Html странички типа "Ono Zarabotalo!!!" - нет. Когда заработает, тогда будете усложнять (или копировать авторизацию в свой "настоящий" скетч).
2.Немного странно выглядит строка
String readString = String(100); // string for fetching data from address
По всей видимости вы хотели, по аналогии с массивом, задать максимальную длину строки. Но, на самом деле, это тоже самое что написать String("100"). В данном случае "не смертельно" и мешать не должно, просто ко всем ваших хедерам будет впереди добавлятся префикс "100".
3. Теперь мысленно пройдите по своим ифам. Посмотрите что происходит: вы вычитали один символ. добавили его к readString. Проверили ""if HTTP request has ended" (кстати проверили неправильно, но об этом ниже), не зашли в этот if. Сделали проверку пароля, которая, естественно вернула false (пока вычитали-то только один символ), после чего вы сразу, не вычитывая все остальный символы, вернули браузеру ""HTTP/1.0 401 Unauthorized" и оборвали конекшн. Закончили loop(). И пошли его "по второму разу". Вычитали второй символ, попытались опять вернуть браузеру http 401, а так как он уже "не на связи" , то вас уже не слушает (а от пользователя опять требует пароль).
Что делать:
Первое.нужно проверять пароль и принимать решение выводит "нормальную страницу" или "http 401" уже после того как вычитали все хедеры. Внутри if-а ""if HTTP request has ended".
Второе. Проверка ""readString.length() < 100" - возможно лишняя. Тем более что все хедеры в сумме могут занимать и больше. Если пароля не будет в первых 100 символах, то вы его "никогда не увидите".
4. Вы неправильно проверяете признак ""HTTP request has ended". По вашему коду признаком является "перевод строки" ("\n"). То есть вы читаете только первую строку хедеров. Поэтому ничего кроме первой строки ""проходит только GET / HTTP/1.1 " вы в консоле и не видите (а браузер и того меньше). Правильным признаком окончания хедеров, является пустая строка. Не "перевод строки", а "строка содержащая только перевод строки". Посмотрите в примере к библиотеке семпл WebServer.pde, обратите внимание на переменную currentLineIsBlank и как они проверяют окончание хедеров.
Кстати возможно замечательной идеей будет взять "за базу" этот скетч. И вначале попробовать к нему добавить авторизацию. Запихнуть проверку пароля внутрь этого if-а. А "вычитывание" добавить чуть раньше, после char c = client.read(); добавить readString = readString + c;
P.S. Не растраивайтесь. Рано или поздно вы его победите :)
P.S.S. При написание кода, желатолько тело if-ов, циклов, функций, отодвигать табуляциями вправо. Форматировать код. Тогда его и вам и другим читать легче. Видно "кто в кого вложен". Возможно вы запутались в логике именно поэтому "глазом трудно воспринимается".
М... сорри. Кажется с третим пунктом, по поводу того что "вы делаете проверку пароля вычитав только один символ" - я прогнал. Обманулся таки глаз. Подстветил редактором открывающие, закрывающие скобки и увидел что вы в правильном месте пароль проверяете, уже "после того как все хедеры получили" (вернее думаете что получили :) ).
Все остальное: "readString.length() < 100", "признак окончания хедеров" - вроде в силе.
Здравствуйте! А не подскажете, как сделать, чтобы доступ к серверу был через интернет? В смысле, подключил arduino через ethernet шилд к маршрутизатору. В локальной сети я могу зайти на него с любого устройства. А каким образов можно подключиться из внешней сети? спасибо!
Нужна услуга от провайдера "Прямой IP адресс"
и настройки на роутере, "проброс портов"
или еще может называться "Виртуальный сервер" или как то так
Так же DMZ если 1 устройство можно направить прям на его внутренний IP
И все обращения на внешний IP, будут попадать на ваш Arduino.
Здравствуйте! А не подскажете, как сделать, чтобы доступ к серверу был через интернет? В смысле, подключил arduino через ethernet шилд к маршрутизатору. В локальной сети я могу зайти на него с любого устройства. А каким образов можно подключиться из внешней сети?
Общие требования: точка с внешним IP, на которую Вы сможете заходить снаружи. С этой точки должен быть "виден" Ваш arduino-сервер.
Это делается либо "внешний IP + проброс порта на маршрутизаторе", либо "поднятие туннеля со стороны маршрутизатора на любой подконтрольный Вам внешний сервер, а туда Ваш заход по ssh с маппингом портов из любой точки интернета"... С учетом того, что большинство современных маршрутизаторов поддерживают достаточное количество туннелей начиная от openvpn и заканчивая ipsec - второй вариант был бы более предпочтителен с точки зрения безопасности.
Спасибо за информацию, буду пробовать разобраться
leshak, покажите пожалуйста на примере как попадают данные в clientRequestStr.indexOf
<form method=get><input type=submit name=3 value='einschalten'></form>
Очевидно, в строке после адреса должна идти get переменная( http://some.domain.tld/?3=einschalten), которую мы ловим в
if(readString.indexOf("3=einschalten") > -1) {...
А можете сделать "еще тупее" (хотя и чуть -чуть не по стандарту). Если пароль не совпадает, тогда возвращать http 401. В этом случае при неправильном пароле он просто будет спрашиватся еще раз.
Тогда не нужно будет делать проверки на наличие аудентификационных хедеров в запросе и проч. Вообщем тупо до горя: если пароль в запросе есть - выводить html, если нет - спрашиваем.
leshak, скажите пожалуйста я правильно в clientRequestStr получаю данны?
char c = client.read();
if (clientRequestStr.length() < 30) {
clientRequestStr.concat(c);
}
Это ведь GET, а пароль насколько я понимаю проверяется не через GET, здесь нужно что-то другое. Но что?
Обычно форомчки посылаются не методом GET, а методом POST. Что-бы все эти "пароли/параметры" - не светились в URL-ле.
http://www.w3schools.com/tags/att_form_method.asp
Я же рекомендовал поставить Fiddler2, открыть какой-нибудь сайт и посмотреть что там бегает между бразуером и сервером - половина вопросов бы отпала (ну и почитать вообще про заголовки, теги и проч. нужно. Как же строить web-решение, не зная базовых вещей http протоколов?)
Если на Fiddler2 у вас - табу.
То можете просто сделать, на компе, локальный html файл с формочкой. В атррибут action - прописать адресс своей дуины, заполнить форму и послать.
Далее - со стороны дуины. Вам нужно принять этот запрос и собрать в какую-то переменную. Будет это string или String - выбирать вам.
Соберите этот запрос - и просто выведите его в Serial.
Посмотрите что вам присылает браузер.
Ну а потом уже будете думать как имея подобную строку, найти в ней данный полей, проверить пароль и т.п.
И да... почитайте прикрепленную ветку "Как вставлять код...".
А "собираете", в принципе правильно. Можете еще вот этот пример посмотреть http://www.w3schools.com/tags/att_form_method.asp
возможно чере += оно красивей выглядеть будет (но это дело вкуса).
И еще "clientRequestStr.length() < 30" 30 - может быть маловато. Учитывая заголовки, base64 энкодинги и т.п. мдень.
Да и вообще, непонятно зачем вы проверяете максимальную длину. Если вы уже взяли String, а не string (вот тут проверка "не вылезти за размер буфера - была-бы нужна обязательна), он же, по идее сама следить/выделяет памяти сколько нужно.
И еще, вам нужно решить будете вы отвечить именно http 401 (что-бы выскакивал браузерный запрос пароля), или как большинство сайтов - выдвать свою собственную логин формочку. То есть http 200 и html содержащий что-то типа
(вообщем зайтиде на любой сайт с лоигн формой и сделайте ей view source).
Спасибо, разобрарался.
В моем случае проблемма была именно в if (clientRequestStr.length() < 30) {
Закомментировав это все заработало.
Подскажите, как сделать обратное? Тоесть нужно послать GET запрос с ардуины на сервер защищеный паролем.
С обычного компьютера в браузере это адрес в виде: http://login:password@website.dyndns.ru/objects/?object=arduino
Подскажите, как сделать обратное? Тоесть нужно послать GET запрос с ардуины на сервер защищеный паролем.
С обычного компьютера в браузере это адрес в виде: http://login:password@website.dyndns.ru/objects/?object=arduino
А фиг его знает. Видимо у вас какая-то очень экзотичная библиотека Ethernet-карты. Лично я еще ни одной библиотеки работы с сетью не встречал, что-бы у нее в примерах небыло показанно "как делать GET запрос" (зачастую это вообще - первый пример).
Ну что вы, сложилось ощущение что это сарказм, как делать GET-запросы везде есть. Вопрос не в этом, попробую уточнить.
Сейчас делаю так:
Если раскоментировать 22 строчку и закоментировать 23, то все работает по прямому IP-адресу, сервер настроен так что доступ из локалки к нему открыт без логин/пароля.
Хочу перенести ардуинку во внешнюю сеть, доступ к серверу оттуда доступен только по URL (IP сервера динамический и доступ из вне запаролен). Как сделать правильно?
Ну как доступатся не по IP-шнику, а по имени тоже есть в примерах Arduino - DnsWebClient
По поводу пароля. Можно, конечно, закопатся в чтение стандартов, а можно просто посмотреть на примере.
У вас браузер есть? Что вам мешает зайти браузером, посмотреть что он шлет на это login:password@website.dyndns.ru, что ему отвечает сайт. За один запрос происходит авторизация или за несколько.
Вообщем я фактически вам сейчас повторил сообщение #8 (там вы найдете и "как смотреть что шлет браузер").
Постите сюда что шлет браузер и что он получает в ответ. Посмотрим, решим что "действительно из этого нужно слать", а что "можно и пропутстить" (для упрощения скетча).
И сообщение #23 можете перечитать. Там тоже есть полезная ссылка.
Ну либо дайте адресс сайта настоящий (логин/пароль можно не давать) - сам посмотрю что он запрашивает. Сервер-то тоже может быть настрон "очень по разному" не возможно вам "в слепую" дать рецепт.
Попробовал Fiddler (интересная програмка) через браузер, выдает:
Первый пакет:
Второй пакет:
Во... видите в первом пакете сервер ответил "HTTP/1.0 401 Unauthorized" и "WWW-Authenticate: Basic"
В точности то что мы "воспроизводили ардуиной" выше по ветке :) И, опять как ни странно, совпадает с тем что описано по ссылке из поста #23
"Требуется авторизация. Шлите ваш логин пароль по базовой схеме" :)
Теперь мы просто "поменилсь ролями". Только это вы подглядели "ответы сервера". А нам нужно "что бразуер послал".
Это видно над ответами. Переходите на вкладку Inspectors / RAW
А да, спасибо за Inspectors / RAW , а то сразу непонял где искать.
Вот что там в первом пакете:
Второй пакет:
Вы уж простите, заменил адрес на заведомо не верный и в конце звездочки - перечисляются много куков, думаю не столько важны.
>перечисляются много куков, думаю не столько важны.
В данном случае - нет. Но если бы сервер использовал аторизацию через логин форму - именно они бы и нужны были.
Ну что. Перед вами есть два запроса. Практически идентичные. Но на один сервер возвращает "http 401" - нужна авторизация, а на второй "http 200" - все хорошо, мы поняли кто-ты.
Найдете разницу между ними? ;)
Вы уж простите, заменил адрес на заведомо не верный
Если больше ничего не меняли и вводили реальный логин/пароль - их тоже потом нужно будет поменять.
Эмц...? Ну что неужели не получается увидить "одну строчку разницы"? Нашли строку-отличие?
Спасибо, разобрался с авторизацией, но дело в том что до самой авторизации дело так и не доходит. Вот этот кусок кода возвращает connection failed:
причем если serverName заменить на:
то все работает. Добавил для отладки:
показывает что ip адрес по домену website.dyndns.ru=128.63.59.0, а по google.com=74.125.232.52 (этот верный). Реальный ip-адрес сервера 192.168.1.20 (в локалке) и 46.х.х.х (через роутер с пробросом 80 порта из вне), почему лезет на 128.63.59.0? Видать какаято беда с DNS? dns-маскарадинг на роутере: server=/website.dyndns.ru/192.168.1.20 не помогает.
P/s. Исследования показали, что проблема существует только с dyndns.info, если адрес сервера dyndns.tv или любой другой, то все работает прекрасно. Причем перепробовал штук 5 разных найденых в гугле сайтов с доменом dyndns.info, на всех их arduino реагирует почемуто не корректно (dnsclient возвращяет по домену не верный ip).
Проблема с неверным IP адресом для доменов типа xxxx.dyndns.info оказалась в библиотеке, не верно работает функция inet_aton(). В файле \Arduino\arduino-1.5.2\hardware\arduino\avr\libraries\Ethernet\Dns.cpp нужно заменить в 73 строке:
Добрый день, не могли бы показать код с функционирующей авторизацией, думаю был бы благо дарен не только я но и многие ардуиновцы )
Спасибо за код, но у меня несколько другой вопрос. Данный скетч я так понимаю служит для подключения ардуины к какому то серверу, например dyndns. Я хочу сделать следующее. У меня есть Arduino Ethernet, и довольно таки банальный скетч для управления светодиодом через браузер. Хочу поставить авторизацию на подключение к ардуине по адресу 192.168.1.хх и что бы только после авторизации можно было управлять светодиодиком)
Нашел скетч :
НО он написан под WebServer, а мне нужно через наподобии:
P.S. Я далеко не программист, поэтому может тут даже кому то все очевидно, но я сам в тупике, на данный момент.
Прошу вашей помощи.
Я так полагаю мне как раз нужен код который получился у Dima85 )))
Есть проблема при обращении к недоступному серверу, ethernet шилд зависает на смерть до тех пор пока сервер не заработает. Может провисеть несколько дней пока сервер не появится в сети
Как сделать некий таймаут на прверку доступности сервера (arduino в роли клиента) чтобы работал arduino+ethernet шилд дальше если сервер не доступен?
пока обращение к серверу такое:
У кого получилось сделать авторизацию? Покажите пожалуйста как вот считывали данные с формы для заполнения логин и пароль в строку и проверку.