SIM800L GPRS передача данных, скорость, "многопоточность" AT команды

zDimaBY
Offline
Зарегистрирован: 10.06.2018

Возможно как-то ещё можно обмениваться данными через 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());    // ...и отправляем полученную команду модему
}

 

b707
Offline
Зарегистрирован: 26.05.2017

после подачи любой команды модему или серверу надо дождаться ответа . А вы все шлете подряд - вот он вас и банит.

Ответы по GRPS нередко по несколько секунд идут. Не забывайте, что СИМ800 и 900 - это даже не 3g, а 2g модем, там все очень не быстро. Так что 1 запрос в 2 секунды - это вполне себе результат. Но правильнее, конечно, общаться с сервером двусторнне, а не орать ему в ухо

zDimaBY
Offline
Зарегистрирован: 10.06.2018

Да, можно функцию добавить типо такой ..

connectGSM("AT+HTTPACTION=0","+HTTPACTION: 0,200,7"); 

void connectGSM (String cmd, char *res)
{
  while(1)
  {
    Serial.println(cmd);
    Serial1.println(cmd);
    delay(500);
    while(Serial1.available()>0)
    {
      if(Serial1.find(res))
      {
        delay(1000);
        return;
      }
    }
    delay(1000);
   }
 }

 

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

zDimaBY , ваши delay в вашем примере категорически неприемлемо для нормального обмена с модемом, прилети байт 200 данных и ничего вы не обработаете.

zDimaBY
Offline
Зарегистрирован: 10.06.2018

Я топлю за millis естественно.. delay в примерах могу себе позволить)

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

Какой нафиг millis, надо ответы все от модема читать и анализировать, все остальное "дошкольная поделка".

zDimaBY
Offline
Зарегистрирован: 10.06.2018

Все ответы от модема через анализатора команд? без millis ? даже пропускать через анализатор AT+HTTPREAD ? и все в 1 функции ? Очень интересно посмотреть ваш пример. НЕ "дошкольной поделкой"

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

Гы))) сомневаетесь? Ну на форуме ищите, я письками меряться не собираюсь, скучно :)

b707
Offline
Зарегистрирован: 26.05.2017

zDimaBY пишет:

Все ответы от модема через анализатора команд?  и все в 1 функции ?

а почему обязательно в одной функции? - хотите, делайте в разных, число функций ни на что не влияет

 

ЗЫ правда, я бы не рассчитывал на 10 запросов в секунду даже после того, как вы перепишете все правильно. АТ-командами через Уарт такая скорость недостижима, как мне кажется.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

если надо 10 запросов в секунду, то что-то не так в архитектуре приложения.

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

А оно (10 и более запросов в секунду) и не получиться, по даташиту модема на каждую команду ждать ответа несколько секунд, в качестве варианта можно отправлять данные без подтверждения, зависит от задачи.
Кстати потоковые данные уходят достаточно шустро, мы пару лет назад передавали по mqtt jpeg фото на пару сотен килобайт вполне успешно.

zDimaBY
Offline
Зарегистрирован: 10.06.2018

andycat пишет:
Ну на форуме ищите, я письками меряться не собираюсь, скучно :)

От вас нашел в этой мусорке

пример, небольшую библиотеку 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

Хз что ищо есть..

b707 пишет:

АТ-командами через Уарт такая скорость недостижима, как мне кажется.

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

