[ZMQ] -- ZMQ通信Protobuf數據結構 1

1、前言背景

工作需要域間實現zmq通信,剛開始需要比較簡單的數據結構,比如兩個bool,后面可能就需要傳輸比較大的數據,所以記錄下實現流程,至于為啥選擇proto數據結構去做大數據傳輸,可能是地平線也用這個,那繼續當cv工程師

2、protobuf源碼編譯

下載proto的編譯源碼 我比較喜歡源碼編譯 方便跟現有代碼做兼容

Release Protocol Buffers v3.6.1 · protocolbuffers/protobuf · GitHub

proto 3.6.1是工作原有編譯環境編譯工具鏈的版本 所以也下載這個版本,根據自己需要版本即可,大同小異的東西

電腦環境安裝,不裝執行會報錯

udo apt-get update
sudo apt-get install g++ gcc cmake
sudo apt-get install autoconf
sudo apt-get install libtool
cd protobuf-3.6.1/
./autogen.sh
./configure --prefix=/home/qhr/Downloads/protobuf/install
make?????? (時間較長 等)
make install

生成可執行文件在bin? 頭include和庫lib在下面,因為工具鏈里已經有了? 就不需要 我們只要bin /protoc可執行文件就行,去生成proto頭文件

3、生成proto頭文件

隨便搞個數據結構

// 指定采用 proto3 語法
syntax = "proto3";

// 相當于命名空間
package contacts;

message PeopleInfo{
??? string name = 1;??? //不是賦值,而是指定唯一編號
??? int32 age = 2;
}

install/bin/protoc --cpp_out=. people.proto

protoc:編譯工具
–proto_path:指定 .proto 文件的檢索路徑,可以多次指定指定。不指定默認在當前文件夾下檢索。可以簡寫為 -I.
–cpp_out:指定編譯后的文件類型為C++
DST_DIR:指定文件的生活生成路徑
file.proto:指定要編譯的 .proto 文件(–proto_path 路徑下的)

執行后在本地生成people.pb.cc? people.pb.h兩個文件,后面再用

或者定義一個稍微復雜的數據結構

syntax = "proto3"; // 指定使用 proto3 語法

package myexample; // 定義包名,避免不同項目之間的命名沖突

// Address message definition

message Address {

string street = 1;

string city = 2;

string state = 3;

string zip_code = 4;

string country = 5; }

// Person message definition, which includes an Address

message Person {

string name = 1;

int32 id = 2; // Unique ID number for this person

string email = 3;

// A person can have multiple addresses repeated

Address addresses = 4; }

在這個例子中:

  • syntax = "proto3"; 行指定了使用的語法版本為 proto3。這是最新的版本,并且簡化了某些規則。
  • package myexample; 行定義了一個包名 myexample,這有助于防止名稱沖突,特別是在大型項目或庫中。
  • Address 是一個消息類型,它包含了街道、城市、州/省、郵政編碼和國家等字段。
  • Person 是另一個消息類型,它除了包含人的姓名、ID 和電子郵件地址之外,還有一個名為 addresses 的字段,這個字段是一個 repeated 類型,意味著它可以包含零個或多個 Address 實例。

4、zmq通信代碼架構

不多逼逼? 直接上代碼? (只剝離出一部分通信代碼)

zmq_subscriber.h


#ifndef _ZMQ_SUBSCRIBER_H_
#define _ZMQ_SUBSCRIBER_H_#include <iostream>
#include <chrono>
#include <iomanip>
#include <sstream>#include <memory>
#include <thread>
#include <functional>
#include <atomic>namespace 1121212
{
class zmq_subscriber
{
public:zmq_subscriber();~zmq_subscriber();void Init(std::string name, std::string ip_port, uint32_t timeout);void Start();void HandleZmqMessage();private:zmq::context_t                 context_;std::shared_ptr<zmq::socket_t> subscriber_ptr_;std::string                    zmq_name_;std::string                    ip_port_;uint32_t                       timeout_;std::shared_ptr<std::thread>   thread_ = nullptr;zmq::pollitem_t                items_[1];std::atomic<bool>              running_{true};};}  // namespace 22221212#endif  //_ZMQ_SUBSCRIBER_H_

zmq_subscriber.cpp

