【MQTT协议】使用Mosquitto实现mqtt协议(二):编写视频帧的发布/订阅服务

这篇具有很好参考价值的文章主要介绍了【MQTT协议】使用Mosquitto实现mqtt协议(二):编写视频帧的发布/订阅服务。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


更多内容详见 【MQTT协议】使用c++实现mqtt协议(Mosquitto源码编译)

一、Mosquitto中的QoS定义

MQTT协议中的QoS(Quality of Service)表示消息传输的服务质量等级,它是MQTT协议中非常重要的一个概念。
MQTT协议中定义了三个不同等级的QoS:

QoS 0:最多一次(At most once)传输。消息发布者只发送一次消息,不进行确认,也不关心消息是否到达订阅者。这种QoS等级的消息传输效率最高,但可靠性最低。

QoS 1:最少一次(At least once)传输。消息发布者会发送消息,并等待确认。如果消息没有被确认,会再次发送,直到收到确认为止。这种QoS等级的消息传输可靠性较高,但效率稍低。

QoS 2:恰好一次(Exactly once)传输。消息发布者发送消息,并等待确认。如果没有收到确认,会再次发送,直到收到确认为止。订阅者接收到消息后,会发送一个确认消息给发布者。如果发布者没有收到确认,会再次发送消息,直到收到确认为止。这种QoS等级的消息传输可靠性最高,但效率最低。

QoS1和3区别

在MQTT协议中,客户端和服务端可以通过协商来确定消息传输的QoS等级,以满足消息传输效率和可靠性的要求。
MQTT协议中的QoS 1和QoS 2都保证了消息的可靠性,但它们之间有一些区别。
QoS 1(最少一次)保证了消息至少会被传输一次,但不保证消息一定会被准确地传输一次。在QoS 1级别下,发布者发送消息并等待一个确认,如果没有收到确认,会再次发送消息,直到收到确认为止。但是,如果确认消息丢失或延迟,可能会导致发布者不断地发送相同的消息。因此,QoS 1级别下可能会出现重复的消息。
QoS 2(恰好一次)保证了消息会被恰好传输一次,不会出现重复的消息。在QoS 2级别下,发布者发送消息并等待一个确认。订阅者收到消息后,会发送一个确认消息给发布者。如果发布者没有收到确认,会再次发送消息,直到收到确认为止。如果订阅者收到重复的消息,可以通过消息中的标识符进行去重,以保证只处理一次。
综上所述,QoS 2级别下的消息传输可靠性更高,但是会带来更大的网络开销和延迟。在选择QoS等级时,需要根据具体的应用需求来确定。

二、安装base64库

base64库用于完成图片与base64之间的转换工作。
git clone https://github.com/ReneNyffenegger/cpp-base64.git
得到base64.h及base64.cpp,直接在工程中进行引用即可。

三、cjson简介

由于Mosquitto传递字节消息,需使用CJSON完成对象的序列化:
如果需要将C语言结构体转化为JSON字符串,需要手动遍历结构体中的成员,并使用CJSON提供的接口将它们转化为JSON对象。
cjson库在上一篇博文中已安装。这里使用cjson获取字符串实现mqtt节点间的信息传递

四、主程序代码

视频在拉流后,视频帧到不同算法间的关系是发布/订阅关系,
下面代码进行了2节点简单模拟,文中对于Mosquitto原始库做了一个简易封装,了解逻辑即可