#define APN "internet" //Профиль интернет соединения
#define USER ""
#define PASSWORD ""
#define ATsetTimeout 2000 //Время ожидания ответа мс
void setup() {
  Serial.begin(115200);
  Serial3.begin(115200);
  Serial3.setTimeout(10000);//Время ожидания модема
  //AT("", "READY");
  Serial3.setTimeout(ATsetTimeout);
  AT("AT", "OK");
  AT("AT+DDET=0; E0; +CLIP=1; S0=0; V1; +CMEE=2; +CMGF=0; +CIPMODE=0", "OK"); //1 - вылючаем режим распознования DTMF, 2 - отключаем возврат команд от модема, 3 - включаем АОН, 4 - вручную поднимать трубку при входящем звонке, 5 - развернутый символьный ответ от модема, 6 - подробный вывод ошибок, 7 - PDU режим приема и отправки SMS, 8 - Командный режим передачи данных
  AT("AT+SAPBR=3,1,\"CONTYPE\",\"GPRS\"", "OK");
  AT("AT+SAPBR=3,1,\"APN\", "APN"", "OK");
  AT("AT+SAPBR=3,1,\"USER\","USER"", "OK");
  AT("AT+SAPBR=3,1,\"PWD\","PASSWORD"", "OK");
  AT("AT+SAPBR=1,1", "OK");//Устанавливаем GPRS соединение
  AT("AT+HTTPINIT", "OK");//Инициализация http сервиса
  AT("AT+HTTPPARA=\"CID\",1", "OK");//Установка CID параметра для http сессии
  Serial3.println("AT+SAPBR=4,1; +SAPBR=2,1; +CREG?; +COPS?; +CGATT?");//сведения о профиле, соединении и IP адреса (+SAPBR: 1,1,"-ip-") соединение установлено, проверяем что зарегестрировались в домашней сети, смотрим кто оператор, Проверка доступа к услугам пакетной передачи данных
}
void loop() {
}
void serialEvent() {
  Serial3.write(Serial.read());    // ...и отправляем полученную команду модему
}
void serialEvent3() {
  Serial.write(Serial3.read());    // ...и выводим их в Serial
}
void AT (String ATcmd, char *res) {
  Serial.println(ATcmd);
  Serial.print(" wait->");
  Serial3.println(ATcmd);
  while (!Serial3.available()) {
    Serial.print(".");
  } if (Serial3.find(res)) {
    Serial.println("done!");
  } else {
    Serial.println("timeOut!");
  }
}

 

b707
Offline
Зарегистрирован: 26.05.2017

zDimaBY пишет:

b707 пишет:

АТ-командами через Уарт такая скорость недостижима, как мне кажется.

1 бод = 1 бит/сек. 1 байт= 8 бит, след. 9600 бод = 1200 байт/ сек. 150байт 1 запрос 200мс норм будет

не понятно, чего спорить?

1 запрос в 200мс - это уже только 5 запросов в секунду. Вы. вроде, хотели 10?

А если прибавить таймауты между запросами - вот и выйдет, что 1-2 запроса - это максимум.

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

zDimaBY, а если например команда httpinit будет выполняться больше 10 секунд, что будете делать?

zDimaBY
Offline
Зарегистрирован: 10.06.2018

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

Серия SIM800 поддерживает использование двух APN, то есть двух разных соединение GPRS.
для передачи данных. Этот режим должен использоваться в многоканальном соединении. Клиент активировал GPRS в первое соединение, сделайте какое-то соединение. Когда нужен второй соединение для подключения к данным, используйте
«at+cipsgtxt=1» для переключения, после этого активируйте второй соединение и выполните подключение данных.
 
AT+CIPSTART=1,"TCP","116.236.221.75",5555 OK
1, CONNECT OK
 
+RECEIVE,0,15      Установить TCP-соединение на 1 канал во втором контексте
Hello world 000
 
+RECEIVE,1,15     Получите данные двух каналов как обычное многоканальное соединение
Hello world 111
 
Хз как это..
 
andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Учиться и учиться.... Ну а так то все просто, читаем литературу и примеры выше, разбираемся что каждая команда делает, рисуем тестовый скетч, проверяем, пока можно и не ждать корректных ответов, просто наблюдать. Когда захочется скорости и стабильности - включаем мозг и пишем обработку ответов от модема в соответствии с логикой программы и даташита.
Тут на форуме уже неоднократно обсуждалось как правильно парсить ответы от модема, есть несколько вариантов.
- складывать все в буфер ждать например прихода \r\n т е конца строки и парсить строку. Тут проблема в том, что когда прилетает большой пакет данных типа три рекламных смс кириллицей и весь приход не умещается в буфер, можно профукать команду.
- каждый входящий байт кладём в кольцевой буфер и ищем нужную команду.

zDimaBY
Offline
Зарегистрирован: 10.06.2018

Отправил модему AT+CIPSEND=100 появилось в порту > отправились 2 сообщения.. сервер принял все ок.. но после этого sim800l остановился.. около 20 символов отправились и все. и сейчас после AT+CIPSEND зависает не могу ничего отправит после > останавливаеться модем, ардуинка работает помогает ребут модуля. Команды по мануалу 2.1.1 How to Establish a TCP Client Connection

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

А код 26 в конце отправки шлете¿

zDimaBY
Offline
Зарегистрирован: 10.06.2018

Я после появления знака ">" в мониторе порта совсем ничего не могу отправить, модуль sim800l зависает, помогает только перезагрузка.. 0x0a это понятно что нужно отправлять. Я не знаю как, но первый раз два сообщения пришло на сервер без этого. Просто ентер клацнул и пришло.. потом при 2 разе зависло.

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

