ENC28J60 и обработка параметров URL

bsdshneg
Offline
Зарегистрирован: 21.10.2014

Всем привет!

Юзал поиск, нашёл это http://arduino.ru/forum/programmirovanie/parsing-stroki-adresa-arduino-v-rezhime-veb-servera ... всё тут хорошо, но малость не то, что надо .. а именно:

Допустим весь урл звучит так http://10.0.0.10/?mod=leds&led_id=1&cmd=on (это так .. для примера)

нужна функция, на подобии $_GET[] в php .. т.е.

if (get_param("mod") == "leds") {

.....

}

if (get_param("cmd") == "on") {

.....

}

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

bsdshneg
Offline
Зарегистрирован: 21.10.2014

Вот как я пробовал эксперементировать ... 

// структра описывающие наш параметр

struct port_param_t{String name; int value;};

#define MAX_PARAMS 20 // сколько параметров максимально мы умеем парсить

port_param_t params[MAX_PARAMS]; // в этот массис будем сохранять наши парсенные параметры

byte parsedParams=0; // сколько параметров нам удалось напарсить

void setup(){

  Serial.begin(9600);
/*
  char* inputString="h ttp://192.168.3.5/setip?aaa=192&bbb=168&ccc=1&ddd=33"; // наши тестовые данные
  char* match = "aaa";
*/
  // выводим что собираемся парсить
/*
  Serial.print("input '");Serial.print(inputString);  Serial.println("'");
  // парсим
  parseParams(inputString, match);
  // выводим что получилось
  printParams();
  */
}

// парсид входящую строку в массив params[] и устанавливает parsedParam в количество прочитанных элементов

void parseParams(char* inputString, char* match){
  
  parsedParams=0; // пока ничего не напарсили
 char* buffer=strtok(inputString,"?"); // лучше так проверять/пропускать вопросилово
 
  if(buffer!=NULL){
    for(buffer=strtok(NULL,"&"); buffer!=NULL;     buffer=strtok(NULL,"&") ) 
    {
  String buffer1= String(buffer);
    params[parsedParams].name=buffer1.substring(0,buffer1.indexOf('='));
    
       if (params[parsedParams].name == match) {
    
          params[parsedParams].value=strtoint(buffer1.substring(buffer1.indexOf('=')+1)); 
  
          parsedParams++; // отмечаем сколько удалось распарсить
       }
    
    }
         if(parsedParams>MAX_PARAMS-1)return; // больше нет места куда сохранять парсенное.
     } 
     

  
}
// Выводит в Serial массив parsedParams[]
void printParams(){
  for(byte i=0;i<parsedParams;i++){
      // TODO: всю эту кучу принтов можно заменить одним sprintf
      
//      Serial.print(params[i].name);
//      Serial.print(" -> ");
      Serial.println(params[i].value);
    //  Serial.print("=");
    //  Serial.println(params[i].value,DEC);
  }
}

int strtoint(String str) // Процедура переобразования строки в число
{
  int tempInt;
  char rez[str.length()+1];
  str.toCharArray(rez, sizeof(rez));
  tempInt = atoi(rez);
  return tempInt;
}

void loop(){
  
  char* inputSUrl="h ttp://192.168.3.5/setip?aaa=192&bbb=168&ccc=1&ddd=33"; // наши тестовые данные
  char* match = "aaa";
  
  Serial.print("input '");Serial.print(inputSUrl);  Serial.println("'");
  
  // парсим
  parseParams(inputSUrl, match);
  // выводим что получилось
  printParams();
  
}

при таком варианте он мне пишет в сериал вот что:

input 'h ttp://192.168.3.5/setip?aaa=192&bbb=168&ccc=1&ddd=33'
192
input 'h ttp://192.168.3.5/setip'
input 'h ttp://192.168.3.5/setip'
input 'h ttp://192.168.3.5/setip'
input 'h ttp://192.168.3.5/setip'
 
я не пойму почему он обрезает мои параметры .. переменная же другая .. 
 
bsdshneg
Offline
Зарегистрирован: 21.10.2014

а если изменить вот так

void loop(){
  
  char* inputSUrl="h ttp://192.168.3.5/setip?aaa=192&bbb=168&ccc=1&ddd=33"; // наши тестовые данные
  char* match = "aaa";

  
  Serial.print("input '");Serial.print(inputSUrl);  Serial.println("'");
  
  // парсим
  parseParams(inputSUrl, match);
//  if (printParams() == "192") {
    Serial.println(printParams());
  // выводим что получилось
//  }
  
}

то выводит вот так

input 'h ttp://192.168.3.5/setip?aaa=192&bbb=168&ccc=1&ddd=33'
192
input 'h ttp://192.168.3.5/setip'
0
input 'h ttp://192.168.3.5/setip'
0
input 'h ttp://192.168.3.5/setip'
0
input 'h ttp://192.168.3.5/setip'
0
 
при этом, если поставим IF
 
void loop(){
  
  char* inputSUrl="h ttp://192.168.3.5/setip?aaa=192&bbb=168&ccc=1&ddd=33"; // наши тестовые данные
  char* match = "aaa";

  
  Serial.print("input '");Serial.print(inputSUrl);  Serial.println("'");
  
  // парсим
  parseParams(inputSUrl, match);
  if (printParams() == "192") {
    Serial.println("Ok");
  }
  
}

то получим вот такую ошибку

sketch_nov10b.ino: In function 'void loop()':
sketch_nov10b:82: error: ISO C++ forbids comparison between pointer and integer

 

 

bsdshneg
Offline
Зарегистрирован: 21.10.2014

после вот таких изменений

