ethernet shield + web access

axill
Offline
Зарегистрирован: 05.09.2011

tip777 пишет:

arduino mega + GSM  отвечает за sms (сработка различных датчиков)

arduino mega + internet + lcd winstar 240x128 (упровление всем описанным выше)

arduino nano взамен родных мозгов кондиционера

ну и всякой мелочёвки с ebay (модуль на 16 релюх, eeprom,ds1302 и тд и тп)

как все это между собой общается? провода?

прямо так взяли и заменили контроллер кондиционера? для меня очень актуально управление кондиционером, но по IR не нашел ни одного решения

tip777
Offline
Зарегистрирован: 16.08.2011

axill пишет:

 

как все это между собой общается? провода?

прямо так взяли и заменили контроллер кондиционера? для меня очень актуально управление кондиционером, но по IR не нашел ни одного решения

[/quote]

GSM часть с основной частью общается через com port, в mege их хватает и кондицеонер общается через com

для пульта есть библиотека.

в чем актуальность упровления кондицеонером? 

axill
Offline
Зарегистрирован: 05.09.2011

tip777 пишет:

GSM часть с основной частью общается через com port, в mege их хватает и кондицеонер общается через com

для пульта есть библиотека.

в чем актуальность упровления кондицеонером? 

значит все-таки связка по проводам? я сам строю умный дом, основная его часть построена на z-wave, т.е. на беспроводной технологии. К ардуино пришел так как под некоторые задачи нет готовых устройств z-wave. В частности нет возможности управлять кондиционером. Сейчас прикручиваю шлюз из ethernet в  IR, но он не может работать с кондиционерами так как у всех кондиционеров интерактивные дистанционные пульты.

Нужно включать-выключать как минимум так чтобы это мог делать контроллер умного дома. Я смотрю в сторону расширения умного дома за счет устройств на ардуине со связкой через Xbee/Zigbee. Но даже так не ясно как справиться с кондеем. Как в фильме Электроник "Урий, где у него кнопка???" )

leshak
Offline
Зарегистрирован: 29.09.2011

 Ну наверное потому что "что-то не так". Не обладая телепатическими способностями трудно ответит по другому на этот вопрос. Из того что вы написали трудно понять, кто,что, куда отправляет. Что вы ожидаете, и что у вас происходит.

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

P.S. К сожалению у меня Ethernet шилд на другом чипе, и другая библиотека юзается (кстати не такая удобная). Поэтому "написать готовый пример" для вас - затруднительно. Приходится "работать на слух". Будет время (не раньше воскресенья) попробую реализовать на своем, может тогда и ваш быстрее "запустить" получится.

 

tip777
Offline
Зарегистрирован: 16.08.2011

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

отсылать команды только чкрез пульт ,а так мы тулим туда arduino ,делаем из него простейши терморегулятор и шлём ему до кокой температуры охлождать или нагревать, но снагреванием алгоритм работы кондея чуть другой,но я обогревом не пользуюсь. Скондеями я кокретно на ТЫ

tip777
Offline
Зарегистрирован: 16.08.2011

 инетерестно в readString вся информация которую шлёт браузер?

axill
Offline
Зарегистрирован: 05.09.2011

tip777 пишет:

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

отсылать команды только чкрез пульт ,а так мы тулим туда arduino ,делаем из него простейши терморегулятор и шлём ему до кокой температуры охлождать или нагревать, но снагреванием алгоритм работы кондея чуть другой,но я обогревом не пользуюсь. Скондеями я кокретно на ТЫ

насколько это сложно? если возможно - было бы очень занимательно посмотреть на схемотехнику и скетч.

вот бы прикрутить к кондиционеру zigbee и управлять им от умного дома

tip777
Offline
Зарегистрирован: 16.08.2011

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

axill
Offline
Зарегистрирован: 05.09.2011

tip777 пишет:

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

сколько в типичном кондее датчиков и цепей управления?

tip777
Offline
Зарегистрирован: 16.08.2011

кто б помог бы с авторизацией  

tip777
Offline
Зарегистрирован: 16.08.2011

axill пишет:

 

 

сколько в типичном кондее датчиков и цепей управления?

в простейшем кондее:

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

внутренний вентилятор + регулятор оборотов и трёхходовой клапон холод/тепло

