SIM800L и GPRS-соединение

obuhanoe
Offline
Зарегистрирован: 18.05.2016

Добрый день!

Есть Мега 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?

Если у кого есть примеры, с АТ командами или с помощью функций библиотек, пожалуйста дайте примеры.

Спасибо.

 

obuhanoe
Offline
Зарегистрирован: 18.05.2016

Добрый день, смог побороть только отправку данных на сайт, а вот скачивание файла, или данных из файла ну ни как найти не могу, есть у кого наработки помогите пожайлуста.

Загрузка данных на сайт

// отправка данных с помощью gprs-соединения
void gprs_sending_data(String data){
  String www_patch_data;
	www_patch_data = www_patch + data;
	if (inet.connectedClient()) {
		numdata=inet.httpGET(www.c_str(), 80, www_patch_data.c_str(), msg, 50);
	} else 
          debug_log("ErroR when sending data"); 	
}

String www = "www.site.ru", www_patch = "/log.php?data=";

Большое спасибо за помощь.

obuhanoe
Offline
Зарегистрирован: 18.05.2016

Вчера нашел время поковыряться в получении данных с сайта, выяснил следующее:

получить данные можно таким же запросом что и отправка данных, например

numdata=inet.httpGET("www.site.ru", 80, "/graphik.php", msg, 500);

Но данные которые возвращаются ограничены 255 символами (msg- char переменная), из которых около 200 только сервисная информация сервера. Пришла идея, а что если вместо библиотеки попробывать АТ-команды для получения данных, ограничения в 255 символов будет наложено или нет?

 

 

 

obuhanoe
Offline
Зарегистрирован: 18.05.2016

Проблему решил - в

 \hardware\arduino\avr\libraries\SoftwareSerial\src\SoftwareSerial.h

именил #define _SS_MAX_RX_BUFF с 255 на 1024

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

obuhanoe пишет:

Проблему решил - в

 \hardware\arduino\avr\libraries\SoftwareSerial\src\SoftwareSerial.h

именил #define _SS_MAX_RX_BUFF с 255 на 1024

Это вы временно купировали попоболь ;) Проблема не в размере буфера, а в том, что вы не успеваете оттуда вычитывать, видимо.

obuhanoe
Offline
Зарегистрирован: 18.05.2016

Вычитытать как раз успеваю, но не все что возвращает сервер. Причем что через SIM800L, что через ESP8266-01.

Так как в конце получаю Done.

 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

obuhanoe пишет:

Вычитытать как раз успеваю, но не все что возвращает сервер. 

Перечитайте то, что написали, и поймёте, что ваше высказывание полностью эквивалентно утверждению "вы не успеваете вычитывать данные".

obuhanoe
Offline
Зарегистрирован: 18.05.2016

DIYMan пишет:

obuhanoe пишет:

Вычитытать как раз успеваю, но не все что возвращает сервер. 

Перечитайте то, что написали, и поймёте, что ваше высказывание полностью эквивалентно утверждению "вы не успеваете вычитывать данные".

А что тогда поможет в данном случае, просто delay? или нечто иное?

Спасибо.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

obuhanoe пишет:

А что тогда поможет в данном случае, просто delay? или нечто иное?

Delay тут точно не поможет, только усугубит :) У вас данные в приёмном буфере успевают протухать между вызовами вашего куска кода, который вычитывает эти данные. Следовательно, где-то у вас тупилово в скетче, раз не успеваете вычитывать. Может, библиотека какая тупит. 

И кстати вспомнилось: отцы ардуины для нерадивых горе-писателей библиотек придумали механизм, который позволяет во время долгоиграющих операций (ну не может если библиотека вернуться из функции вот прям щас, ей надо позарез до таймаута пооткисать) - чудную функцию yield. И если бы авторы библиотек хоть иногда читали документацию - они бы использовали эту возможность, тем самым избавив от многих головняков. Однако, сколько я этих библиотек пересмотрел - хрен вам, а не yield.