int parseParams(char* inputString, char* match){
  
  parsedParams=0; // пока ничего не напарсили
 char* buffer=strtok(inputString,"?"); // лучше так проверять/пропускать вопросилово
 
  if(buffer!=NULL){
    for(buffer=strtok(NULL,"&"); buffer!=NULL;     buffer=strtok(NULL,"&") ) 
    {
      String buffer1= String(buffer);
      params[parsedParams].name=buffer1.substring(0,buffer1.indexOf('='));
      
        if (params[parsedParams].name == match) {
        
          params[parsedParams].value=strtoint(buffer1.substring(buffer1.indexOf('=')+1)); 
          
          return params[parsedParams].value;
          
          parsedParams++; // отмечаем сколько удалось распарсить
        
        }
      
    }
         if(parsedParams>MAX_PARAMS-1)return 0; // больше нет места куда сохранять парсенное.
  } 
     
}

......

void loop(){
  
  char* inputSUrl="h ttp://192.168.3.5/setip?aaa=192&bbb=168&ccc=1&ddd=33"; // наши тестовые данные
  char* match = "aaa";

  
  Serial.print("input '");Serial.print(inputSUrl);  Serial.println("'");

  if (parseParams(inputSUrl, match) == "192") {
    Serial.println("Ok!");
  }
  
}

получаем ошибку

sketch_nov10b.ino: In function 'void loop()':
sketch_nov10b:84: error: ISO C++ forbids comparison between pointer and integer
 
а если пишем результат в Serial - то всё пишет, но опять же вот так:
input 'h ttp://192.168.3.5/setip?aaa=192&bbb=168&ccc=1&ddd=33'
192
input 'h ttp://192.168.3.5/setip'
0
input 'h ttp://192.168.3.5/setip'
0
input 'h ttp://192.168.3.5/setip'
0
input 'h ttp://192.168.3.5/setip'
0
 
т.е. почему-то берёт целую строку только при первом прохождении циклом .. 
 
я в тупике .. 

 

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

Ну правильно - при парсинге вы указатель перезаписываете вот оно и работает только один раз чтобы работало много раз нужно присваивать строки через strncpy(), так же желательно явно задать максимальную длину строки

char inputSUrl[255];
strncpy(inputUrl,"h ttp://192.168.3.5/setip?aaa=192&bbb=168&ccc=1&ddd=33\0",255);

 

bsdshneg
Offline
Зарегистрирован: 21.10.2014

Супер, а можешь помочь разобраться с тем, как сравнить полученный результат с моей строкой?

bsdshneg
Offline
Зарегистрирован: 21.10.2014

да ё-моё .... если значение параметра не число - то выводится 0 .... 

например

_http://192.168.3.5/setip?aaa=qwerty&bbb=168&ccc=1&ddd=33

 

input 'h ttp://192.168.3.5/setip?aaa=qwerty&bbb=168&ccc=&ddd=33'

0
input 'h ttp://192.168.3.5/setip?aaa=qwerty&bbb=168&ccc=&ddd=33'
0
input 'h ttp://192.168.3.5/setip?aaa=qwerty&bbb=168&ccc=&ddd=33'
0
input 'h ttp://192.168.3.5/setip?aaa=qwerty&bbb=168&ccc=&ddd=33'
0
 
 
 
NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

Ну так и должно быть согласно строке 14 и функции strtoint()

params[parsedParams].value=strtoint(buffer1.substring(buffer1.indexOf('=')+1));

Попейте чаю а то уже очевидного не замечаете.

bsdshneg
Offline
Зарегистрирован: 21.10.2014

Ну да, перегрелся видимо .. 

// структра описывающие наш параметр

struct port_param_t{String name; String value;};

#define MAX_PARAMS 20 // сколько параметров максимально мы умеем парсить

port_param_t params[MAX_PARAMS]; // в этот массис будем сохранять наши парсенные параметры

byte parsedParams=0; // сколько параметров нам удалось напарсить

void setup(){

  Serial.begin(9600);

}

// парсид входящую строку в массив params[] и устанавливает parsedParam в количество прочитанных элементов

String parseParams(char* inputString, String match){
  
  parsedParams=0; // пока ничего не напарсили
  char* buffer=strtok(inputString,"?"); // лучше так проверять/пропускать вопросилово
 
  if(buffer!=NULL){
    for(buffer=strtok(NULL,"&"); buffer!=NULL; buffer=strtok(NULL,"&") )
    {
      String buffer1 = String(buffer);
      params[parsedParams].name=buffer1.substring(0,buffer1.indexOf('='));
      
        if (params[parsedParams].name == match) {
        
          //params[parsedParams].value=strtoint(buffer1.substring(buffer1.indexOf('=')+1)); 
          params[parsedParams].value=buffer1.substring(buffer1.indexOf('=')+1);
          return (params[parsedParams].value);
          //return strtoint(buffer1.substring(buffer1.indexOf('=')+1));
          
          parsedParams++; // отмечаем сколько удалось распарсить
        
        }
      
    }

  } 
     
}


void loop(){
  
  char inputSUrl[255];
  strncpy(inputSUrl,"h ttp://192.168.3.5/setip?aaa=qwerty&bbb=168&ccc=&ddd=33",255);
  
  Serial.print("input '");Serial.print(inputSUrl);  Serial.println("'");
  
  if (parseParams(inputSUrl, "aaa") == "qwert1y") {
    Serial.println("aaa - Ok!");
  } else {
      Serial.println("aaa - err!");
  }
  strncpy(inputSUrl,"h ttp://192.168.3.5/setip?aaa=qwerty&bbb=168&ccc=&ddd=33",255);
  if (parseParams(inputSUrl, "bbb") == "168") {
    Serial.println("bbb - Ok!");
  } else {
      Serial.println("bbb - err!");
  }
  strncpy(inputSUrl,"h ttp://192.168.3.5/setip?aaa=qwerty&bbb=168&ccc=&ddd=33",255);
  if (parseParams(inputSUrl, "ccc") == "") {
    Serial.println("ccc - Ok!");
  } else {
      Serial.println("ccc - err!");
  }
  strncpy(inputSUrl,"h ttp://192.168.3.5/setip?aaa=qwerty&bbb=168&ccc=&ddd=33",255);
  if (parseParams(inputSUrl, "ddd") == "33") {
    Serial.println("ddd - Ok!");
  } else {
      Serial.println("ddd - err!");
      
  }
  
}

