【问题标题】:How to receive cumulocity real time notifications with SmartREST?如何使用 SmartREST 接收累积实时通知?
【发布时间】:2017-08-21 13:49:49
【问题描述】:

我们使用 cumulocity REST API。定期实时通知工作,例如我们订阅/alarms/*,启动我们的连接/轮询循环,当我们创建警报时,我们会收到预期的 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 并且没有错误消息,除了最后一个:

  1. 通过 POST 到 /s
    注册智能响应模板 正文:11,102,,,$.channel
  2. 握手:POST 到 /cep/realtime
    正文:80 响应是我们的 clientId(例如 191het1z38bp7iq1m96jqqt8jnef)
  3. 订阅:POST 到 /cep/realtime
    正文:81,191het1z38bp7iq1m96jqqt8jnef,/alarms/*
  4. 连接:POST 到 /cep/realtime
    正文:83,191het1z38bp7iq1m96jqqt8jnef

在正常的 REST 情况下,通知由一个带有 2 个元素的 JSON 数组组成,这两个元素都有一个属性“通道”。这就是我们对响应模板的期望。相反,我们得到了上述错误 40。

我们的回复模板错了吗? X-Id 是否没有正确匹配?没有“为频道订阅的模板”是什么意思?订阅是针对 clientId 完成的,而不是针对特定的响应模板,并且无论如何都应该自动匹配模板。那么“模板”在这里可能意味着“X-Id”吗?文档对于该词的含义似乎模棱两可。但无论如何,我们确实在所有请求中使用了相同的 X-Id 标头。

任何关于我们做错了什么的指针都将不胜感激,因为我们现在几乎尝试了任何事情。

【问题讨论】:

    标签: complex-event-processing cumulocity


    【解决方案1】:

    SmartREST 协议是为物联网设备 平台通信而开发的。因此,从来没有任何设计可以使用它来订阅实时数据(当然设备需要的操作除外),因为通常设备不需要订阅他们自己创建的数据。

    也就是说可以使用它,但有一些限制。您的方法基本上是正确的,但是订阅存在一个问题。通配符订阅不适用于 SmartREST,因为订阅时它将您的 X-Id 与您订阅的频道相关联,但从未在频道 /alarms/* 上发布消息。因此,这种奇怪的错误消息说没有为出现警报的频道订阅模板。在 CometD 中,由于通配符订阅,您仍然会收到警报,但 SmartREST 部分不起作用。

    消息在带有 deviceId 的通道上发布(例如 /alarms/12345)。 如果您订阅 /alarms/12345 它将起作用。您当然可以订阅任意数量的频道,但通配符订阅不起作用。

    关于模板,您需要了解以下内容。 SmartREST 解析不是在 CometD 的原始 JSON 上完成,而是在其中的有效负载(例如警报)上完成。因此,警报模板可能如下所示:

    11,500,,$.severity,$.id,$.type,$.severity
    

    仅当对象具有严重性并返回 id、类型和严重性时才会触发。

    【讨论】:

    • 谢谢!这正是我需要的解释。我们总是使用通配符进行测试,因为它非常方便。不知道 SmartREST 不支持它。通过订阅特定频道,它可以工作。 :)
    • 一点澄清:实验表明“它将您的X-Id与您订阅的频道联系起来”与问题stackoverflow.com/q/35841237/8495341中提到的排队机制无关,如果我再握手,但是使用相同的 X-Id,那么我之前的订阅以及可能同时在服务器上排队的数据不会转移到新连接,我也没有收到任何这些通知。这是有道理的,因为多个设备可以随时使用同一个 X-Id 连接。
    • 是的,这是正确的。 X-Id 与一般的 CometD 流程无关。它仅用于从 JSON 到 CSV 的映射。 CometD 流程定义了您获得的内容和缓存的内容,就像您使用 JSON 有效负载一样
    猜你喜欢
    • 2018-05-13
    • 1970-01-01
    • 2020-04-08
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    • 2016-12-27
    • 2014-06-26
    相关资源
    最近更新 更多