Как это относится к вашему вопросу? Да очень просто: достаточно написать

void yield()
{
 // тут критичный код, вычитка из приёмного буфера UART, 
// например - чтоб не переполнился, болезный
}

где-нибудь в скетче - и всё заработает как надо, если в сторонних кусках кода учитывается эта особенность. Да и в своих кусках кода можно применять примерно такой же механизм, например, если ждём 100 мс до таймаута, то писать так, раз уж без delay никуда:

for(byte i=0;i<100;i+=2)
{
  delay(2); 
  yield(); // даём поработать другим
}

Особенность функции yield - она объявлена так, что если её нигде в скетче не написано - всё равно всё скомпилируется. Инструмент довольно мощный в разрезе кооперативной работы. У меня, например, одновременно выдаётся файл с SD по UART, работает Wi-Fi, гоняя туда/сюда данные, GSM-модуль чего-то там в порт сыпет - и это всё успевает вычитываться без протухания буфера. Это не считая разных датчиков и кучи всякой шелухи - чего там только нету: ресурсов хватает на всё, ттт. Именно потому, что почти нигде нет delay и юзается yield.

Я ответил на ваш вопрос? Смотрите код, выясняйте, где оно тупит и как это исправить малой кровью. Если кода немного - выкладывайте, глянем.

Baks
Baks аватар
Offline
Зарегистрирован: 11.01.2016

такой вопрос

  yield(); // даём поработать другим

каму именно даем  работать? 

ардуино поддерживает многозадачность?

вот пример на АТ командах, http://2150692.ru/faq/62-gprs-svyaz-cherez-sim800l-i-arduino

выкиньте эту библиотеку с чужими багами, своих еще хватит, и в один момент появится такой в котором без правки библиотеки не получится исправить, и прийдется ее перелопачивать

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Baks пишет:

такой вопрос

  yield(); // даём поработать другим

каму именно даем  работать? 

ардуино поддерживает многозадачность?

Ардуино не поддерживает многозадачность. Для чего применяется механизм yield - я достаточно внятно описал в топике выше, перечитайте. 

obuhanoe
Offline
Зарегистрирован: 18.05.2016

DIYMan пишет:

obuhanoe пишет:

А что тогда поможет в данном случае, просто delay? или нечто иное?

Я ответил на ваш вопрос? Смотрите код, выясняйте, где оно тупит и как это исправить малой кровью. Если кода немного - выкладывайте, глянем.

Где тупит я знаю, код нижке.

#include "inetGSM.h"

// отправка данных с помощью gprs-соединения
void gprs_sending_data(String data, byte sd_log = 0){
  int numdata;
  char msg[220];
  String www = "www.site.ru", www_patch = "/log.php?data=", www_patch_sd = "/log_sd.php?data=", www_patch_gr = "/graph_out.php";
  String www_patch_data;   
  data.replace(" ","%20");
  data.replace("\r\n","%0a");
  switch (sd_log) {
  case 0:
    www_patch_data = www_patch + data;
    break;
  case 1:
    www_patch_data = www_patch_sd + data;
  case 2:
    www_patch_data = www_patch_gr;
    break;  
  }	

  if (startedGSM) {       
       init_gprs(0); 
        
        numdata=inet.httpGET(www.c_str(), 80, www_patch_data.c_str(), msg, 220);     
        
        if (String(msg).startsWith("HTTP/1.1 200 OK"))           
          Serial.println(String(msg)); 
  } 
}

Данные не успевают считаться на строке

numdata=inet.httpGET(www.c_str(), 80, www_patch_data.c_str(), msg, 220);

Как в этот кусок кода вставить yield()?

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

obuhanoe пишет:

Как в этот кусок кода вставить yield()?

Прямо и библиотеке править, вставляя в нужные места, где она долго раздупляется, вызов yield(); ;) А потом в скетче написать функцию

void yield()
{
}

Внутри неё дополнительно вычитывать с буфера. На работоспособность библиотеки с другими скетчами, в которых нет yield - это никак не повлияет.

