почему ардуино не может писать на сервер?

Я пишу код для Arduino + SIM800 для подключения к серверу. но это не работает!

SerialGsm.println("AT+CIPSEND=63\r\n");
delay( 1000 );
receive_message();
SerialGsm.print( "GET http://sasasas.ir.ir/hadi/signal.php?value=10" );
delay( 10000 );
receive_message();

все верно, но "GET" не может повторить "OK". это ответ ардуино:


В

ОК

Вызов готов

СМС готово AT+CSTT="мтниранселл"

ОК AT+CIICR

ОК AT+CIFSR

100,65,157,1 AT+CIPSTART="TCP","processes.go",80

ОК

ПОДКЛЮЧИТЬ ОК AT+CIPSEND=63

ПОЛУЧИТЬ http://sasasas.ir/hadi/signal.php?value=10


"get" не имеет ответа. Что не так в этом коде?

, 👍0

Обсуждение

Изучите правильный формат запроса GET., @Majenko


1 ответ


Лучший ответ:

1

Во-первых, у вас есть только половина первой строки запроса GET. Во-вторых, та половина, которая у вас есть, плохо отформатирована.

Запрос GET НЕ выглядит следующим образом:

GET http://jalambadani.ir/hadi/signal.php?value=10

Запрос GET ДЕЙСТВИТЕЛЬНО выглядит следующим образом:

GET /hadi/signal.php?value=10 HTTP/1.1
Host: jalambadani.ir
Connection: close
[extra blank line]

Если вы отправите неправильные данные, вы не можете рассчитывать на ответ. Вы должны изучить основы того, что вы пытаетесь сделать, вместо того, чтобы просто бросать случайный текст на веб-сервер.


Вот полная расшифровка запроса GET к вашему URL:

$ telnet jalambadani.ir 80
Trying 185.211.56.148...
Connected to jalambadani.ir.
Escape character is '^]'.
GET /hadi/signal.php?value=10 HTTP/1.1
Host: jalambadani.ir
Connection: close

HTTP/1.1 200 OK
Date: Tue, 25 Jun 2019 22:47:07 GMT
Server: Apache/2
X-Powered-By: PHP/5.6.35
Upgrade: h2,h2c
Connection: Upgrade, close
Vary: User-Agent
Content-Length: 31
Content-Type: text/html; charset=UTF-8

New record created successfullyConnection closed by foreign host.

В коде это будет:

SerialGsm.print("AT+CIPSEND=83\r\n");
delay(1000); // I hate that. Look for a proper OK instead.
SerialGsm.print("GET /hadi/signal.php?value=15 HTTP/1.1\r\n");
SerialGsm.print("Host: jalambadani.ir\r\n");
SerialGsm.print("Connection: close\r\n");
SerialGsm.print("\r\n);
,

Спасибо за ваш ответ. я студент-электрик, и я не знаю о http... но я попытаюсь изучить его. я проверяю ваш ответ, но он еще не работает: | "ПОЛУЧИ" не отвечай мне. @Majenko, @hadisamani1996

PHP не имеет к этому никакого отношения. Вы говорите в HTTP., @Majenko

Вы пробовали предложение Маженко - похоже, оно работает - работает против вашего сервера - с помощью telnet ?? Как только вы увидите, как это работает, переведите это в свой код Arduino. Не стремитесь к окончательному решению с первой попытки, если оно слишком далеко. Делайте это шаг за шагом. Скопируйте пример telnet от majenko -> изучите протокол. Затем передайте протокол в свое приложение., @GMc

да, я использую предложение Маженко. SerialGsm.print("AT+CIPSEND=50\r\n"); задержка(3000); получить_сообщение(); SerialGsm.print("GET /hadi/signal.php?value=15 HTTP/1.1"); задержка(3000); получить_сообщение(); не работа., @hadisamani1996

@hadisamani1996 hadisamani1996 Как насчет заголовков Host: и Connection: вместе с дополнительной пустой строкой? Все они являются частью запроса. Вы должны отправить все запросы., @Majenko

я решаю это с вашей помощью @Majenko у меня 2 ошибка. сначала вы увидели, и когда я использую эту строку, она решена. ********** SerialGsm.print("GET /hadi/signal.php?value=150 HTTP/1.1\r\nHost: jalambadani.ir\r\n\r\n"); *********** два следующая из «команды GET» я использую небольшую задержку. я немного увеличиваю его и затем решил свою проблему Спасибо, @hadisamani1996

Поскольку Маженко помог вам, вы должны принять его ответ, щелкнув маленькую серую галочку (галочку) рядом с его ответом., @GMc

придирки: почему не println?, @Juraj

В зависимости от системы println может заканчиваться на \n, \r или \r\n. Здесь лучше быть откровенным., @Markus Deibel

Спецификация HTTP требует \r\n. Arduino println() добавляет \r\n на все ядра, @Juraj

@Juraj, это не может быть гарантировано. Конечно, все ядра *должны* делать это, но их так много написано разными людьми с разными наборами навыков, что нельзя гарантировать 100%-ную гарантию., @Majenko

Класс печати скопирован. в println менять нечего. если бы какое-то ядро изменило бы его, у него сразу бы возникла проблема в трекере. базовые примеры сетевых библиотек не будут работать, @Juraj