последний момент остался непонятным ... 

strncpy(inputSUrl,"h ttp://192.168.3.5/setip?aaa=qwerty&bbb=168&ccc=&ddd=33",255);

придётся после каждого сравнения писать?

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

strncpy() нужно чтобы скопировать строку в кавычках в память выделенную для переменной. Логичнее в самой функции определить переменную и копировать туда данные, для их обработки. по переданному указателю или даже по указателю который разбивает строку по '?'. 

P.S. Код конечно жуткий, но вам самому надо понять как его улучшить. Я бы сделал класс, где парметры парсились при инициализации и потом просто нахолились по имени.

bsdshneg
Offline
Зарегистрирован: 21.10.2014

На счёт кода - согласен ... и подозреваю я, что гораздо проще/лучше/правильней/безопасней будет прицепить контроллер к COM (USB-COM) порту сервера (на котором и будет вертеться вся веб-мордочка), и уже СЛАТЬ команды на него, управляя из полноценного веб-интерфейса ... или попробовать использовать Шилд с микроСД картой ... народ пишет, что с ним проще работать, да и сам он мощнее ... 

bsdshneg
Offline
Зарегистрирован: 21.10.2014

Столкнулся счас с такой штукой ... подал внешнее питание а контроллер, а он не проинициализировался ардуинкой ... какая разница в том, какое питание подаётся? .. было подано питание от второй ардуинки ... просто питание и всё

art100
Offline
Зарегистрирован: 09.03.2014

[quote=bsdshneg]Столкнулся...[/quote]со схемой электрической

bsdshneg
Offline
Зарегистрирован: 21.10.2014

Пардон, а какая разницо откуда питание идёт? .. или я физику наглухо забыл?

art100
Offline
Зарегистрирован: 09.03.2014

bsdshneg пишет:

Пардон, а какая разницо откуда питание идёт? .. или я физику наглухо забыл?

а по физике электротехнику всегда поверхностно опысывают

схему посмотрите поймете

что вы там резет не понимаете?

как резистор притягивает к плюсу?

на какой уровень пр каких кандерах этот уровень проседает?

ключевое слово

я вашей схемы не вижу

разговор ни о чем

щас попробую поискать местные мои чтоб дать понять что без основ разговор ни о чем

схема

 

З.Ы.напрмер вот боролся с нехилой пульсацией коллекторных моторов в режиме жуткого форсажа

https://yadi.sk/i/tikT5q0NaFQuP

там по питанию ардуины лупит удары током по полампера

у вас все в разы спокойнее

в веб игрушками вообще не помню проблем по питанию

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

99% от отсутсивя понимания основ http клиент сервер что делать сревреру что делать клиенту и сколько у кого ресрурсов и куда логику в каком случае лучше переносить

я все жду когда тут застонут когда php не смогу всунуть

фотки моих веб сервреров на ардуине не нашел а поднимать лень

а ведь будут

даю вероятность 99% на due будут пытаться

 

bsdshneg
Offline
Зарегистрирован: 21.10.2014

По поводу логики - разговор отдельный)))))

На счет php - натыкался на статью, но не про ардуину, а просто на атмеге и эзернет-контроллере собирали мини вебник, кстати с cgi и там выполнялись легкие php скрипты )))

з.ы. девайс по полу катается прикольный)))

 

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

Может я не прав, но у меня не получилось (хотя я не мега-кодер на Си) ...

art100
Offline
Зарегистрирован: 09.03.2014

bsdshneg пишет:
...универсальности" не добиться ... 

зриш в корень

1.это слово закончилось на apache ну например http://art1.by иссКуйСвто заключаю в выгребании авна и запуска в промышленную эксплуатацию

 

2.на атмегах 328 больше не всунешь и то тут сдшка нужна

пока всю логику на произвольного но виндо-линухо-андроид клиента не перенес нормально адекватно не управляется

и то в один поток

вот тут хороший пример

checkbox прекрастно щелкаешь релюшками тож бывает твой комп пока выплюнет команду бывает в непонятках через секунду

button труба дело вроде жмется а скорострельности что-то стабильно меньше

а вот отображение в сторону клинета когда логика клиента нафик не работает

переменники отображаются шустренько

ну кнопки понятно как сам пальцем тыкаешь

быстрей чем этот веб интерфейс не всречал

скорость определятся скоростью виндо компьютера

начинаеш просчитывать затраты и получается

Меньше 50$(без акк) за однопотоковый ногодрыг ацпслух через веб ключевое новомодное слово atmega328

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

За 200$(с аккумуляторм) древнюoщий махровый апач по 50 попыток взлома в сутки игнорирует пятилетками ключевое слово старик интел 

веб одноплатники собирал

на raspberry 185$ (без акк) тот же апач или nxix но с гиммороем на raspbian поднимать если только готовое тебе не в тему 

 

bsdshneg
Offline
Зарегистрирован: 21.10.2014

Ну как сказать про готовое ... надо начать с того "для чего оно мне"