Гы)) вы пытаетесь через терминал отправлять команды и корректно отправьть двнные?)
Читаем (вы ж сами нашли) последовательность команд для нормального 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...
Пробуем учимся

zDimaBY
Offline
Зарегистрирован: 10.06.2018

Да пытался через монитор порта отослать.. но не верно отсылалось это при > можно писать, а после отсылки он виснет "тогда 26 символ не сработал", а если после > нет возможности писать тогда какое-то неверные настройки были применены.

Что делается теперь.. к серверу присоединяется выводит от него сообщение при отправке модем отвечает SEND OK но данные не отправляются и не приходят. Иза чего это может быть ? К примеру в клиенте на телефоне все работает как надо.

СЕРВЕР

<?php
error_reporting(E_ALL);

/* Позволяет скрипту ожидать соединения бесконечно. */
set_time_limit(0);

/* Включает скрытое очищение вывода так, что мы видим данные
 * как только они появляются. */
ob_implicit_flush();

$address = '192.168.1.53';
$port = 10000;

if (($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) === false) {
    echo "Не удалось выполнить socket_create(): причина: " . socket_strerror(socket_last_error()) . "\n";
}

if (socket_bind($sock, $address, $port) === false) {
    echo "Не удалось выполнить socket_bind(): причина: " . socket_strerror(socket_last_error($sock)) . "\n";
}

if (socket_listen($sock, 5) === false) {
    echo "Не удалось выполнить socket_listen(): причина: " . socket_strerror(socket_last_error($sock)) . "\n";
}

do {
    if (($msgsock = socket_accept($sock)) === false) {
        echo "Не удалось выполнить socket_accept(): причина: " . socket_strerror(socket_last_error($sock)) . "\n";
        break;
    }
    /* Отправляем инструкции. */
    $msg = "\nДобро пожаловать на тестовый сервер PHP. \n" .
        "Чтобы отключиться, наберите 'выход'. Чтобы выключить сервер, наберите 'выключение'.\n";
    socket_write($msgsock, $msg, strlen($msg));

    do {
        if (false === ($buf = socket_read($msgsock, 2048, PHP_NORMAL_READ))) {
            echo "Не удалось выполнить socket_read(): причина: " . socket_strerror(socket_last_error($msgsock)) . "\n";
            break 2;
        }
        if (!$buf = trim($buf)) {
            continue;
        }
        if ($buf == 'выход') {
            break;
        }
        if ($buf == 'выключение') {
            socket_close($msgsock);
            break 2;
        }
        $talkback = "PHP: Вы сказали '$buf'.\n";
        socket_write($msgsock, $talkback, strlen($talkback));
        echo "$buf\n";
    } while (true);
    socket_close($msgsock);
} while (true);

socket_close($sock);
?>

 

АТ команды
 
AT+CSTT=internet
OK
 
AT+CIICR
OK
 
AT+CIFSR
111.111.155.122
 
AT+CIPSTART=TCP,111.111.155.111,10000
OK
 
CONNECT OK
Добро пожаловать на тестовый сервер PHP.
Чтобы отключиться, наберите 'выход'. Чтобы выключить сервер, наберите 'выключение'.
at
OK
 
AT+CIPSEND
> qqqq
SEND OK
 
AT+CIPSEND
> выключение
SEND OK
andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Если send Ok, значит данные уходят, это 100 %, что то другое блочит, смотрите брандмауэр и /или логи сервера.

Update:

AT+CIPSEND
> qqqq
SEND OK

На qqqq сервер и не ответит, http заголовок кто для php отправлять будет?

zDimaBY
Offline
Зарегистрирован: 10.06.2018

УСПЕХ

andycat пишет:
Если send Ok, значит данные уходят, это 100 %, что то другое блочит, смотрите брандмауэр и /или логи сервера.

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

andycat пишет:
На qqqq сервер и не ответит, http заголовок кто для php отправлять будет?

Для TCP не нужно HTTP.. но возможно и так делать. смисл тогда TCP

Через монитор порта.. лучше взять PuTTY. будет такая последованность.

RDY
 
+CFUN: 1
 
+CPIN: READY
 
Call Ready
 
SMS Ready
AT+CSTT=internet
OK
AT+CIICR
OK
AT+CIFSR
999.999.156.60
AT+CIPSTART=TCP,999.999.105.221,10000
OK
 
CONNECT OK
 
