如何在Python3和CURL中使用HTTP Bridge发布到GCP发布/订阅主题?

时间:2020-05-14 10:10:48

标签: google-cloud-platform google-cloud-functions google-cloud-pubsub google-cloud-iot

我正在尝试使用python3和CURL通过HTTP Bridge发布到发布/订阅主题。

**Python3**

import json
import logging
import os
import socket
import sys
import time
import requests
URL = 'https://cloudiotdevice.googleapis.com/v1/projects/{}/locations/{}/registries/{}/devices/{}:publishEvent'
JWT = 'JWT'

def main():
    if not URL or not JWT:
        sys.exit("Are the Environment Variables set?")
    get_sensor_data(socket.gethostname())
def get_sensor_data(device_id):
    while True:
        print("in get_sensor data")
        payload = {'device': str('asd'),
                   'type': str('adssaff'),
                   'timestamp': str(time.time()),
                   'data': json.dumps({'temperature': str('23'),
                            'humidity': str('442')})}
        post_data(payload)
        print("data printed")
        time.sleep(5)
def post_data(payload):
    payload = json.dumps(payload)
    headers = {
        'Content-Type': 'application/json; charset=utf-8',
        'Authorization': JWT
    }
    try:
        req = requests.post(URL, json=str(payload), headers=headers)
        print("request Successfull "+str(req))
    except requests.exceptions.ConnectionError:
        logging.error('Error posting data to Cloud Function!')
    except requests.exceptions.MissingSchema:
        logging.error('Error posting data to Cloud Function! Are Environment Variables set?')
if __name__ == '__main__':

这给出了错误400,因为我认为我没有描述子文件夹。 现在我感到困惑,我在代码中的哪里可以定义子文件夹(主题名称)? 并且只有子文件夹丢失了吗?还是我做错了什么?

CURL

我也尝试使用

中所述的CURL命令

https://cloud.google.com/iot/docs/how-tos/http-bridge

命令是

curl -X POST -H 'authorization: Bearer JWT' -H 'content-type: application/json' --data '{"binary_data": "DATA", "sub_folder": "SUBFOLDER"}' -H 'cache-control: no-cache' 'https://cloudiotdevice.googleapis.com/v1/projects/{project-id}/locations/{cloud-region}/registries/{registry-id}/devices/{device-id}:publishEvent'

它触发了我的云功能,这意味着授权有效,但是我无法在日志中看到“ DATA”。我假设我没有为binary_data提供正确的格式。如果我也想使用curl发布上述“有效载荷”,为什么是正确的格式?

2 个答案:

答案 0 :(得分:2)

您似乎正在使用data字段设置为对象而不是二进制string的JSON有效负载。尝试在json.dumps字段中'data'对象或将'data'字段作为字符串发送。

答案 1 :(得分:0)

来自本文档。 https://cloud.google.com/iot/docs/reference/cloudiotdevice/rest/v1/projects.locations.registries.devices/publishEvent

我发现我的有效载荷请求正文不正确。

因此有效负载应如下所示。.

s= json.jumps('json object')
payload = {"subFolder": 'Sub_FOLDER_NAME', "binaryData": base64.b64encode(s.encode('utf-8'))}