Zveruga
Offline
Зарегистрирован: 29.09.2011

tip777 пишет:

кто б помог бы с авторизацией  

Да поможем, только не понятно что не та работает. Привиди кусок кода и что именно присылает ардуино в ком-порт.

tip777
Offline
Зарегистрирован: 16.08.2011
#include <SPI.h> // insert by Katsu
// #include <WString.h> removed by Katsu
#include <Ethernet.h>


byte mac[] = { 0x54, 0x55, 0x58, 0x10, 0x00, 0x24 }; // entspricht einer MAC von 84.85.88.16.0.36
byte ip[] = { 192, 168, 0, 221 }; // IP-Adresse
byte gateway[] = { 192, 168, 0, 1 }; // Gateway
byte subnet[] = { 255, 255, 255, 0 };

Server server(80);

int Pin3 = 3;
int Pin4 = 4;
int Pin5 = 5;
int Pin6 = 6;

String readString = String(100); // string for fetching data from address
boolean Pin3ON = false; // Status flag
boolean Pin4ON = false;

void setup(){
Ethernet.begin(mac, ip, gateway, subnet);
server.begin();
pinMode(Pin3, OUTPUT);
pinMode(Pin4, OUTPUT);

Serial.begin(9600); }

void loop(){

// Create a client connection
Client client = server.available();
if (client) {
while (client.connected()) {
if (client.available()) {
char c = client.read();

//read char by char HTTP request
if (readString.length() < 100) {

//store characters to string
// readString.append(c); removed by Katsu
readString = readString + c; // insert by Katsu

}

Serial.print(c); //output chars to serial port

if (c == '\n') { //if HTTP request has ended

// readString.contains() replaced with readString.indexOf(val) > -1 by Katsu
// indexOf locates a character or String within another String.
// Returns the index of val within the String, or -1 if not found.
if(readString.indexOf("3=einschalten") > -1) {
digitalWrite(Pin3, HIGH);
Serial.println("Pin 3 eingeschaltet!");
Pin3ON = true;
}
if(readString.indexOf("3=ausschalten") > -1){
digitalWrite(Pin3, LOW);
Serial.println("Pin 3 ausgeschaltet!");
Pin3ON = false;
}
if(readString.indexOf("4=einschalten") > -1) {
digitalWrite(Pin4, HIGH);
Serial.println("Pin 4 eingeschaltet!");
Pin4ON = true;
}
if(readString.indexOf("4=ausschalten") > -1){
digitalWrite(Pin4, LOW);
Serial.println("Pin 4 ausgeschaltet!");
Pin4ON = false;
}

if(readString.indexOf("all=Alles+aus") > -1){
digitalWrite(Pin3, LOW);
digitalWrite(Pin4, LOW);
Serial.println("Alles ausgeschaltet");
Pin3ON = false;
Pin4ON = false;
}
//--------------------------HTML------------------------
if(readString.indexOf("cXFxOmFhYQ==")>-1){














client.println("HTTP/1.1 200 OK");

client.println("Content-Type: text/html");

client.println();

client.print("<html><head>");

client.print("<title>Arduino Webserver Poldi</title>");

client.println("</head>");

client.print("<body bgcolor='#444444'>");

//---Überschrift---
client.println("<br><hr />");

client.println("<h1><div align='center'><font color='#2076CD'>Arduino Webserver 1.0 by Poldi</font color></div></h1>");

client.println("<hr /><br>");
//---Überschrift---

//---Ausgänge schalten---
client.println("<div align='left'><font face='Verdana' color='#FFFFFF'>Ausg&auml;nge schalten:</font></div>");

client.println("<br>");

client.println("<table border='1' width='500' cellpadding='5'>");

client.println("<tr bgColor='#222222'>");

client.println("<td bgcolor='#222222'><font face='Verdana' color='#CFCFCF' size='2'>Ausgang 3<br></font></td>");

client.println("<td align='center' bgcolor='#222222'><form method=get><input type=submit name=3 value='einschalten'></form></td>");

client.println("<td align='center' bgcolor='#222222'><form method=get><input type=submit name=3 value='ausschalten'></form></td>");

if (Pin3ON)
client.println("<td align='center'><font color='green' size='5'>ON");
else
client.println("<td align='center'><font color='#CFCFCF' size='5'>OFF");

client.println("</tr>");

client.println("<tr bgColor='#222222'>");

client.println("<td bgcolor='#222222'><font face='Verdana' color='#CFCFCF' size='2'>Ausgang 4<br></font></td>");

client.println("<td align='center' bgcolor='#222222'><form method=get><input type=submit name=4 value='einschalten'></form></td>");

client.println("<td align='center' bgcolor='#222222'><form method=get><input type=submit name=4 value='ausschalten'></form></td>");

if (Pin4ON)
client.println("<td align='center'><font color='green' size='5'>ON");
else
client.println("<td align='center'><font color='#CFCFCF' size='5'>OFF");

client.println("</tr>");


client.println("</tr>");

client.println("</table>");


client.println("<br>");

client.println("<form method=get><input type=submit name=all value='Alles aus'></form>");

client.println("</body></html>");

//---Ausgänge schalten---

//clearing string for next read
readString="";

//stopping client
client.stop();
}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");
readString="";
client.stop();
}}}}}} 

 

