длина сообщения в топиках MQTT

silentlekx
Offline
Зарегистрирован: 24.08.2021

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

    void  MQTT_FloatPub (const char* topic, float val, int x) {
      char st[10];
      dtostrf(val,0, x, st), MQTT_PUB (topic, st);
      }
  ////////////////////////////////////////////////////////2/////////////////////////////////////////////////////
  void  MQTT_PUB(const char* MQTT_topic, const char* MQTT_messege) {          // пакет на публикацию 
  SIM800.write(0x30);
  SIM800.write(strlen(MQTT_topic) + strlen(MQTT_messege) +2 );//+2
  SIM800.write((byte)0x00); SIM800.write(strlen(MQTT_topic)); SIM800.write(MQTT_topic); // топик
  SIM800.write(MQTT_messege);  
  }                                                  // сообщение

 ///////////////////////////////////////////////////////5//////////////////////////////////////////////////////////
  void  MQTT_SUB (const char* MQTT_topic) {                                        
  SIM800.write(0x82);
  SIM800.write(strlen(MQTT_topic)+5);     //+5                     
  SIM800.write((byte)0x00); SIM800.write(0x01);
  SIM800.write((byte)0x00); SIM800.write(strlen(MQTT_topic)); SIM800.write(MQTT_topic);                                     
  SIM800.write((byte)0x00); 
  }

если длина топика к примеру вот такая  84E4DF59/sub/temp24.94 то брокер обрабатывает и все работает без сбоев. но если первое слово увеличиваю хотя бы до 9 символов к примеру  B84E4DF59/sub/temp24.94.то брокер разрывает соединение собщением CLOSED. подскажите в чем может быть проблемма? или размер сообщения превышает какой то размер.

 

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

похоже, что вы некорректно считаете длину отправляемых данных, строки 8 и 16, соответственно брокер прерывает соединение с клиентом.
выведете в консоль все вычисляемые цифры, которые вы отправляете брокеру, сравните/рассчитайте как должно быть по стандарту MQTT

тут можете посмотреть примеры pub функций:

http://arduino.ru/forum/programmirovanie/snova-mqtt-1?page=1#comment-570275

 

silentlekx
Offline
Зарегистрирован: 24.08.2021

я понинмаю все сообщение нужно в формат HEX перевести? как вообще правильно расчитать? извиняйте за навязчивость!

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

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

Update: и непонятно в каком режиме вы все шлете в модем, нет полного кода программы, может вы сказали отправить модему пакет X байт, а шлете Y, конечно у него крыша поедет.
в теме про MQTT все есть, прочитайте полностью.