Хотя, а вижу, что дело вовсе не в этом, скорее всего. Вижу, что вы вычитываете какое-то кол-во данных в свой буфер, а данных может придти и больше. Дайте ссылку на библиотеку - гляну.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

obuhanoe, если библиотека вот эта: https://github.com/arduinocamp/gsm - то она вычитывает данные в буфер до тех пор, пока не будет таймаут или буфер не наполнится. Если вы передадите в вызов httpGET длину буфера 10 - то у вас вычитаются только 10 символов. Если вы хотите вычитывать полный ответ, при этом не выделять огромный буфер, то надо в цикле читать, вызывая httpGET, пока он не вернёт 0, судя по исходникам.

obuhanoe
Offline
Зарегистрирован: 18.05.2016

DIYMan пишет:

obuhanoe, если библиотека вот эта: https://github.com/arduinocamp/gsm - то она вычитывает данные в буфер до тех пор, пока не будет таймаут или буфер не наполнится. Если вы передадите в вызов httpGET длину буфера 10 - то у вас вычитаются только 10 символов. Если вы хотите вычитывать полный ответ, при этом не выделять огромный буфер, то надо в цикле читать, вызывая httpGET, пока он не вернёт 0, судя по исходникам.

Добрый день, DIYMan.

Если я не ошибаюсь, то библиотеку использую вот эту https://github.com/itead/Segnix/tree/master/libraries/itead_GSM-GPRS-GPS

 

 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

obuhanoe пишет:

 

Если я не ошибаюсь, то библиотеку использую вот эту https://github.com/itead/Segnix/tree/master/libraries/itead_GSM-GPRS-GPS

Аналогичная фигня - вычитывает в буфер, пока его длины хватает. Возвращает 0 и при таймаутах, и при ошибке коннекта - короче, не сильно грамотно. Способа вычитыть весь буфер пошагово - не увидел, вариант - только увеличивать приёмный. В общем, не понравилась библиотека, от слова "совсем".

obuhanoe
Offline
Зарегистрирован: 18.05.2016

DIYMan пишет:

obuhanoe пишет:

 

Если я не ошибаюсь, то библиотеку использую вот эту https://github.com/itead/Segnix/tree/master/libraries/itead_GSM-GPRS-GPS

Аналогичная фигня - вычитывает в буфер, пока его длины хватает. Возвращает 0 и при таймаутах, и при ошибке коннекта - короче, не сильно грамотно. Способа вычитыть весь буфер пошагово - не увидел, вариант - только увеличивать приёмный. В общем, не понравилась библиотека, от слова "совсем".

Может тогда посоветуете библиотеку под данный модуль или лучше уже на AT-командах все сделать?

Вы как для NeoWay 590 реализовали?

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

obuhanoe пишет:

Может тогда посоветуете библиотеку под данный модуль или лучше уже на AT-командах все сделать?

Вы как для NeoWay 590 реализовали?

1. Библиотеку не посоветую, т.к. ручками пишу.

2. Реализовал конечным автоматом, данные вычитываю во внутренний буфер по факту их прихода из порта. Детали реализации можно посмотреть здесь:

https://github.com/Porokhnya/GreenhouseProject/blob/master/Main/SMSModul... - но там много специфики проекта, да и код не самый красивый, т.к. постоянно что-то допиливается.

vsvleo
Offline
Зарегистрирован: 29.09.2016

Нужна помощь!

Работаю чисто с АТ командами. При чтении полученной с сервера информации, первые несколько байт(50-100) получаются нормально, а дальше начинается и пропуск символов и неверные  данные... Для диагностики использую ардуино как ретранслятор в терминал, со следующей конструкцией:

String st;
while(GSMport.available()>0){
    char c = GSMport.read();
    st += c;
    delay(1); // Без него выдается шлак, подобрал опытным путем
}
Serial.print(st);

Проблема возникает тогда, когда строка становится слишком длиной, т.к. когда заменяю сложение строки на Serial.print(c);, то в терминал пересылается все нормально, не зависимо от длины данных.

