From e81b19d491563134fb971bfe5c6b2bbaf48bc7ad Mon Sep 17 00:00:00 2001 From: Barzan Hayati Date: Sun, 7 Sep 2025 20:50:55 +0000 Subject: [PATCH] Create nvmsgbroker --- CMakeLists.txt | 5 +-- data/configuration.json | 13 +++++-- .../nvmsgboker_configs/libnvds_redis_proto.so | Bin 0 -> 68512 bytes data/nvmsgboker_configs/msgbroker_config.txt | 9 +++++ src/nv_message_broker.cpp | 32 ++++++++++++++++++ src/nv_message_broker.hpp | 19 +++++++++++ ...converter.cpp => nv_message_converter.cpp} | 11 ++---- ...converter.hpp => nv_message_converter.hpp} | 0 src/pipeline_manager.cpp | 1 + src/pipeline_manager.hpp | 4 ++- 10 files changed, 81 insertions(+), 13 deletions(-) create mode 100755 data/nvmsgboker_configs/libnvds_redis_proto.so create mode 100644 data/nvmsgboker_configs/msgbroker_config.txt create mode 100644 src/nv_message_broker.cpp create mode 100644 src/nv_message_broker.hpp rename src/{nv_messgae_converter.cpp => nv_message_converter.cpp} (87%) rename src/{nv_messgae_converter.hpp => nv_message_converter.hpp} (100%) diff --git a/CMakeLists.txt b/CMakeLists.txt index c80e634..2427c8a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -81,7 +81,8 @@ include_directories(${PROJECT_SOURCE_DIR}/nv_tracker_manager.hpp) include_directories(${PROJECT_SOURCE_DIR}/face_candid_trace.hpp) include_directories(${PROJECT_SOURCE_DIR}/face_nv_infer_server_manager.hpp) include_directories(${PROJECT_SOURCE_DIR}/face_nv_infer_server_manager.hpp) -include_directories(${PROJECT_SOURCE_DIR}/nv_messgae_converter.hpp) +include_directories(${PROJECT_SOURCE_DIR}/nv_message_converter.hpp) +include_directories(${PROJECT_SOURCE_DIR}/nv_message_broker.hpp) set(SOURCES src/main.cpp src/camera_manager.cpp src/pipeline_manager.cpp src/streammux_manager.cpp @@ -93,7 +94,7 @@ set(SOURCES src/main.cpp src/camera_manager.cpp src/pipeline_manager.cpp src/st src/config_manager.cpp src/nv_infer_server_manager.cpp src/nv_tracker_manager.cpp src/face_candid_trace.cpp src/face_nv_infer_server_manager.cpp src/face_nv_infer_server_manager.cpp - src/nv_messgae_converter.cpp) + src/nv_message_converter.cpp src/nv_message_broker.cpp) # missing initializer for member 'NvDsInferDims::d' [-Werror=missing-field-initializers] NvDsInferDims dims = {0}; diff --git a/data/configuration.json b/data/configuration.json index 18bf68c..a1e1a9c 100644 --- a/data/configuration.json +++ b/data/configuration.json @@ -54,6 +54,15 @@ "num-extra-surfaces": 1, "num-surfaces-per-frame": 0 }, - "msgconv_config_file": "../data/nvmsgconv_configs/msgconv_config.txt", - "msgconv_frame_interval": 30 + "msgconv": { + "msgconv_config_file": "../data/nvmsgconv_configs/msgconv_config.txt", + "msgconv_frame_interval": 30 + }, + "msgbroker": { + "msgbroker_config_file": "../data/nvmsgboker_configs/msgbroker_config.txt", + "protocol_adaptor_library": "../data/nvmsgboker_configs/libnvds_redis_proto.so", + "redis_broker_host": "ABC", + "redis_broker_port": 1234, + "topic_redis": "redis_stream" + } } \ No newline at end of file diff --git a/data/nvmsgboker_configs/libnvds_redis_proto.so b/data/nvmsgboker_configs/libnvds_redis_proto.so new file mode 100755 index 0000000000000000000000000000000000000000..2e4c633ea81eb7fd91e89eed0dd3c6993979e76a GIT binary patch literal 68512 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[!^Ox`f5xhO@Y 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 literal 0 HcmV?d00001 diff --git a/data/nvmsgboker_configs/msgbroker_config.txt b/data/nvmsgboker_configs/msgbroker_config.txt new file mode 100644 index 0000000..45bede2 --- /dev/null +++ b/data/nvmsgboker_configs/msgbroker_config.txt @@ -0,0 +1,9 @@ +[message-broker] +# Redis-specific options +hostname=192.168.130.13 +port=6379 +streamsize=10000 +payloadkey=metadata +consumergroup=mygroup +consumername=myname +share-connection=1 \ No newline at end of file diff --git a/src/nv_message_broker.cpp b/src/nv_message_broker.cpp new file mode 100644 index 0000000..bfba071 --- /dev/null +++ b/src/nv_message_broker.cpp @@ -0,0 +1,32 @@ +#include "nv_message_broker.hpp" + +NvMessageBroker::NvMessageBroker() { + const auto& config = ConfigManager::get_instance().get_config(); + + msgbroker_config_file = config["msgbroker"]["msgbroker_config_file"]; + protocol_adaptor_library = config["msgbroker"]["protocol_adaptor_library"]; + topic_redis = config["msgbroker"]["topic_redis"]; + redis_host = config["msgbroker"]["redis_broker_host"]; + redis_port = config["msgbroker"]["redis_broker_port"]; + conn_str = redis_host + ";" + std::to_string(redis_port); +} + +bool NvMessageBroker::create_message_broker() { + msgbroker = gst_element_factory_make("nvmsgbroker", "nvmsg-broker"); + g_object_set(G_OBJECT(msgbroker), "config", msgbroker_config_file, NULL); + + // nvmsgbroker looks first at the --conn-str (or conn-str property). + // If it’s not provided, and you gave a --cfg-file (or config property), it + // will read hostname and port from the config file. If you set both, the + // conn-str overrides the file values. g_object_set (G_OBJECT (msgbroker), + // "conn-str", conn_str, NULL); + g_object_set(G_OBJECT(msgbroker), "proto-lib", protocol_adaptor_library, + "sync", FALSE, NULL); + g_object_set(G_OBJECT(msgbroker), "topic", topic_redis, NULL); + + if (!msgbroker) { + g_printerr("Unable to create msgbroker.Exiting."); + return false; + } + return true; +} \ No newline at end of file diff --git a/src/nv_message_broker.hpp b/src/nv_message_broker.hpp new file mode 100644 index 0000000..9041949 --- /dev/null +++ b/src/nv_message_broker.hpp @@ -0,0 +1,19 @@ +#include + +#include +#include + +#include "config_manager.hpp" + +class NvMessageBroker { + private: + public: + gint frame_interval; + GstElement *msgbroker = NULL; + std::string msgbroker_config_file, protocol_adaptor_library, topic_redis, + redis_host, conn_str; + int redis_port; + NvMessageBroker(); + bool create_message_broker(); + ~NvMessageBroker(); +}; \ No newline at end of file diff --git a/src/nv_messgae_converter.cpp b/src/nv_message_converter.cpp similarity index 87% rename from src/nv_messgae_converter.cpp rename to src/nv_message_converter.cpp index 6b7a22d..55fedd6 100644 --- a/src/nv_messgae_converter.cpp +++ b/src/nv_message_converter.cpp @@ -1,14 +1,10 @@ -#include "nv_messgae_converter.hpp" - -#define SET_GPU_ID(object, gpu_id) \ - g_object_set(G_OBJECT(object), "gpu-id", gpu_id, NULL); -#define GPU_ID 0 +#include "nv_message_converter.hpp" NvMessageConverter::NvMessageConverter() { const auto& config = ConfigManager::get_instance().get_config(); - msgconv_config_file = config["msgconv_config_file"]; - frame_interval = config["msgconv_frame_interval"]; + msgconv_config_file = config["msgconv"]["msgconv_config_file"]; + frame_interval = config["msgconv"]["msgconv_frame_interval"]; } bool NvMessageConverter::create_message_converter() { @@ -21,7 +17,6 @@ bool NvMessageConverter::create_message_converter() { // the "payload-type: 1" and "msg2p-newapi: 1" // msg2p-newapi: TRUE for DeepStream 6.x+ (recommended). g_object_set(G_OBJECT(msgconv), "frame-interval", frame_interval, NULL); - SET_GPU_ID(msgconv, GPU_ID); // g_object_set(G_OBJECT(msgconv), // "config", "dstest5_msgconv.cfg", // message schema config diff --git a/src/nv_messgae_converter.hpp b/src/nv_message_converter.hpp similarity index 100% rename from src/nv_messgae_converter.hpp rename to src/nv_message_converter.hpp diff --git a/src/pipeline_manager.cpp b/src/pipeline_manager.cpp index ec32129..bcef512 100644 --- a/src/pipeline_manager.cpp +++ b/src/pipeline_manager.cpp @@ -435,6 +435,7 @@ bool PipelineManager::create_pipeline_elements(int num_sources, nv_osd_manager->create_nv_osd(); nv_messgae_converter_manager->create_message_converter(); + nv_messgae_broker_manager->create_message_broker(); /* Add queue elements between every two elements */ const char* base = "queue"; diff --git a/src/pipeline_manager.hpp b/src/pipeline_manager.hpp index b089d38..070514d 100644 --- a/src/pipeline_manager.hpp +++ b/src/pipeline_manager.hpp @@ -11,7 +11,8 @@ #include "message_handling.hpp" #include "nv_ds_logger_manager.hpp" #include "nv_infer_server_manager.hpp" -#include "nv_messgae_converter.hpp" +#include "nv_message_broker.hpp" +#include "nv_message_converter.hpp" #include "nv_osd_manager.hpp" #include "nv_tracker_manager.hpp" #include "nv_video_convert_manager.hpp" @@ -43,6 +44,7 @@ class PipelineManager { FaceNvInferServerManager *face_nv_infer_server_manager = new FaceNvInferServerManager(); NvMessageConverter *nv_messgae_converter_manager = new NvMessageConverter(); + NvMessageBroker *nv_messgae_broker_manager = new NvMessageBroker(); static double fps_buffer_probe; static double fps_probe; static double fps_osd;