Arduino UNO +sim800l+mqtt(blynk)

vlad072
Offline
Зарегистрирован: 01.08.2017

Чтоб соединение не отлетало, нужно пинговать брокер (C0, 00) и контролироать соединение по ответам. Cоответствующие пакеты тоже подробно описаны в солюшне

#define DEF_TIMEOUT 1000
uint32_t tsend = 0;
uint32_t tresp = 0;
bool sendstart() {
  bool _ret = false; modem.setTimeout(200);
  modem.println(F("AT+CIPSEND")); _ret = modem.find("> ");
  modem.setTimeout(DEF_TIMEOUT);
  return _ret; 
}
bool sendfin() {
  bool _ret = false; modem.setTimeout(200);
  modem.write(0x1A); _ret = modem.find("DATA ACCEPT:");
  if (_ret) tsend = millis();
  modem.setTimeout(DEF_TIMEOUT);
  return _ret;
}
void ping() {
  if (sendstart()) modem.write(0xC0), modem.write(byte(0x00)), sendfin();
}
void modemshut() {
  modem.println(F("AT")); if (!modem.find("OK\r\n")) modem.write(0x1A), modem.find("\r\n");
  modem.println(F("AT+CIPHEAD=1;+CIPQSEND=1;+CIPSHUT"));
  tsend = millis(); tresp = millis();
}
void setup() {
  SoftwareSerial modem(SIM800TX_PIN, SIM800RX_PIN);
//..
}
void loop() {
  if ((millis() - tsend) > 20333ul) tsend = millis(), ping();
  if ((millis() - tresp) > 60000ul) modemshut();
//..
}

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Irinka пишет:

ua6em пишет:

Irinka пишет:

А чуть позже на сервере

2019-12-05 18:16:58: Log cleared by user
2019-12-05 18:17:08: New connection from 176.59.100.9 on port 11481.
2019-12-05 18:18:38: Client <unknown> has exceeded timeout, disconnecting.

и чудненько!!!

В каком смысле?

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

"мне теперь не надо гладить брюки,
помощь мне прислуги не нужна,
у меня для этой самой штуки,
есть своя законная жена ..."

;-)))

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

andycat пишет:
Irinka пишет:

ua6em пишет:

Irinka пишет:

А чуть позже на сервере

2019-12-05 18:16:58: Log cleared by user
2019-12-05 18:17:08: New connection from 176.59.100.9 on port 11481.
2019-12-05 18:18:38: Client <unknown> has exceeded timeout, disconnecting.

и чудненько!!!

В каком смысле?

В прямом, сервер подождал 30 секунд данные и отключился. Я ж выше давал ссылку на описание и пример команд и там чёрным по русски было написано что в пакете connect указывать время соединения, будьте добры или данные отправлять каждые 20 секунд или переподключаться.

const word MQTT_Keep_Alive= 600;//10 минут
byte hiKA = highByte(MQTT_Keep_Alive); // старший байт
byte lowKA = lowByte(MQTT_Keep_Alive); // младший байт
SIM800.write(hiKA);//Keep Alive LSB
SIM800.write(lowKA);//Keep Alive LSB

Правильно ставлю время 10 минут?

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

Mqtt подразумевает работу в "интернет устройствах" соответственно отправил, принял, отсоеденился, где то я читал что рекомендуется делать короткий connect пакет, и отправлять пакеты ping каждые x секунд, контролировать ответ и если корректного ответа нет - переподключаться

MaksVV
Offline
Зарегистрирован: 06.08.2015

я делал таймаут 20 минут. Посылал данные на брокер раз в 10 минут. и все равно с брокера выкидывало. Сделал отсылку данных на брокер раз в 2 минуты , проблема пропала. 

MaksVV
Offline
Зарегистрирован: 06.08.2015

Irinka пишет:
Правильно ставлю время 10 минут?

а как же эксперименты? 

filibuster200
Offline
Зарегистрирован: 11.10.2022

Подскажите а как обрабатывать ответы от брокера. В монитор порта приходит символ квадратика и перекодировать не могу. Уже вычитал что командой AT+CIPHEAD=1  можно подставить заголовок  +IPD, но и тут засада, не хочет записываться в переменную. Вернее в командном режиме все что приходит не от Sim 800, просто игнорируется. Разъясните плиз.

 

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

Потому что это байты меньше 0x20 или больше 0x7f, а обрабатывать согласно протокола mqtt, там все написано.
Тут тема есть
Снова MQTT
В ней много интересного