SIM800L GPRS передача данных, скорость, "многопоточность" AT команды
- Войдите на сайт для отправки комментариев
Втр, 12/04/2022 - 20:45
Возможно как-то ещё можно обмениваться данными через GPRS? Во время тестов на хостинге меня забанили.. я хотел добиться 10 запросов в 1с в итоге получалось 1 запрос в ~2 секунды.. Принимаю любую критику)
//#include <SoftwareSerial.h> #define APN "internet" #define USER "" #define PASSWORD "" //SoftwareSerial SIM800(2, 3);// 2 - RX Arduino (TX SIM800L), 3 - TX Arduino (RX SIM800L) unsigned long initSIM800L, loopSIM800L,timeout; // таймеры функций byte val[16]; //переменык для инициализаций------ bool initGPRS = true, workGPRS = false; byte loopInit; //--------------------------------- void setup() { Serial.begin(115200); Serial3.begin(115200);// для SoftwareSerial нужно указывать SIM800.begin //delay(10000); //ждем включения модема } void loop() { if (initGPRS) { initSattingSIM800L(); } if (workGPRS) { //SIM800Lloop(); } dataPrintSerial(); } void SIM800Lloop() { if (millis() - loopSIM800L > 2000) { val[0]++; loopSIM800L = millis();/* Serial3.println("AT+HTTPINIT");//Инициализация http сервиса Serial3.println("AT+HTTPPARA=\"CID\",1");*/ Serial3.println("AT+HTTPPARA=\"URL\",\"http://сайт.com/add_data.php?temperature=" + String(val[0]) + "&&temperature1=" + String(val[0]) + "\"; +HTTPACTION=0"); //Serial3.println("AT+HTTPACTION=0");//Старт сессии, на обмен данными данных 0 – GET, 1 – POST, 2 – HEAD //Serial3.println("AT+HTTPREAD");//Чтение данных //Serial3.println("AT+HTTPDATA=10,10000");//Передача данных HTTP серверу //Serial3.println("AT+HTTPTERM");//Завершить работу HTTP службы } } void initSattingSIM800L() { if (millis() - initSIM800L >= 1000) { String ATCommand[] = { //массив АТ команд "AT+DDET=0; E1; +CLIP=1; S0=0; V1; +CMEE=2; +CMGF=0; +CIPMODE=0", //1 - вылючаем режим распознования DTMF, 2 - отключаем возврат команд от модема, 3 - включаем АОН, 4 - вручную поднимать трубку при входящем звонке, 5 - развернутый символьный ответ от модема, 6 - подробный вывод ошибок, 7 - PDU режим приема и отправки SMS, 8 - Командный режим передачи данных "AT+SAPBR=3,1,\"CONTYPE\",\"GPRS\"; +SAPBR=3,1,\"APN\", "APN"; +SAPBR=3,1,\"USER\","USER"; +SAPBR=3,1,\"PWD\","PASSWORD"",//Настройка профиля "AT+SAPBR=1,1", //Устанавливаем GPRS соединение "AT+HTTPINIT", //Инициализация http сервиса "AT+HTTPPARA=\"CID\",1", //Установка CID параметра для http сессии "AT+SAPBR=4,1; +SAPBR=2,1; +CREG?; +COPS?; +CGATT?"//сведения о профиле, соединении и IP адреса (+SAPBR: 1,1,"-ip-") соединение установлено, проверяем что зарегестрировались в домашней сети, смотрим кто оператор, Проверка доступа к услугам пакетной передачи данных }; Serial3.println(ATCommand[loopInit]);//шлем команды loopInit++; initSIM800L = millis(); if (loopInit == 6) { initGPRS = false; workGPRS = true; } } } void dataPrintSerial() { if (Serial3.available()) // Ожидаем прихода данных (ответа) от модема... Serial.write(Serial3.read()); // ...и выводим их в Serial if (Serial.available()) // Ожидаем команды по Serial... Serial3.write(Serial.read()); // ...и отправляем полученную команду модему }
после подачи любой команды модему или серверу надо дождаться ответа . А вы все шлете подряд - вот он вас и банит.
Ответы по GRPS нередко по несколько секунд идут. Не забывайте, что СИМ800 и 900 - это даже не 3g, а 2g модем, там все очень не быстро. Так что 1 запрос в 2 секунды - это вполне себе результат. Но правильнее, конечно, общаться с сервером двусторнне, а не орать ему в ухо
Да, можно функцию добавить типо такой ..
zDimaBY , ваши delay в вашем примере категорически неприемлемо для нормального обмена с модемом, прилети байт 200 данных и ничего вы не обработаете.
Я топлю за millis естественно.. delay в примерах могу себе позволить)
Какой нафиг millis, надо ответы все от модема читать и анализировать, все остальное "дошкольная поделка".
Все ответы от модема через анализатора команд? без millis ? даже пропускать через анализатор AT+HTTPREAD ? и все в 1 функции ? Очень интересно посмотреть ваш пример. НЕ "дошкольной поделкой"
Гы))) сомневаетесь? Ну на форуме ищите, я письками меряться не собираюсь, скучно :)
Все ответы от модема через анализатора команд? и все в 1 функции ?
а почему обязательно в одной функции? - хотите, делайте в разных, число функций ни на что не влияет
ЗЫ правда, я бы не рассчитывал на 10 запросов в секунду даже после того, как вы перепишете все правильно. АТ-командами через Уарт такая скорость недостижима, как мне кажется.
если надо 10 запросов в секунду, то что-то не так в архитектуре приложения.
А оно (10 и более запросов в секунду) и не получиться, по даташиту модема на каждую команду ждать ответа несколько секунд, в качестве варианта можно отправлять данные без подтверждения, зависит от задачи.
Кстати потоковые данные уходят достаточно шустро, мы пару лет назад передавали по mqtt jpeg фото на пару сотен килобайт вполне успешно.
От вас нашел в этой мусорке
пример, небольшую библиотеку http://arduino.ru/forum/apparatnye-voprosy/vse-o-sim800l-i-vse-chto-s-nim-svyazano?page=2#comment-494752
Последовательность команд http://arduino.ru/forum/programmirovanie/snova-mqtt-1?page=1#comment-567999
Хз что ищо есть..
АТ-командами через Уарт такая скорость недостижима, как мне кажется.
1 бод = 1 бит/сек. 1 байт= 8 бит, след. 9600 бод = 1200 байт/ сек. 150байт 1 запрос 200мс норм будет на 9600. Думаю больше зависит от засраного loop.. а на стороне модема AT+HTTPACTION=0 сессия передачи даных чтобы достич 10 пакетов в секунду
макс скорость зависит от БС.. GPRS class 12 (85.6 кБ/с) - 85.6 Килобайт = 87654.4 Байт. Запросы GET. POST совсем другое
Ищо поковыряю TCP и UDP, mqtt ..
ПРИМЕР инициализации HTTP
АТ-командами через Уарт такая скорость недостижима, как мне кажется.
1 бод = 1 бит/сек. 1 байт= 8 бит, след. 9600 бод = 1200 байт/ сек. 150байт 1 запрос 200мс норм будет
не понятно, чего спорить?
1 запрос в 200мс - это уже только 5 запросов в секунду. Вы. вроде, хотели 10?
А если прибавить таймауты между запросами - вот и выйдет, что 1-2 запроса - это максимум.
zDimaBY, а если например команда httpinit будет выполняться больше 10 секунд, что будете делать?
SIM800 Series_FM_Application Note_V1.00
SIM800 Series_Email_Application Note_V1.00
SIM800 Series_MMS_Application Note_V1.00
SIM800 Series_IP_Application Note_V1.00
SIM800 Series_TCPIP_Application Note_V1.00
SIM800 Series_AT Command Manual_V1.01
SIM800 datasheet TCPIP Application V1.01
SIM800_Hardware Design_V1.09
SIM800 Hardware Design V2.02
Пособирал мануалы может кому-то пригодиться. возможно не все.
В SIM800 Series_TCPIP_Application Note_V1.00 оглавление 4: Two GPRS Context
Учиться и учиться.... Ну а так то все просто, читаем литературу и примеры выше, разбираемся что каждая команда делает, рисуем тестовый скетч, проверяем, пока можно и не ждать корректных ответов, просто наблюдать. Когда захочется скорости и стабильности - включаем мозг и пишем обработку ответов от модема в соответствии с логикой программы и даташита.
Тут на форуме уже неоднократно обсуждалось как правильно парсить ответы от модема, есть несколько вариантов.
- складывать все в буфер ждать например прихода \r\n т е конца строки и парсить строку. Тут проблема в том, что когда прилетает большой пакет данных типа три рекламных смс кириллицей и весь приход не умещается в буфер, можно профукать команду.
- каждый входящий байт кладём в кольцевой буфер и ищем нужную команду.
Отправил модему AT+CIPSEND=100 появилось в порту > отправились 2 сообщения.. сервер принял все ок.. но после этого sim800l остановился.. около 20 символов отправились и все. и сейчас после AT+CIPSEND зависает не могу ничего отправит после > останавливаеться модем, ардуинка работает помогает ребут модуля. Команды по мануалу 2.1.1 How to Establish a TCP Client Connection
А код 26 в конце отправки шлете¿
Я после появления знака ">" в мониторе порта совсем ничего не могу отправить, модуль sim800l зависает, помогает только перезагрузка.. 0x0a это понятно что нужно отправлять. Я не знаю как, но первый раз два сообщения пришло на сервер без этого. Просто ентер клацнул и пришло.. потом при 2 разе зависло.
Гы)) вы пытаетесь через терминал отправлять команды и корректно отправьть двнные?)
Читаем (вы ж сами нашли) последовательность команд для нормального gprs, реализуете это пока с delay секунд 10...15 между командами, тестируете, анализируете.
Читаем
http://arduino.ru/forum/apparatnye-voprosy/vse-o-sim800l-i-vse-chto-s-ni...
http://codius.ru/articles/GSM_%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D1%8C_SIM80...
Пробуем учимся
Да пытался через монитор порта отослать.. но не верно отсылалось это при > можно писать, а после отсылки он виснет "тогда 26 символ не сработал", а если после > нет возможности писать тогда какое-то неверные настройки были применены.
Что делается теперь.. к серверу присоединяется выводит от него сообщение при отправке модем отвечает SEND OK но данные не отправляются и не приходят. Иза чего это может быть ? К примеру в клиенте на телефоне все работает как надо.
СЕРВЕР
Если send Ok, значит данные уходят, это 100 %, что то другое блочит, смотрите брандмауэр и /или логи сервера.
Update:
AT+CIPSEND
> qqqq
SEND OK
На qqqq сервер и не ответит, http заголовок кто для php отправлять будет?
УСПЕХ
Скорое всего нет, это означает что уходит только в модем. А модем пытается понять и отправить такое, как нужно.. мануал немного не дописан как по мне.
Для TCP не нужно HTTP.. но возможно и так делать. смисл тогда TCP
Через монитор порта.. лучше взять PuTTY. будет такая последованность.
это означает что уходит только в модем.
сами то поняли что сказали? SEND OK означает что TCP сокет сервера принял данные, но это совершенно не означает что он их нормально воспринял и обработал.
Для TCP не нужно HTTP..
сами то поняли что сказали? SEND OK означает что TCP сокет сервера принял данные, но это совершенно не означает что он их нормально воспринял и обработал.
Да вы 100% правы. Понял.
нашел код от какого то проекта 19 года, как PHP обрабатывает запрос от ESP, соответственно отправка на МК и прием на сервере
--
PHP это такое уже.. не про sim800.
Я что-то не понимаю как дождаться без delay и милис пакет.. вот фунция обработки AT+CIPSEND после ">"
Пакет отправляет, а ответ как дождаться ? вот что в сериал
Serial
.println(iBuff); выводит 0 и 1 и все..
http://arduino.ru/forum/apparatnye-voprosy/vse-o-sim800l-i-vse-chto-s-ni...
0 и 1 это по всей вероятности и есть ответы от php сервера, код то мы не видим. И если так и есть - их и отслеживайте.
Да, исправил. буду оптимизировать. такой пакет получаеться.
zDimaBY , я не знаю насколько стабильно вам надо общаться с сервером, поэтому сложно судить про корректность кода, но однозначно могу сказать следующее: не отслеживая CIPSTATUS перед отправкой, рано или поздно произойдет ситуация, при которой SIPSEND не сможет отправить данные.