Добро пожаловать на тестовый сервер PHP.
Чтобы отключиться, наберите 'выход'. Чтобы выключить сервер, наберите 'выключение'.
AT+CIPSEND
> sdfsdf (в терминале обизательно enter и потом ctrl+z - на сервер пришло. Выше СМС когда в первый раз случайно нажал ентер тоже отправилось, но не мог понять как. Мдаа..)
SEND OK 
PHP: Вы сказали 'sdfsdf'.  - пришло от сервера
AT+CIPSHUT
SHUT OK
 
andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

zDimaBY пишет:

 это означает что уходит только в модем.

сами то поняли что сказали? SEND OK означает что TCP сокет сервера принял данные, но это совершенно не означает что он их нормально воспринял и обработал.

zDimaBY пишет:

Для TCP не нужно HTTP.. 

 
Выше вы сами написали что используете PHP, ну если ваш PHP воспринимает входящие данные без HTTP GET/POST запросов, то круто. Возвращаясь выше, повторюсь - начните с логов сервера.
zDimaBY
Offline
Зарегистрирован: 10.06.2018

andycat пишет:

сами то поняли что сказали? SEND OK означает что TCP сокет сервера принял данные, но это совершенно не означает что он их нормально воспринял и обработал.

Да вы 100% правы. Понял.

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

нашел код от какого то проекта 19 года, как PHP обрабатывает запрос от ESP, соответственно отправка на МК и прием на сервере

    case 6: { // при успешном подключении отправляем данные
        String url = "/espimpt/p/";
        url += "?rs="; url += countImpuls;
        url += "&id="; url += deviceid;
        for (byte i = 0; i < dsCount; ++i) {
          url += "&t"; url += i; url += "="; url += massTemper[i];
        }
        url = "GET " + url + " HTTP/1.1\r\n" +
              "Host: " + srvhost + "\r\n" +
              "User-Agent: Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9b5) Gecko/2008050509 Firefox/3.0b5\r\n" +
              "Accept: text/html\r\n" +
              "Connection: Keep-Close\r\n\r\n";
        Serial.println(url);
        client.println(url);
        deviceMode = 0;
        countImpuls = 0;
        client.stop();
        break;
      }

--

<?php include_once $_SERVER['DOCUMENT_ROOT'] . '/espimpt/includes/helpers.inc.php'; ?>
<!DOCTYPE html>
<html>

<?php 

function tempToFloat($arg)
{
	if ($arg >= 2000)
	{
		$res = ($arg-2000);
		$res = ($res / 10);
		$res = (0-$res);
	} else
	{
		$res = ($arg / 10);
	}
	return $res;
}

if ((isset($_GET['id']))  and (isset($_GET['rs'])) and (isset($_GET['t0'])))
{
	try
	{
		if (isset($_GET['t5'])) 
		{
			$sql = 'INSERT INTO `thermometers` (`i_id`, `i_countimp`, `f_t1`, `f_t2`, `f_t3`, `f_t4`, `f_t5`, `f_t6`) VALUES (:p1, :p2, :p3, :p4, :p5, :p6, :p7, :p8)';
		} else if (isset($_GET['t4'])) 
		{
			$sql = 'INSERT INTO `thermometers` (`i_id`, `i_countimp`, `f_t1`, `f_t2`, `f_t3`, `f_t4`, `f_t5`) VALUES (:p1, :p2, :p3, :p4, :p5, :p6, :p7)';
		} else if (isset($_GET['t3'])) 
		{
			$sql = 'INSERT INTO `thermometers` (`i_id`, `i_countimp`, `f_t1`, `f_t2`, `f_t3`, `f_t4`) VALUES (:p1, :p2, :p3, :p4, :p5, :p6)';
		} else if (isset($_GET['t2'])) 
		{
			$sql = 'INSERT INTO `thermometers` (`i_id`, `i_countimp`, `f_t1`, `f_t2`, `f_t3`) VALUES (:p1, :p2, :p3, :p4, :p5)';
		} else if (isset($_GET['t1']))
		{
			$sql = 'INSERT INTO `thermometers` (`i_id`, `i_countimp`, `f_t1`, `f_t2`) VALUES (:p1, :p2, :p3, :p4)';
		} else 
		{
			$sql = 'INSERT INTO `thermometers` (`i_id`, `i_countimp`, `f_t1`) VALUES (:p1, :p2, :p3)';
		}
		$s = $pdo->prepare($sql);
		$s->bindValue(':p1', $_GET['id']);
		$s->bindValue(':p2', $_GET['rs']);
		$s->bindValue(':p3', tempToFloat($_GET['t0']));
		if (isset($_GET['t1']))
		{
			$s->bindValue(':p4', tempToFloat($_GET['t1']));
		}
		if (isset($_GET['t2']))
		{
			$s->bindValue(':p5', tempToFloat($_GET['t2']));
		}
		if (isset($_GET['t3']))
		{
			$s->bindValue(':p6', tempToFloat($_GET['t3']));
		}
		if (isset($_GET['t4']))
		{
			$s->bindValue(':p7', tempToFloat($_GET['t4']));
		}
		if (isset($_GET['t5']))
		{
			$s->bindValue(':p8', tempToFloat($_GET['t5']));
		}
		$s->execute();
	}
	catch (PDOException $e)
	{
		$error = 'Error ' . $e->getMessage();
		include $_SERVER['DOCUMENT_ROOT'] . '/espimpt/includes/error.html.php';
		exit();
	}
}
?>

