aiPbMgrSendAck

aiPbMgrSendAck是一个基于 Protobuf 通信框架的确认发送函数,用于在 AI 服务与客户端之间发送响应确认消息。

1. 函数功能

向客户端发送 ACK(Acknowledgment)确认消息,通常用于:

  • 响应命令接收成功
  • 返回处理状态
  • 确认数据接收完成
  • 错误响应

函数

cpp 复制代码
/**
 * @brief 发送 Protobuf 确认消息
 * @param ctx       AI Protobuf 管理器上下文
 * @param cmd       原始命令类型(用于响应关联)
 * @param status    状态码(成功/错误码)
 * @param msg       可选的状态消息字符串
 * @return bool     发送成功返回 true,失败返回 false
 */
bool aiPbMgrSendAck(aiPbMgrCtx_t *ctx, 
                    EnumCmd cmd, 
                    PbAckStatus status, 
                    const char *msg);

典型实现代码

c 复制代码
#include "ai_pb_mgr.h"
#include "pb_encode.h"

bool aiPbMgrSendAck(aiPbMgrCtx_t *ctx, EnumCmd cmd, PbAckStatus status, const char *msg) {
    // 1. 检查参数有效性
    if (!ctx || !ctx->transport_send) {
        PB_LOG_ERROR("Invalid context or transport");
        return false;
    }
    
    // 2. 创建 ACK 消息
    PbAck ack_msg = PbAck_init_zero;
    ack_msg.cmd = cmd;              // 关联原始命令
    ack_msg.status = status;        // 状态码
    ack_msg.timestamp = pb_get_timestamp();  // 时间戳
    
    // 3. 可选的状态消息
    if (msg && strlen(msg) > 0) {
        strncpy(ack_msg.message, msg, sizeof(ack_msg.message) - 1);
        ack_msg.message[sizeof(ack_msg.message) - 1] = '\0';
        ack_msg.has_message = true;
    } else {
        ack_msg.has_message = false;
    }
    
    // 4. Protobuf 编码
    uint8_t tx_buffer[PB_ACK_MAX_SIZE];
    pb_ostream_t stream = pb_ostream_from_buffer(tx_buffer, sizeof(tx_buffer));
    
    if (!pb_encode(&stream, PbAck_fields, &ack_msg)) {
        PB_LOG_ERROR("Failed to encode ACK message: %s", PB_GET_ERROR(&stream));
        return false;
    }
    
    // 5. 通过传输层发送
    size_t sent = ctx->transport_send(ctx->transport_handle, 
                                       tx_buffer, 
                                       stream.bytes_written);
    if (sent != stream.bytes_written) {
        PB_LOG_ERROR("Failed to send ACK, sent %zu/%zu bytes", 
                     sent, stream.bytes_written);
        return false;
    }
    
    PB_LOG_DEBUG("ACK sent for cmd %d, status %d", cmd, status);
    return true;
}

对应的 Protobuf 消息定义

c 复制代码
// ack.proto
syntax = "proto3";

enum PbAckStatus {
    PB_ACK_OK = 0;          // 成功
    PB_ACK_ERROR = 1;       // 通用错误
    PB_ACK_BUSY = 2;        // 设备忙
    PB_ACK_TIMEOUT = 3;     // 超时
    PB_ACK_INVALID_CMD = 4; // 无效命令
    PB_ACK_NO_MEMORY = 5;   // 内存不足
}

message PbAck {
    EnumCmd cmd = 1;            // 原始命令类型
    PbAckStatus status = 2;     // 状态码
    uint64 timestamp = 3;       // 时间戳(毫秒)
    optional string message = 4; // 可选状态描述
}

aiPbMgrSendAck是 AI Protobuf 通信框架中的关键响应函数,用于:

确认机制:确保命令可靠传输;

状态反馈:实时返回处理状态;

错误处理:标准化错误响应;

异步支持:分离命令接收与执行。

命令处理完成后发送成功确认;

参数错误时发送错误响应;

启动长时间操作前发送接收确认。

相关推荐
hz567894 小时前
涉密视频会议设备配置指南:终端、音视频采集与配套设施选型
服务器·网络·数据库·安全·实时音视频·信息与通信·智能硬件
广州浮点FLOATLIC4 小时前
许可证服务器迁移后软件打不开:研发 IT 怎样定位连接问题
linux·服务器·数据库
程序员Sunday4 小时前
MySQL 为什么使用 B+ 树索引?把范围查询、回表和覆盖索引连起来
数据库·mysql
优橙教育4 小时前
零基础学AI应用开发要多久?3个月能到什么水平
服务器·开发语言·网络·php
BLUcoding4 小时前
接口服务公网超时排查记录:SecureRandom 阻塞问题分析与解决
java·linux·springboot·aes·securerandom
半杯咖啡半行码4 小时前
Qt开发实战:数据库、MV 模式、QProcess与串口通信全攻略
数据库·qt
AIgorithmGEEK4 小时前
[Linux]从手写报头到内核套路:序列化、反序列化与自定义协议全链路
linux·运维·服务器·网络·序列化·反序列化
yuniko-n4 小时前
【JUC】Lock 和 synchronzied 锁
java
小米里的大麦4 小时前
16 MySQL 事务
数据库·mysql
西柚小萌新4 小时前
【LLM&&AI应用开发 八股文】--4.3.Agent智能体(下)
java·开发语言·数据库