Также пробовал через массив char:

String st;
char c[1000];
int i=0;
while(GSMport.available()>0){
    c[i++] = GSMport.read();
    delay(1);
}
// здесь цикл на сборку строки, делал через while
Serial.print(st);

Напрямую отправлять в Serial.print мне не нужно, это сделал для теста, а в конечном итоге планирую разбирать входящие данные.

Кто что может посоветовать, хочется разобраться с проблемой стабильного получения данных с объемом до 1 Кб.

PS. За основу брал проект http://2150692.ru/faq/62-gprs-svyaz-cherez-sim800l-i-arduino , библиотека и порты соответсвуют примеру. В работе использую модули arduino pro mini 328 и sim800l.

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

Товарищи, подскажите:

AT+SAPBR=0,1    Разрываю соединение при включении SIM800

Далее проверяю есть ли сеть AT+CCALR?

Как тольеол сеть нашлась, делаю натройки:

AT+SAPBR=3,1,"CONTYPE","GPRS",
AT+SAPBR=3,1,"APN","internet.tele2.ru"
AT+SAPBR=3,1,"USER","tele2"
AT+SAPBR=3,1,"PWD","tele2"
AT+SAPBR=1,1
Все ОК, GPRS соединение работает, лампочка на SIM800 моргает быстро.
 
Далее отправляю запрос:
AT+HTTPINIT //Инициализация http сервиса
AT+HTTPPARA="CID",1 //Установка CID параметра для http сессии
AT+HTTPPARA="URL","https://site.ru/123.html"
 
AT+HTTPREAD //Читаю данные
AT+HTTPTERM //Завершаю работу HTTP службы
 
 
Вопрос в чем:
Команды:
AT+HTTPINIT //Инициализация http сервиса
AT+HTTPPARA="CID",1 //Установка CID параметра для http сессии
Нужно выполнять каждый раз при отправке запроса к сайту? или один раз при установке соединения?
 
 

 

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

Irinka пишет:
Нужно выполнять каждый раз при отправке запроса к сайту? или один раз при установке соединения?

и так и эдак работает

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Я выполняю каждый раз

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

Я планирую делать запрос каждые 15 секунд с момента ответа на предыдущий запрос.

Ваше мнение,не часто ли?

 

Запрос формата:1,0,1

Ответ: 13.6,53,60

Т.е. запросы короткие как и ответы

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Смотря какой канал, ping, скорость задержки и т д
Непредсказуемо
Какой нибудь edge или dialup может и не успеть отработать
Опять же ничего не мешает сделать таймаут и повторить запрос

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

Поняла, буду пробовать)

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

у меня иногда при плохом уровне связи (меньше 10ки по команде CSQ) 

выдается код ответа 601 - +HTTPACTION: ,601,

я после этого повторяю отправку - возвращаюсь к команде

"AT+HTTPPARA=\"URL\",\"http://....

 

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

Да-да, я так же делаю - +HTTPACTION: 0,601,0

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

кто пробовал через сим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

зараза, обрезает почему то..  да и укороченный вараинт тоже не сервере не появляется.

 
Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

инициализирую передачу данных вот так:

 

AT+CREG=1 
AT+CIPMODE=0  
AT+GSN
AT+CGATT=1
AT+CIPSTART="TCP","auau.biz.net","80"

понятное дело с ожиданиями ответа и прочего

далее получаю ответ:

CONNECT OK
и шлю следующую команду:

AT+CIPSEND

> 

и вот теперь сам гет запрос в формате как выше написал..  ......{34,56,76,98,23,65,45,98,34,12,67,89,3,19,23,76,3.1}

суть в том, что мне на сервер нужно отправить вот такие данные {34,56,76,98,23,65,45,98,34,12,67,89,3,19,23,76,3.1}

и после отправки получаю :

SEND OK
значит на сам сервер оно как бы ушло, или не ушло?

как это еще можно сделать, чтобы данные в фигурных скобках туда на сервер закинуть?

