如何用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
相关产品推荐
相关产品推荐

