Google SDM APINest 设备的 Google PubSub 订阅者问题

如何解决Google SDM APINest 设备的 Google PubSub 订阅者问题

所以,我被卡住了。这可能会很长,因为我想建立所有(或我所做的大部分)以达到这一点:

背景:想要为 Raspberry PI 创建一个应用程序,该应用程序可以访问和操作 Nest 设备套件(门铃、恒温器等)。我目前正在笔记本电脑上的 Ubuntu VM 中执行此操作。

我做了什么:

  1. 按照谷歌提供的步骤创建了一个设备访问项目。
  2. 还创建了一个 GCP 项目(与上面的不同),以便能够设置 OAuth 和订阅设置
  3. Device Access 项目使用 GCP 项目中的 OAuth,即 Device Access 项目具有引用 GCP 项目 OAuth 的字段
  4. 完成了设备访问项目步骤,通过浏览器页面授予权限,直到我创建和使用授权代码为止,我获得了我的第一个访问令牌。我可以执行 CURL 命令来检索 Nest 设备特征,甚至可以执行 RTSP url 来访问相机流。

所以我已经完成了一半,因为我可以使用 OAuth 访问令牌与设备 (REST API) 进行交互。但我想要做的是能够对来自设备的事件做出反应,这需要 PubSub 交互性。这就是我被卡住的地方

额外步骤:我还在 GCP Credentials 中创建了一个服务帐户,因为我在文档中看到它可能是必需的,而 googles 算法需要一个 GOOGLE_APPLICATION_CREDENTIALS 环境变量到一个带有下载的服务帐户凭据的 json 文件。所以检查

  1. 在设置设备访问项目时,创建了一个 PubSub 主题。在 GCP 控制台中,我为 GCP 项目创建了相应的订阅,并手动将其引用到作为设备访问项目的一部分创建的主题(上述步骤)
  2. 文档中提到,当您第一次通过 REST API 与 OAuth 访问令牌交互时,发布订阅功能变得可用。注意:我可以从 GCP Console 的 PubSub 订阅页面确认此“查看消息”。我能够“拉”消息并看到消息出现在订阅中。我知道通过拉取消息,我暂时阻止它们出现在其他队列中,但我想检查消息是否能够填充到订阅中。

好的。所以,不,我想编写代码来访问 pubsub 订阅并围绕对这些事件消息做出反应来创建我的应用程序(或其中的一部分)。这就是我被困两天的地方。

我根据谷歌提供的方法创建了一个 python 脚本(我不介意包含 ID,因为这不是私有的)

from google.cloud import pubsub_v1
from concurrent.futures import TimeoutError

project_id = 'nestcontroller-299520'
subscription_id = 'NestEventPull'
timeout = 60.0

subscriber = pubsub_v1.SubscriberClient()
subscription_path = subscriber.subscription_path(project_id,subscription_id)

def callback(message):
    print(f"Received a message: \n")
    print(f"{message} \n")
    message.ack()

future = subscriber.subscribe(subscription_path,callback=callback)
print(f"\nprojtest - listening for messages on: {subscription_path}\n")
print(f"subscription_id : {subscription_id}\n")

with subscriber:
    try:
        future.result(timeout=timeout)
    except:
        TimeoutError
        future.cancel()

输出如下:

projtest - listening for messages on: projects/nestcontroller-299520/subscriptions/NestControlSub

subscription_id : NestControlSub

Background thread did not exit.
ERROR:root:Exception in callback <bound method ResumableBidiRpc._on_call_done of <google.api_core.bidi.ResumableBidiRpc object at 0x7f042ae47fa0>>: ValueError('Cannot invoke RPC: Channel closed!')

上面的代码“卡住”了 60 秒,之后“后台线程没有退出”。和错误出现

我尝试了上述的几种变体,包括另一个使用(即“PIP INSTALL”ing)google-cloud-pubsub库的python脚本,但最终我尝试了以下,我从另一个解决方案中借用了我试图找出“卡住”时发生了什么。

    project_id = 'nestcontroller-299520'
    subscription_id = 'NestControlSub'
    topic_id = 'projects/sdm-prod/topics/enterprise-5a0f7c4e-d20d-4e56-968d-c6239936a3b0'


    def callback(message,event):
        logger.info(message)
        event.set()

    subscriber = pubsub_v1.SubscriberClient()

    event = Event()

    def callback_wrapper(message):
        callback(message,event)

    future = subscriber.subscribe('subscription/path',callback=callback_wrapper)

    event.wait()
    logger.exception('Got event. Shutting down.')
    future.cancel()
    exit(1) 

