You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用C++创建Google Action fulfillment端点实现树莓派摄像头语音控制

用C++实现Google Action Fulfillment端点的完整指南

作为刚接触Google Action的开发者,卡在Fulfillment环节太正常了,我来帮你一步步理清核心问题:

1. 必须搭建RESTful API端点吗?

没错!Google Action的Fulfillment机制本质就是通过HTTP请求和你的服务通信的。你必须搭建一个公网可访问的REST API端点,用来接收Google发送的意图请求,并返回符合规范的响应数据。

2. 用C++创建Fulfillment端点的具体方案

原生C++没有内置Web服务器,得借助轻量的Web框架来快速实现。推荐几个适合的框架:

  • Pistache:轻量级现代C++ HTTP框架,语法简洁,适合快速开发API
  • Boost.Beast:Boost生态下的HTTP库,灵活性强,适合对性能有要求的场景
  • CppCMS:全功能Web框架,支持模板和会话管理,相对重一些

这里用Pistache举个极简示例,实现处理Google Action POST请求的端点:

#include <pistache/endpoint.h>
#include <pistache/http.h>
#include <nlohmann/json.hpp> // 引入nlohmann/json库处理JSON

using namespace Pistache;
using json = nlohmann::json;

class ActionHandler : public Http::Handler {
public:
    HTTP_PROTOTYPE(ActionHandler)

    void onRequest(const Http::Request& req, Http::ResponseWriter response) override {
        // Google Action默认用POST发送请求,只处理POST
        if (req.method() != Http::Method::Post) {
            response.send(Http::Code::Method_Not_Allowed, "仅支持POST请求");
            return;
        }

        // 解析Google传来的JSON请求体
        json requestJson = json::parse(req.body());
        std::string intentName = requestJson["queryResult"]["intent"]["displayName"];

        // 根据意图生成响应(比如处理"播放摄像头"的指令)
        json responseJson;
        if (intentName == "PlayCameraFeed") {
            // 这里可以加入和树莓派的交互逻辑,比如获取摄像头流地址
            std::string cameraStreamUrl = "http://你的树莓派IP:端口/stream";
            
            responseJson["fulfillmentText"] = "好的,正在为你播放树莓派摄像头画面";
            // 给PC/移动端传递额外数据(比如流地址),放在payload里
            responseJson["payload"] = {{"cameraStreamUrl", cameraStreamUrl}};
        } else {
            responseJson["fulfillmentText"] = "抱歉,我没听懂你的请求";
        }

        // 设置响应头并返回JSON
        response.headers().add<Http::Header::ContentType>(MIME(Application, Json));
        response.send(Http::Code::Ok, responseJson.dump());
    }
};

int main() {
    Http::Endpoint server(Address(Ipv4::any(), Port(9080)));
    auto opts = Http::Endpoint::options().threads(1);
    server.init(opts);
    server.setHandler(Http::make_handler<ActionHandler>());
    server.serve();
    return 0;
}

3. HTTP请求方式:POST还是GET?

Google Action的Fulfillment只会用POST请求向你的端点发送数据。因为请求体包含大量结构化信息(用户语音转文字内容、意图参数、会话上下文等),POST更适合传输这类复杂的JSON payload,GET基本不会用到。

额外关键提示

  • JSON格式要合规:严格遵循Google Action的请求/响应JSON规范,比如请求里的queryResult、intent字段,响应里的fulfillmentText、payload字段都是必填项
  • 公网可访问性:你的C++服务要么部署在公网服务器上,要么本地调试时用ngrok做端口映射,确保Google能调用到你的端点
  • 摄像头流的暴露:先确保树莓派的IP摄像头流(比如用motionEye、ffmpeg搭建的HTTP流)可以被PC/移动端访问,Fulfillment端点只需要把流地址传递给客户端即可

内容的提问来源于stack exchange,提问作者holopekochan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 11:13:48