Ответ прост - пока не для чего ... с ардуиной знаком пару недель, пришёл ещё комплект барахла из Китая .. вот сижу разбираюсь, как минутка выдаётся .. страничку с СД карты отдаёт, но опять же, чтоб это всё красиво работало (например при включении чего-нибудь, на страничке показывала, что это что-то включено, а не 2 кнопуи ВКЛ и ВЫКЛ) - нужно продумывать как это делать с минимальными нагрузками на контроллер .. вариант вижу с записью/чтением параметров в/из файлик(а), чтоб eeprom не засирать, но опять же, это пока так, баловство ... пожалуй самым провильным вариантом будет всёж подключение этого хозяйства к серверу через USB-COM и управление командами ... с уже красивым, понятным WEB-интерфейсом .. хотя опять же вопрос обратной связи от контроллера имеет место быть, т.е. как он будет сообщать статусы того или иного прибора подсоединённого к нему .... выход - запись параметров например в базу и при включении контроллера слать ему портянку из комманд .. 

 

Короче тема долгая и интересная, особенно с пивом хорошо будет обсуждаться .. жаль не с кем)))

art100
Offline
Зарегистрирован: 09.03.2014

bsdshneg пишет:

Ну как сказать про готовое ... надо начать с того "для чего оно мне"

Ответ прост - пока не для чего ... с ардуиной знаком пару недель, пришёл ещё комплект барахла из Китая .. вот сижу разбираюсь, как минутка выдаётся .. страничку с СД карты отдаёт, но опять же, чтоб это всё красиво работало (например при включении чего-нибудь, на страничке показывала, что это что-то включено, а не 2 кнопуи ВКЛ и ВЫКЛ) - нужно продумывать как это делать с минимальными нагрузками на контроллер .. вариант вижу с записью/чтением параметров в/из файлик(а), чтоб eeprom не засирать, но опять же, это пока так, баловство ... пожалуй самым провильным вариантом будет всёж подключение этого хозяйства к серверу через USB-COM и управление командами ... с уже красивым, понятным WEB-интерфейсом .. хотя опять же вопрос обратной связи от контроллера имеет место быть, т.е. как он будет сообщать статусы того или иного прибора подсоединённого к нему .... выход - запись параметров например в базу и при включении контроллера слать ему портянку из комманд .. 

 

Короче тема долгая и интересная, особенно с пивом хорошо будет обсуждаться .. жаль не с кем)))

вижу веб вы никогда не поднимали

на этой миркушке забудьте про php как старшный сон очевидно cgi вы не писали и не нужно в микрушку его пихать

логика на стороне клиента называется JavaScript логика которая утрамбована оптимальна уже абревиатура Ключевая абревиатруа ajax

почитайте что это за приемы кодирования javascript передачи xml и какая упрощенная серверная часть достаточна ino подгрузки клиенту html - это наш случай atmega328

приведенная страничка как говорят pure java в данном случае конечно же не ява а "чистый ajax" по книжке с прикручиванием к atmega328+w5100+miniSD32gbyte+ethernet+code.ino+index.html-><--xml-->intel+windows7+yandex.browser+index.html+javascript

вот такая цепочка технологических решений

1. Сервер Слабый

логику стартуя молотит ардуино как только появился первый и постяннй запрос пытается вытолкнуть с minisd index.html в сторону занимающего канал связи и становится в ожидание команд "command".xml все за 1 секунду успел и расслабился

2. Клиент Мощный

мощный Intel Core Due +Windows7+ или Android начиная с версий 2 запускает монстра Web-Browser способного легко промолачивать JavaScript и задавать вопросы серверу легковесной xml

я даже command.xml не писал она на лету в памятях мелочь тощая туду сюда шныряет

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

это основы построения клиент сервер - кто думает больше

народ за 2 пятилетку вообще обленился

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

а тут надо вспомнить основы и логику всего-лишь из cgi/php перенести в javascript

чтоб студентов на бабло раздевать обозвали все словом ajax

все старо как мир web

чтоб не собирать с миру по нитке поищи книжку со словами ну типа ajax 

я когда писал книжек не нашел

а вот статейки как к генератору arduino-w5100-index.html прикрутить омен ajax-ом уже были все на ангельском

теоретически можно index.html типовой 10кбайт в код ino хранить но я что дибил что-ли 

любая правка оформления старнички будет требовать перешивание контроллера

я сразу искал варинат чтобы index.html править в любой момент 

люди которые придумывали этот щиток реально знают основы построения web-server тупо покупаешь и все готовенькое для сервера

Я этот щиток на Arduino Mega ADK и Arduino Uno R3 проверял одним и тем же кодом на ура.

Релюшный щиток сверху третей полкой на ура.

И не грееется я на всякий случай радиатор приклеил на w5100

Теперь вопрос о графике

Стадо сразу пытается графику прикрутить и тупят постояно.

Основы если не хватает ресурсов сервера подкачиваем с сервера который успевает. Это прописано в стандарте HTTP.

Я думал со свободных 32 гигабайт miniSD шки подкачивть jpg gif и тормоза жуткие не прокачке. Решение внешними ссылками со своего севрера подкачивать. У меня есть веб-сервера личные, мне легко, а у вас? Короче я жестко послал графику в сад. Брал чисто древню псевдо графику и средства JavaScript. Button максимум. Варианты когда стрелочки на шкалках двигаются. Ну тормозят они.

Короче текст и максимум цвет шрифт и все летает как ласточка на любов вашем android nokia и других мобильниках.

Проанализируем клиентов

Собственно я делал из расчета мелкого мобильного интерфейса. Узенько и Высоко так чтобы на 4 дюймовом оперативно без увеличения можно было тыкнуть.

button вроде побольше, а оказался хуже проверенного старика checkbox-а в синтаксисе javascript

 

Ладно хватит. Преподы за такой курс 1500$ берут. И так много безплатно рассказал.

попробуйте понять что здесь написано - это с рабочего сервера каждая строчка вилизана и вычищена летает ласточкой

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

так сказать вариант заготовка для разработчика

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

ключевое слово удаляя а не комментируя иначе вы не расслябляете arduino

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