#include "mqtt-client.hpp"
#include <opencv2/opencv.hpp>
#include <base64.h>
#include "cJSON.h"
#include <fstream>
using namespace std;
string matToBase64(const cv::Mat& image) {
    // 将图像编码为base64字符串
    vector<uchar> data;
    cv::imencode(".jpg", image, data);
    string base64_img = base64_encode(data.data(), data.size());
    return base64_img;
}
cv::Mat base64ToMat(const std::string& base64_str) {
    // 解码base64字符串
    std::string decoded_str = base64_decode(base64_str);
    // 将解码后的字符串转换为cv::Mat
    cv::Mat image = cv::imdecode(std::vector<uchar>(decoded_str.begin(), decoded_str.end()), cv::IMREAD_COLOR);
    return image;
}
int main(){  
    typedef struct {
    int id;
    std::string pic;
    } Student;
    // 读取PNG图片为Mat
    cv::Mat image = cv::imread("/home/trtlearn/mqtt-client/workspace/pic.jpg");
    string base64_img = matToBase64(image);
    // 创建一个JSON对象
    cJSON *root = cJSON_CreateObject();
    // 将结构体成员转化为JSON对象
    cJSON_AddNumberToObject(root, "num", 0.75);
    cJSON_AddStringToObject(root, "pic", base64_img.c_str());
    // 将JSON对象转换为JSON字符串
    char* json_str = cJSON_Print(root);
    cJSON_Delete(root);
    //新建两个客户端,其中一个发布消息接收数值,另一个接收图片。其中第一个节点即是发布者又是订阅者。
    string strPic(json_str);
    MQTTInitializer _;
    MQTTConnectCredential credential;
    credential.client_id = "wish";
    credential.subscribe_topic = "cc";
    credential.server_address = "127.0.0.1";
    credential.port = 9999;
    MQTTConnectCredential credential2;
    credential2.client_id = "wish1";
    credential2.subscribe_topic = "cc";
    credential2.server_address = "127.0.0.1";
    credential2.port = 9999;
    auto client = create_mqtt_client(credential);
    auto client2 = create_mqtt_client(credential2);

    if(client == nullptr){
        printf("Failed to create client.\n");
        return -1;
    }
    if(client2 == nullptr){
        printf("Failed to create client2.\n");
        return -1;
    }
    printf("Create client success.\n");
    //设置订阅后,收到消息时的回调函数
    client->set_message_callback([](MQTTClient* client, std::string topic, std::string message){
        cJSON *root = cJSON_Parse(message.c_str());
        cJSON *num = cJSON_GetObjectItem(root, "num");
        printf("客户端1收到 [%s] 数值: %f\n", topic.c_str(), (float)(num->valuedouble));
        cJSON_Delete(root);
    });
    client2->set_message_callback([&](MQTTClient* client, std::string topic, std::string message){
        cJSON *root = cJSON_Parse(message.c_str());
        cJSON *pics = cJSON_GetObjectItem(root, "pic");
        cv::Mat image=base64ToMat(string(pics->valuestring));
    if (!image.empty()) {
        cv::imwrite("receiver.jpg",image);
    }
        printf("客户端2收到 [%s] 图片\n", topic.c_str());
        cJSON_Delete(root);
    });
    while(true){
        char c = getchar();
        if(c == 'q'){
            break;
        }

        if(c == 's'){
            if(client->publish("cc", strPic)){
                printf("Publish success\n");
            }else{
                printf("Publish failed\n");
            }
        }
    }
    printf("Done.\n");
    return 0;
}

运行程序,输入s发布数值与图片信息,打印订阅输出结果:
【MQTT协议】使用Mosquitto实现mqtt协议(二):编写视频帧的发布/订阅服务文章来源地址https://www.toymoban.com/news/detail-413484.html

五、调用Mosquitto库使用的cmakelist

cmake_minimum_required(VERSION 3.0)
project(pro)
add_definitions(-std=c++11)

option(CUDA_USE_STATIC_CUDA_RUNTIME OFF)
set(CMAKE_CXX_STANDARD 11)
#set(CMAKE_BUILD_TYPE Release)
set(CMAKE_BUILD_TYPE Debug)
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/workspace)

set(OpenCV_DIR   "/usr/local/opencv/lib64/cmake/opencv4")
set(mosquitto_Include   "/usr/local/mosquitto/include/")
set(CJSON_INCLUDE   "/usr/local/include/cjson")
set(mosquitto_DIR   "/usr/local/mosquitto")
set(mosquitto_LIBS mosquitto mosquittopp)
set(CJSON_LIBS cjson)

find_package(OpenCV)

include_directories(
    ${PROJECT_SOURCE_DIR}/src
    ${OpenCV_INCLUDE_DIRS}
    ${mosquitto_Include}
    ${CJSON_INCLUDE}
)

link_directories(
    ${TENSORRT_DIR}/lib
    ${CUDA_DIR}/lib64
    ${CUDNN_DIR}/lib
    ${mosquitto_DIR}/lib
)

set(CMAKE_CXX_FLAGS  "${CMAKE_CXX_FLAGS} -std=c++11 -Wall -O0 -Wfatal-errors -pthread -w -g")