</html>

 

zDimaBY
Offline
Зарегистрирован: 10.06.2018

PHP это такое уже.. не про sim800.

Я что-то не понимаю как дождаться без delay и милис пакет.. вот фунция обработки AT+CIPSEND после ">" 

void ATLoopSend (String ATcmd, char *res) {
  Serial.println(ATcmd);
  Serial3.println(ATcmd);
  while (!Serial3.available()) Serial.print(".");
  if (Serial3.find(res)) {
    Serial.println(res);
  }
  while (!Serial3.available()) Serial.print(".");
  while (Serial3.available()) {
    char ch = Serial3.read();
    Serial.println(iBuff);
    if (ch == '\n' && iBuff > 30) {
      buff[iBuff] = 0;
      iBuff = 0;
      Serial.println(buff);
      Parser data(buff, ':');
      int am = data.split();
      for (byte i = 0; i < am; i++) Serial.println(data[i]);
    } else {
      buff[iBuff++] = ch;
    }
  }
}

Пакет отправляет, а ответ как дождаться ? вот что в сериал

99:23:33.906 -> AT+CIPSEND
99:23:33.906 -> >
99:23:33.906 -> 99:88:77:66:55:44:33:22:00:88:77:66:55:44:33:22:11 
99:23:33.906 ->  
99:23:39.049 -> SEND OK
99:23:39.049 -> 0
99:23:39.049 -> 1
99:23:39.096 -> AT+CIPSHUT

Serial.println(iBuff); выводит 0 и 1 и все..

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

0 и 1 это по всей вероятности и есть ответы от php сервера, код то мы не видим. И если так и есть - их и отслеживайте.

zDimaBY
Offline
Зарегистрирован: 10.06.2018

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

99:28:29.474 -> AT+CIPSEND................................................................................>
99:28:29.474 -> 99:88:77:66:55:44:33:22:00:88:77:66:55:44:33:22:11 
99:28:29.474 ->  
99:28:29.753 -> SEND OK
99:28:29.846 -> 
99:28:29.846 -> '99:50:50:0:50:50:50:50:50:50:50:50:50:50:50:50'.
99:28:29.893 -> AT+CIPSEND...............................................................................>
99:28:29.893 -> 99:88:77:66:55:44:33:22:00:88:77:66:55:44:33:22:11 
99:28:29.940 ->  
99:28:30.172 -> SEND OK
99:28:30.310 -> 
99:28:30.310 -> '99:50:50:0:50:50:50:50:50:50:50:50:50:50:50:50'.
99:28:30.356 -> AT+CIPSEND................................................................................>
99:28:30.356 -> 99:88:77:66:55:44:33:22:00:88:77:66:55:44:33:22:11 
99:28:30.356 ->  
99:28:30.634 -> SEND OK
99:28:30.634 -> .
99:28:30.680 -> '99:50:50:0:50:50:50:50:50:50:50:50:50:50:50:50'.
99:28:30.726 -> AT+CIPSEND................................................................................>
99:28:30.773 -> 99:88:77:66:55:44:33:22:00:88:77:66:55:44:33:22:11 
99:28:30.773 ->  
99:28:31.048 -> SEND OK
99:28:31.048 -> 
99:28:31.048 -> '99:50:50:0:50:50:50:50:50:50:50:50:50:50:50:50'.

 

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

zDimaBY , я не знаю насколько стабильно вам надо общаться с сервером, поэтому сложно судить про корректность кода, но однозначно могу сказать следующее: не отслеживая CIPSTATUS перед отправкой, рано или поздно произойдет ситуация, при которой SIPSEND не сможет отправить данные.