пока у меня не получилось.

 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Short Circuit пишет:

кто пробовал через сим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-последовательности:

String encodeURI(const String& uri)
{
  String result;
  
  typedef struct
  {
    char fromChar;
    uint8_t toCode;
    
  } URIReplace;

  static URIReplace replacements[] = 
  {
    {'$',0x24},
    {'&',0x26},
    {'+',0x2B},
    {',',0x2C},
    {'/',0x2F},
    {':',0x3A},
    {';',0x3B},
    {'=',0x3D},
    {'?',0x3F},
    {'@',0x40},
    {' ',0x20},
    {'"',0x22},
    {'<',0x3C},
    {'>',0x3E},
    {'#',0x23},
    {'%',0x25},
    {'{',0x7B},
    {'}',0x7D},
    {'|',0x7C},
    {'\\',0x5C},
    {'^',0x5E},
    {'~',0x7E},
    {'[',0x5B},
    {']',0x5D},
    {'`',0x60},
    {0,0}
  };

    for(size_t i=0;i<uri.length();i++)
    {
      char ch = uri[i];
      bool found = false;
      int counter = 0;
      while(replacements[counter].fromChar != 0)
      {
        if(ch == replacements[counter].fromChar)
        {
          result += '%';
          result += String(replacements[counter].toCode,16);
          
          found = true;
          break;
        }
        counter++;
      } // while
      
      if(!found)
        result += ch;
      
    } // for

  return result;
}

Скармливать ей ваш параметр "{34,56,76,98,23,65,45,98,34,12,67,89,3,19,23,76,3.1}" - на выходе вернёт well-formed URI part.

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

нет, там в другом проблема, я навернео не смог обьяснить, да и сам не все понимаю до конц.

Эту строку обрезало (включил эхо команд и видно)  - разобрался нужно было еще одну ат команду добавить.

 Далее эти цифры на самом деле шестнадцатиричные. С ними то работает на другом заводском девайсе. С него и тенируюсь.

Но пока не понятен полностью формат, как туда запхивать эту команду.


gsm.print("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");  gsm.print((char)26);

или 

gsm.print("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  Host: auau.biz.net:80");  gsm.print((char)26);

вот здесь мне общий формат строки неясен, как правильно нужно этот "хост" указывать,  с какими "знаками препинания" для верной отправки ?:)

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

Для  GET запросов нужно поднимать HTTP сервис, у тебя только TCP.

AT+HTTPINIT

AT+HTTPPARA=\"CID\",1"

AT+HTTPPARA=\"URL\",\"blabla.ru/s.php?p1=xxxxxxxxxxxxxxx\"

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

так вроде оигинальное устройство по ТСР туда и ходит..  я в оригинале подсмотрел ат команды и прочее.

Но попробую конечно все вараинты, хочется изучить и понять как работает.

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

а по идее должно и так и так  работать?

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Andy пишет:

Для  GET запросов нужно поднимать HTTP сервис, у тебя только TCP.

AT+HTTPINIT

AT+HTTPPARA=\"CID\",1"

AT+HTTPPARA=\"URL\",\"blabla.ru/s.php?p1=xxxxxxxxxxxxxxx\"

Неверно. Прекрасно любые данные отправляются и по TCP, достаточно только правильно создать HTTP-запрос, сиречь - некий набор текста.

У вопрошающего - в URI творится дичь, такое URI ни один нормальный сервер не прожуёт, и даже не обязан, ибо оно не соответствует RFC. Хотя, я вижу, тут это никого не смущает.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Short Circuit пишет:

нет, там в другом проблема, я навернео не смог обьяснить, да и сам не все понимаю до конц.

Эту строку обрезало (включил эхо команд и видно)  - разобрался нужно было еще одну ат команду добавить.

 Далее эти цифры на самом деле шестнадцатиричные. С ними то работает на другом заводском девайсе. С него и тенируюсь.

Но пока не понятен полностью формат, как туда запхивать эту команду.


