Jump to content

Recommended Posts

mar1b0ro
Posted

Добрый день.

Работаю с KasperskyOS Community Edition 1.4, пытаюсь использовать IPC-интерфейс kl.MosquittoBroker для взаимодействия внутреннего процесса с брокером вместо TCP loopback + libmosquitto.

Документации по использованию mosquitto-брокера как сущности внутри KasperskyOS-решения не нашёл — ни в официальной документации KCE 1.4, ни в примерах SDK. Запустить брокер удалось самостоятельно, через анализ файлов в sysroot: kl/Mosquitto.edl, kl/MosquittoBroker.idl.h, kl/MosquittoCtrl.idl.h, lib/cmake/mosquitto/entityTargets.cmake, mosquittoConfig.cmake, а также бинаря bin/mosquitto.

Что удалось:

  • запустить брокер внутри решения
  • подключить внешние MQTT-клиенты по TCP 1883 + libmosquitto — всё работает корректно
  • вызвать MqttConnect через IPC — возвращает clientId и EOk

Проблема: MqttSend возвращает EPacketInvalid (-3) при любых данных в packet.

Что пробовал передавать в MqttPacket:

  1. Сырой MQTT PUBLISH-пакет (тот же, что брокер корректно принимает по TCP, "подсмотрел" данный пакет через логирование при TCP-взаимодействии)
  2. Просто payload без заголовков
  3. Сформированные MQTT-пакеты при помощи библиотеки Eclipse Paho MQTT C/C++ client for Embedded platforms

Нигде в документации KCE 1.4 не нашёл описания ожидаемого формата буфера MqttPacket. Подскажите, пожалуйста:

  • что именно ожидает брокер в буфере packet при вызове MqttSend?
  • есть ли вспомогательный API или пример использования IPC-интерфейса kl.MosquittoBroker?
Yura Beznos
Posted (edited)

Поторопился с комментарием. Обновлю если у меня пример появится рабочий.

Edited by Yura Beznos
Yura Beznos
Posted (edited)

День добрый.

Судя по заголовкам библиотеки libmosquitto включенной в SDK, она уже позволяет использовать IPC:

Цитата

$ cat ./sysroot-aarch64-kos/include/mosquitto.h |grep KOS -A 4

#ifdef __KOS__
libmosq_EXPORT int mosquitto_reload_config(const char *config_file);
libmosq_EXPORT struct mosquitto *mosquitto_new_kos(const char *id, bool clean_session, unsigned int max_queued_bytes, void *userdata, bool log_enabled);
#endif

$ cat ./sysroot-aarch64-kos/include/mosquittopp.h |grep KOS -A 4

#ifdef __KOS__
        mosquittopp(const char *id=NULL, bool clean_session=true, unsigned int max_queued_bytes=0, bool kos_ipc=true);
#else
        mosquittopp(const char *id=NULL, bool clean_session=true, unsigned int max_queued_bytes=0);
#endif

p.s. у меня сходу не получилось, но у меня сам Mosquitto как сервис не стартует нормально.

Может более знающие товарищи дадут пояснения.

Edited by Yura Beznos
Yura Beznos
Posted

Потыкался некоторое время. Результаты аналогичные. Гипотеза, что Mosquitto (entity/библиотека) собраны без поддержки локальной работы по IPC. 

В остальном всё работает без проблем.

В MqttSend packet очевидно это packet в терминах Mosquitto (https://github.com/eclipse-mosquitto/mosquitto/blob/master/lib/packet_mosq.h) соответственно закодированный в sequence для IPC.

Подождём ещё опытный товарищей, может прояснят конкретнее.

 

А вы над каким проектом работаете, если не секрет?

Posted

Здравствуйте!

По вашему изначальному сообщению был создан запрос в техническую поддержку: INC000018435953
Пожалуйста, ожидайте ответа.

Vadim N
Posted

Добрый день!

К сожалению, в KasperskyOS Community Edition SDK 1.4 не поддержано общение по IPC с брокером. Мы рассмотрим добавление данной функциональности в следующих релизах.

Наличие подобных файлов  kl/Mosquitto* является ошибкой, так как соответствующая функциональность не реализована. Мы обязательно возьмем баг в работу.

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

Спасибо за обращение и найденный баг!

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now


×
×
  • Create New...