2016-11-08 51 views
0

我正在爲我的跟蹤代理中的特定確認消息寫入解析器。在解析時,我想檢索跟蹤器的所有掛起命令/固件更新,以便我可以將它們與確認內容進行比較並更新相關操作,以便它們在QuarkIoE中相應顯示。Cumulocity找到跟蹤器的所有掛起操作

我該怎麼做?例如,也許我可以使用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; 
       } 
      } 
     } 
    } 
} 
+0

你能說出這個類的OperationsHelper來自哪裏嗎?我無法在跟蹤代理或通用Java客戶端中找到它。 – TyrManuZ

+0

/tracker-agent/src/main/java/c8y/trackeragent/operations/OperationsHelper.java –

+0

好吧,它已被更名爲OperationExecutor在較新的版本,但一般功能仍然是相同的 – TyrManuZ

回答

0

的getOperationsByStatusAndAgent()函數將獲得操作所有跟蹤器設備。這可能不是你想要的。

如果在OperationDispatcher中檢查startPolling()方法,您將看到代理自動輪詢每個跟蹤器的操作。這應該在新設備連接或啓動代理時自動觸發(然後它將開始對所有已註冊設備進行輪詢)。

對於新的跟蹤器協議,您不需要自己處理它。您只需要爲實現翻譯界面的協議添加類。只要代理收到設備的新操作,就會觸發這些操作。

編輯:

如果希望在設備回答有多種方法可以做到這一點,更新操作。首先,我將使用TrackerDevice中的DeviceControlApi與操作進行交互。它目前沒有在TrackerDevice中公開,但你可以改變它。

要稍後更新操作,您需要該操作的ID。您可以緩存操作,例如在將設備對象發送給設備後,或者您需要查詢設備對象按狀態和片段類型

+0

是的我已經設法中繼操作我的設備使用translate()。然而,我現在的問題是在稍後時間將設備發送的操作和確認之間的鏈接關聯起來。當跟蹤代理解析這種確認時,我需要瀏覽該設備的所有操作以查找相應的操作並更新其在QuarkIoE中的狀態,我該怎麼做?我正在考慮在我的Fragment的onParsed()方法中做這件事,但我不知道如何瀏覽這些操作。 –

+0

好的,我誤解了這個問題。我更新了我的答案,以包括這一點。 onParsed()方法肯定會是觸發此操作的好地方。 – TyrManuZ

+0

再想一想,我只是通過查看代碼就弄不清楚,這個方法是怎麼調用的?我相信每次設備與跟蹤代理進行通信時,都會調用它,對於所有當前未決的操作,是不是? (參看OperationsDispatcher.executePendingOps())。如果是這樣,如果我在解析器中實現translate()方法並執行if(operation.getText()== someValue),然後執行operation.setStatus「ACCEPTED」)。你明白我的意思嗎?你認爲這會起作用嗎? –