Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Почему TIcsMQTTClient не получает сообщения от Mosquitto сервера: возможные причины и решения

Delphi , Интернет и Сети , Компоненты и Интернет

 

В работе с MQTT-клиентами в Delphi разработчики иногда сталкиваются с ситуацией, когда подписка на топик успешно создается, но сообщения не приходят. В этой статье разберем распространенные причины такой проблемы и способы их решения на примере компонента TIcsMQTTClient.

Основные причины отсутствия сообщений

1. Неправильный паттерн топика

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

  • + - подстановка одного уровня топика
  • # - подстановка нескольких уровней (включая все подуровни)

Пример из обсуждения:

// Неправильно:
MQTTClient.Subscribe('lectura/cajas/+', qtAT_LEAST_ONCE);

// Правильно:
MQTTClient.Subscribe('lectura/cajas/#', qtAT_LEAST_ONCE);

2. Неправильная обработка событий

Убедитесь, что вы правильно подписались на событие получения сообщений:

procedure TForm1.FormCreate(Sender: TObject);
begin
  MQTTClient.OnClientMsg := HandleMQTTMessage;
end;

procedure TForm1.HandleMQTTMessage(Sender: TObject; aTopic: UTF8String; 
  aMessage: AnsiString; aQos: TMQTTQOSType; aRetained: boolean);
begin
  Memo1.Lines.Add('Топик: ' + aTopic + ', Сообщение: ' + aMessage);
end;

3. Проблемы с QoS (Quality of Service)

Уровень качества обслуживания должен совпадать на клиенте и сервере. Проверьте параметры QoS при подписке:

// Пример правильной подписки с указанием QoS
MQTTClient.Subscribe('lectura/cajas/#', qtEXACTLY_ONCE);

Альтернативные решения

Если проблема сохраняется, рассмотрите следующие варианты:

1. Использование другого MQTT-клиента

Попробуйте альтернативные библиотеки, такие как TMQTTClient из набора Synapse:

uses mqttclient;

var
  Client: TMQTTClient;
begin
  Client := TMQTTClient.Create('192.168.1.1', 1883);
  try
    Client.Connect('clientid', 'username', 'password');
    Client.Subscribe('lectura/cajas/#');
    // обработка сообщений
  finally
    Client.Free;
  end;
end;

2. Проверка подключения через утилиты

Используйте MQTT Explorer или аналогичные инструменты для проверки: - Подключение к серверу - Подписка на топик - Получение сообщений

3. Анализ логов Mosquitto

Включите подробное логирование в Mosquitto, добавив в конфигурационный файл:

log_dest file /var/log/mosquitto/mosquitto.log
log_type all

Пример полного рабочего кода

unit MainUnit;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, OverbyteIcsMqttCli;

type
  TForm1 = class(TForm)
    MQTTClient: TMQTTClient;
    btnConnect: TButton;
    btnSubscribe: TButton;
    Memo1: TMemo;
    edtTopic: TEdit;
    procedure btnConnectClick(Sender: TObject);
    procedure btnSubscribeClick(Sender: TObject);
    procedure MQTTClientClientMsg(Sender: TObject; aTopic: UTF8String;
      aMessage: AnsiString; aQos: TMQTTQOSType; aRetained: boolean);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.btnConnectClick(Sender: TObject);
begin
  MQTTClient.Host := '192.168.1.1';
  MQTTClient.Port := 1883;
  MQTTClient.ClientId := 'DelphiClient_' + IntToStr(Random(1000));
  MQTTClient.Username := 'username';
  MQTTClient.Password := 'password';
  MQTTClient.Connect;
end;

procedure TForm1.btnSubscribeClick(Sender: TObject);
begin
  if Trim(edtTopic.Text) <> '' then
  begin
    MQTTClient.Subscribe(edtTopic.Text, qtAT_LEAST_ONCE);
    Memo1.Lines.Add('Подписались на топик: ' + edtTopic.Text);
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  MQTTClient.OnClientMsg := MQTTClientClientMsg;
end;

procedure TForm1.MQTTClientClientMsg(Sender: TObject; aTopic: UTF8String;
  aMessage: AnsiString; aQos: TMQTTQOSType; aRetained: boolean);
begin
  Memo1.Lines.Add(Format('Получено сообщение. Топик: %s, Данные: %s', [aTopic, aMessage]));
end;

end.

Заключение

Основные шаги для диагностики проблемы:
1. Проверьте правильность паттерна топика (# вместо + в большинстве случаев)
2. Убедитесь, что событие OnClientMsg правильно обрабатывается
3. Проверьте логи Mosquitto на наличие ошибок
4. Сравните параметры подключения (хост, порт, учетные данные) с работающими клиентами
5. Проверьте QoS при подписке и публикации сообщений

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

Создано по материалам из источника по ссылке.

Статья рассматривает причины и решения проблемы отсутствия сообщений в TIcsMQTTClient при работе с Mosquitto сервером, включая неправильные паттерны топиков, ошибки обработки событий и настройки QoS.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Компоненты и Интернет ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-07-23 06:04:24/0.0035088062286377/0