<!DOCTYPE html>
<html>
<head>
<title>art100</title>
<script>
strLED1 = "";
strLED2 = "";
strLED3 = "";
strLED4 = "";
var LED3_state = 0;
var LED4_state = 0;

function GetArduinoIO()	{
nocache = "&nocache=" + Math.random() * 1000000;
var request = new XMLHttpRequest();
request.onreadystatechange = function(){
	if (this.readyState == 4) {
		if (this.status == 200) {
			if (this.responseXML != null) {
// XML file received - contains analog values, switch values and LED states
var count;
// get analog inputs
var num_an = this.responseXML.getElementsByTagName('analog').length;
for (count = 0; count < num_an; count++) {document.getElementsByClassName("analog")[count].innerHTML =
					this.responseXML.getElementsByTagName('analog')[count].childNodes[0].nodeValue;	}
// get switch inputs
var num_an = this.responseXML.getElementsByTagName('switch').length;
for (count = 0; count < num_an; count++) {document.getElementsByClassName("switches")[count].innerHTML =
					this.responseXML.getElementsByTagName('switch')[count].childNodes[0].nodeValue;	}
// LED 1
if (this.responseXML.getElementsByTagName('LED')[0].childNodes[0].nodeValue === "checked") {
		document.LED_form.LED1.checked = true;	}
else {		document.LED_form.LED1.checked = false;	}
// LED 2
if (this.responseXML.getElementsByTagName('LED')[1].childNodes[0].nodeValue === "checked") {
		document.LED_form.LED2.checked = true;	}
else {		document.LED_form.LED2.checked = false;	}
// LED 3
if (this.responseXML.getElementsByTagName('LED')[2].childNodes[0].nodeValue === "on") {
		document.getElementById("LED3").innerHTML = "LED 3 is ON (D8)";		LED3_state = 1;	}
else {		document.getElementById("LED3").innerHTML = "LED 3 is OFF (D8)";	LED3_state = 0;	}
// LED 4
if (this.responseXML.getElementsByTagName('LED')[3].childNodes[0].nodeValue === "on") {
		document.getElementById("LED4").innerHTML = "LED 4 is ON (D9)";		LED4_state = 1;	}
else {		document.getElementById("LED4").innerHTML = "LED 4 is OFF (D9)";	LED4_state = 0;	}
				}
			}
		}
	}

	// send HTTP GET request with LEDs to switch on/off if any
	request.open("GET", "ajax_inputs" + strLED1 + strLED2 + strLED3 + strLED4 + nocache, true);
	request.send(null);
	setTimeout('GetArduinoIO()', 1000);
	strLED1 = "";
	strLED2 = "";
	strLED3 = "";
	strLED4 = "";
}
// service LEDs when checkbox checked/unchecked
function GetCheck(){
	if (LED_form.LED1.checked) {	strLED1 = "&LED1=1";}
	else {				strLED1 = "&LED1=0";}
	if (LED_form.LED2.checked) {    strLED2 = "&LED2=1";}
	else {				strLED2 = "&LED2=0";}
}
function GetButton1(){
	if (LED3_state === 1) {		LED3_state = 0;		strLED3 = "&LED3=0";}
	else {				LED3_state = 1;		strLED3 = "&LED3=1";}
}
function GetButton2(){
	if (LED4_state === 1) {		LED4_state = 0;		strLED4 = "&LED4=0";}
	else {				LED4_state = 1;		strLED4 = "&LED4=1";}
}

</script>

<style type="text/css">
.IO_box {
//margin: auto;   
	float: left;
//	margin: 0 10px 10px 0;
	border: 4px solid grey;
	padding: 0 5px 0 5px;
	width: 175px;
}
h1 {
	text-align:center;
	font-size: 200%;
	color: green;
	margin: 0 0 10px 0;
}
h2 {
	font-size: 100%;
	color: grey;
	margin: 5px 0 5px 0;
}
p{
	font-size: 100%;
	color: green;
}
form{
	font-size: 100%;
	color: green;
}
button {
	font-size: 100%;
	color: black;
}
.small_text {
	font-size: 50%;
	color: grey;
}
body{   
	background-color:black; 
	background-image:url(constr.gif);
	background-repeat:no-repeat;
//	background-position:top;
}
</style>
</head>

<body onload="GetArduinoIO()">
        <h1>WebControl devices art100</h1>
<div style="float:left; position:relative; left:50%;">
<div style="float:left; position:relative; left:-50%;">
        <div class="IO_box">
		<h2>Input Analog</h2>
		<p class="small_text">Input A0 used by Ethernet shield</p>
		<p class="small_text">Input A1 used by Ethernet shield</p>
		<p>Input A2 1: <span class="analog">...</span></p>
		<p>Input A3 2: <span class="analog">...</span></p>
		<p>Input A4 3: <span class="analog">...</span></p>
		<p>Input A5 4: <span class="analog">...</span></p>
		<h2>Inputs Digital</h2>
		<p class="small_text">Input D0: used by serial RX</p>
		<p class="small_text">Input D1: used by serial TX</p>
		<p>Input D2 5: <span class="switches">...</span></p>
		<p>Input D3 6: <span class="switches">...</span></p>
		<p class="small_text">Input D4: used by Ethernet shield</p>
		<p>Input D5 7: <span class="switches">...</span></p>
	</div>
	<div class="IO_box">
		<h2>Output Checkbox</h2>
		<form id="check_LEDs" name="LED_form">
		<input type="checkbox" name="LED1" value="0" onclick="GetCheck()" />Output D6 1<br /><br />
		<input type="checkbox" name="LED2" value="0" onclick="GetCheck()" />Output D7 2<br /><br />
		</form>
		<h2>Output Button</h2>
		<button type="button" id="LED3" onclick="GetButton1()">Output is OFF D8 3</button><br /><br />
		<button type="button" id="LED4" onclick="GetButton2()">Output is OFF D9 4</button><br /><br />
		<p class="small_text">Output D10 used by Ethernet shield</p>
		<p class="small_text">Output D11 used by Ethernet shield</p>
		<p class="small_text">Output D12 used by Ethernet shield</p>
		<p class="small_text">Output D13 used by Ethernet shield</p>
	</div>
        
