Как правильно отправлять данные через 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)

, 👍2

Обсуждение

Есть ли у него антенна? И какую именно ошибку вы получаете? Сообщения 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


1 ответ


4

Вы упоминаете два разных сообщения об ошибках.

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