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

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

  1. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Простите, я только изучаю тему.
    http://184.154.145.114:8016/listen.pls;
    Вот к этому серверу и ресурсу БУДЕТ ДЕЛАТЬ GET запрос УСТРОЙСТВО на базе Ардуино UNO.
    Как синтаксически правильно это нарисовать в программе Ардуины. Месяц не могу найти ответ. Нарисуйте пожалуйста код запроса. Мне главное строчки GET xxxxxxxxxx HTTP/1.0 и Host: xxxxxxxxxxxx
    И второй вопрос - Октеты IP и порт (8016) надо передавать в программу как строки или как байты ? Извините если не понятно.

    const byte server[] = {184, 154, 145, 114};
    const int serverPort = 8016;
    const int HTTPport = 80;

    // Подключение к серверу
    client.connect(server, HTTPport); // порт 80 - подключается успешно, КУДА-ТО!!!
    delay(1000);
    // Отправление запроса
    client.println("GET /listen.pls HTTP/1.0");
    client.println(String("Host: ") + server[0] + (".") + server[1] + (".") + server[2] + (".") + server[3] + (":") + serverPort);
    client.println(); //конец запроса - Ответ приходит, не тот что должен и непонятно от кого

    Здесь октеты, точки, двоеточие и порт отправляются в виде строк.
    Это код не работает правильно.
    Как надо ??? Help !!!!! Спасибо заранее.
     
    Последнее редактирование: 20 июн 2018
  2. Igor68

    Igor68 Гуру

  3. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Ни в одной ссылке нет ответа на мой вопрос. А первая ссылка - это и есть мой вопрос в другом форуме. Вы бы не умничали, а нарисовали мне две строчки, что я просил. Надо именно в виде команд client. print(). Заранее благодарен.
     
    Последнее редактирование: 20 июн 2018
  4. Igor68

    Igor68 Гуру

    Нормальный вопрос:
    http://184.154.145.114:8016/listen.pls;
    ...ссылка на плейлист и есть вопрос.
    И это не катит?:
    Код (C++):
    #include <SPI.h>
    #include <Ethernet.h>
    byte mac[] = {
      0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
    char server[] = "www.timeapi.org";
    IPAddress ip(192, 168, 0, 2);
    EthernetClient client;
    void setup() {
      Serial.begin(9600);
      Ethernet.begin(mac, ip);
      // Дадим время шилду на инициализацию
      delay(1000);
      Serial.println("connecting...");
      if (client.connect(server, 80)) {
        Serial.println("---------------");
        // Создаем HTTP-запрос
        client.println("GET /utc/now HTTP/1.1");
        client.println("Host: www.timeapi.org");
        client.println("User-Agent: arduino-ethernet");
        client.println("Connection: close");
        client.println();
      }
      else {
        // if you didn't get a connection to the server:
        Serial.println("connection failed");
      }
    }
    void loop() {
      // Если есть доступные биты, читаем их и выводим на экран
      if (client.available()) {
        char c = client.read();
        Serial.print(c);
      }
      // Если соединение прервано, отключаем клиент
      if (!client.connected()) {
        Serial.println();
        Serial.println("---------------");
        Serial.println("disconnecting");
        client.stop();
        // Останавливаем выполнение программы
        while (true);
      }
    }
    А вам нужно обязательно IP... и доменное имя ни причём?
    Тогда сначала делайте PING на URL и получайте IP, если Вы не через Proxy.
    А такое не катит?:
    Код (C++):
    //вместо этого:
    char server[] = "www.timeapi.org";
    //ставить это:
    char server[] = "10.24.190.33";
    //к примеру
    Где 10.24.190.33 необходимый IP сервера, которому посылка

    У меня такое:
    Код (C++):
    //у меня такое работает без указания порта
    //по умолчанию он 80
    client.println("GET /192.168.0.240 HTTP/1.0");
    //а это если надо указать порт:
    client.println("GET /192.168.0.240:80 HTTP/1.0");
    //а это конткретный путь к чему-то
    client.println("GET /192.168.0.240:80/ramdisk/work.bmp HTTP/1.0");
    Как видите вместо имени типа www.yandex.ru вполне нормально указывается IP. Попробуйте IP введите в адресной строке браузера... и что... не работает??????
    И что это за браузер такой?
     
    Последнее редактирование: 20 июн 2018
  5. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Начнем с того, что в Интернет софте я полный ноль, и GSM интернет мне дешевле кабельного. Все примеры из Интернета используют имена серверов, не их IP. По ссылке, что я там в вопросе написал, должна подключиться ардуина - самостоятельно. Сделал web-приемник по кабелю на ардуино уно и ENC28J60. Массив станций - в виде IP: порт - цифры. Порт здесь - имя процесса трансляции данных. Многие "музыкалки" не имеют названий, только IP и порт. А подключение к ним идет по IP и обычному HTTP 80-му порту. Музон идет. Используется готовая функция из ethernet библиотеки. Как работает я понять не могу. По прошивке вижу, она использует GET, POST, Host:, Accept: и тд. Хочу добавить прием, через соту. Модуль NeoWay M590. В его библиотеке нет аналогичной функции (или не нашел). Есть примеры, но опять через доменные имена. Поэтому сам рисую строки запроса client.print(.......). Отсюда и родился мой вопрос. Естественно никаких браузеров у ардуины нет. Я мониторю через ардуинный отладчик. После GET строки положено отправить строку - Host: xxxxxx . Что там надо писать в случае "IP: порт" ? Гуглите темы про shoutcast и icecast сервера. Заранее спасибо.
     
    Последнее редактирование: 20 июн 2018
    Igor68 нравится это.
  6. Igor68

    Igor68 Гуру

    Да не волнуйтесть! Надо когда-то начинать. Про модуль не скажу... и не буду им пользоваться. А вот запрос... сам запрос... ну допустим GET:
    Код (Text):
    GET http://www.google.com HTTP/1.0
    а точнее
    GET http://www.google.com HTTP/1.0\r\n
    Host: www.google.com\r\n
    потом остальные строки содержимого запроса с завершением \r\n каждая
    и в конце ещё \r\n
     
    И после посылки этого Вы дожны получить ответ от сервера
    Вместо www.google.com можно указать IP адрес и если требуется порт (отличный от 80), то
    GET http://www.google.com:3453 HTTP/1.0\r\n где 3453 ваш порт. А в строчку
    Host: www.google.com\r\n порт не вставляете
    Это не конкретное применение библиотеки Arduino, а понятие о содержании запроса.
    В ссылках, что указаны есть описание протокола HTTP. У меня нет такого модуля... я использую Raspberry... но запросы и там надо строить, но собственно соединение делаю с указанием URL/IP и порта, и потом посылаю этот самый запрос с содержимым... ожидаю ответа и принимаю данные.
     
  7. Ariadna-on-Line

    Ariadna-on-Line Гуру

    byte serverIP[] = {184, 154, 145, 114}; // байты
    int serverPort = 8016; // целое
    int HTTPport = 80; // целое
    char resource[] = "/listen.pls"; // строка
    Должен я (то есть ардуина) отправлять октеты (байты) IP адреса как байты или конвертировать их в строку
    То же самое с целым - с портом процесса (serverPort), отправлять как целое или конвертировать в строку
    Должен ли я 3 раза отправлять символ '.' между октетами
    Должен ли я отправлять символ ':' между адресом и портом процесса
    Я ведь спрашиваю именно о синтаксисе HTTP.
    Судя по вашим примерам вы адреса, порты, точки и двоеточие отправляете целиком как строку. То есть пишем вот так :

    client.connect(server, HTTPport); //подключаемся по HTTP. IP адрес именно в байтах
    client.flush(); //инициализируемся
    client.println(String("GET /") + server[0] + ('.') + server[1] + ('.') + server[2] + ('.') + server[3] + (':') + serverPort + ("/listen.pls HTTP/1.0"); //Отправляем запрос
    client.println(String("Host: ") + server[0] + ('.') + server[1] + ('.') + server[2] + ('.') + server[3] );
    Попробую.
    попробовал - страница не найдена. И хоть ты убейся. Но она там есть !!!
     
    Последнее редактирование: 20 июн 2018
  8. DIYMan

    DIYMan Guest

    Короче: чем разводить тут сопли - надо просто сделать над собой усилие, открыть RFC по HTTP, прочитать пару страниц, и понять, как устроен HTTP-запрос, тогда мнооогие вопросы отпадут сами собой. Считаю - это самое грамотное решение, если, конечно, не лениться и не кусочничать, выискивая готовые примеры.
     
  9. b707

    b707 Гуру

    блин, ну ведь Igor68 в сообщении #4 уже ответил! Какие нафик байты в адресе??? HTTP- текстовой протокол, там ничего, кроме символов, быть не может.
    Igor68 все подробно расписал:
    Код (C++):
    //вместо этого:
    char server[] = "www.timeapi.org";
    //ставить это:
    char server[] = "10.24.190.33";
    //к примеру
     
  10. DIYMan

    DIYMan Guest

    А вдруг может? Зачем ты человеку мир рушишь? :D Ему и так лень прочитать хоть что-нибудь про HTTP, а тут ещё ты - текстовый протокол, текстовый протокол... Ты бы ещё аббревиатуру HTTP ему расшифровал, чтобы совсем чела ввести в прострацию :D
     
  11. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Уважаемые !!! Я просил всего 2 строчки написать. Всего - две. Вы ж не поленились по полстраницы натыкать. А две несчастные строчки так и не написали. Не в силах- не мешайтесь.
     
  12. DIYMan

    DIYMan Guest

    Я умещусь в одну, ок? HTTP RFC - там есть всё. Даже ссылку дам: https://tools.ietf.org/html/rfc2616
     
  13. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Мдя. Похоже у вас зимой снега не выпросишь.
     
  14. Mitrandir

    Mitrandir Гуру

    так в 4-том посте вам ответ дали.
    www.timeapi.org поменяйте на ваш адрес и готово
     
  15. Mitrandir

    Mitrandir Гуру

    ну так и быт ь за вас поменяю

    Код (C++):
    #include <SPI.h>
    #include <Ethernet.h>
    byte mac[] = {
      0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
    char server[] = "184.154.145.114";
    IPAddress ip(192, 168, 0, 2);
    EthernetClient client;
    void setup() {
      Serial.begin(9600);
      Ethernet.begin(mac, ip);
      // Дадим время шилду на инициализацию
      delay(1000);
      Serial.println("connecting...");
      if (client.connect(server, 8016)) {
        Serial.println("---------------");
        // Создаем HTTP-запрос
        client.println("GET /listen.pls HTTP/1.1");
        client.println("Host: 184.154.145.114");
        client.println("User-Agent: arduino-ethernet");
        client.println("Connection: close");
        client.println();
      }
      else {
        // if you didn't get a connection to the server:
        Serial.println("connection failed");
      }
    }
    void loop() {
      // Если есть доступные биты, читаем их и выводим на экран
      if (client.available()) {
        char c = client.read();
        Serial.print(c);
      }
      // Если соединение прервано, отключаем клиент
      if (!client.connected()) {
        Serial.println();
        Serial.println("---------------");
        Serial.println("disconnecting");
        client.stop();
        // Останавливаем выполнение программы
        while (true);
      }
    }
     
  16. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Mitrandir -у. Спасибо за реальную помощь. Однако вы меня удивили. Вот этим :

    if (client.connect(server, 8016)) { // Я уверен, что здесь должен быть порт 80
    Serial.println("---------------"); // Это же HTTP соединение.
    // Создаем HTTP-запрос
    client.println("GET /listen.pls HTTP/1.1"); // А порт 8016 здесь "GET /184.154.145.114:8016/listen.pls HTTP/1.1"
    client.println("Host: 184.154.145.114"); // Так советовал например гуру "Igor86" в 6-м посте

    Короче, попробовал ваш совет, получил то что надо. Большущее вам спасибо. Если тут можно где-то прибавить вам рейтинг напишите. Еханный бабай- оказалось совсем не там. где искал. Если получится с приемником - пришлю вам полную документацию.
     
    Последнее редактирование: 21 июн 2018
  17. Mitrandir

    Mitrandir Гуру

    Лол, вы сами в первом посте указали порт 8016...

    И зачем передавать порт в теле запроса.. соединение уже установлено
     
  18. b707

    b707 Гуру

    А теперь посмотри выше - не это ли самое тебе советовали 4 человека, которых обозвал разными словами? Теперь-то дошло, что тебе с самого начала советовали правильно? - может извинишься?

    Оказывается, надо было вот прям за тебя вписать строчку в скетч, иначе не дошло. С такой соображалкой тебе не ардуиной заниматся
     
    Mitrandir нравится это.
  19. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Ребята - я не просил советов, я просил нарисовать 2 строчки. Только и всего.

    В общем так - Я считал что путь доступа к ресурсу - файлу "listen.pls" ---
    --- http://184.154.145.114:8016/listen.pls. То есть "8016" - путь к ресурсу. Но для этого надо сначала подключиться к серверу по протоколу HTTP, те 80. Поэтому сначала выполнял подключение client.connect(server, 80); // 80
    Посмотрите мой первый пост. А потом пытался втиснуть в запрос этот самый "путь - 8016".
    Главное, что все примеры сплошь через доменные имена. У меня их нет.
    Ну что ж поделать. Непросто старому электронщику новые технологии осваивать. Спасибо.
     
  20. DetSimen

    DetSimen Guest

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