</div>
</div>
</body>
</html>

 

сохраните как index.html и вперед на мины

Не надо изобретать велосипеды. Из классического железа классический Web-Server-Arduino я устанавливаю вот таким. Красным цветом помечены свободные ноги для щитка третьего уровня. Можно и четвертый. Но тут уже все типы: Аналоги, I2C, Кнопки, Мощные ключи, Чего еще надо количество ног? Тупо вынимаем и вставляем в Arduino Mega без переписывания кода. Тут Щиток третьего уровня дороже arduino+w5100=17$ 20$ итого имеем без аккумулятора 50$. Я думаю мы понимаем что сервера без УПС не строятся ну на крайний случай wdt.h Мне эта собака никогда не нужна была.

Код не дам. Вот книжечку напишут за 50$. Потом переведут за 20$. Народ прочитет если не основы то хоть приемы переноса логики на клиента. Тогда и можно будет поповорить об оптимизации например. Ну жу куда оптимизировать? Без книжки. Как минимум продажная цена 100$ это минимум. Не нужна экспериментальщина? Вперед на заводские типовые решения за 50$. Не нравится? Вперед на покупку следующих заводских решений за 50$.

 

Ну вот заготовку целой лекции прочитал по курсу: http сервера клиенты. Распределение динамических и статичных данных при обмене.

 

bsdshneg
Offline
Зарегистрирован: 21.10.2014

Вах, круто ... есть пара НО:

Веб я поднимал, сбился со счёту раз ))) (да, не на ардуине а на многоголовом апаче, поэтому эта тема для меня офигенно нова)

Занимаюсь разработкой веб-проектом, поэтому и с технологиями знаком)))

С внешними серверами проблем нет, да и графики мне на странице не надо, первым делом я хочу разобраться с кодом ардуины, а именно - попробовать реализовать "модульную структуру" .. например есть ссылка

http://192.168.3.5/?mod=led&ledid=7&cmd=off

она соответствует такой структуре

http://192.168.3.5/?mod=<имя контроллера(модуля)>&<параметр>=<значение>&<команда>=<значение>

по анадогии с MVC моделью ... но вот как раз тут (написание кода на Си) знаний маловато :(

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

У меня есть желание именно разобраться, понять, ане копипастить чужой код ...

art100
Offline
Зарегистрирован: 09.03.2014

как будет осуществляться передача параметров от ардуины на эту страничку (к примеру как будет известно, что светодиод включен, а не выключен),

тощий xml

учитывая, что страничка лежит на SD карте

1!!! один раз при запросе клента пытаемся 4 килобайта index.html затолкать клиенту чтоб думать начинал уже он

У меня есть желание именно разобраться, понять, ане копипастить чужой код ...

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

очень много случайного народы в веб стротиельстве не понимают для чего придумали симовл переноса строки в конце передаче \n и ноют тут 99,99999999999999% что связь обАрВалАся ай яй яй

их халтурщиков вредителей надо xtml ткнуть носом за грубейши брак в сети

я 3 недели вьезжал по 14 часов без праздников и выходных

количесво авна переичнанного 

думаю проштудировал все книжки што хоть как-то по этой теме боком

вот сухая выжимка в остатке

 Содержимое папки D:\workarduino\ethernet

14.11.2014  12:28    <DIR>          .
14.11.2014  12:28    <DIR>          ..
09.06.2014  11:01             1 931 0000000000000abel.txt
18.07.2014  07:00    <DIR>          0gif
14.11.2014  12:28                 0 1.txt
18.07.2014  07:00    <DIR>          ajax
18.07.2014  07:00    <DIR>          arduino0023
10.02.2014  21:04            18 826 ASCII-Table.htm
18.07.2014  07:00    <DIR>          chinaunsorted
04.10.2014  09:54    <DIR>          construction
18.07.2014  07:00    <DIR>          ethernetW5100server
18.07.2014  07:00    <DIR>          gifauto
13.06.2014  20:15             4 089 index.htm
06.06.2014  23:18             5 184 index.htm.1ok
13.06.2014  11:13             4 519 index.htm.2ok
13.06.2014  11:29             4 403 index.htm.3ok
13.06.2014  11:40             5 524 index.htm.4ok
13.06.2014  12:31             4 084 index.htm.5ok
03.10.2014  09:49    <DIR>          majordomo-arduino-master
03.10.2014  09:47            10 647 majordomo-arduino-master.zip
18.07.2014  07:00    <DIR>          musormakroff
18.07.2014  07:00    <DIR>          musorsketch_may26b
18.07.2014  07:00    <DIR>          musorWebduino
23.10.2014  11:02    <DIR>          radiofirmwareupdatenrf24nrf24
18.07.2014  07:00    <DIR>          seismogifcssnowork
04.10.2014  09:53    <DIR>          slider0023
26.05.2014  19:18           357 033 String.zip
18.07.2014  07:00    <DIR>          techmike
18.07.2014  07:00    <DIR>          Teleduino
18.07.2014  07:00    <DIR>          tempgavno
18.07.2014  07:00    <DIR>          TwitterRead
18.07.2014  07:00    <DIR>          web-rsswitch1
13.11.2014  15:38    <DIR>          webcontrol
18.07.2014  07:00    <DIR>          webcontrolart10020pins_192168020_20140618200000
18.07.2014  07:00    <DIR>          webcontrolart100_20140608_200000ok
06.07.2014  08:26            44 170 webcontrolart100_4pins19216802120140706100000.rar
18.07.2014  07:01    <DIR>          webcontrolled01
13.11.2014  15:41            14 348 webinterface.png
18.07.2014  07:01    <DIR>          webledsketch_may26cnowork
18.07.2014  07:01    <DIR>          WebServer
18.07.2014  07:01    <DIR>          webserver-ds
18.07.2014  07:01    <DIR>          webserver-ds1920
18.07.2014  07:01    <DIR>          webserver-sig
18.07.2014  07:01    <DIR>          WebServer1
18.07.2014  07:01    <DIR>          webserverajaxswitch2
18.07.2014  07:01    <DIR>          webservercommandlineleds8
18.07.2014  07:01    <DIR>          webserverio1
18.07.2014  07:01    <DIR>          webserversd
18.07.2014  07:01    <DIR>          webserverst1
18.07.2014  07:01    <DIR>          webswichfromzoomkat1
18.07.2014  07:01    <DIR>          webswitch
18.07.2014  07:01    <DIR>          webswitchajax1
18.07.2014  07:01    <DIR>          webTwitterClient
18.07.2014  07:01    <DIR>          webweather
18.07.2014  07:01    <DIR>          web_batton1
18.07.2014  07:01    <DIR>          web_button_led
18.07.2014  07:01    <DIR>          web_button_led20140526_075700
18.07.2014  07:01    <DIR>          web_led1
18.07.2014  07:01    <DIR>          web_radio_switch1
              13 файлов        474 758 байт
              46 папок  54 696 837 120 байт свободно

теряешь время это все уже написано по моим прикидкам 2 года назад

сайт есть какой?

w5100+ miniSD на 4 килобайта нйдется?

мой "балконнный личный апач" http://art1.by

 

bsdshneg
Offline
Зарегистрирован: 21.10.2014

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

Если ты говоришь, что написано, можешь инфой поделиться? .. на примеры ссылочку кинуть? .. по примерам всёж проще изучать-то))) 

