当前位置: 首页 > news >正文

[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博客

相关文章:

[ZMQ] -- ZMQ通信Protobuf数据结构 1

1、前言背景 工作需要域间实现zmq通信&#xff0c;刚开始需要比较简单的数据结构&#xff0c;比如两个bool&#xff0c;后面可能就需要传输比较大的数据&#xff0c;所以记录下实现流程&#xff0c;至于为啥选择proto数据结构去做大数据传输&#xff0c;可能是地平线也用这个&…...

大数据平台

大数据行业应用持续升温&#xff0c;特别是企业级大数据市场正在进入快速发展时期。越来越多的企业期望实现数据孤岛的打通&#xff0c;整合海量的数据资源&#xff0c;挖掘并沉淀有价值的数据&#xff0c;进而驱动更智能的商业。随着公司数据爆发式增长&#xff0c;原有的数据…...

《C++解锁机器学习特征工程:构建智能数据基石》

在当今机器学习蓬勃发展的浪潮中&#xff0c;特征工程犹如一座坚实的基石&#xff0c;奠定了模型成功的基础。而 C以其卓越的性能和强大的底层控制能力&#xff0c;在实现机器学习特征工程方面发挥着独特且关键的作用。 特征工程的核心目标是从原始数据中提取和构建最具代表性…...

《机器学习》3.7-4.3end if 启发式 uci数据集klda方法——非线性可分的分类器

目录 uci数据集 klda方法——非线性可分的分类器 计算 步骤 1: 选择核函数 步骤 2: 计算核矩阵 步骤 4: 解广义特征值问题 と支持向量机&#xff08;svm&#xff09; 目标&#xff1a; 方法&#xff1a; 核技巧的应用&#xff1a; 区别&#xff1a; 使用 OvR MvM 将…...

【Linux】VMware 安装 Ubuntu18.04.2

ISO镜像安装步骤 选择语言 English 选择键盘布局 English 选择系统 Ubuntu 虚拟机网卡地址&#xff0c;默认即可 代理地址&#xff0c;默认空即可 镜像地址&#xff0c;修改成阿里云地址 选择第二项&#xff0c;LVM 磁盘扩容技术 第一块硬盘名sda&#xff0c;默认…...

人员离岗监测摄像机智能人员睡岗、逃岗监测 Python 语言结合 OpenCV

在安全生产领域&#xff0c;人员的在岗状态直接关系到生产流程的顺利进行和工作环境的安全稳定。人员离岗监测摄像机的出现&#xff0c;为智能人员睡岗、逃岗监测提供了高效精准的解决方案&#xff0c;而其中的核心技术如AI识别睡岗脱岗以及相关的算法盒子和常见的安全生产AI算…...

【Spark】Spark数据倾斜解决方案、大表join小表及大表join大表优化思路

如果觉得这篇文章对您有帮助&#xff0c;别忘了点赞、分享或关注哦&#xff01;您的一点小小支持&#xff0c;不仅能帮助更多人找到有价值的内容&#xff0c;还能鼓励我持续分享更多精彩的技术文章。感谢您的支持&#xff0c;让我们一起在技术的世界中不断进步&#xff01; Sp…...

探索 Cesium 的未来:3D Tiles Next 标准解析

探索 Cesium 的未来&#xff1a;3D Tiles Next 标准解析 随着地理信息系统&#xff08;GIS&#xff09;和 3D 空间数据的快速发展&#xff0c;Cesium 作为领先的开源 3D 地球可视化平台&#xff0c;已成为展示大规模三维数据和进行实时渲染的强大工具。近年来&#xff0c;随着…...

每日一站技術架構解析之-cc手機桌布網

# 網站技術架構解析&#xff1a; ## 一、整體架構概述https://tw.ccwallpaper.com是一個提供手機壁紙、桌布免費下載的網站&#xff0c;其技術架構設計旨在實現高效的圖片資源管理與用戶訪問體驗優化。 ### &#xff08;一&#xff09;前端展示 1. **HTML/CSS/JavaScript基礎構…...

prometheus监控之黑盒(blackbox)监控

1.简单介绍 blackbox-exporter项目地址&#xff1a;https://github.com/prometheus/blackbox_exporter blackbox-exporter是Prometheus官方提供的一个黑盒监控解决方案&#xff0c;blackbox-exporter无须安装在被监控的目标环境中&#xff0c;用户只需要将其安装在与Promethe…...

计算机网络之传输层协议TCP

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 计算机网络之传输层协议TCP 收录于专栏【计算机网络】 本专栏旨在分享学习计算机网络的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目…...

子查询与嵌套查询

title: 子查询与嵌套查询 date: 2024/12/13 updated: 2024/12/13 author: cmdragon excerpt: 子查询和嵌套查询是关系型数据库中强大的查询工具,允许用户在一个查询的结果中再进行查询。通过使用子查询,用户能够简化复杂的SQL语句,增强查询的灵活性和可读性。本节将探讨子…...

GPT-SoVITS语音合成模型部署及使用

1、概述 GPT-SoVITS是一款开源的语音合成模型&#xff0c;结合了深度学习和声学技术&#xff0c;能够实现高质量的语音生成。其独特之处在于支持使用参考音频进行零样本语音合成&#xff0c;即使没有直接的训练数据&#xff0c;模型仍能生成相似风格的语音。用户可以通过微调模…...

springboot423玩具租赁系统boot(论文+源码)_kaic

摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装玩具租赁系统软件来发挥其高效地信息处理的作用&#xff0c…...

【收藏】Cesium 限制相机倾斜角(pitch)滑动范围

1.效果 2.思路 在项目开发的时候&#xff0c;有一个需求是限制相机倾斜角&#xff0c;也就是鼠标中键调整视图俯角时&#xff0c;不能过大&#xff0c;一般 pitch 角度范围在 0 至 -90之间&#xff0c;-90刚好为正俯视。 在网上查阅了很多资料&#xff0c;发现并没有一个合适的…...

Jenkins流水线初体验(六)

DevOps之安装和配置 Jenkins (一) DevOps 之 CI/CD入门操作 (二) Sonar Qube介绍和安装(三) Harbor镜像仓库介绍&安装 (四) Jenkins容器使用宿主机Docker(五) Jenkins流水线初体验(六) 一、Jenkins流水线任务介绍 之前采用Jenkins的自由风格构建的项目,每个步骤…...

Azure OpenAI 生成式人工智能白皮书

简介 生成式 AI 成为人工智能领域新的关键词。吸纳从机器智能到机器学习、深度学习的关键技术生成式 AI更进一步&#xff0c;能够根据提示或现有数据创建新的书面、视觉和听觉内容。在此基础上大模型和大模型应用一时涌现&#xff0c;并迅速确立AI落地新范式。据 data.ai inte…...

Ubuntu22.04安装docker desktop遇到的bug

1. 确认已启用 KVM 虚拟化 如果加载了模块&#xff0c;输出应该如下图。说明 Intel CPU 的 KVM 模块已开启。 否则在VMware开启宿主机虚拟化功能&#xff1a; 2. 下一步操作&#xff1a; Ubuntu | Docker Docs 3. 启动Docker桌面后发现账户登陆不上去&#xff1a; Sign in | …...

LLMC:大语言模型压缩工具的开发实践

关注&#xff1a;青稞AI&#xff0c;学习最新AI技术 青稞Talk主页&#xff1a;qingkelab.github.io/talks 大模型的进步&#xff0c;正推动我们向通用人工智能迈进&#xff0c;然而庞大的计算和显存需求限制了其广泛应用。模型量化作为一种压缩技术&#xff0c;虽然可以用来加速…...

基于阿里云Ubuntu22.04 64位服务器Java及MySql环境配置命令记录

基于阿里云Ubuntu22.04 64位服务器Java及MySql环境配置命令记录 Java 23 离线环境配置MySql 环境配置MySQL常用命令 Java 23 离线环境配置 下载 Ubuntu环境下 Java 23 离线包 链接: java Downloads. 在Linux环境下创建一个安装目录 mkdir -p /usr/local/java将下载好的jdk压缩…...

华硕笔记本性能调校新选择:G-Helper轻量控制工具全解析

华硕笔记本性能调校新选择&#xff1a;G-Helper轻量控制工具全解析 【免费下载链接】g-helper Lightweight, open-source control tool for ASUS laptops and ROG Ally. Manage performance modes, fans, GPU, battery, and RGB lighting across Zephyrus, Flow, TUF, Strix, S…...

高斯数据库(GaussDB)SQL 常用语句总结

高斯数据库(GaussDB)SQL 常用语句总结 高斯数据库(GaussDB)是华为基于 PostgreSQL 开源生态开发的企业级分布式关系型数据库,兼容标准 SQL 92/99/2003,同时支持 PostgreSQL 语法,还自带分布式、高可用特性。 下面按日常开发高频场景整理最实用的 SQL 语句,直接复制就…...

赋能软件测试:三大主流数据标注平台(Label Studio, Prodigy, Scale)的深度技术解析与选型指南

当软件测试遇见AI数据工程在人工智能驱动的软件测试新时代&#xff0c;数据已不仅仅是应用运行的输入&#xff0c;更是构建智能测试模型、实现自动化测试演进的核心“燃料”。数据标注&#xff0c;作为将原始数据转化为机器可理解、可学习结构化信息的关键工序&#xff0c;其质…...

如何用3D Slicer实现精准医学图像配准?5个高效技巧分享

如何用3D Slicer实现精准医学图像配准&#xff1f;5个高效技巧分享 医学图像配准是影像分析中的关键步骤&#xff0c;它直接影响后续定量测量和手术导航的准确性。作为开源医学图像处理平台的代表&#xff0c;3D Slicer凭借其模块化设计和丰富的插件生态&#xff0c;成为许多研…...

别再手动截图了!用Java POI把商品图片和详情一键导出到Excel(附完整工具类)

电商后台自动化利器&#xff1a;Java POI实现商品图文一键导出Excel实战指南 每次运营同事催你要商品数据报表时&#xff0c;还在手工复制粘贴图片吗&#xff1f;作为经历过这种折磨的开发者&#xff0c;我深知电商系统中商品信息导出的痛点——尤其是当需要将主图、详情图等多…...

保姆级教程:在Ubuntu上为龙芯2K0300开发板配置交叉编译环境(含完整测试流程)

保姆级教程&#xff1a;在Ubuntu上为龙芯2K0300开发板配置交叉编译环境&#xff08;含完整测试流程&#xff09; 刚拿到龙芯2K0300开发板的开发者们&#xff0c;往往会在环境配置阶段遇到各种"拦路虎"。本文将手把手带你完成从工具链部署到"Hello World"验…...

开源番茄小说下载工具:让数字阅读摆脱平台依赖的完整方案

开源番茄小说下载工具&#xff1a;让数字阅读摆脱平台依赖的完整方案 【免费下载链接】fanqienovel-downloader 下载番茄小说 项目地址: https://gitcode.com/gh_mirrors/fa/fanqienovel-downloader 当你在通勤途中想继续阅读昨晚未看完的小说&#xff0c;却发现网络信号…...

我在OpenClaw 创建公司

我在OpenClaw 创建公司一、公司创立背景1.1 创立契机1.2 公司定位1.3 组织架构设计二、公司体系建设2.1 文档管理体系2.1.1 目录结构设计2.1.2 文档命名规范2.2 工作流程规范2.2.1 协作机制2.2.2 报告机制三、定时任务体系建立3.1 任务规划3.1.1 基础任务设置3.1.2 报告任务规划…...

别再只盯着STA了!用SDF文件给你的芯片时序验证上个“双保险”(附VCS反标实操)

芯片时序验证的双重保障&#xff1a;SDF文件与STA的协同应用 在芯片设计领域&#xff0c;时序验证是确保电路功能正确性和性能达标的核心环节。许多工程师习惯于依赖静态时序分析&#xff08;STA&#xff09;作为唯一的验证手段&#xff0c;却忽视了动态时序仿真&#xff08;SD…...

给CUDA新手的3DGS代码保姆级拆解:从forward.cu到backward.cu的完整学习路径

给CUDA新手的3DGS代码保姆级拆解&#xff1a;从forward.cu到backward.cu的完整学习路径 当你第一次打开3D Gaussian Splatting的代码仓库时&#xff0c;那些密密麻麻的CUDA核函数和复杂的线程同步操作可能让你望而生畏。但别担心&#xff0c;这篇文章将带你像拆解乐高积木一样&…...