无GCP SDK的微控制器如何通过HTTP向Pub/Sub发送数据?
无SDK设备向GCP Pub/Sub发送数据的极简方案
GCP支持无SDK/类库的设备通过HTTP向Pub/Sub发送数据,有两种可行方案,可根据你的微控制器资源情况选择:
方案一:直接调用Pub/Sub REST API
适合具备基础加密计算能力(支持RSA签名、SHA256哈希)的微控制器,无需中间层。
步骤1:前置准备
- 在GCP控制台创建Pub/Sub主题,记录项目ID和主题名称。
- 创建服务账号,授予
Pub/Sub Publisher权限,下载JSON格式的密钥文件(包含私钥和服务账号邮箱)。
步骤2:获取OAuth2访问令牌
Pub/Sub API要求Bearer认证,需为服务账号生成访问令牌:
- 若微控制器资源有限,可先用本地脚本(如Python)预先生成短期令牌(有效期1小时),到期后重新生成替换。
- 若微控制器支持加密运算,可在设备上构造JWT并请求令牌:
- 构造JWT头部:
{"alg": "RS256", "typ": "JWT"} - 构造JWT载荷:包含
iss(服务账号邮箱)、scope(https://www.googleapis.com/auth/pubsub)、aud(https://oauth2.googleapis.com/token)、exp(过期时间戳)、iat(签发时间戳) - 用服务账号私钥对头部+载荷的Base64拼接字符串做RS256签名,生成完整JWT
- 发送POST请求到
https://oauth2.googleapis.com/token,参数grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer,assertion为生成的JWT,返回的access_token即为Bearer令牌。
- 构造JWT头部:
步骤3:发送温度数据
构造HTTP POST请求到以下端点:
POST https://pubsub.googleapis.com/v1/projects/{你的项目ID}/topics/{你的主题名称}:publish
请求头需包含:
Authorization: Bearer {你的访问令牌}Content-Type: application/json
请求体格式(温度数据需Base64编码):
{ "messages": [ { "data": "MjUuNg==" // 示例:"25.6"的Base64编码 } ] }
方案二:用Cloud Functions做中间层
适合资源受限、无法处理加密运算或Base64编码的微控制器,只需发送简单HTTP请求。
步骤1:创建Cloud Functions端点
- 选择HTTP触发器,编写转发代码(以Python为例):
from google.cloud import pubsub_v1 publisher = pubsub_v1.PublisherClient() TOPIC_PATH = publisher.topic_path("你的项目ID", "你的主题名称") def forward_temp_to_pubsub(request): req_data = request.get_json() temp = req_data.get("temperature") if not temp: return "缺少温度数据", 400 # 直接将温度转为字节发送到Pub/Sub future = publisher.publish(TOPIC_PATH, str(temp).encode("utf-8")) return f"消息已提交: {future.result()}", 200
- 部署时为Cloud Functions的默认服务账号授予
Pub/Sub Publisher权限。
步骤2:微控制器发送请求
只需向Cloud Functions的部署URL发送HTTP POST请求,请求体用简单JSON格式:
{"temperature": 25.6}
可选:为端点添加简单验证(如请求头携带自定义API密钥,在代码中校验),避免非法请求。
内容的提问来源于stack exchange,提问作者AJV
相关产品推荐
相关产品推荐