leshak
Offline
Зарегистрирован: 29.09.2011

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-ов, циклов, функций, отодвигать табуляциями вправо. Форматировать код. Тогда его и вам и другим читать легче. Видно "кто в кого вложен". Возможно вы запутались в логике именно поэтому "глазом трудно воспринимается".

 

 

leshak
Offline
Зарегистрирован: 29.09.2011

 М... сорри. Кажется с третим пунктом, по поводу того что "вы делаете проверку пароля вычитав только один символ" - я прогнал. Обманулся таки глаз. Подстветил редактором открывающие, закрывающие скобки и увидел что вы в правильном месте пароль проверяете, уже "после того как все хедеры получили" (вернее думаете что получили :)  ).

Все остальное: "readString.length() < 100", "признак окончания хедеров" - вроде в силе.

 

Shuric93
Offline
Зарегистрирован: 15.10.2012

Здравствуйте! А не подскажете, как сделать, чтобы доступ к серверу был через интернет? В смысле, подключил arduino через ethernet шилд к маршрутизатору. В локальной сети я могу зайти на него с любого устройства. А каким образов можно подключиться из внешней сети? спасибо!

AVik
Offline
Зарегистрирован: 27.01.2013

Нужна услуга от провайдера "Прямой IP адресс"

и настройки на роутере, "проброс портов"

или еще может называться "Виртуальный сервер" или как то так

Так же DMZ если 1 устройство можно направить прям на его внутренний IP

И все обращения на внешний IP, будут попадать на ваш Arduino.

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

Shuric93 пишет:

Здравствуйте! А не подскажете, как сделать, чтобы доступ к серверу был через интернет? В смысле, подключил arduino через ethernet шилд к маршрутизатору. В локальной сети я могу зайти на него с любого устройства. А каким образов можно подключиться из внешней сети?

Общие требования: точка с внешним IP, на которую Вы сможете заходить снаружи. С этой точки должен быть "виден" Ваш arduino-сервер.

Это делается либо "внешний IP + проброс порта на маршрутизаторе", либо "поднятие туннеля со стороны маршрутизатора на любой подконтрольный Вам внешний сервер, а туда Ваш заход по ssh с маппингом портов из любой точки интернета"... С учетом того, что большинство современных маршрутизаторов поддерживают достаточное количество туннелей начиная от openvpn и заканчивая ipsec - второй вариант был бы более предпочтителен с точки зрения безопасности.

Shuric93
Offline
Зарегистрирован: 15.10.2012

 

Спасибо за информацию, буду пробовать разобраться

Dima85
Offline
Зарегистрирован: 07.01.2013

leshak, покажите пожалуйста на примере как попадают данные в clientRequestStr.indexOf

leshak пишет:

 



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");

}

 

 

 

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

<form method=get><input type=submit name=3 value='einschalten'></form>

