SIM800L и GPRS-соединение
- Войдите на сайт для отправки комментариев
Добрый день!
Есть Мега 2560 и SIM800L, с помощью модуля хочу научиться отправлять логи в на свой сайт и там их хранить, считывать с сайта файл с данными.
Научился с помощью данного модуля принимать/отправлять СМС с помощью библиотечных функций. А вот как работать с GPRS соединением через функции библиотеки не нашел - описано очень мало, нашел только пример из библиотеке, а вот куда дальше копать не знаю. Все примеры в интеренете почему-то с AT командами(ну если с ними проще работать, я не против).
для GPRS использую следующую библиотеку
#include "SIM900.h" #include "inetGSM.h"
Например:
//TCP Client GET, send a GET request to the server and //save the reply. numdata=inet.httpGET("www.google.com", 80, "/", msg, 50); //Print the results. Serial.println("\nNumber of data received:"); Serial.println(numdata); Serial.println("\nData received:"); Serial.println(msg);
1. Могу я используя данный код, получить файл со своего сайта или данные из файла?
2. Правильно ли я понял, чтобы отправить данные на сайт необходимо использовать httpPOST?
Если у кого есть примеры, с АТ командами или с помощью функций библиотек, пожалуйста дайте примеры.
Спасибо.
Добрый день, смог побороть только отправку данных на сайт, а вот скачивание файла, или данных из файла ну ни как найти не могу, есть у кого наработки помогите пожайлуста.
Загрузка данных на сайт
String www = "www.site.ru", www_patch = "/log.php?data=";
Большое спасибо за помощь.
Вчера нашел время поковыряться в получении данных с сайта, выяснил следующее:
получить данные можно таким же запросом что и отправка данных, например
Но данные которые возвращаются ограничены 255 символами (msg- char переменная), из которых около 200 только сервисная информация сервера. Пришла идея, а что если вместо библиотеки попробывать АТ-команды для получения данных, ограничения в 255 символов будет наложено или нет?
Проблему решил - в
именил #define _SS_MAX_RX_BUFF с 255 на 1024
Проблему решил - в
именил #define _SS_MAX_RX_BUFF с 255 на 1024
Это вы временно купировали попоболь ;) Проблема не в размере буфера, а в том, что вы не успеваете оттуда вычитывать, видимо.
Вычитытать как раз успеваю, но не все что возвращает сервер. Причем что через SIM800L, что через ESP8266-01.
Так как в конце получаю Done.
Вычитытать как раз успеваю, но не все что возвращает сервер.
Перечитайте то, что написали, и поймёте, что ваше высказывание полностью эквивалентно утверждению "вы не успеваете вычитывать данные".
Вычитытать как раз успеваю, но не все что возвращает сервер.
Перечитайте то, что написали, и поймёте, что ваше высказывание полностью эквивалентно утверждению "вы не успеваете вычитывать данные".
А что тогда поможет в данном случае, просто delay? или нечто иное?
Спасибо.
А что тогда поможет в данном случае, просто delay? или нечто иное?
Delay тут точно не поможет, только усугубит :) У вас данные в приёмном буфере успевают протухать между вызовами вашего куска кода, который вычитывает эти данные. Следовательно, где-то у вас тупилово в скетче, раз не успеваете вычитывать. Может, библиотека какая тупит.
И кстати вспомнилось: отцы ардуины для нерадивых горе-писателей библиотек придумали механизм, который позволяет во время долгоиграющих операций (ну не может если библиотека вернуться из функции вот прям щас, ей надо позарез до таймаута пооткисать) - чудную функцию yield. И если бы авторы библиотек хоть иногда читали документацию - они бы использовали эту возможность, тем самым избавив от многих головняков. Однако, сколько я этих библиотек пересмотрел - хрен вам, а не yield.
Как это относится к вашему вопросу? Да очень просто: достаточно написать
где-нибудь в скетче - и всё заработает как надо, если в сторонних кусках кода учитывается эта особенность. Да и в своих кусках кода можно применять примерно такой же механизм, например, если ждём 100 мс до таймаута, то писать так, раз уж без delay никуда:
Особенность функции yield - она объявлена так, что если её нигде в скетче не написано - всё равно всё скомпилируется. Инструмент довольно мощный в разрезе кооперативной работы. У меня, например, одновременно выдаётся файл с SD по UART, работает Wi-Fi, гоняя туда/сюда данные, GSM-модуль чего-то там в порт сыпет - и это всё успевает вычитываться без протухания буфера. Это не считая разных датчиков и кучи всякой шелухи - чего там только нету: ресурсов хватает на всё, ттт. Именно потому, что почти нигде нет delay и юзается yield.
Я ответил на ваш вопрос? Смотрите код, выясняйте, где оно тупит и как это исправить малой кровью. Если кода немного - выкладывайте, глянем.
такой вопрос
yield();
// даём поработать другим
каму именно даем работать?
ардуино поддерживает многозадачность?
вот пример на АТ командах, http://2150692.ru/faq/62-gprs-svyaz-cherez-sim800l-i-arduino
выкиньте эту библиотеку с чужими багами, своих еще хватит, и в один момент появится такой в котором без правки библиотеки не получится исправить, и прийдется ее перелопачивать
такой вопрос
yield();
// даём поработать другим
каму именно даем работать?
ардуино поддерживает многозадачность?
Ардуино не поддерживает многозадачность. Для чего применяется механизм yield - я достаточно внятно описал в топике выше, перечитайте.
А что тогда поможет в данном случае, просто delay? или нечто иное?
Я ответил на ваш вопрос? Смотрите код, выясняйте, где оно тупит и как это исправить малой кровью. Если кода немного - выкладывайте, глянем.
Где тупит я знаю, код нижке.
Данные не успевают считаться на строке
numdata=inet.httpGET(www.c_str(), 80, www_patch_data.c_str(), msg, 220);
Как в этот кусок кода вставить
yield()?
Как в этот кусок кода вставить
yield()?
Прямо и библиотеке править, вставляя в нужные места, где она долго раздупляется, вызов yield(); ;) А потом в скетче написать функцию
Внутри неё дополнительно вычитывать с буфера. На работоспособность библиотеки с другими скетчами, в которых нет yield - это никак не повлияет.
Хотя, а вижу, что дело вовсе не в этом, скорее всего. Вижу, что вы вычитываете какое-то кол-во данных в свой буфер, а данных может придти и больше. Дайте ссылку на библиотеку - гляну.
obuhanoe, если библиотека вот эта: https://github.com/arduinocamp/gsm - то она вычитывает данные в буфер до тех пор, пока не будет таймаут или буфер не наполнится. Если вы передадите в вызов httpGET длину буфера 10 - то у вас вычитаются только 10 символов. Если вы хотите вычитывать полный ответ, при этом не выделять огромный буфер, то надо в цикле читать, вызывая httpGET, пока он не вернёт 0, судя по исходникам.
obuhanoe, если библиотека вот эта: https://github.com/arduinocamp/gsm - то она вычитывает данные в буфер до тех пор, пока не будет таймаут или буфер не наполнится. Если вы передадите в вызов httpGET длину буфера 10 - то у вас вычитаются только 10 символов. Если вы хотите вычитывать полный ответ, при этом не выделять огромный буфер, то надо в цикле читать, вызывая httpGET, пока он не вернёт 0, судя по исходникам.
Добрый день, DIYMan.
Если я не ошибаюсь, то библиотеку использую вот эту https://github.com/itead/Segnix/tree/master/libraries/itead_GSM-GPRS-GPS
Если я не ошибаюсь, то библиотеку использую вот эту https://github.com/itead/Segnix/tree/master/libraries/itead_GSM-GPRS-GPS
Аналогичная фигня - вычитывает в буфер, пока его длины хватает. Возвращает 0 и при таймаутах, и при ошибке коннекта - короче, не сильно грамотно. Способа вычитыть весь буфер пошагово - не увидел, вариант - только увеличивать приёмный. В общем, не понравилась библиотека, от слова "совсем".
Если я не ошибаюсь, то библиотеку использую вот эту https://github.com/itead/Segnix/tree/master/libraries/itead_GSM-GPRS-GPS
Аналогичная фигня - вычитывает в буфер, пока его длины хватает. Возвращает 0 и при таймаутах, и при ошибке коннекта - короче, не сильно грамотно. Способа вычитыть весь буфер пошагово - не увидел, вариант - только увеличивать приёмный. В общем, не понравилась библиотека, от слова "совсем".
Может тогда посоветуете библиотеку под данный модуль или лучше уже на AT-командах все сделать?
Вы как для NeoWay 590 реализовали?
Может тогда посоветуете библиотеку под данный модуль или лучше уже на AT-командах все сделать?
Вы как для NeoWay 590 реализовали?
1. Библиотеку не посоветую, т.к. ручками пишу.
2. Реализовал конечным автоматом, данные вычитываю во внутренний буфер по факту их прихода из порта. Детали реализации можно посмотреть здесь:
https://github.com/Porokhnya/GreenhouseProject/blob/master/Main/SMSModul... - но там много специфики проекта, да и код не самый красивый, т.к. постоянно что-то допиливается.
Нужна помощь!
Работаю чисто с АТ командами. При чтении полученной с сервера информации, первые несколько байт(50-100) получаются нормально, а дальше начинается и пропуск символов и неверные данные... Для диагностики использую ардуино как ретранслятор в терминал, со следующей конструкцией:
Проблема возникает тогда, когда строка становится слишком длиной, т.к. когда заменяю сложение строки на Serial.print(c);, то в терминал пересылается все нормально, не зависимо от длины данных.
Также пробовал через массив char:
Напрямую отправлять в Serial.print мне не нужно, это сделал для теста, а в конечном итоге планирую разбирать входящие данные.
Кто что может посоветовать, хочется разобраться с проблемой стабильного получения данных с объемом до 1 Кб.
PS. За основу брал проект http://2150692.ru/faq/62-gprs-svyaz-cherez-sim800l-i-arduino , библиотека и порты соответсвуют примеру. В работе использую модули arduino pro mini 328 и sim800l.
Товарищи, подскажите:
AT+SAPBR=0,1 Разрываю соединение при включении SIM800
Далее проверяю есть ли сеть AT+CCALR?
Как тольеол сеть нашлась, делаю натройки:
и так и эдак работает
Я выполняю каждый раз
Я планирую делать запрос каждые 15 секунд с момента ответа на предыдущий запрос.
Ваше мнение,не часто ли?
Запрос формата:1,0,1
Ответ: 13.6,53,60
Т.е. запросы короткие как и ответы
Смотря какой канал, ping, скорость задержки и т д
Непредсказуемо
Какой нибудь edge или dialup может и не успеть отработать
Опять же ничего не мешает сделать таймаут и повторить запрос
Поняла, буду пробовать)
у меня иногда при плохом уровне связи (меньше 10ки по команде CSQ)
выдается код ответа 601 - +HTTPACTION: ,601,
я после этого повторяю отправку - возвращаюсь к команде
"AT+HTTPPARA=\"URL\",\"http://....
Да-да, я так же делаю - +HTTPACTION: 0,601,0
кто пробовал через сим800 гет запросы слать?
типа такие: GET /s.php?p1={34,56,76,98,23,65,45,98,34,12,67,89,3,19,23,76,3.1} HTTP/1.1
зараза, обрезает почему то.. да и укороченный вараинт тоже не сервере не появляется.
инициализирую передачу данных вот так:
понятное дело с ожиданиями ответа и прочего
далее получаю ответ:
суть в том, что мне на сервер нужно отправить вот такие данные {34,56,76,98,23,65,45,98,34,12,67,89,3,19,23,76,3.1}
и после отправки получаю :
как это еще можно сделать, чтобы данные в фигурных скобках туда на сервер закинуть?
пока у меня не получилось.
кто пробовал через сим800 гет запросы слать?
типа такие: GET /s.php?p1={34,56,76,98,23,65,45,98,34,12,67,89,3,19,23,76,3.1} HTTP/1.1
зараза, обрезает почему то.. да и укороченный вараинт тоже не сервере не появляется.
Не почему-то, а потому, что у вас в URI - unsafe characters. Почитайте RFC (страница 2, про unsafe characters): http://www.ietf.org/rfc/rfc1738.txt
Вот - тупейшая функция перевода небезопасных символов в escape-последовательности:
Скармливать ей ваш параметр "{34,56,76,98,23,65,45,98,34,12,67,89,3,19,23,76,3.1}" - на выходе вернёт well-formed URI part.
нет, там в другом проблема, я навернео не смог обьяснить, да и сам не все понимаю до конц.
Эту строку обрезало (включил эхо команд и видно) - разобрался нужно было еще одну ат команду добавить.
Далее эти цифры на самом деле шестнадцатиричные. С ними то работает на другом заводском девайсе. С него и тенируюсь.
Но пока не понятен полностью формат, как туда запхивать эту команду.
вот здесь мне общий формат строки неясен, как правильно нужно этот "хост" указывать, с какими "знаками препинания" для верной отправки ?:)
Для GET запросов нужно поднимать HTTP сервис, у тебя только TCP.
AT+HTTPINIT
AT+HTTPPARA=\"CID\",1"
AT+HTTPPARA=\"URL\",\"blabla.ru/s.php?p1=xxxxxxxxxxxxxxx\"
так вроде оигинальное устройство по ТСР туда и ходит.. я в оригинале подсмотрел ат команды и прочее.
Но попробую конечно все вараинты, хочется изучить и понять как работает.
а по идее должно и так и так работать?
Для GET запросов нужно поднимать HTTP сервис, у тебя только TCP.
AT+HTTPINIT
AT+HTTPPARA=\"CID\",1"
AT+HTTPPARA=\"URL\",\"blabla.ru/s.php?p1=xxxxxxxxxxxxxxx\"
Неверно. Прекрасно любые данные отправляются и по TCP, достаточно только правильно создать HTTP-запрос, сиречь - некий набор текста.
У вопрошающего - в URI творится дичь, такое URI ни один нормальный сервер не прожуёт, и даже не обязан, ибо оно не соответствует RFC. Хотя, я вижу, тут это никого не смущает.
нет, там в другом проблема, я навернео не смог обьяснить, да и сам не все понимаю до конц.
Эту строку обрезало (включил эхо команд и видно) - разобрался нужно было еще одну ат команду добавить.
Далее эти цифры на самом деле шестнадцатиричные. С ними то работает на другом заводском девайсе. С него и тенируюсь.
Но пока не понятен полностью формат, как туда запхивать эту команду.
вот здесь мне общий формат строки неясен, как правильно нужно этот "хост" указывать, с какими "знаками препинания" для верной отправки ?:)
Т.е. вы продолжаете утверждать, что дело не в битом URI? Да, вы правы - дело НЕ ТОЛЬКО в нём. А ещё и в том, что у вас неправильно сформирован HTTP-запрос. Для того, чтобы научиться, как правильно формировать простейшие HTTP-запросы к HTTP-серверу - достаточно прочитать всего парочку обзорных статей по протоколу HTTP, чтобы понять, почему у вас ничего не получается. Как минимум - у вас нет переводов строки между заголовками HTTP-запроса. Как максимум - в конце HTTP-запроса должен быть двойной перевод строки. Плюс, как я писал выше - URI, который вы запрашиваете, а именно значение параметра p1 - содержит небезопасные символы, которые НЕОБХОДИМО кодировать в escape-последовательности.
Дело ваше - прислушиваться или нет. Не прислушаетесь - ок, более ничего писать не буду, ибо - бестолку.
Какой, максимальной длины, отправляется заголовок, get запроса? У меня в заголовке был обычный текст, параметр=значение.. так же обрезало.
в URI творится дичь, такое URI ни один нормальный сервер не прожуёт, и даже не обязан, ибо оно не соответствует RFC. Хотя, я вижу, тут это никого не смущает.
меня тоже смущает, но пока не знаю как правильно.. пока разбираюсь.
такого формата как выше.
нашел почему у меня резало - кажется в инициализации не было команды AT+CIPMODE=0 или AT+CIPMUX=0 не помню.
Как только добавил - резать перестало. В оригинальном устройстве эта команда есть. Вроде уже все сделал как в оригинале, но где то мелкая проблема осталась. Оригинал то работает, шлет на сервер и все ок..
я как чукча, все буквы угадал, а слово не знаю...
слово в конце немного не верно - Host: auau.biz.net:80 как в этой посылке указывать или не указывать?
в остальном общение с модемом вроде все идет ок..
CLOSED пишет секунд через 10 если ничего больше не посылать.
AT+CIPSTART="TCP","auau.biz.net","80" - вроде как заранее указывается с чем коннектимся.
далее GET /s.php?p1= - и все должно отправится... дешево и сердито.
Я использую SIM800L для управления(мониторинг датчиков, упраление реле и т.п.) Arduino со смартфона. Если нужна помощь, обращайтесь в личку, помогу со скетчем, программой для сервера и Android приложением в полном объеме.
Кому интересно пишите на почту vanoomsk999@gmail.com
http://forum.cxem.net/index.php?/topic/195209-настройка-соединения-gprs-в-sim800l/
вот здесь еще есть инфа по ТСР соединению. Достаточно информативно.
как и ожидалось - банальная проблема была, нужно было писать в конце посылки : \r\n\r\n
тоесть два раза указывать!!!. в описании модема об логично этом не говорится, а пришлось подробнее почитать о гет запросах, очень редко но там на этом акцентировалось внимание.