HTTP GET запрос через числовой IP адрес сервера

Тема в разделе "Arduino & Shields", создана пользователем Ariadna-on-Line, 19 июн 2018.

  1. b707

    b707 Гуру

    ну то есть вместо извинений проще кучу никому не интересного текста про 8016 порт написать? :) - ясно...
     
    Mitrandir и DetSimen нравится это.
  2. Igor68

    Igor68 Гуру

    Именно так. И не забудьте после последней строки запроса послать "\r\n", потому как каждая строка должна заканчиваться "\r\n". А последняя "строка" просто "\r\n". Не ругайте... сам лично делал запросы "вручную" без этих библиотек.
     
  3. Igor68

    Igor68 Гуру

    Это е
    Это ещё зачем? на требуемый порт и подключайтесь! Просто по умолчанию (если он не указан) он равен 80 для HTTP и 443 для HTTPS
     
  4. DIYMan

    DIYMan Guest

    Перескажу телу RFC, чего уж там. Тело отлучено от гугля навеки, и даже прочитать буквально пару страничек RFC по любезно предоставленной ссылке - не в состоянии. Зато у него все виноваты, кроме него самого. Поколение пепси, млять.
     
    Igor68 нравится это.
  5. Mitrandir

    Mitrandir Гуру

    походу ТС не хотел понять как это работает, а хотел готовое решение
     
  6. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Именно так. Понять - не против, но когда-нибудь ... потОм.
     
    Последнее редактирование: 22 июн 2018
  7. b707

    b707 Гуру

    хотеть не вредно. На форумах таких халявщиков не любят.
     
    Igor68 нравится это.
  8. diabolittenok

    diabolittenok Нуб

    Добрый день помогите пожалуйста с GET запросом, показывает, что по ip-шнику соединяется,порт 80 открывается, а далее GET запрос обмен данными не происходит, тоже уже несколько недель как сижу голову ломаю.
    В кратце : хочу передать данные с датчиков морского аквариума->ардуино(клиентом)->сервер(опен сервер). пересмотрел уже кучу примеров, описание запросов, но итог не передается. Еще проблема если делаю доменное имя aqua то вообще не конектится, если ip то конектится, но на GET запрос ответа нет.
    требуется передать переменная: aqua, данные пока что просто вставил цифру 24, потом заменю на данные с датчика.
    Подключаю ноут вместо ардуины, с таким же ip-шником 192.168.1.3 и к файлу index.php доступ есть открывается.
    подскажите в чем затык, пожалуйста.

    Адруино:
    Код (C++):
    #include <SPI.h>                         //LAN карта
    #include <Ethernet.h>                                   //LAN карта

    byte mac[]={0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};          //mac адрес LAN карты
    byte ip[]={192, 168, 1, 3};                               //ip адрес LAN карты

    EthernetClient client;                                   //создаем клиент TCP

    char server[] = "192.168.1.2";                      //имя домена, сервер

    int buff=0;                                              
    void setup() {  
        Serial.begin(9600);                                  //скорость работы порта с компьютером
        delay(1000);
        Ethernet.begin(mac, ip);                          //инициализация контроллера
        delay(1000);                                             //для инициализации LAN шилду
    }
    void loop() {  
        if (client.connect(server, 80)) {                                    //устанавливает соединение через ip и порту сеть с сервером
          Serial.println("server connect port");                         //установилось ли соединение с сервером
          client.print("GET /index.php?aqua=24 HTTP/1.1");  //запрос к файлу
          client.print("Host:192.168.1.2");                
          client.println("Connection: close");
          client.println();
        } else {
          client.stop();                                                          //если соединения нет то разываем соедиение с сервером
          delay(1000);
          Serial.println("server connecting failed");}
        if(client.available()) {                    //проверяем количество непрочитанных байтов
            char c = client.read();                 //если от сервера имеются то записываем в переменную с
              Serial.println("print bait dannih"); //убедиться в передаче данных
              Serial.print(c);
              if ( c=='1'){                        
                buff=1;}                      
              if ( c=='0'){
                buff=0;}}
          client.stop();                            //разрываем соединение с сервером
          client.flush();                           //отбрасываем все непрочитанные байты полученные от сервера
          delay(100);
      if (!client.connected()) {                    // Если соединение прервано, отключаем клиент
        Serial.println("server not connected");
        client.stop();}                             // Останавливаем выполнение программы
         
          Serial.println();  
          delay(6000);

    }

     
    Монитор порта:
    server connect port
    server not connected

    на сервере: index.php:
    PHP:
    <?php
    echo date("d.m.y H:i:s") . " Taqua=" . $_GET["aqua"];
    ?>
    браузер:
    04.02.20 22:36:52 Taqua=
     
  9. parovoZZ

    parovoZZ Гуру

    а доменное имя где-то сопоставлено с IP адресом? Как браузер узнает, на какой адрес слать пакет?
     
  10. diabolittenok

    diabolittenok Нуб

    Где и как это должно быть прописанно? в index?
     
  11. parovoZZ

    parovoZZ Гуру

    чтобы дать ответ на этот вопрос, необходимо понимать, куда обращается браузер, чтобы ему доменное имя преобразовать в IP адрес.
     
  12. diabolittenok

    diabolittenok Нуб

    в данном случае прописано в настройках опен-сервера в алиасах, с ноутбука вместо ардуины проверил, можно зайти хоть aqua/ хоть 192.168.1.2
    при вводе в адресной строки хоть так: http://aqua/index.php?temp1=25&temp2=18&water=86 , хоть так: http://192.168.1.2/index.php?temp1=25&temp2=18&water=86 запрос выполняется и данные отображаются. То есть браузер запрос отрабатывает. (переменные и значения это из другого примера взял, temp1=25&temp2=18&water=86). Как подключаю ардуинку так запрос нету ответу.
     
  13. diabolittenok

    diabolittenok Нуб

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

    parovoZZ Гуру

    Что-то я потерял нить: что выступает в роли сервера, а что в роли клиента?
     
  15. diabolittenok

    diabolittenok Нуб

    ардуино клиент, комп сервер
     
  16. diabolittenok

    diabolittenok Нуб

    закинул вот такой пример:
    Код (C++):
    #include <SPI.h>
    #include <Ethernet.h>

    byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
    EthernetClient client;

    float temp1;
    float temp2;                                  
    float water;
    unsigned long int time1 = millis();
    char server[] = "aqua/";

    void setup()
    {
      //Старт
      Serial.begin(9600);
      Ethernet.begin(mac);
    }


    void loop()

    {
       
         //твои данные для передачи
           temp1 = 23;
         temp2 = 18;
         water = 86;
     
     
      if (millis() - time1 > 3000) {   // можешь задать и 5 сек.
        sendData(temp1,temp2,water);
        time1 = millis();
        Serial.println("CONNECT SERVER: Send temp/hum");
      }
    }


    void sendData(float temp1, float temp2, float water) {
      client.connect(server, 80);
      client.print( "GET /index.php?");
       client.print("temp1=");
       client.print(temp1);
       client.print("&");
         client.print("temp2=");
         client.print(temp2);
         client.print("&");
           client.print("water=");
           client.print(water);
      client.println(" HTTP/1.1");
      client.print( "Host: " );
      client.println(server);
      client.println( "Connection: close" );
      client.println();
      client.println();
      client.stop();
      client.flush();
      }
     
    выдает:
    CONNECT SERVER: Send temp/hum

    в index.php:
    PHP:
    <?php
    if(isset($_GET['temp1']) AND isset($_GET['temp2']) AND isset($_GET['water'])) {
       echo 'ПАРАМЕТРЫ СРЕДЫ AQUA - ПРОВЕРКА ДЛЯ ПАШИ </br>';
            echo date( "Данные на сегодня d.m.y H:i Московского времени" ); echo '</br>';
       echo '</br>'; //переволд строки код - </br>
       echo 'Температура - '.$_GET['temp1'];echo ' град. С</br>';
       echo 'Температура - '.$_GET['temp2'];echo ' град. С</br>';
       echo 'Влажность - '.$_GET['water'];echo ' %</br>';
     
      //присваиваем значения полученные переменным если надо
      $temperatur_1=$_GET['temp1'];
     
      //можем пересчитать в кельвины
      echo '</br>';
      echo 'Пересчет температуры - temp1 в градусы Кельвина!</br>';
      $temperatur_1k=273.0+$temperatur_1;
      echo 'Температура 1 - '.$temperatur_1.' равна '.$temperatur_1k.' K';
      echo '</br>';
     
    }

    //передача данных сервером на сайт aqua/
      echo '</br>';
      echo 'Для справки!</br>';
      echo '==========================================================================</br>';
      echo 'Передача значений переменных из браузера - http://aqua/index.php?temp1=23&temp2=18&water=86</br>';
      echo ' temp1=23  temp2=18 и water=86 передаются в index.php после знака ? через знак &';
      echo '</br>';
     





    ?>
     
    результат GET запрос не выполняется:
    Для справки!
    ==========================================================================
    Передача значений переменных из браузера - http://aqua/index.php?temp1=23&temp2=18&water=86
    temp1=23 temp2=18 и water=86 передаются в index.php после знака ? через знак &
     
  17. То что вы написали в скетче (#28), то и выполняется.
    В loop сначала устанавливаете соединение с сервером, и если соединение установлено выводите в сериал "server connect port"
    Выполняете client.print("GET ... client.print("Host... client.println("Connection... и client.println()
    Чем отличаются print и println видимо вас не очень интересует, как впрочем и то что прилетает на ваш сервер (логов от сервера нет).
    Сервер этот кривой запрос не обрабатывает, но даже если он его обработал, то ответ вы тоже не ожидаете.
    После отправки запроса, в ту-же миллисекунду проверяете есть-ли хоть один байт от сервера (а его скорее всего просто не успеваете получать), и если что то есть, то вычитываете один байт, а не http ответ от сервера.
     
    b707 и parovoZZ нравится это.
  18. parovoZZ

    parovoZZ Гуру

    Опять наступаем на грабли...
    Код (C++):
    char server[] = "aqua/";
    Только теперь не браузер, а ардуина.