Заголовки HTTP GET POST для Arduino + SIM808
Я пытаюсь заставить SIM808 работать с Arduino. Может GET и POST HTTP-запрос GPRS, но только то, что пришло на его тело со стороны сервера {"error":true,"message":"Unauthorized"}
но мне нужен заголовок, так как он приносит cookie для сеанса.
+CREG: 0,1
AT+SAPBR=3,1,"Contype","GPRS"
OK
AT+SAPBR=3,1,"APN","giffgaff.com"
OK
AT+SAPBR=3,1,"USER","giffgaff"
OK
AT+SAPBR=3,1,"PWD",""
OK
AT+SAPBR=1,1
AT+SAPBR=2,1
+SAPBR: 1,1,"xx.xxx.xxx.xxx"
OK
AT+HTTPINIT
OK
AT+HTTPPARA="CID",1
OK
AT+HTTPPARA="URL","http://www.xxx.co.uk/index.php"
OK
AT+HTTPPARA="UA","MH Tracker"
OK
AT+HTTPPARA="CONTENT","Content-Length: 42"
OK
AT+HTTPPARA="CONTENT","Content-Type: application/x-www-form-urlencoded"
OK
AT+HTTPSSL=0
OK
AT+HTTPDATA=41,30000
pass=xxxx&user=xxxx&action=xxxx
OK
AT+HTTPACTION=1
OK
+HTTPACTION: 1,401,39
AT+HTTPREAD
+HTTPREAD: 39
{"error":true,"message":"Unauthorized"}
OK
AT+HTTPTERM
Я получил некоторые результаты, но с ошибкой, похоже, мой код содержит ненужные символы
любой совет
ПОСТ/клиент/index.php HTTP/1.1 Content-Type: application/x-www-form-urlencoded Хост: www.mhprojects.co.uk Длина контента: 41 пароль=xxx6&пользователь=xxx&action=xxx ОТПРАВИТЬ ОК HTTP/1.1 400 Неверный запрос Дата: Чт, 01 февраля 2018 г., 00:38:56 по Гринвичу Сервер: Апач Длина контента: 357 Подключение: закрыть Тип содержимого: текст/html; кодировка = iso-8859-1 ошибка 400, неверный запросНеверный запрос
Ваш браузер отправил запрос, который этот сервер не смог понять.
Кроме того, внутренняя ошибка сервера 500 произошла ошибка при попытке использовать ErrorDocument для обработки запроса.
Код Arduino
char data[350]="POST /client/index.php HTTP/1.1\r\nContent-Type: application/x-www-form-urlencoded\r\nHost: www.mhprojects.co.uk\r\nContent- Длина: 41\r\n\r\npass=xxx&user=xxx&action=xxx"; int PowerOn = 12;//Питание на контакте int Reset = 11;//Сброс вывода символ aux_str[50]; /////////////// недействительная установка () { pinMode (PowerOn, ВЫХОД); pinMode (Сброс, ВЫВОД); Serial.begin(9600);//скорость передачи UART включить(); Serial.println(F("Включение питания")); Серийный.println(); Serial.println(F("Подключение к сети...")); while(send_command("AT+CREG?", "+CREG: 0,1", 1000)== 0 ); } ///////////// недействительный цикл () { символьный буфер[200]; if (send_command("AT+CIPMUX=0", "OK", 2000) == 1)// Выбирает режим одиночного соединения { if (send_command("AT+CSTT=\"giffgaff.com\",\"giffgaff\",\"\"", "OK", 2000) == 1)// Устанавливает APN, имя пользователя и пароль { if (send_command("AT+CIICR", "OK", 10000) == 1)// Устанавливает беспроводное соединение { if (send_command("AT+CIFSR", ".", 3000) == 1)// Получает локальный IP-адрес { if (send_command("AT+CIPSTART=\"TCP\",\"www.mhprojects.co.uk\",\"80\"","CONNECT OK", 10000) == 1)// Открывает TCP разъем { sprintf(aux_str,"AT+CIPSEND=%d", strlen(данные)); если (send_command(aux_str, ">", 1000) == 1) { send_command(данные, "ОТПРАВИТЬ ОК", 1000); пока (правда) { read_UART_buffer (буфер, sizeof (буфер), 0); } Serial.println(буфер); } } еще { Serial.println(F("Ошибка установки TCP-соединения\r\n\r\n")); } } еще { Serial.println(F("Ошибка получения IP-адреса\r\n\r\n")); } } еще { Serial.println(F("Ошибка подключения к беспроводной сети\r\n\r\n")); } } еще { Serial.print(F("Ошибка установки APN\r\n\r\n")); } } еще { Serial.print(F("Ошибка установки одиночного соединения\r\n\r\n")); } send_command("AT+CIPCLOSE", "CLOSE OK", 1000); send_command("AT+CIPSHUT", "SHUT OK", 1000); } //////////////// недействительным power_on () { // импульс включения цифровая запись (PowerOn, LOW); delay(500); цифровая запись (PowerOn, ВЫСОКИЙ); delay(3000); цифровая запись (PowerOn, LOW); delay(3000); } /////////////// недействительный сброс () { digitalWrite (Сброс, НИЗКИЙ); delay(500); digitalWrite (Сброс, ВЫСОКИЙ); delay(3000); цифровая запись (PowerOn, LOW); delay(500); } ////////////////////////////////////////////////// ////////////////////////////////// int8_t send_command (char * AT-команда, char * ожидаемый_ответ, тайм-аут без знака int) { uint8_t х = 0, ответ = 0; символьный ответ[50]; беззнаковый длинный предыдущий; memset(ответ, '\0', 50); // Инициализировать строку delay(100); в то время как ( Serial.available() > 0) Serial.read(); // Очистить входной буфер Серийный.println(); Серийный.println(); Serial.println (AT-команда); // Отправляем AT-команду х = 0; предыдущий = millis(); // этот цикл ждет ответа делать { if (Serial. available() != 0) { // если во входном буфере UART есть данные, считывает их и проверяет ответ ответ[x] = Serial.read(); Serial.print (ответ [x]); х++; if (strstr(response, expect_answer) != NULL) // проверяем, есть ли нужный ответ (ОК) в ответе модуля { ответ = 1; } } } while ((answer == 0) && ((millis() - предыдущая) 0) Serial.read(); // Очистить входной буфер } ////////////////////////////////////////////////// ////////// void read_UART_buffer (char *buffer, int count, unsigned int timeOut) { интервал я = 0; беззнаковый длинный timerStart; timerStart = millis(); в то время как (1) { в то время как (Серийный.доступный()!=0){ Serial.write(Serial.read()); char c = Serial.read(); буфер[i++] = с; } //буфер[i]='\0'; if((unsigned long) (millis() - timerStart) > timeOut * 1000UL) { перерыв; } } }
@Egauss Egauss, 👍-1
1 ответ
Вы уверены, что длина контента равна 41? Не похоже, убедитесь, что оно такой же длины, как и ваше сообщение.
Это зависит от сервера к серверу, но я думаю, что вы также должны поставить CRLF после тела вашего сообщения.
- Как использовать SPI на Arduino?
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Как создать несколько запущенных потоков?
- Как подключиться к Arduino с помощью WiFi?
- avrdude ser_open() can't set com-state
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Я закирпичил свой Arduino Uno? Проблемы с загрузкой скетчей на плату
Проблема была в задержках, кажется это очень важно, получил рабочий код, @Egauss Egauss
можете ли вы дать нам исходный код вашего скетча, @MH Fuad