MKR1400-как устранить неполадки в запросе POST?
Я успешно отправляю запрос GET (в функции настройки для загрузки сертификатов), но мой запрос POST завершается ошибкой с кучей ошибок AT. Я подозреваю, что это связано с тем, как я форматирую СООБЩЕНИЕ. Любые идеи будут оценены по достоинству.
Код следующий:
// MKRGSM - Version: 1.5.0
#include <MKRGSM.h>
#include <ArduinoJson.h>
#include <Arduino_MKRGPS.h>
const char PINNUMBER[] = "";
// APN data
const char GPRS_APN[] = SECRET_GPRS_APN;
const char GPRS_LOGIN[] = "";
const char GPRS_PASSWORD[] = "";
DynamicJsonDocument doc(1024);
// initialize the library instance
GSMSSLClient client;
GPRS gprs;
GSM gsmAccess(true);
// Specify IP address or hostname
char server[] = "webhook.site";
char path[] = "/ce480c43-95a8-4f1e-b996-bc02f6d1adaa";
int port = 443;
void setup() {
// initialize serial communications and wait for port to open:
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}
// If you are using the MKR GPS as shield, change the next line to pass
// the GPS_MODE_SHIELD parameter to the GPS.begin(...)
delay(200);
if (!GPS.begin()) {
Serial.println("Failed to initialize GPS!");
while (1);
}
Serial.println("Starting Arduino GSM ping.");
// connection state
bool connected = false;
// After starting the modem with GSM.begin()
// attach the shield to the GPRS network with the APN, login and password
while (!connected)
{
if ((gsmAccess.begin(PINNUMBER) == GSM_READY) &&
(gprs.attachGPRS(GPRS_APN, GPRS_LOGIN, GPRS_PASSWORD) == GPRS_READY))
{
connected = true;
}
else
{
Serial.println("Not connected");
delay(1000);
}
}
Serial.println("connecting...");
// if you get a connection, report back via serial:
// Use this to load Root Certs the first time
if (client.connect(server, port))
// Use this to not load Root Certs anymore as done last time and stored in modem's flash
// if (client.connect(server, port, false))
{
Serial.println("connected");
// Make a HTTP request:
client.print("GET ");
client.print(path);
client.println(" HTTP/1.1");
client.print("Host: ");
client.println(server);
client.println("Connection: close");
client.println();
}
else
{
// if you didn't get a connection to the server:
Serial.println("connection failed");
}
}
void loop() {
...GPS stuff happens here
// print GPS values
Serial.println();
Serial.print("Location: ");
Serial.print(latitude, 7);
Serial.print(", ");
Serial.println(longitude, 7);
Serial.print("Altitude: ");
Serial.print(altitude);
Serial.println("m");
Serial.print("Number of satellites: ");
Serial.println(satellites);
doc["latitude"] = latitude;
doc["longitude"] = longitude;
doc["altitude"] = altitude;
String location;
serializeJson(doc, location);
Serial.print("Location string: ");
Serial.println(location);
Serial.println();
Serial.println("Starting Arduino web client.");
// connection state
if (client.available()) {
Serial.println("Sending location");
client.print("POST ");
client.print(path);
client.println(" HTTP/1.1");
delay(5);
client.println("Content-Type: application/json;");
delay(5);
client.print("Content-Length: ");
client.println(location.length());
client.print("Host: ");
client.println(server);
delay(5);
client.println("Connection: close");
delay(5);
client.println();
delay(5);
client.println(location);
Serial.print("Successfully sent location");
if (!client.available() && !client.connected()) {
Serial.println();
Serial.println("disconnecting.");
client.stop();
}
} else {
// if you didn't get a connection to the server:
Serial.println("connection failed");
}
}
Вот как выглядит результат:
Местоположение: 32.1208382, 35.2468376 Высота над уровнем моря: 640,40 м Количество спутников: 5 Строка местоположения: {"широта":32.12084,"долгота":35.24684,"высота":640,4}
Запуск веб-клиента Arduino. Место отправки ПРИ+USOWR=0,13,"504F53542068747470733A2F2F"
ОШИБКА ПРИ+USOWR=0,37,"2F63653438306334332D393561382D346631652D623939362D626330326636643161646161"
ОШИБКА ПРИ+USOWR=0,9,"20485454502F312E31"
ОШИБКА ПРИ+USOWR=0,2,"0D0A"
ОШИБКА ПРИ+USOWR=0,31,"436F6E74656E742D5479 70653A206170706C69636174696F6E2F6A736F6E3B"
ОШИБКА ПРИ+USOWR=0,2,"0D0A"
ОШИБКА ПРИ+USOWR=0,16,"436F6E74656E742D4C656E6774683A20"
ОШИБКА ПРИ+USOWR=0,2,"3539"
ОШИБКА ПРИ+USOWR=0,2,"0D0A"
ОШИБКА ПРИ+USOWR=0,6,"486F73743A20"
ОШИБКА ПРИ+USOWR=0,12,"776562686F6F6B2E73697465"
ОШИБКА ПРИ+USOWR=0,2,"0D0A"
ОШИБКА ПРИ+USOWR=0,17,"436F6E6E656374696F6E3A20636C6F7365"
ОШИБКА ПРИ+USOWR=0,2,"0D0A"
ОШИБКА ПРИ+USOWR=0,2,"0D0A"
ОШИБКА AT+USOWR=0,59,"7B226C61746974756465223A33322E31323038342C226C6F6E676974756465223A33352E32343638342C22616C746974756465223A3634302E347D"
ОШИБКА ПРИ+USOWR=0,2,"0D0A"
ОШИБКА
Я мог бы отправить данные в качестве параметров в запросе GET, но это некрасиво.
@Boris K, 👍1
Обсуждение2 ответа
Ваш HTTP - запрос плохо отформатирован. У вас есть:
POST https://webhook.site/ce480c43-95a8-4f1e-b996-bc02f6d1adaa HTTP/1.1
Content-Type: application/json
Вместо этого протокол подразумевается портом, к которому вы подключаетесь, и доменное имя не входит в путь компонента сервера - у него есть свой собственный заголовок.
Ваш запрос должен выглядеть примерно так:
POST /ce480c43-95a8-4f1e-b996-bc02f6d1adaa HTTP/1.1
Host: webhook.site
Content-Type: application/json
Content-Length: [x]
Connection: close
[location]
Где [x]
- местоположение.длина()
и [местоположение]
- это содержимое строки местоположения
.
Спасибо, я обновил код в соответствии с вашими предложениями. К сожалению, он все еще терпит неудачу. Я даже не вижу, чтобы это входило в `если (клиент.подключение(сервер, порт)) {
` блок, который предполагает, что что-то не так с тем, как я инициализирую клиента., @Boris K
@BorisK Вам нужно добавить вторую новую строку после " Соединение: закрыть`. В HTTP заголовки и содержимое разделены двумя новыми строками. Ваш первоначальный вопрос включал этот " client.println ();", но в вашем обновленном коде это было опущено., @Gerben
@гербен, я даже не вижу вывода "Местоположение отправки", что говорит о том, что клиент не подключается, @Boris K
@Gerben Я поменялся симами и теперь подключаюсь к GET, но не могу выполнить СООБЩЕНИЕ. Я обновил исходный вопрос. Если бы вы могли взглянуть, я был бы благодарен., @Boris K
Проблема заключалась в том, что GSM gsmAccess;
должен был быть GSM gsmAccess(true)
. К сожалению, хотя это решает непосредственную проблему, заключающуюся в том, что клиент не инициализировался, есть другие проблемы, которые заслуживают отдельного вопроса.
- Множественная ошибка определения при связывании firmware.elf
- Пример SSL-клиента Arduino MKR GSM 1400 не удается подключиться
- Arduino MKR GSM 1400: Можно ли сказать по коду, сработало ли питание
- Как отправить АТ команды на модем ubox на MKR NB 1500
- Как проверить, активно ли соединение MQTT?
- Полудуплекс для Atmel SAMD21
- MKR GSM 1400 Работает только при подключении к компьютеру
смотрите пример GSMWebClient, @Juraj
Я видел этот пример, но это ОШИБКА., @Boris K
Ваш HTTP - запрос плохо отформатирован., @Majenko
чтение ответа-то же самое. и строка HTTP-запроса также не должна содержать полный URL-адрес для публикации, @Juraj