Как правильно отправлять данные через http с помощью sim908?
Преамбула:
У меня есть плата sim908
, и я пытаюсь периодически отправлять некоторые данные на сервер с помощью AT-команд
.
На каждую команду я жду ответа, чтобы проверить, все ли работает.
На самом деле скетч работает, но я часто замечал ошибки во время http-запросов.
Современное состояние:
Вот последовательность AT-команд (не весь код) в цикле:
1) Проверьте регистрацию сети и, если необходимо, подождите
AT+CREG?
2) Установите параметры для GPRS-подключения (имя пользователя и пароль не требуются)
AT+SAPBR=3,1,"Contype","GPRS"
AT+SAPBR=3,1,"APN","web.omnitel.it"
3) Получить текущего носителя
AT+SAPBR=2,1
4) Если носитель == 0,0,0,0 (не назначен), получить нового носителя
AT+SAPBR=1,1
5) Инициализация HTTP
AT+HTTPINIT
6) Установите CID и URL
AT+HTTPPARA="CID",1
AT+HTTPPARA="URL","www.someurl.com/service.php?p1=1&p2=2"
7) Выполните команду HTTP (POST)
AT+HTTPACTION=1
8) Закройте HTTP-соединение
AT+HTTPTERM
Вопрос:
Почему HTTP init (шаг 5) или HTTP posting (шаг 7) часто не удается? Что не так в этой процедуре? Я что-то упускаю? Есть ли способ сделать процедуру более стабильной?
Заранее спасибо :)
Важное обновление:
Если при отправке данных по HTTP произошла ошибка, рекомендуется обновить канал (шаг 4)
Ответы на комментарии:
a) У Shield есть антенна, и она работает. Если я попытаюсь отключить антенну, код все равно будет искать сеть (шаг 1), пока я не подключу антенну снова.
b) Иногда у меня возникает следующая ошибка при инициализации HTTP (шаг 5):
AT+HTTPINIT
+ОШИБКА CME: 3
Иногда у меня есть только «ОК» в качестве данных для отправки ответа (шаг 7) вместо:
+HTTPACTION:1,200,xxx
Или такой ответ:
+HTTPACTION:1,600,0
c) У меня ошибка на шаге 4 (AT+SAPBR=1,1) только если я выполняю команду, когда у меня еще есть bearer. Ошибка в этом случае:
AT+SAPBR=1,1
+ОШИБКА CME: 3
По этой причине я делаю проверку (шаг 3)
@Lipsyor, 👍2
Обсуждение1 ответ
Вы упоминаете два разных сообщения об ошибках.
1. Ошибка AT+HTTPINIT
Вы получаете +CME ERROR 3. Что означает «операция не разрешена».
Это может быть связано с неправильной настройкой HTTP.
Если вы получили эту ошибку (или она всегда появляется перед настройкой), вызовите AT+HTTPTERM
, чтобы убедиться, что она закрыта.
2. AT+HTTPACTION=1
Я заметил, что вы пытаетесь сделать сообщение POST
, в то время как ваши переменные находятся в URL (который, насколько я знаю, в стиле GET
).
Я нашел источник, в котором говорится, что вам нужно вызвать AT+HTTPDATA
с соответствующими значениями.
Сообщите модулю, что вы отправите 192 байта данных, и что он может отключиться через 10 секунд бездействия.
После этого устройство скажет DOWNLOAD
, и вы можете отправить тело POST
.
После этой команды вы получаете DOWNLOAD URC, после чего вы можете ввести 192 байта данных в течение 10 секунд. Введенные данные заполняются в локальном буфере модуля и еще не отправляются на сервер. В теле сообщения находятся данные многокомпонентной формы, которые содержат необходимые заголовки и данные для отправки файла с именем data.txt с 10 байтами данных.
AT+HTTPDATA=192,10000
И после этого вы можете отправить сообщение POST
.
Выполните команду HTTP POST, чтобы содержимое буфера было отправлено методом POST сервер
AT+HTTPACTION=1 ОК
Вы получите ответное сообщение, в котором будет указан код HTTP (200 «OK») и количество полученных байтов в ответном сообщении.
+HTTPACTION:1,200,141
Этот URC означает, что данные были успешно отправлены на сервер и получено 141 байт данных. что является ответом сервера на ваш HTTP POST
Вы можете использовать AT+HTTPREAD
для получения этих байтов.
Приведенная ниже команда сообщает модулю, что мы хотим прочитать полученные данные AT+HTTPREAD. Ниже приведены данные. получено с сервера +HTTPREAD:141 Успешно сброшено 0 переменных поста. Посмотреть на http://www.posttestserver.com/data/2015/10/07/07.41.291690063480 Опубликовать Длина тела сообщения 0 символов. ОК
(Прокрутите немного вниз исходный код, первая часть находится по адресу HTTP GET
: http://www.raviyp.com/embedded/194-sim900-gprs-http-at-commands)
Вы также можете пропустить это, используя HTTP GET
, поскольку это несколько проще.
Если ничего не помогает, вы можете настроить TCP IP
соединение с GSM-модулем и вручную настроить HTTP-сообщение GET/POST.
Спасибо за ответ. По поводу HTTPINIT fail, обратите внимание, что (шаг 8) я использую HTTPTERM для каждого цикла. Я попробую то, что вы предлагаете по поводу GET и POST. Однако я не понимаю, почему иногда мой код работает, а иногда нет., @Lipsyor
Я пробовал, но безрезультатно. Теперь попробую подождать больше времени для ответов., @Lipsyor
@Lipsyили какой вариант вы пробовали? Предлагаю попробовать сделать запрос GET
работающим, прежде чем пробовать запросы POST
., @Paul
Я пробовал ждать ответа дольше: теперь GET и POST работают. У меня возникли проблемы с HTTPINIT: когда он терпит неудачу, я не могу восстановиться с помощью HTTPTERM, и мне пришлось пробовать еще раз. Я подумываю сбросить щит, если подряд возникнет более двух-трех ошибок., @Lipsyor
Хм, по крайней мере, здесь мы делаем успехи ;) вы проверяли, как другие библиотеки обрабатывают ошибки? Если http init не удается, вы можете снова проверить все вышеперечисленное, at+creg?, at+sapbr и т. д. Необходимость сбрасывать его немного грубо (если это происходит часто). Но хорошо иметь такую встроенную функцию в любом случае., @Paul
- Как публиковать запросы HTTP POST на моем веб-сайте?
- Почтовый запрос HTTP в формате JSON с использованием модуля SIM900
- HTTP GET запрос с использованием Arduino Uno и ESP8266
- Как составить URL-адрес HTTP-запроса GET с параметрами ключ/значение
- ESP8266 Ошибка неверного запроса 400
- GSM-модуль Sim800l не может подключить данные gprs
- Более быстрый способ анализа HTTP-ответа в Arduino
- ESP8266 отправляет веб-страницу клиенту, но html-коды отображаются в браузере вместо веб-страницы
Есть ли у него антенна? И какую именно ошибку вы получаете? Сообщения Post должны возвращать http+error с номером., @Paul
Вы получили результаты новых настроек носителя, возвращенных
AT+SAPBR=1,1
? Опубликуйте точный код ошибки +CMEE, который вы видите., @SoreDakeNoKotoЯ отредактировал исходный пост., @Lipsyor
ОШИБКА CME: 3 означает «операция не разрешена». А код ответа HTTP 600 официально не является чем-то, попробуйте прочитать заголовок и тело сообщения, но это может быть «недопустимый запрос»., @Paul
Спасибо, Пол. Из документации (http://www.waveshare.com/w/upload/4/4e/SIM908_AT-Command-Manual.pdf) 600 — это «не HTTP PDU». Эта ошибка не появляется каждый раз. Откуда вы знаете, моя процедура верна?, @Lipsyor
@Lipsyor, трудно сказать, прошло довольно много времени с тех пор, как я работал с этими модулями GSM, и у меня нет ни одного доступного для тестирования. Если
AT+HTTPINIT
не удается, вы можете принудительно закрыть существующую настройку http с помощьюAT+HTTPTERM
., @Paul