gsm.print("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");  gsm.print((char)26);

или 

gsm.print("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  Host: auau.biz.net:80");  gsm.print((char)26);

вот здесь мне общий формат строки неясен, как правильно нужно этот "хост" указывать,  с какими "знаками препинания" для верной отправки ?:)

Т.е. вы продолжаете утверждать, что дело не в битом URI? Да, вы правы - дело НЕ ТОЛЬКО в нём. А ещё и в том, что у вас неправильно сформирован HTTP-запрос. Для того, чтобы научиться, как правильно формировать простейшие HTTP-запросы к HTTP-серверу - достаточно прочитать всего парочку обзорных статей по протоколу HTTP, чтобы понять, почему у вас ничего не получается. Как минимум - у вас нет переводов строки между заголовками HTTP-запроса. Как максимум - в конце HTTP-запроса должен быть двойной перевод строки. Плюс, как я писал выше - URI, который вы запрашиваете, а именно значение параметра p1 - содержит небезопасные символы, которые НЕОБХОДИМО кодировать в escape-последовательности.

Дело ваше - прислушиваться или нет. Не прислушаетесь - ок, более ничего писать не буду, ибо - бестолку.

vsvleo
Offline
Зарегистрирован: 29.09.2016

Какой, максимальной длины, отправляется заголовок, get запроса? У меня в заголовке был обычный текст, параметр=значение.. так же обрезало.

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

DIYMan пишет:

в URI творится дичь, такое URI ни один нормальный сервер не прожуёт, и даже не обязан, ибо оно не соответствует RFC. Хотя, я вижу, тут это никого не смущает.

меня тоже смущает, но пока не знаю как правильно.. пока разбираюсь.

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

такого формата как выше.

нашел почему у меня резало - кажется в инициализации не было команды AT+CIPMODE=0 или AT+CIPMUX=0 не помню.

Как только добавил - резать перестало. В оригинальном устройстве эта команда есть. Вроде уже все  сделал как в оригинале, но где то мелкая проблема осталась. Оригинал то работает, шлет на сервер и все ок..

 


AT+CMGF=1
OK

AT+CREG=1
OK

AT+CIPSHUT
SHUT OK

AT+CGATT=0
OK


AT+CIPATS=0
OK

AT+CIPCSGP=1,"internet"
OK

AT+CIPMUX=0
OK

AT+CIPMODE=0
OK

AT+CIFSR
ERROR

AT+CIPSTART="TCP","auau.biz.net","80"
OK

CONNECT OK

AT+CIFSR
111.37.114.38

AT+CIPSEND

> 


test modem ON 25sec
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 Host: auau.biz.net:80
SEND OK

CLOSED

я как чукча, все буквы угадал, а слово не знаю...

слово в конце немного не верно - Host: auau.biz.net:80  как в этой посылке указывать или не указывать?

в остальном общение с модемом вроде все идет ок..

CLOSED пишет секунд через 10 если ничего больше не посылать.

AT+CIPSTART="TCP","auau.biz.net","80" - вроде как заранее указывается с чем коннектимся.

далее GET /s.php?p1= - и все должно отправится... дешево и сердито.

 

zhukovivan
Offline
Зарегистрирован: 27.09.2017

Я использую SIM800L для управления(мониторинг датчиков, упраление реле и т.п.) Arduino со смартфона. Если нужна помощь, обращайтесь в личку, помогу со скетчем, программой для сервера и Android приложением в полном объеме.
Кому интересно пишите на почту vanoomsk999@gmail.com

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

http://forum.cxem.net/index.php?/topic/195209-настройка-соединения-gprs-в-sim800l/

 

вот здесь еще есть инфа по ТСР соединению. Достаточно информативно.

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

как и ожидалось - банальная проблема была, нужно было писать в конце посылки :  \r\n\r\n

тоесть два раза указывать!!!. в описании модема об логично этом не говорится, а пришлось подробнее почитать о гет запросах, очень редко но там на этом акцентировалось внимание.