#include "zmq_subscriber.h"namespace 121212
{zmq_subscriber::zmq_subscriber()
{}zmq_subscriber::~zmq_subscriber()
{std::cout << "zmq_subscriber class destruct" << std::endl;subscriber_ptr_->disconnect(ip_port_);running_.store(false);if ((thread_ != nullptr) && (thread_->joinable())){thread_->join();}
}void zmq_subscriber::Init(std::string name, std::string ip_port, uint32_t timeout)
{zmq_name_       = name;ip_port_        = ip_port;timeout_        = timeout;subscriber_ptr_ = std::make_shared<zmq::socket_t>(context_, ZMQ_SUB);subscriber_ptr_->connect(ip_port_);  // "tcp://localhost:5555"subscriber_ptr_->setsockopt(ZMQ_SUBSCRIBE, "", 0);subscriber_ptr_->setsockopt(ZMQ_RCVTIMEO, timeout);items_[0].socket  = static_cast<void*>(subscriber_ptr_->handle());items_[0].fd      = 0;items_[0].events  = ZMQ_POLLIN;items_[0].revents = 0;
}void zmq_subscriber::Start()
{thread_ = std::make_shared<std::thread>(std::bind(&zmq_subscriber::HandleZmqMessage, this));
}void zmq_subscriber::HandleZmqMessage()
{pthread_setname_np(pthread_self(), zmq_name_.c_str());while (true){zmq::poll(&items_[0], 1, 1000);if (!running_.load()){break;}if (items_[0].revents & ZMQ_POLLIN){zmq::message_t message;//do something}}else{cout << zmq_name_ << " " << ip_port_ << " ZMQ TimeOut!!!";}}
}}  // namespace 121212

以為工作只用訂閱,如果需要收發的代碼 ,移步:[ZMQ] -- ZMQ通信收發多個Proto數據結構 2-CSDN博客

參考鏈接:

【protobuf】ProtoBuf——快速上手protobuf、創建.proto文件、編譯.proto文件、序列化與反序列化的使用-CSDN博客【Protobuf速成指南】.proto文件的編寫與編譯-CSDN博客

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/62888.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/62888.shtml
英文地址,請注明出處:http://en.pswp.cn/web/62888.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

順序表的使用,對數據的增刪改查

主函數&#xff1a; 3.c #include "3.h"//頭文件調用 SqlListptr sql_cerate()//創建順序表函數 {SqlListptr ptr(SqlListptr)malloc(sizeof(SqlList));//在堆區申請連續的空間if(NULLptr){printf("創建失敗\n");return NULL;//如果沒有申請成功&#xff…

React和Vue中暴露子組件的屬性和方法給父組件用,并且控制子組件暴露的顆粒度的做法

React 在 React 中&#xff0c;forwardRef 是一種高級技術&#xff0c;它允許你將 ref 從父組件傳遞到子組件&#xff0c;從而直接訪問子組件的 DOM 節點或公開的方法。這對于需要操作子組件內部狀態或 DOM 的場景非常有用。為了使子組件能夠暴露其屬性和方法給父組件&#xf…

《C++ 實時視頻流物體跟蹤與行為分析全解析》

在當今科技飛速發展的時代&#xff0c;視頻監控與智能分析技術在眾多領域發揮著極為重要的作用。從安防監控到智能交通&#xff0c;從工業自動化到人機交互&#xff0c;利用 C 處理實時視頻流中的物體跟蹤和行為分析成為了熱門且極具挑戰性的研究與開發方向。本文將深入探討其中…

5G中的隨機接入過程可以不用收RAR?

有朋友提到了一種不用接收RAR的RA過程&#xff0c;問這個是怎么回事。其實在剛剛寫過的LTM cell switch篇章中就有提到&#xff0c;這里把所有相關的內容整理如下。 在RACH-less LTM場景&#xff0c;在進行LTM cell switch之前就要先知道target cell的TA信息&#xff0c;進而才…

git 導出某段時間修改的文件 windows

第一步&#xff1a;列出兩次commitID之間的文件變動 git diff oldid newid --name-only// 例如 git diff 4a886c57a8b5611a2abcfcd120461c2e92f7029a HEAD --name-only 4a886c57a8b5611a2abcfcd120461c2e92f7029a 代表之前 HEAD 代表最新或者換成某次commitID 例如&#xf…

Qt 聯合Halcon配置

文章目錄 配置代碼窗口綁定 配置 選擇添加庫 選擇外部庫 LIBS -LC:/Program Files/MVTec/HALCON-17.12-Progress/lib/x64-win64/ LIBS -lhalconcpp\-lhdevenginecpp\-lhalconINCLUDEPATH C:/Program Files/MVTec/HALCON-17.12-Progress/include DEPENDPATH C:/Program Fil…

new URL(`../assets/images/${name}`, import.meta.url).href

背景&#xff1a; 文章講述了Vite框架中關于資源文件&#xff08;如圖片&#xff09;在默認配置下&#xff0c;如何正確處理開發環境和打包后的不同引用方式。重點介紹了使用import.meta.url和new URL() 來動態獲取并處理靜態資源URL的方法&#xff0c;以及注意事項&#xff0…

8、筆記本品牌分類介紹:LG - 計算機硬件品牌系列文章

LG筆記本品牌以其高性能和先進技術而聞名&#xff0c;?提供多種型號以滿足不同用戶的需求。? LG筆記本產品線包括多種類型&#xff0c;?以滿足不同用戶的需求。?其中&#xff0c;?LG Gram Pro系列以其超薄設計和高性能配置受到關注。?該系列筆記本采用16:10的OLED顯示屏&…

367_C++_計算mouse移動過程中,視頻框的右側、底部邊距,以及根據實時的右側、底部邊距計算—視頻框的左上角位置

代碼分析 1. restorePos 方法 restorePos 的作用是恢復 NavigationFrame 的位置,將其移動到父窗口或者指定矩形內的特定位置。 void NavigationFrame::restorePos() {// 獲取目標矩形:優先使用 `m_pRect`,否則默認使用視頻區域或父窗口區域RSRect videoRect(m_pVide

Tiptap,: 富文本編輯器入門與案例分析

Tiptap 是一個現代的富文本編輯器&#xff0c;基于 ProseMirror 打造&#xff0c;旨在提供一個靈活且功能強大的文本編輯解決方案。它具有開箱即用的能力&#xff0c;同時也允許開發者根據業務需求進行高度定制化擴展。與傳統的富文本編輯器相比&#xff0c;Tiptap 提供了更精細…

scala的泛型類

泛型&#xff1a;類型參數化 泛型類指的是把泛型定義到類的聲明上, 即:該類中的成員的參數類型是由泛型來決定的. 在創建對象時, 明確具體的數據類型. 定義格式: class 類名&#xff08;成員名&#xff1a;數據類型&#xff09; class 類名[泛型名](成員名:泛型名) 參考代…

對比損失(Contrastive Loss)與大模型:Contrastive Loss and Large Models (中英雙語)

對比損失&#xff08;Contrastive Loss&#xff09;與大模型&#xff1a;從原理到實踐 在現代深度學習中&#xff0c;對比損失&#xff08;Contrastive Loss&#xff09;是一種核心技術&#xff0c;尤其是在對比學習&#xff08;Contrastive Learning&#xff09;中被廣泛使用…

Java基礎學習:java常用啟動命令

一、java -jar 1、系統屬性傳遞 使用形式&#xff1a;java -DpathD:\jacoco -jar 獲取方式&#xff1a;System.getProperties() 2、系統參數傳遞 使用形式&#xff1a;java -jar application.jar --jacocoPathD:\tomcat 獲取方式&#xff1a;通過啟動方法入口main的參數arg…

Linux下SVN客戶端保存賬號密碼

參考文章&#xff1a;解決&#xff1a;Linux上SVN 1.12版本以上無法直接存儲明文密碼_linux svn 保存密碼-CSDN博客新版本svn使用gpg-agent存儲密碼-CSDN博客svn之無法讓 SVN 存儲密碼&#xff0c;即使配置設置為允許_編程設計_ITGUEST 方法一&#xff1a;明文方式保存密碼 首…

負載均衡oj項目:介紹

目錄 項目介紹 項目演示 項目介紹 負載均衡oj是一個基于bs模式的項目。 用戶使用瀏覽器向oj模塊提交代碼&#xff0c;oj模塊會在所有在線的后端主機中選擇一個負載情況最低的主機&#xff0c;將用戶的代碼提交給該主機&#xff0c;該主機進行編譯運行&#xff0c;將結果返回…

gateway 微服務的入口-筆記

本文屬于b站圖靈課堂springcloud筆記系列。講的好還不要錢&#xff0c;值得推薦。 為什么需要API網關&#xff1f; 客戶端多次請求不同的微服務&#xff0c;會增加客戶端代碼和配置的復雜性&#xff0c;維護成本比價高認證復雜&#xff0c;每個微服務可能存在不同的認證方式&…

vue2+element-ui實現多行行內表格編輯

效果圖展示 當在表格中點擊編輯按鈕時:點擊的行變成文本框且數據回顯可以點擊確定按鈕修改數據或者取消修改回退數據: 具體實現步驟 1. 行數據定義編輯標記 行數據定義編輯標記 當在組件中獲取到用于表格展示數據的方法中,針對每一行數據添加一個編輯標記 this.list.f…

安卓主板_MTK聯發科android主板方案

在當前智能設備的發展中&#xff0c;安卓主板的配置靈活性和性能優化顯得尤為重要。安卓主板的聯發科方案&#xff0c;在芯片上&#xff0c;搭載聯發科MTK6761、MT8766、MT6765、MT6762、MT8768、MT8390、MTK8370以及MT8788等型號&#xff0c;均基于64位的四核或八核架構設計。…

如何破解“不會寫作”的煩惱

在人生的諸多煩惱中&#xff0c;有一種煩惱或許不那么顯眼&#xff0c;卻常常如影隨形&#xff0c;讓人倍感困擾——那就是不會寫作的煩惱。這不僅僅是對那些以寫作為生的人而言&#xff0c;對于每一個需要在學習、工作或生活中以文字表達思想、情感的人來說&#xff0c;不會寫…

虛幻5描邊輪廓材質

很多游戲內都有這種描邊效果&#xff0c;挺實用也挺好看的&#xff0c;簡單復刻一下 效果演示&#xff1a; Linethickness可以控制輪廓線條的粗細 這樣連完&#xff0c;然后放到網格體細節的覆層材質上即可 可以自己更改粗細大小和顏色