这立即导致以下“无效授权:未找到帐户”错误,不断重复,直到我取消脚本...

ERROR:grpc._plugin_wrapping:AuthMetadataPluginCallback "<google.auth.transport.grpc.AuthMetadataPlugin object at 0x7f7188d17d30>" raised exception!
Traceback (most recent call last):
  File "/home/christian/PythonProjects/google-cloud-pubsub/venv/lib/python3.8/site-packages/grpc/_plugin_wrapping.py",line 77,in __call__
    self._metadata_plugin(
  File "/home/christian/PythonProjects/google-cloud-pubsub/venv/lib/python3.8/site-packages/google/auth/transport/grpc.py",line 86,in __call__
    callback(self._get_authorization_headers(context),None)
  File "/home/christian/PythonProjects/google-cloud-pubsub/venv/lib/python3.8/site-packages/google/auth/transport/grpc.py",line 72,in _get_authorization_headers
    self._credentials.before_request(
  File "/home/christian/PythonProjects/google-cloud-pubsub/venv/lib/python3.8/site-packages/google/auth/credentials.py",line 133,in before_request
    self.refresh(request)
  File "/home/christian/PythonProjects/google-cloud-pubsub/venv/lib/python3.8/site-packages/google/oauth2/service_account.py",line 361,in refresh
    access_token,expiry,_ = _client.jwt_grant(request,self._token_uri,assertion)
  File "/home/christian/PythonProjects/google-cloud-pubsub/venv/lib/python3.8/site-packages/google/oauth2/_client.py",line 153,in jwt_grant
    response_data = _token_endpoint_request(request,token_uri,body)
  File "/home/christian/PythonProjects/google-cloud-pubsub/venv/lib/python3.8/site-packages/google/oauth2/_client.py",line 124,in _token_endpoint_request
    _handle_error_response(response_body)
  File "/home/christian/PythonProjects/google-cloud-pubsub/venv/lib/python3.8/site-packages/google/oauth2/_client.py",line 60,in _handle_error_response
    raise exceptions.RefreshError(error_details,response_body)
google.auth.exceptions.RefreshError: ('invalid_grant: Invalid grant: account not found','{"error":"invalid_grant","error_description":"Invalid grant: account not found"}')
INFO:google.cloud.pubsub_v1.subscriber._protocol.streaming_pull_manager:Observed non-terminating stream error 503 Getting metadata from plugin failed with error: ('invalid_grant: Invalid grant: account not found',"error_description":"Invalid grant: account not found"}')
INFO:google.cloud.pubsub_v1.subscriber._protocol.streaming_pull_manager:Observed recoverable stream error 503 Getting metadata from plugin failed with error: ('invalid_grant: Invalid grant: account not found',"error_description":"Invalid grant: account not found"}')
INFO:google.api_core.bidi:Re-established stream
INFO:google.cloud.pubsub_v1.subscriber._protocol.streaming_pull_manager:Observed non-terminating stream error 503 Getting metadata from plugin failed with error: ('invalid_grant: Invalid grant: account not found',"error_description":"Invalid grant: account not found"}')

有人知道为什么 Pubsub 模型不起作用,即使我遵循了所有可能的文档变体吗?我已尝试更改凭据文件详细信息(只要我不使用服务帐户凭据,它就会给出明确定义的错误,因此这似乎不是问题。

任何帮助或提示将不胜感激。

解决方法

好的。因此,经过一夜好眠和幸运的 YouTube 视频后,我找到了遗漏的步骤。

必须为 Pub/Sub 发布者和 Pub/Sub 订阅者角色专门配置服务帐户的角色。完成此操作并重新激活服务帐户后,evnet 消息开始通过

无论如何,我希望上面的过程和结论可以帮助任何遇到同样问题的人

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res