使用 Google IoT Core 网关和 Pub/Sub 时子文件夹为空
subFolder is empty when using a Google IoT Core gateway and Pub/Sub
我有一个设备通过网关将事件主题 (/devices/<dev_id>/events/motion
) 发布到 PubSub。它正确登陆 PubSub,但 subFolder 只是一个空字符串。
在 网关 我正在使用下面的代码发布。 f"mb.{device_id}"
是 device_id(不是网关 ID,attribute
可以是任何东西 - 运动、温度等
def report(self, device_id, attribute, value):
topic = f"/devices/mb.{device_id}/events/{attribute}"
timestamp = datetime.utcnow().timestamp()
client.publish(topic, json.dumps({"v": value, "ts": timestamp}))
这是 云函数 监听 PubSub 队列。
def iot_to_bigtable(event, context):
payload = json.loads(base64.b64decode(event["data"]).decode("utf-8"))
timestamp = payload.get("ts")
value = payload.get("v")
if not timestamp or value is None:
raise BadDataException()
attributes = event.get("attributes", {})
device_id = attributes.get("deviceId")
registry_id = attributes.get("deviceRegistryId")
attribute = attributes.get("subFolder")
if not device_id or not registry_id or not attribute:
raise BadDataException()
Pub/Sub中的事件示例:
{
@type: 'type.googleapis.com/google.pubsub.v1.PubsubMessage',
attributes: {
deviceId: 'mb.26727bab-0f37-4453-82a4-75d93cb3f374',
deviceNumId: '2859313639674234',
deviceRegistryId: 'mb-staging',
deviceRegistryLocation: 'europe-west1',
gatewayId: 'mb.42e29cd5-08ad-40cf-9c1e-a1974144d39a',
projectId: 'mb-staging',
subFolder: ''
},
data: 'eyJ2IjogImxvdyIsICJ0cyI6IDE1OTA3NjgzNjcuMTMyNDQ4fQ=='
}
为什么 subFolder
是空的?根据文档,我期望它是属性(即 motion
或 temperature
)
此问题与Cloud IoT Core无关。它是由 Pub/Sub 处理失败消息的方式引起的。它正在重试大约 12 小时前失败的消息(并且没有属性)。
您可以通过清除 Pub/Sub 中的订阅来解决此问题。
我有一个设备通过网关将事件主题 (/devices/<dev_id>/events/motion
) 发布到 PubSub。它正确登陆 PubSub,但 subFolder 只是一个空字符串。
在 网关 我正在使用下面的代码发布。 f"mb.{device_id}"
是 device_id(不是网关 ID,attribute
可以是任何东西 - 运动、温度等
def report(self, device_id, attribute, value):
topic = f"/devices/mb.{device_id}/events/{attribute}"
timestamp = datetime.utcnow().timestamp()
client.publish(topic, json.dumps({"v": value, "ts": timestamp}))
这是 云函数 监听 PubSub 队列。
def iot_to_bigtable(event, context):
payload = json.loads(base64.b64decode(event["data"]).decode("utf-8"))
timestamp = payload.get("ts")
value = payload.get("v")
if not timestamp or value is None:
raise BadDataException()
attributes = event.get("attributes", {})
device_id = attributes.get("deviceId")
registry_id = attributes.get("deviceRegistryId")
attribute = attributes.get("subFolder")
if not device_id or not registry_id or not attribute:
raise BadDataException()
Pub/Sub中的事件示例:
{
@type: 'type.googleapis.com/google.pubsub.v1.PubsubMessage',
attributes: {
deviceId: 'mb.26727bab-0f37-4453-82a4-75d93cb3f374',
deviceNumId: '2859313639674234',
deviceRegistryId: 'mb-staging',
deviceRegistryLocation: 'europe-west1',
gatewayId: 'mb.42e29cd5-08ad-40cf-9c1e-a1974144d39a',
projectId: 'mb-staging',
subFolder: ''
},
data: 'eyJ2IjogImxvdyIsICJ0cyI6IDE1OTA3NjgzNjcuMTMyNDQ4fQ=='
}
为什么 subFolder
是空的?根据文档,我期望它是属性(即 motion
或 temperature
)
此问题与Cloud IoT Core无关。它是由 Pub/Sub 处理失败消息的方式引起的。它正在重试大约 12 小时前失败的消息(并且没有属性)。
您可以通过清除 Pub/Sub 中的订阅来解决此问题。