#递归地添加的相关文件
file(GLOB_RECURSE cpp_srcs ${PROJECT_SOURCE_DIR}/src/*.cpp)
file(GLOB_RECURSE c_srcs ${PROJECT_SOURCE_DIR}/src/*.c)

add_executable(pro ${cpp_srcs} ${c_srcs})

target_link_libraries(pro ${OpenCV_LIBS} ${mosquitto_LIBS} ${CJSON_LIBS})

add_custom_target(
    run
    DEPENDS pro
    WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/workspace
    COMMAND ./pro
)

到了这里,关于【MQTT协议】使用Mosquitto实现mqtt协议(二):编写视频帧的发布/订阅服务的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MQTT协议版本Mosquitto移植到嵌入式arm平台

    MQTT是一个基于客户端-服务器的消息发布/订阅传输协议。MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛。在很多情况下,包括受限的环境中,如:机器与机器(M2M)通信和物联网(IoT)。其在,通过卫星链路通信传感器、偶尔拨号的医疗设备、智

    2024年02月06日
    浏览(41)
  • 【C++】开源:MQTT安装与配置使用(mosquitto)

    😏 ★,° :.☆( ̄▽ ̄)/$: .°★ 😏 这篇文章主要介绍MQTT安装与配置使用。 学其所用,用其所学。——梁启超 欢迎来到我的博客,一起学习知识,共同进步。 喜欢的朋友可以关注一下,下次更新不迷路🥞 官网: https://mqtt.org/ MQTT 是一个基于 客户端-服务器 的 消息发布/订阅传

    2024年02月04日
    浏览(35)
  • MQTT:windows环境下配置MQTT服务器(mosquitto)

    目录 1.下载 mosquitto 2.安装 mosquitto  3.配置 mosquitto  4.测试 mosquitto         登录网址:         http://mosquitto.org/files/binary/         这里是window环境,选择win32/,下载mosquitto安装包。          双击安装 - 点击Next - 点击Next - 选择安装路径 - 点击install - 点击Finish。

    2024年02月11日
    浏览(30)
  • Ubuntu MQTT mosquitto

    https://github.com/eclipse/paho.mqtt.c.git https://github.com/eclipse/paho.mqtt.cpp.git Paho MQTT C Client Library: MQTT Client library for C (MQTTClient) GitHub - eclipse/mosquitto: Eclipse Mosquitto - An open source MQTT broker  1. install: https://mosquitto.org/download/ 2. conf: 打开/etc/mosquitto/mosquitto.conf,发现需要将配置文件放置于/

    2024年02月04日
    浏览(34)
  • 物联网通信协议-MQTT及使用python实现

    简述 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的\\\"轻量 级\\\"通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发布。MQTT最大优点在于,可以以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。作

    2024年02月10日
    浏览(34)
  • Linux搭建MQTT服务器(Mosquitto)

    编译时,若提示fatal error: cjson/cJSON.h: No such file or directory,需要安装cJSON,然后重新安装mosquitto。 若不添加软连接,发布、订阅消息时会提示\\\"error while loading shared libraries: libmosquitto.so.1: cannot open shared object file: No such file or directory\\\"。 打开两个服务器连接,分别执行mosquitto_sub、

    2024年02月09日
    浏览(39)
  • 如何在Docker中配置Mosquitto MQTT代理,以便在容器化环境中运行和管理MQTT通信

    MQTT(Message Queuing Telemetry Transport)是一种轻量级的消息传输协议,广泛用于物联网和传感器网络中。Mosquitto是一个流行的开源MQTT代理,可以在Docker中进行配置和部署。本文将详细介绍如何在Docker中配置Mosquitto MQTT代理,以便在容器化环境中运行和管理MQTT通信。 在开始之前,

    2024年02月06日
    浏览(38)
  • 阿里云部署开源MQTT平台mosquitto的docker操作

    MQTT(Message Queuing Telemetry Transport)是一种轻量级的消息传输协议,广泛用于物联网和传感器网络中。Mosquitto是一个流行的开源MQTT代理,可以在Docker中进行配置和部署。本文将详细介绍如何在Docker中配置Mosquitto MQTT代理,以便在容器化环境中运行和管理MQTT通信。 在开始之前,

    2024年02月10日
    浏览(35)
  • 【ESP8266】使用MQTT协议 连接华为云iotDA,实现设备属性上报

    相关资料:https://github.com/CQUPTLei/ESP8266 往期文章:【ESP8266】基础AT指令和常用WIF指令 【MQTT 5.0】协议 ——发布订阅模式、Qos、keepalive、连接认证、消息结构 华为云物联网平台 (IoT 设备接入云服务)提供海量设备的接入和管理能力,将物理设备联接到云,支撑设备数据采集上

    2024年02月09日
    浏览(29)
  • Windows环境下MosQuitto服务器搭建,安装mqtt服务端软件

    1、下载、安装MosQuitto服务器 下载地址:http://mosquitto.org/files/binary/ 根据平台选择相应的代码下载。 -u是用户名,-P是密码,-t是主题,-h是ip(如:127.0.0.1),-p是端口号 ,-m 是发布的消息 另外开启一个cmd窗口,然后订阅一个主题,主题名字叫 topic 再开启第三个cmd窗口,然后在

    2024年02月08日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包