Arduino как принять два параметра из строки запроса

Подключение исполнительных устройств, датчиков, контроллеров.

Модератор: immortal

Ответить
Xseon
Сообщения: 51
Зарегистрирован: Ср сен 18, 2013 12:21 am
Благодарил (а): 9 раз
Поблагодарили: 7 раз

Arduino как принять два параметра из строки запроса

Сообщение Xseon » Ср ноя 20, 2013 9:06 pm

Всем привет.
Гуглил, искал на arduino.cc, результата пока увы нет.
Может кто подскажет... как в скетче для дуни обработать две переменные за раз из строки запроса?
Для примера опишу задачу:
Из МД посылается запрос вида:

Код: Выделить всё

getURL('http://192.168.1.253/command?0=BRIGHT',0);
После того как дуня видит, что это команда диммирования, она выставляет заданное значение (у меня сейчас на тесте порт 21).
Так вот мне хочется вместе со значением яркости передать и номер порта, на котором нужно задать этот уровень.
собственно строка запроса в моём понимании должна выглядеть примерно так:

Код: Выделить всё

getURL('http://192.168.1.253/command?21=PINB&155=BRIGHT',0);
Дуня должна понять, что на 21 порту нужно сделать яркость 155...
Заранее благодарен.
З.Ы. Сергей, может сделаем отдельную ветку с arduino, ведь это самый дешевый компонент для умного дома ИМХО.
Xseon
Сообщения: 51
Зарегистрирован: Ср сен 18, 2013 12:21 am
Благодарил (а): 9 раз
Поблагодарили: 7 раз

Re: Arduino как принять два параметра из строки запроса

Сообщение Xseon » Чт ноя 21, 2013 9:29 pm

Думал есть грамотное решение задачи у форумчан, но видимо никто не морочился...

Решил пойти на маленькую хитрость в скетче...

Код: Выделить всё

while (strlen(url_tail)) // Разбор URI на составные части (выборка параметров)
    {
      rc = server.nextURLparam(&url_tail, name, NAMELEN, value, VALUELEN);
      if (rc == URLPARAM_EOS) {
        // server.printP(Params_end);
      }
      else // Получили параметр (name) и его значение (value)
      {
        // Выполняем команды
        strcpy (gCommandBuffer, value); // параметры (значение)
        strcpy (gParamBuffer, name); // команда
        if (strcmp("PINB", gCommandBuffer) == 0) { //Проверяем имя команды, если это указатель на номер пина Дуни, то
          pinB = strtol(gParamBuffer, NULL, 0); // Присваиваем его
        }
        cliProcessCommand(server);
      }
    }
В итоге всё очень корректно отрабатывает...
Но хочу правильного решения данного вопроса.
mixa
Сообщения: 7
Зарегистрирован: Вс окт 27, 2013 10:36 pm
Благодарил (а): 1 раз
Поблагодарили: 0

Re: Arduino как принять два параметра из строки запроса

Сообщение mixa » Сб ноя 23, 2013 7:48 am

Я сделал так:

Код: Выделить всё

  // чтене с порта строки
  while (Serial.available())    //если есть что читать
  {
    char c = Serial.read();     //читаем символ
    s += c;                     //добавляем к строке
    if (c == '\n')              //если считали символ переноса каретки (строка закончилась)
    {
      Serial.print("String: "); //выводим строку
      Serial.println(s);
      // Парсинг строки
      s=s.substring(0,s.length()-1);
      // Выводит список комманд (вызов http://xx.xx.xx.xx/command?8=HELP )      
      //Serial.println("substr" + s.substring(0,8));
      if (s.substring(0,9) == "/command?")
      {
        s=s.substring(9);

        for(;s.indexOf(delim)>0 or s.indexOf('=')>0;)
        {
          Serial.println("s1:" + s );

          if(s.indexOf(delim)>0){
            bufp=s.substring(0,s.indexOf(delim));
            s=s.substring(s.indexOf(delim)+1);
            Serial.println("s2:" + s + " b:" + bufp);
          }
          else
          {
            bufp=s;
            s="";
          }
          if (bufp.indexOf('=')>0)
          {
            //Значение
            val=bufp.substring(0,bufp.indexOf('='));
            // Команда
            com=bufp.substring(bufp.indexOf('=')+1);

            Serial.println("val:" + val + " com:" + com);
            // ----------- HELP -------------------
            if(com == "HELP"){
              Serial.println("Help");
            } 
            // ------------ TEST -----------------------
            else if(com == "TEST")
            {
              Serial.println("Test");
            } 
            //--------------- GETTemp1  Тепература на первом термометре ------------------
            else if(com == "GETTemp1")
            {
              if (getTemperature()==true)  
              {
                new_temperature1=((int)(new_temperature1*10.0))/10.0;
//                sprintf(buf, gethttp,"GET /objects/?object=SensorWestBalkonInt&op=m&m=tempChanged&t=%s HTTP/1.0", dtostrf(new_temperature1,2,2,buffer));   
                sprintf(buf, gethttp,"SensorWestBalkonInt","tempChanged",dtostrf(new_temperature1,2,2,buffer));   
                old_temperature1=new_temperature1;
                Serial.println(buf);
              }
            } 
            //  --- Жалюзи 1   В положение val
            //commnad?180=SetG1;90=SetG1
            else if(com == "SetG1")
            {
              PosSm1=val.toInt();
              Sm1.write(PosSm1);
              ServNF();
            } 
            //  --- Жалюзи 2   В положение val
            else if(com == "SetG2")
            {
              PosSm2=val.toInt();
              Sm2.write(PosSm2);
              ServNF();
            } 

            // --------------- Ошибка  --------------------
            else
            {
              Serial.println("Error: Unable command" + com );
            }
          }
          else
          { 
            Serial.println("Error: Format Only  http://xx.xx.xx.xx/command?[val]=[command] ");
          }
        }
      }

      s = "";
    }
  }
dmw
Сообщения: 469
Зарегистрирован: Вт мар 12, 2013 1:22 am
Благодарил (а): 41 раз
Поблагодарили: 81 раз

Re: Arduino как принять два параметра из строки запроса

Сообщение dmw » Сб ноя 23, 2013 9:43 am

Xseon писал(а):Решил пойти на маленькую хитрость в скетче...
А в чем заключается хитрость? Просто из кода непойму, его что не желательно использовать?
Xseon
Сообщения: 51
Зарегистрирован: Ср сен 18, 2013 12:21 am
Благодарил (а): 9 раз
Поблагодарили: 7 раз

Re: Arduino как принять два параметра из строки запроса

Сообщение Xseon » Сб ноя 23, 2013 10:21 am

to dmw
Вот эти строки:

Код: Выделить всё

if (strcmp("PINB", gCommandBuffer) == 0) { //Проверяем имя команды, если это указатель на номер пина Дуни, то
          pinB = strtol(gParamBuffer, NULL, 0); // Присваиваем его
        }
Делают принудительную проверку на наличие параметра PINB и присваивает ему значение, все остальные параметры передаются в

Код: Выделить всё

cliProcessCommand(server);
И уже там ищется в массиве команд сервера, если нужны подробности, то могу написать...

В скетче у mixa, этого массива нет. У него проверка идёт в реалтайме и постоянно проверяет все условия на совпадения.
Этот метод хорош при малом количестве команд или простой отладке ИМХО.
Ответить