Просто я уже долго ищу, но не нашёл ровным счётом ничего подобного ...

art100
Offline
Зарегистрирован: 09.03.2014

bsdshneg пишет:

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

Если ты говоришь, что написано, можешь инфой поделиться? .. на примеры ссылочку кинуть? .. по примерам всёж проще изучать-то))) 

Просто я уже долго ищу, но не нашёл ровным счётом ничего подобного ...

а железо?

w5100+ miniSD на 4 килобайта нйдется?

bsdshneg
Offline
Зарегистрирован: 21.10.2014

у меня пока эзернет-модуль enc28j60 и вот такой SD-модуль 

ну и карта на 512мегов .. перебрал 4 штуки, только 1 заработала ... 

art100
Offline
Зарегистрирован: 09.03.2014

bsdshneg пишет:

у меня пока эзернет-модуль enc28j60 и вот такой SD-модуль 

ну и карта на 512мегов .. перебрал 4 штуки, только 1 заработала ... 

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

Мне за сервера в следующем месяце платить надо 40$. И что-то пока халтур нет. Если ты сайт поднимал то понимаешь, что это не деньги за рабочую технологию.

Рабочий код сервера могу продать. Веб сервер arduino что на мега что на uno в инет для тестирования выставить не проблема. А как он поднимется на твоем железе. Тебе смотреть надо. Теоретически вроде похоже. Смотри сам. Мое железо. Все классика все схемы официальные. http://arduino.cc/en/Main/ArduinoEthernetShield все тут всем доступно.

http://arduino.cc/en/uploads/Main/arduino-ethernet-shield-06-schematic.pdf

Код я для этого железа отлаживал.

Красным я помечаю свободные ноги. Остальное все сервер занимает.

Решайся на книжках больше потратишь и не найдешь единственно правильного решения. Почтовым переводом например. Или в банк сходить на карточку как я хохлам типа всяких вариантов мгновенных переводов. В моем банке все варианты есть возможны. В Краматорск до войны я хлопцу через WesternUnion 180$ за 2 дня долетало.

 

Будешь у себя лежа на диване своим андроидом релюшками всякие девайсы щелкать :)

Я уже нащелкался я своему Windows2012-му думаю включение удаленное приладить. Но пока жареный петух не клюнул лень.

 

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

Enc28j60 - не очень удобен - много памяти сьедает TCP/IP стек. Я использовал библиотеку Webduino - почти полноценный веб сервер, но памяти тоже не хило ест. Можно конечно самому написать только нужный функционал - экономя каждый байт. Модулюную структуру я понимаю как - куча модулей связывается с сервером - получая по dhcp адреса и используя адрес шлюза для запроса настроек и регистрации. Если модули настроены то - они могут связываться между собой (в настройках задается автоматика взаимодействия). Но это как экстренная мера при нарушении целостности сети - когда сервер недоступен. 

Каждое устройство имеет в себе http клиента для уведомления сервера о событиях на входах устройства и http сервер для управления устройством. Параметры лучше чтобы были числовыми - от 0 до 255 (1 байт или тип uint8_t). А на самом устройстве сделать "стстичную" страницу с описанием возможностей - количество входов, выходов, возможные значения.

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

bsdshneg
Offline
Зарегистрирован: 21.10.2014
art100
Закажу я пожалуй себе шилд, а как придёт - так может и приобрету у тебя код (пока сам на мели) ... если сам сосвем задолбаюсь)))
К этой железке другая библиотека, а переделывать я пока не рискну .. не тот опыт ещё...
 
NeiroN
Что касается неудобности - я уже начал догадываться(((
 
Под "модулбной структурой" я имел в виду органицацию работы (структуру кода) в пределах одного контроллера, на счёт ольшого количества железок с http клиентом мне ещё рано говорить))))
 
