如何使用 SmartREST 接收 cumulocity 实时通知?
How to receive cumulocity real time notifications with SmartREST?
我们使用 cumulocity REST API。定期实时通知工作,例如我们订阅 /alarms/*,开始我们的 connection/polling 循环,当我们创建一个警报时,我们收到预期的 JSON。我们没有安装任何特定的模块或语句,它只是工作。
但是,当我们尝试对 SmartREST 执行相同操作时,我们会在创建警报后立即收到此错误:
40,,/alarms/177649296,Could not find any templates subscribed for the channel
按照参考指南 (http://cumulocity.com/guides/reference/smartrest/) 我们这样尝试,所有请求都具有相同的 X-Id-header 并且所有请求都会导致预期的 http 状态 200 并且没有错误消息,除了最后一个:
- 通过POST到/s
注册智能回复模板
Body: 11,102,,,$.channel
- 握手:POST到/cep/realtime
Body: 80
响应是我们的 clientId(例如 191het1z38bp7iq1m96jqqt8jnef)
- 订阅:POST到/cep/realtime
Body: 81,191het1z38bp7iq1m96jqqt8jnef,/alarms/*
- 连接:POST 到 /cep/realtime
Body: 83,191het1z38bp7iq1m96jqqt8jnef
在正常的 REST 情况下,通知由一个包含 2 个元素的 JSON 数组组成,这两个元素都有一个 属性 "channel"。这就是我们对响应模板的期望。相反,我们得到上述错误 40.
我们的回复模板错了吗?是不是X-Id没有匹配好?没有 "templates subscribed for the channel" 是什么意思?订阅是针对 clientId 完成的,而不是针对特定响应模板完成的,并且无论如何模板都应该自动匹配。所以可能 "template" 在这里意味着 "X-Id"?该文档似乎对该词的含义含糊不清。但无论如何,我们确实在所有请求中使用了相同的 X-Id header。
任何关于我们做错了什么的指示都将不胜感激,因为我们现在已经尝试了几乎所有的东西。
SmartREST 协议是为物联网设备 <-> 平台通信而开发的。因此,从来没有任何设计使用它来订阅实时数据(当然除了设备需要的操作),因为通常设备不需要订阅他们自己创建的数据。
也就是说可以使用它,但有一些限制。你的方法基本上是正确的,但是订阅有一个问题。通配符订阅不适用于 SmartREST,因为在订阅时它会将您的 X-Id 链接到您订阅的频道,但频道 /alarms/* 上永远不会发布消息。因此,这种奇怪的错误消息表示没有为警报出现的频道订阅模板。在 CometD 中,由于通配符订阅,您仍然会收到警报,但 SmartREST 部分不起作用。
消息发布在具有 deviceId 的频道上(例如 /alarms/12345)。
如果您订阅 /alarms/12345 它将起作用。您当然可以订阅任意数量的频道,但通配符订阅将不起作用。
关于模板你需要了解以下内容。 SmartREST 解析不是在 CometD 的原始 JSON 上完成的,而是在其中的有效负载(例如警报)上完成的。因此,警报模板可能如下所示:
11,500,,$.severity,$.id,$.type,$.severity
仅当对象具有严重性并且 return id、类型和严重性时才会触发。
我们使用 cumulocity REST API。定期实时通知工作,例如我们订阅 /alarms/*,开始我们的 connection/polling 循环,当我们创建一个警报时,我们收到预期的 JSON。我们没有安装任何特定的模块或语句,它只是工作。 但是,当我们尝试对 SmartREST 执行相同操作时,我们会在创建警报后立即收到此错误:
40,,/alarms/177649296,Could not find any templates subscribed for the channel
按照参考指南 (http://cumulocity.com/guides/reference/smartrest/) 我们这样尝试,所有请求都具有相同的 X-Id-header 并且所有请求都会导致预期的 http 状态 200 并且没有错误消息,除了最后一个:
- 通过POST到/s
注册智能回复模板 Body:11,102,,,$.channel
- 握手:POST到/cep/realtime
Body:80
响应是我们的 clientId(例如 191het1z38bp7iq1m96jqqt8jnef) - 订阅:POST到/cep/realtime
Body:81,191het1z38bp7iq1m96jqqt8jnef,/alarms/*
- 连接:POST 到 /cep/realtime
Body:83,191het1z38bp7iq1m96jqqt8jnef
在正常的 REST 情况下,通知由一个包含 2 个元素的 JSON 数组组成,这两个元素都有一个 属性 "channel"。这就是我们对响应模板的期望。相反,我们得到上述错误 40.
我们的回复模板错了吗?是不是X-Id没有匹配好?没有 "templates subscribed for the channel" 是什么意思?订阅是针对 clientId 完成的,而不是针对特定响应模板完成的,并且无论如何模板都应该自动匹配。所以可能 "template" 在这里意味着 "X-Id"?该文档似乎对该词的含义含糊不清。但无论如何,我们确实在所有请求中使用了相同的 X-Id header。
任何关于我们做错了什么的指示都将不胜感激,因为我们现在已经尝试了几乎所有的东西。
SmartREST 协议是为物联网设备 <-> 平台通信而开发的。因此,从来没有任何设计使用它来订阅实时数据(当然除了设备需要的操作),因为通常设备不需要订阅他们自己创建的数据。
也就是说可以使用它,但有一些限制。你的方法基本上是正确的,但是订阅有一个问题。通配符订阅不适用于 SmartREST,因为在订阅时它会将您的 X-Id 链接到您订阅的频道,但频道 /alarms/* 上永远不会发布消息。因此,这种奇怪的错误消息表示没有为警报出现的频道订阅模板。在 CometD 中,由于通配符订阅,您仍然会收到警报,但 SmartREST 部分不起作用。
消息发布在具有 deviceId 的频道上(例如 /alarms/12345)。 如果您订阅 /alarms/12345 它将起作用。您当然可以订阅任意数量的频道,但通配符订阅将不起作用。
关于模板你需要了解以下内容。 SmartREST 解析不是在 CometD 的原始 JSON 上完成的,而是在其中的有效负载(例如警报)上完成的。因此,警报模板可能如下所示:
11,500,,$.severity,$.id,$.type,$.severity
仅当对象具有严重性并且 return id、类型和严重性时才会触发。