首页 > 解决方案 > oneM2M 中的执行器控制

问题描述

我阅读了在 OneM2M 中进行双向通信的文档。我知道这样做的一种方法是使用订阅和通知系统。假设我们有一个如下图所示的示例。IN-AE(智能手机)想打开ADN-AE2的灯。假设注册和资源创建已经完成,并且 ADN-AE-2 已经订阅了 ADN-AE-2 中的灯容器。

因此,oneM2M 涵盖了 IN-AE 如何发送光控请求以及 ADN-AE-2 或 ADN-AE-1 如何获取来自 IN-AE 的请求并执行它的部分。但是,如果 ADN-AE-2 无法控制灯光并在控制时出现故障怎么办。应该是什么场景?已使用 IN-AE 发送的请求创建了 contentinstance。

1- ADN-AE-2 是否应该创建另一个内容实例,它是容器的先前状态

2- ADN-AE-2 是否应该删除未执行的内容实例(那么其他接收通知并成功执行的订阅者呢)

如果执行器无法执行操作,推荐的方式应该是什么?

在此处输入图像描述

http://www.onem2m.org/tr-0034/procedures/actuator-switch-control

标签: onem2m

解决方案


这是异步通信中的普遍问题。当接收者从未收到命令,或者只是无法执行它(无论出于何种原因,例如它正忙于做其他事情或请求超出某些参数)时会发生什么?

您的两个选项都有效,但在 ADN 离线时将不起作用,因此 ADN-AE2 无法执行这些过程。此外,即使 ADN 始终在线,当有多个其他 AE 想要控制 ADN-AE2 时,或者当 IN-AE 不耐烦地一次又一次地设置所需状态时,这两个程序都会出现问题。这通常可能导致竞争条件。

我建议重新考虑两个 AE 之间的通信方案,并将原始 Container 拆分为两个:一个 Container 用于目标状态,另一个 Container 用于状态状态。除了 ADN-AE2 之外,AE使用目标Container 来设置所需的状态。ADN-AE2 被通知创建了一个新的 ContentInstance 并相应地采取行动。然后它在状态容器中创建一个新的 ContentInstance来反映新的内部状态,这将通知 IN-AE 以反映更改。

下图反映了此模式的示例资源结构:

AE ─┬─ Container_target ─── ContentInstances*   ◀═══ Container for desired state, set by other AEs
    │                                      
    └─ Container_state ─── ContentInstances*    ◀═══ Container for actual state, set only by this AE

当节点之间的连接并不总是可靠时,或者当状态更改请求的结果并不总是得到保证时,这是异步通信中的一种常见模式。执行请求的责任在于 ADN-AE2,重试频率或对失败做出反应的策略在于 IN-AE。


推荐阅读