Очевидно, в строке после адреса должна идти get переменная( http://some.domain.tld/?3=einschalten), которую мы ловим в

if(readString.indexOf("3=einschalten") > -1) {...

Dima85
Offline
Зарегистрирован: 07.01.2013

leshak пишет:

 А можете сделать "еще тупее" (хотя и чуть -чуть не по стандарту). Если пароль не совпадает, тогда возвращать 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, здесь нужно что-то другое. Но что?

leshak
Offline
Зарегистрирован: 29.09.2011

Обычно форомчки посылаются не методом 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  (вот тут проверка "не вылезти за размер буфера - была-бы нужна обязательна), он же, по идее сама следить/выделяет памяти сколько нужно.

leshak
Offline
Зарегистрирован: 29.09.2011

И еще, вам нужно решить будете вы отвечить именно http 401 (что-бы выскакивал браузерный запрос пароля), или как большинство сайтов - выдвать свою собственную логин формочку. То есть http 200 и html содержащий что-то типа

<form method="post">
   Login:<input type="text" name="login"/><br/>
    Password: <input type="password" name="password"/><br/>
   <input type="submit"/>
</form>

(вообщем зайтиде на любой сайт с лоигн формой и сделайте ей view source).

Dima85
Offline
Зарегистрирован: 07.01.2013

Спасибо, разобрарался. 

В моем случае проблемма была именно в if (clientRequestStr.length() < 30) {

Закомментировав это все заработало.

dmw
Offline
Зарегистрирован: 24.03.2013

Подскажите, как сделать обратное? Тоесть нужно послать GET запрос с ардуины на сервер защищеный паролем.

С обычного компьютера в браузере это адрес в виде: http://login:password@website.dyndns.ru/objects/?object=arduino

leshak
Offline
Зарегистрирован: 29.09.2011

dmw пишет:

Подскажите, как сделать обратное? Тоесть нужно послать GET запрос с ардуины на сервер защищеный паролем.

С обычного компьютера в браузере это адрес в виде: http://login:password@website.dyndns.ru/objects/?object=arduino

А фиг его знает. Видимо у вас какая-то очень экзотичная библиотека Ethernet-карты. Лично я еще ни одной библиотеки работы с сетью не встречал, что-бы у нее в примерах небыло показанно "как делать GET запрос" (зачастую это вообще - первый пример).

dmw
Offline
Зарегистрирован: 24.03.2013

Ну что вы, сложилось ощущение что это сарказм, как делать 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 сервера динамический и доступ из вне запаролен). Как сделать правильно?

leshak
Offline
Зарегистрирован: 29.09.2011

Ну как доступатся не по IP-шнику, а по имени тоже есть в примерах Arduino - DnsWebClient

По поводу пароля. Можно, конечно, закопатся в чтение стандартов, а можно просто посмотреть на примере.

У вас браузер есть? Что вам мешает зайти браузером, посмотреть что он шлет на это login:password@website.dyndns.ru, что ему отвечает сайт. За один запрос происходит авторизация или за несколько.

Вообщем я фактически вам сейчас повторил сообщение #8  (там вы найдете и "как смотреть что шлет браузер").

Постите сюда что шлет браузер и что он получает в ответ. Посмотрим, решим что "действительно из этого нужно слать", а что "можно и пропутстить" (для упрощения скетча).

 

leshak
Offline
Зарегистрирован: 29.09.2011

И сообщение #23 можете перечитать. Там тоже есть полезная ссылка.

leshak
Offline
Зарегистрирован: 29.09.2011

Ну либо дайте адресс сайта настоящий (логин/пароль можно не давать) - сам посмотрю что он запрашивает. Сервер-то тоже может быть настрон "очень по разному"  не возможно вам "в слепую" дать рецепт.

dmw
Offline
Зарегистрирован: 24.03.2013

Попробовал Fiddler (интересная програмка) через браузер, выдает:
Первый пакет:

HTTP/1.0 401 Unauthorized
Date: Thu, 29 Aug 2013 07:29:18 GMT
Server: Apache/2.2.22 (Ubuntu)
X-Powered-By: PHP/5.3.10-1ubuntu3
WWW-Authenticate: Basic realm="MajordomoSL"
Vary: Accept-Encoding
Content-Length: 43
Connection: close
Content-Type: text/html; charset=UTF-8
Content-Encoding: gzip

Rs,-/ʬJ,S(J-,,JMc"

Второй пакет:

HTTP/1.1 200 OK
Date: Thu, 29 Aug 2013 07:29:24 GMT
Server: Apache/2.2.22 (Ubuntu)
X-Powered-By: PHP/5.3.10-1ubuntu3
Set-Cookie: prj=52rvu4pvr653ueg7d9u7v43r64; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Vary: Accept-Encoding
Content-Encoding: gzip
Content-Length: 4436
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=utf-8

<ko#Ǒ+zg7;Jr(JC`m
V:Y0aiW&r>$`wS 3F@yÙe{řzuUwsZdBC%J;g!
ںYT

*** FIDDLER: RawDisplay truncated at 128 characters. Right-click to disable truncation. ***

 

leshak
Offline
Зарегистрирован: 29.09.2011

Во... видите в первом пакете сервер ответил "HTTP/1.0 401 Unauthorized" и "WWW-Authenticate: Basic"

В точности то что мы "воспроизводили ардуиной" выше по ветке :) И, опять как ни странно, совпадает с тем что описано по ссылке из поста #23

"Требуется авторизация. Шлите ваш логин пароль по базовой схеме" :)    

Теперь мы просто "поменилсь ролями".  Только это вы подглядели "ответы сервера". А нам нужно "что бразуер послал".

Это видно над ответами. Переходите на вкладку Inspectors / RAW  

 

dmw
Offline
Зарегистрирован: 24.03.2013

А да, спасибо за Inspectors / RAW , а то сразу непонял где искать.

Вот что там в первом пакете:

GET http://website.dyndns.ru/ HTTP/1.1
Host: website.dyndns.ru
Connection: keep-alive
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.57 Safari/537.36
Accept-Encoding: gzip,deflate,sdch
Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4
Cookie: uid=WFVdZBJ/X6SUvJv6YeUUAg==; txtMainTab=Timeline; *******

Второй пакет:

GET http://website.dyndns.ru/ HTTP/1.1
Host: website.dyndns.ru
Connection: keep-alive
Authorization: Basic ZG130mdvb5R3YXRlcd==
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.57 Safari/537.36
Accept-Encoding: gzip,deflate,sdch
Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4
Cookie: uid=WFVdZVH/X4SUvJv6YvUUAg==; txtMainTab=Timeline; ******

Вы уж простите, заменил адрес на заведомо не верный и в конце звездочки - перечисляются много куков, думаю не столько важны.

leshak
Offline
Зарегистрирован: 29.09.2011

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

В данном случае - нет. Но если бы сервер использовал аторизацию через логин форму - именно они бы и нужны были.

Ну что. Перед вами есть два запроса. Практически идентичные. Но на один сервер возвращает "http 401" - нужна авторизация, а на второй "http 200" - все хорошо, мы поняли кто-ты.

Найдете разницу между ними? ;)

leshak
Offline
Зарегистрирован: 29.09.2011

dmw пишет:

Вы уж простите, заменил адрес на заведомо не верный 

Если больше ничего не меняли и вводили реальный логин/пароль - их тоже потом нужно будет поменять.

leshak
Offline
Зарегистрирован: 29.09.2011

Эмц...? Ну что неужели не получается увидить "одну строчку разницы"?  Нашли строку-отличие?

dmw
Offline
Зарегистрирован: 24.03.2013

Спасибо, разобрался с авторизацией, но дело в том что до самой авторизации дело так и не доходит. Вот этот кусок кода возвращает connection failed:

char serverName[] = "website.dyndns.ru";  //реальный адрес изменен, этот для примера

void loop() {
  EthernetClient client;
  if (client.connect(serverName, 80)) { 
    client.println("GET /objects/?object=Arduino");
  } else Serial.println("connection failed");
        client.stop();
}

причем если serverName заменить на:

char serverName[] = "www.google.com";

то все работает. Добавил для отладки:

dnsClient.getHostByName(serverName, ip);
Serial.print(ip);

показывает что 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).

dmw
Offline
Зарегистрирован: 24.03.2013

Проблема с неверным IP адресом для доменов типа xxxx.dyndns.info оказалась в библиотеке, не верно работает функция inet_aton(). В файле \Arduino\arduino-1.5.2\hardware\arduino\avr\libraries\Ethernet\Dns.cpp нужно заменить в 73 строке:

int segmentValue =0;
на:
long segmentValue =0;

 

 

Lordserdjo
Offline
Зарегистрирован: 25.06.2014

Добрый день, не могли бы показать код с функционирующей авторизацией, думаю был бы благо дарен не только я но и многие ардуиновцы )

dmw
Offline
Зарегистрирован: 24.03.2013

Lordserdjo пишет:
Добрый день, не могли бы показать код с функционирующей авторизацией, думаю был бы благо дарен не только я но и многие ардуиновцы )
Вот:

#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);
char serverName[] = "www.yoursitename.ru"; // URL удаленного сервера

void setup() {
  SPI.begin();
  Ethernet.begin(mac, ip);
  Serial.begin(9600);
  delay(1000); // секунда ethernet-шилду на инициализацию
}

void loop() { 
  EthernetClient client;
  if (client.connect(serverName, 80)) {
    client.println("GET /objects/?object=Arduino"); //любой нужный вам GET/POST-запрос серверу
    client.println("Authorization: Basic ZG130mdvb5R3YXRlcd=="); //здесь логин/пароль выдернутые Fiddler
    client.println(); //это обязательно для обозначения конца заголовка
    Serial.println("connection OK");
  } else Serial.println("connection failed");
        client.stop();
}

 

Lordserdjo
Offline
Зарегистрирован: 25.06.2014

Спасибо за код, но у меня несколько другой вопрос. Данный скетч я так понимаю служит для подключения ардуины к какому то серверу, например dyndns. Я хочу сделать следующее. У меня есть Arduino Ethernet, и довольно таки банальный скетч для управления светодиодом через браузер. Хочу поставить авторизацию на подключение к ардуине по адресу 192.168.1.хх и что бы только после авторизации можно было управлять светодиодиком)

Нашел скетч :



#define WEBDUINO_AUTH_REALM "Weduino Authentication Example"
#include <SPI.h>
#include <Ethernet.h>
#include <WebServer.h>

static uint8_t mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
static uint8_t ip[] = { 192, 168, 1, 210 };


#define PREFIX ""
WebServer webserver(PREFIX, 80);

void privateCmd(WebServer &server, WebServer::ConnectionType type, char *, bool)
{
if (server.checkCredentials("dXNlcjp1c2Vy"))
{
server.httpSuccess();
if (type != WebServer::HEAD)
{
server.print("Авторизация пройдена");
}
}
else
{
server.httpUnauthorized();
}
}

void setup()
{
Ethernet.begin(mac, ip);
webserver.setDefaultCommand(&privateCmd);
webserver.begin();
}

void loop()
{
char buff[64];
int len = 64;

webserver.processConnection(buff, &len);
}

 

НО он написан под WebServer, а мне нужно через наподобии:



	    EthernetClient client = server.available();
	    if (client) 
	    {
	      
	      while (client.connected()) 
	      {
	        if (client.available()) 

P.S. Я далеко не программист, поэтому может тут даже кому то все очевидно, но я сам в тупике, на данный момент.

Прошу вашей помощи.

 

Lordserdjo
Offline
Зарегистрирован: 25.06.2014

Я так полагаю мне как раз нужен код который получился у Dima85 )))

dmw
Offline
Зарегистрирован: 24.03.2013

Есть проблема при обращении к недоступному серверу, ethernet шилд зависает на смерть до тех пор пока сервер не заработает. Может провисеть несколько дней пока сервер не появится в сети

Как сделать некий таймаут на прверку доступности сервера (arduino в роли клиента) чтобы работал arduino+ethernet шилд дальше если сервер не доступен?

пока обращение к серверу такое:

#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);
char serverName[] = "www.yoursitename.ru"; // URL удаленного сервера

void setup() {
  SPI.begin();
  Ethernet.begin(mac, ip);
  Serial.begin(9600);
  delay(1000); // секунда ethernet-шилду на инициализацию
}

void loop() { 
  EthernetClient client;
  if (client.connect(serverName, 80)) {
    client.println("GET /objects/?object=Arduino"); //любой нужный вам GET/POST-запрос серверу
    client.println("Authorization: Basic ZG130mdvb5R3YXRlcd=="); //здесь логин/пароль выдернутые Fiddler
    client.println(); //это обязательно для обозначения конца заголовка
    Serial.println("connection OK");
  } else Serial.println("connection failed");
        client.stop();
}

 

Alex-human
Offline
Зарегистрирован: 03.11.2014

У кого получилось сделать авторизацию? Покажите пожалуйста как вот считывали данные с формы для заполнения логин и пароль в строку и проверку.