как обработать данные с php страницы

Тема в разделе "Arduino & Shields", создана пользователем atlo, 24 мар 2016.

  1. atlo

    atlo Нерд

    Помогите дописать код
    Запрашиваю данные о статусе устройства через get запрос(статус прописан в mysql) с веб сервера , выводятся данные http://ip-адрес/status.php Выводятся в формате 1 0 Первое значение это статус 1 реле второе значение статус второго реле
    Как обработать данную строку, что бы потом включить или выкючить реле соответственно ее статусу


    Я понимаю что нужно парсить строку, но до меня не доходит принцип как это сделать
    Помогите дописать код или дайте ссылку на пример с комментариями данного процесса

    Код php странички

    PHP:
    <?php
    //соединяемся с mysql
    include_once("./config.php");

    $db = mysql_connect(DB_HOST, DB_USER, DB_PASSWORD);

    //$db = mysql_connect("localhost","login","passwor");
    mysql_select_db("db_terminal",$db);
    $query = "SELECT  `ID` ,  `CUR_VALUE`, `LINKED_OBJECT` FROM  `commands` WHERE  `ID` =  '118'";
    // Формируем запрос
    $query_rele = mysql_query($query);
    // Выполняем запрос
    $row = mysql_fetch_array($query_rele);
    Do { $text = $row['CUR_VALUE'] ; $text2 = $row['LINKED_OBJECT'] ;
    }
    while ($row = mysql_fetch_array($query_rele));
    echo $text.' '.$text2;


    mysql_query($query,$link);
    mysql_close($link);
    ?>
     

    Код написанный на ардуино
    Код (C++):
    #include <Ethernet.h>
    #include <SPI.h>
    #include <Wire.h>


    //mac address дл€ получени€ сети
    byte mac[] = { 0xee, 0x2b, 0xab, 0xa4, 0xd4, 0x9d }; // RESERVED MAC ADDRESS
    EthernetClient client;

    /////////////////////////////реле/////////////////
    int buff=0; // переменна€ дл€ установки значени€ 1 или 0 (вкл или выкл) и последующего приема запросас сервера
    const int rele = 9; //подключаем пин реле дл€ включени€ камеры
    int button = 3; // объ€вл€ем геркон на вход дверь
    void setup()
    {
    Serial.begin(9600);
      ////////////////////////////реле//////////////////////////////
      pinMode(rele, OUTPUT);
      digitalWrite(rele, LOW);
    // объ€вл€ем что слушают датчики
    pinMode(button, INPUT); //кнопка слушает вход

    if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP");
    }
    Serial.print("IP = ");
    Serial.println(Ethernet.localIP());

    }

    void loop()
    {
    rele_(); //считываем значение из файла на веб сервере
    Gerk();
    }

    void Gerk(){
    if (digitalRead(button) == HIGH/*LOW*/) {
      digitalWrite (rele, HIGH);
    Serial.println("connecting to server...");
    if (client.connect("192.168.1.2",80)) {
        Serial.println("making HTTP request...");
      // —оздаем GET HTTP-запрос:
      //  client.println("GET  /objects/?object=Lamp1&op=m&m=turnOn& HTTP/1.1");//отправл€ю переменную t со значением 1
      client.println("GET /objects/?object=Lamp1&op=m&m=switch& HTTP/1.1");
        client.println("HOST: 192.168.1.2");
        client.println();
    }
    if (client.connected()) {
    client.stop();
    }
    delay(100);
    }
    }

    //////////////////////////////////////управл€ем реле///////////////////////
    void rele_(){
      ///////////////////////////////////////реле////////////////////////
    if (client.connect("192.168.1.2",80)) {
    Serial.println("making HTTP request...");
    delay(100);
    // —оздаем GET HTTP-запрос:
    client.print("GET /status.php?rele=");//считываем переменную с сервера
    client.println("HOST: 192.168.1.2");
    client.println();
    delay(100);
    while (client.available())
    {
          char c = client.read();
          Serial.write(c);

            if ( c=='1')           //если 2 то ставим флаг в buff =1
            { //Serial.println("c=1");
            buff=1;
            }
            if ( c=='0')          //если 3 то ставим флаг в buff =0
            {//Serial.println("c=0");
             buff=0;
            }
          }
               client.stop();
          client.flush();
          delay(100);
      }
      else
      {
       client.stop();
       delay(400);
       client.connect("192.168.1.2",80);
      }
    //Serial.println("buff");
      Serial.println(buff);
      if ( buff==1)             //если  флаг в buff =1 то включаем реле
            {
            digitalWrite (rele, HIGH);
            }
            if (buff==0)//было else         //если  флаг в buff =0 то выключаем реле
            {
            digitalWrite(rele, LOW);
            }
      delay(400);
    }
     
     
  2. AlexVS

    AlexVS Гик

    Я думаю, что выходную строку лучше снабдить идентификаторам, например: ID1=1 ID2=0.
    В скетче объявите переменную типа String, например String inString="", собирайте выводимую информацию в строке
    Код (C++):
    char c = client.read();
    inString.concat(c);
    , а затем разбирайте ее стандартными методами для String.
     
  3. atlo

    atlo Нерд

    Написал вот так, для просмотр
    Код (C++):

    char c = client.read();
         String insString = "";
         insString.concat(c);
    Serial.println(insString.charAt(2));
      }
    В serial выдаются квадратики, что не так сделал???
     
    Последнее редактирование: 25 мар 2016
  4. Securbond

    Securbond Гуру

    Посмотрите, этот кусочек кода. тут как раз из строки берутся 2 переменные - topic и playload и записываются в стринговые переменные.
    Код (C++):
    void callback(char* topic, byte* payload, unsigned int length) {
    payload[length] = '\0';
    Serial.print(topic);
    Serial.print(" ");
    String strTopic = String(topic);
    String strPayload = String((char*)payload);
    Serial.println(strPayload);
    if (strTopic == "test/device/arduino01/rel1") {
    if (strPayload == "ON"){REL1 = 1;}
    else if (strPayload == "OFF"){REL1 = 0;}
    }
     
  5. atlo

    atlo Нерд

    Тут разобрался
    Serial.println(insString.charAt(0)); поставил 0 и ардуино начала посимвольно выводить вот такой текст
    making HTTP request...
    HTTP/1c=1
    ID1=1
    ID2=0
    OK
    Date: Thu, 24 Mar 20c=0
    1c=1
    6 0c=0
    6:44:27 GMT
    Server: Apache/2.2.22 (Debian)
    X-Powered-By: PHP/5.4.45-0c=0
    +deb7u2
    Vary: Accept-Encoding
    Content-Length: 322
    Connection: close
    Content-Type: text/html; charset=UTF-8


    как получить только
    ID1=1
    ID2=0
    а все остальное откинуть????
    Сказать что считывать символ поcле ID1= и ID2=
     
  6. atlo

    atlo Нерд

    понял посмотрю
     
  7. AlexVS

    AlexVS Гик

    Переменная String должна быть объявлена не в цикле, а выше, в начале процедуры void rele_()
     
  8. atlo

    atlo Нерд

    Спасибо, считывает
    А как сказать ардуине, что мне необходимо считать 4 символа в 10 строке
    Или придется символы пересчитывать ))))
    Код вывода 13 символа
    Код (C++):
    void rele_(){
        String insString = "";
      ///////////////////////////////////////реле////////////////////////
    if (client.connect("192.168.1.87",36001)) {
    Serial.println("making HTTP request...");
    delay(100);
    // Создаем GET HTTP-запрос:
    client.print("GET /status.php?");//считываем переменную с сервера
    client.println("HOST: 192.168.1.87");
    client.println();
    delay(100);
    while (client.available())
    {
         char c = client.read();
       insString.concat(c);
    Serial.println(insString.charAt(13));
      delay (100);
     
    Выводит O это 13 символ со строчки HTTP/1.1 200 OK
    Если код
    Код (C++):
    void rele_(){
        String insString = "";
      ///////////////////////////////////////реле////////////////////////
    if (client.connect("192.168.1.87",36001)) {
    Serial.println("making HTTP request...");
    delay(100);
    // Создаем GET HTTP-запрос:
    client.print("GET /status.php?");//считываем переменную с сервера
    client.println("HOST: 192.168.1.87");
    client.println();
    delay(100);
    while (client.available())
    {
         char c = client.read();
       /*insString.concat(c);
    Serial.println(insString.charAt(13));
      delay (100);
      */

       Serial.write(c);
    То выводит следующее
    HTTP/1.1 200 OK
    Date: Fri, 25 Mar 2016 09:24:08 GMT
    Server: Apache/2.2.22 (Debian)
    X-Powered-By: PHP/5.4.45-0+deb7u2
    Vary: Accept-Encoding
    Content-Length: 17
    Connection: close
    Content-Type: text/html; charset=UTF-8

    ID1=0 ID2=Lamp

    Как считать с последней строки
     
    Последнее редактирование: 25 мар 2016
  9. atlo

    atlo Нерд

    Вопрос по коду, можно его прокомментировать, я часть написал(может что то неправильно понял)
    void callback(char* topic, byte* payload, unsignedint length){
    // char объявляем массив topic
    //byte не совсем понял что конкретно объявляется для типа данных byte тли длина строки можно прокомментировать
    payload[length]='\0'; //конец строки
    Serial.print(topic); // выводим массив топик
    Serial.print(" ");// выводим пробел, не понял для чего
    String strTopic = String(topic); //преобразуем topic в объект string
    String strPayload = String((char*)payload); // тоже преобразуем в объект string непонятно для чего
    Serial.println(strPayload); //выводим strPayload
    if(strTopic =="test/device/arduino01/rel1"){ // сравниваем массив strTopic с тут я понял , что должны стоять данные из get запроса
    if(strPayload =="ON"){REL1 =1;} // тут выполняем условие по полученным данным
    elseif(strPayload =="OFF"){REL1 =0;}
    }
     
    Последнее редактирование: 25 мар 2016
  10. Securbond

    Securbond Гуру

    Пробелы что бы вывод в мониторе был читабельным
    Для того что бы сравнивать строки и распознавать ON/OFF
     
  11. Securbond

    Securbond Гуру

    Вы не просто объявляете массив, а возвращаете данные из брокера mqtt и записываете эти данные в топик и playload.
     
  12. Securbond

    Securbond Гуру

    Точно не скажу. Думаю это oграничение для работы с библиотекой mqtt
     
  13. atlo

    atlo Нерд

    понял, буду пробывать
     
  14. atlo

    atlo Нерд

    Данная функция как я понял записывает за каждый цикл по одному символу
    insString.concat(c); Время обработки увеличивается, пока он считает все символы получается около 20 секунд, а как передать String за один раз весь массив данных из char и какая функция отвечает за поиск в массиве объекта string
     
  15. atlo

    atlo Нерд

    Нашел функцию indexOf
    Функция indexOf() возвращает самую первую позицию (т.е. индекс) определенного символа, находящегося в строке.
    Код (C++):
    while (client.available())
    {
         char c = client.read();
    String   stringOne = String(c);
        int firstClosingBracket = stringOne.indexOf('=');
      Serial.println("string " + stringOne + " is " + firstClosingBracket);
      delay (30);}}}
    Выводит следующий результат, если значение нашлось то выводит 0 если нет то -1
    ...
    string I is -1
    string D is -1
    string 1 is -1
    string = is 0
    string 0 is -1
    string is -1
    string I is -1
    string D is -1
    string 2 is -1
    string = is 0
    string L is -1
    string a is -1
    string m is -1
    string p is -1
    string 1 is -1
    string is -1
    ....
    Подскажите как с ее помощью можно наити совокупность символов ID1=1

    Или как данные полученные с get запроса затолкать в string в одну строку
     
    Последнее редактирование: 26 мар 2016
  16. atlo

    atlo Нерд

    Помогите найти ошибку
    Написал вот такой код он обрабатывает условия, точнее находит к примеру слово HTTP или другое искомое значение, но в районе одной строчки. а дальше следующие строки данных не обрабатывает
    Код (C++):
      String readString = String(200);
    if (client.connect("192.168.1.44",80)) {
    Serial.println("making HTTP request...");
    delay(100);
    // Создаем GET HTTP-запрос:
    client.print("GET /status.php?");//считываем переменную с сервера
    client.println("HOST: 192.168.1.44");
    client.println();
    delay(100);
    while (client.available())
    {
         char c = client.read();
         Serial.println(c);
           if (readString.length() < 200) {
       readString += c;
       }
         if (c == '\n') {   if(readString.indexOf("HTTP") > 0) {
       Serial.println("device is on");
       }
       if(readString.indexOf("ID1=1") > 0) {
       Serial.println("device is off");
       }
       client.println("HOST: 192.168.1.44");
       client.println();

       readString="";
       client.stop();   }}}
    Пример вывода
    IP = 192.168.1.38
    making HTTP request...
    H
    T
    T
    P
    /
    1
    .
    1

    2
    0
    0

    O
    K


    device is on

    Если прописываю строчку if (c == '\r\n')
    то он выдает весь переданный текст с сервера, но не работает поиск значения
     
    Последнее редактирование: 27 мар 2016