Cumulocity:c8y_Restart 的两个响应模板,一个有 <BASE>,一个没有 <BASE>,为什么?

Cumulocity: Two response templates for c8y_Restart, one with and one without <BASE>, why?

我正在实现一个连接到使用 Cumulocity 的 Cloud of Things 的客户端。在他们的示例实现中,他们有一个模板集合。但是文档很差。我找到了 c8y_Restart 的两个响应模板,但没有必要这样做。

我已经从 Cumulocity 发送了重启请求,并用我的实现方式回复了它们。使用模板530可以成功设置状态。 使用模板 501,我请求所有 PENDING 操作。但是所有答案都带有响应 511 和 none on 521.

这些是模板 - 请忽略转义的 " 和新行 - 它们来自 C++ 代码

"10,501,GET,/devicecontrol/operations?deviceId=%%&nocache=true&status=%%,,application/vnd.com.nsn.cumulocity.operationCollection+json,%%,UNSIGNED STRING,\n"
"11,511,$.operations,\"$.c8y_Restart\",\"$.id\",\"$.description\"\n"
"11,521,,\"@.c8y_Restart\",\"@.id\",\"@.description\"\n"
"10,530,PUT,/devicecontrol/operations/%%,application/vnd.com.nsn.cumulocity.operation+json,application/vnd.com.nsn.cumulocity.operation+json,%%,UNSIGNED STRING,\"{\"\"status\"\": \"\"%%\"\"}\"\n"

我得到的是 $.operations 是父级操作列表的选择器。字段 c8y_Restart 返回 iddescription

JSONPath 的docu 说@ 对应于当前对象。模板521什么时候有用或者用到?

一般来说,对于 SmartREST 1.0,您通常需要 2 个响应模板来进行操作。第一个(您的 511)用于直接查询 PENDING 操作。这个请求总是 returns 一个数组,这就是为什么你需要一个以数组为基础的模板 ($.operations) 以便遍历它。

如果您订阅实时操作,则需要第二个模板。在这种情况下,您收到的操作始终是单个对象,这就是为什么您不能在此模板中包含 $.operations 以使其工作。这基本上就是您的模板 521,这也是您在查询 PENDING 操作时不会收到任何 521 响应的原因。

我建议避免使用 @ 并始终使用 $。使用 $ 你总是知道会发生什么,但使用 @ 取决于 Cumulocity 如何管理 JsonPath,它可能会导致你不想要的结果。

SmartRest 2.0 for MQTT 解决了每次操作需要 2 个响应模板的问题。