Вот как раз о приведённой тобой модулбной структуре я уже думал, но я понятия не имею, как делать правильно (после того, как с этим зазберусь) ... 
 
------------------------
Каждое устройство имеет в себе http клиента для уведомления сервера о событиях на входах устройства и http сервер для управления устройством. Параметры лучше чтобы были числовыми - от 0 до 255 (1 байт или тип uint8_t). А на самом устройстве сделать "стстичную" страницу с описанием возможностей - количество входов, -выходов, возможные значения.
------------------------
 
Вот как будет лучше/правильней делать, в качестве основного сервера таки поднимать на ардуине
 
arduino+ethernet (главный модуль)
|___arduino+ethernet (вторичный модуль)
|___arduino+ethernet (вторичный модуль)
|___arduino+ethernet (вторичный модуль)
 
или взять нормальный "сервак" и им уже принимать данные(по эзернет) от нескольких устройств(для которых и сгодится мой эзернет-модуль) и соответственно ими управлять,
 
СЕРВЕР
|___arduino+ethernet (вторичный модуль)
|___arduino+ethernet (вторичный модуль)
|___arduino+ethernet (вторичный модуль)
 
или прицепить"главный" можуль в COM-порт и слать ему команды?
 
СЕРВЕР
|
USBtoCOM
|
arduino+ethernet (главный модуль)
|___arduino+ethernet (вторичный модуль)
|___arduino+ethernet (вторичный модуль)
|___arduino+ethernet (вторичный модуль)
 
... просто встанет вопрос безопасности, если использовать в качестве сервера ардуину ... да и "стоябельность" при небольшом флуде или спуфинге будет низкая ... может я и ошибаюсь .. 
NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

Я бы остановился на второй схеме плюсом(это в дальнейшем) к которой было бы p2p сеть(когда вторичные устройства тупо взаимодействуют между собой по последней настроенной логической схеме). 

Логика такая: если событие произошло в вторичном устройсве - они делают запрос на сервер. Если событие произошло на сервере - он делает запрос на нужное вторичное устройство. Например нужно зажечь лампочку - есть ардуинка с блоком реле и ардиинка с блоком кнопок. Нажимаем на кнопку - ардуинка делает запрос на сервер, сервер разбирается что за кнопка и включает соответвующую лампочку отправив запрос на ардуинку с блоком реле. А вот тут возникает вопрос - если сервер будет недоступен(перезагружаться после скачка напряжения) то свет включить не получится? Вот тут то и должно помочь p2p - когда ардуинка не увидя сервер выполнит команду(запрос) из загруженной конфигурации - обратится напрямую к ардуинке с блоком реле. Тоесть простая логика сможет работать даже при наличии всего 2 вторичных устройств связанных локальной сетью и предварительно настроенных.

art100
Offline
Зарегистрирован: 09.03.2014

вот это сюрприз :-o в век когда чипов как грязи еще что-то ковырять програмно

нет уж луше к 4$ добавлю 3$ тое сть не надо докупать SDсчитыватель баксов и чтоб летало удобно не глючило наращивалось

а сколько кардридерчик в розницу может это теже в итоге 7 баксов

  • Ethernet адаптер для MCU проектов от открыл студию; этот щит использует ENC28J60 чип, который требует реализации собственного стека TCP/IP в программное обеспечение

так как у меня всех тварей по аре мне все равно какой из трех вариантов

я затачивал так чтоб ардуино гаджет в любом месте на стенку за 50$ повесил и с любой точки мира рубильниками щелкать с любого устройства у жены некий Nokia с неким бройзером и прекрасно щелкается на расстояни дома на работе в тролейбусе

я так с миру доступ даю


#webcontrol art100 arduino
-A PREROUTING -i eth0 -p tcp --dport 8880 -j DNAT --to-destination 192.168.0.20:80
-A PREROUTING -i eth0 -p tcp --dport 8881 -j DNAT --to-destination 192.168.0.21:80
-A PREROUTING -i eth0 -p tcp --dport 8882 -j DNAT --to-destination 192.168.0.22:80

 плодитесь 50$ и размножайтесь WebArduino девайсы

в чем смысл покупать enc82j60 ведь те же деньги в итоге не наращиваемо не меньше размерам все равно картридер покупать и както прикручиват код тяжелее результат все чем далше тем менее надежнее?

1.сейчас щиток w5100 я считал 12$ сейчас смотрю уже 7$ и 2.летает все сдкартридер уже есть 3.нарастить щитком раз плюнуть 4.паять ничего не надо 5.вышло из строя замена легка.

чего-то я нмчего не понимаю

постарел наверно

у меня все стандартное из коробки

//art100 to write webarduino
#include <SPI.h>
#include <Ethernet.h>
#include <SD.h>
...всего 167 строк

и размер

Размер скетча в двоичном коде: 24 578 байт (из 32 256 байт максимум)

 влезает везде ну может только 8 и 16 не влезет

я еще думал может arduinopro+enc82j60-minisd в виде ручки пишущей сдеалть и на проводе UTP чтоб висело, а тут еще такие косяки за дорого

дайте ссыль на биьлиотеку enc82j60 посмотреть что там за писанина

а то я классикой ethernet.h может совсем обленился?

 

 

bsdshneg
Offline
Зарегистрирован: 21.10.2014

art100

Как я писал выше, ардуина у меня чуть более 2ух недель, а пришло всё разом, вместе с эзер-модулем+сд-модуль ... стоило это всё 12$

Библиотека вот https://github.com/jcw/ethercard

Вс более-менее подходящие примеры написаны именно под щиток .. вот заказал за 5$

bsdshneg
Offline
Зарегистрирован: 21.10.2014

NeiroN

Вот я тоже к этому варианту склоняюсь, НО хочу свести роль сервера к минимуму .. ну или действительно что-то типа p2p в отдалённом светлом будущем попробовать реализовать)))