QuarkIoE会查找跟踪器的所有待处理操作

时间:2016-11-08 09:32:44

标签: cumulocity

我在我的跟踪代理中为特定的确认消息编写解析器。解析后,我想检索跟踪器的所有待处理命令/固件更新,以便我可以将它们与确认内容进行比较,并更新相关操作,以便它们在QuarkIoE中相应显示。

我该怎么做?例如,也许我可以使用OperationsHelper.getOperationsByStatusAndAgent()?但是如何在此级别访问OperationsHelper?

修改

以下是我现在要尝试的内容:

TrackerDevice:

public Iterable<OperationRepresentation> getPendingOps() {
    OperationFilter opsFilter = new OperationFilter().byStatus(OperationStatus.PENDING)
            .byAgent(this.gid.getValue());
    return deviceControl.getOperationsByFilter(opsFilter).get().allPages();
}

我的自定义解析器:

TrackerDevice trackerDevice = trackerAgent.getOrCreateTrackerDevice(reportCtx.getEntry(POS_IMEI));
// Looking into pending operations...
for (OperationRepresentation operation: trackerDevice.getPendingOps()) {
    Firmware frm = operation.get(Firmware.class);
    // ...for firmware updates
    if (frm != null) {
        String command = (String) frm.getProperty("command");

        // (GL200Fallback associated a command string to these)
        if (command != null) {
            Matcher m = commandPattern.matcher(command);

            // In each command there is a random count number...
            if (m.find()) {
                String cmdCountNumber = command.substring(m.start(), m.end());

                // ...that must match with the acknowledgement's
                if (cmdCountNumber.equals(reportCtx.getEntry(POS_COUNT_NUMBER))) {
                    trackerDevice.setOperationSuccessful(operation);
                    return true;
                }
            }
        }
    }
}

1 个答案:

答案 0 :(得分:0)

getOperationsByStatusAndAgent()函数将获取所有跟踪器设备的操作。这可能不是你想要的。

如果检查OperationDispatcher中的startPolling()方法,您将看到代理自动轮询每个跟踪器的操作。这应该在新设备连接或启动代理时自动触发(然后它将开始轮询所有已注册的设备)。

您不需要自行处理新的跟踪器协议。您只需要为实现转换器接口的协议添加类。只要代理收到设备的新操作,就会触发这些操作。

修改

如果您想在设备应答后更新操作,可以通过多种方式进行操作。首先,我将使用TrackerDevice中的DeviceControlApi与操作进行交互。它目前没有在TrackerDevice中公开,但您可以更改它。

要稍后更新操作,您需要操作的ID。您可以缓存操作,例如在将设备对象发送到设备后,或者您需要查询它,例如按status和fragmentType