多程序協同的實時資料採集與共享系統

SameX發表於2024-11-01

本文旨在深入探討 HarmonyOS IPC Kit 中的程序間通訊(IPC)機制,基於實際開發實踐實現多程序資料採集與共享系統的設計與開發。本文主要面向開發者,分享資料採集系統架構設計和程式碼實現,並透過案例講解如何在 HarmonyOS 中高效處理多程序資料通訊。

1. 案例背景與需求分析

在物聯網和大資料時代,實時資料採整合為許多應用的核心功能,例如智慧家居的多感測器採集、工業裝置狀態監控等場景。在這些系統中,採集程序通常執行在不同程序空間內,採集的感測器資料需要被整合到一個程序中實時處理,因此需要一種高效的資料共享和通訊機制。

目標需求

  • 多程序資料採集:不同採集程序收集來自多個感測器的資料。
  • 實時資料共享:資料採集程序將採集資料傳遞給資料整合程序進行實時更新。
  • 高效的資料傳輸:在程序間傳輸較大的資料量時不影響系統效能。
  • 資源管理:能夠在採集程序意外終止時,清理資源並觸發資料恢復操作。

涉及技術

  • IPC Kit:透過Client-Server模式實現多程序資料通訊。
  • 共享記憶體:在多個程序間傳輸較大資料量時,使用共享記憶體避免資料複製開銷。
  • 非同步呼叫與多執行緒管理:非同步呼叫使程序不會因資料傳輸而阻塞。
  • 程序消亡通知:遠端消亡通知機制用於監控程序狀態,確保資源安全回收。

2. 系統架構設計

在本系統中,採集資料的程序(採集程序)作為 IPC 客戶端,而負責資料整合的程序(整合程序)作為 IPC 服務端。透過共享記憶體和 IPC Kit,資料可以在程序間快速傳輸。架構分為以下模組:

  1. 採集程序模組:每個採集程序配置獨立的IPC通訊介面,將採集到的資料傳遞至整合程序。
  2. 整合程序模組:整合所有采集程序的資料,透過共享記憶體進行資料管理與實時處理。
  3. 遠端物件消亡通知:透過 registerDeathRecipient 監控程序狀態,處理異常退出的採集程序。

3. 資料採集程序的多執行緒非同步通訊

資料採集程序負責從感測器收集資料,並透過非同步方式將資料傳輸給整合程序。每個採集程序作為IPC客戶端,需要實現如下通訊流程:

  1. 配置 IPC 客戶端介面:透過 IPC Kit 建立程序代理(Proxy),傳送資料至整合程序。
  2. 非同步呼叫避免阻塞:每個採集程序獨立執行資料採集和傳輸的非同步執行緒,以提高效率。
  3. 資料封裝與傳送:將資料封裝到 IPCParcel 中,非同步傳送至整合程序。

示例程式碼

以下為採集程序中的非同步資料傳送程式碼示例,採集的資料透過 SendRequest 非同步傳送到整合程序。

#include <IPCKit/ipc_kit.h>
#include <thread>
#include <mutex>
#include <condition_variable>

class DataCollector {
public:
    DataCollector(OHIPCRemoteProxy* proxy) : proxy_(proxy) {}

    void CollectAndSendData(int sensorData) {
        std::thread([this, sensorData]() {
            OHIPCParcel *data = OH_IPCParcel_Create();
            if (data != nullptr) {
                OH_IPCParcel_WriteInt32(data, sensorData);  // 寫入感測器資料
                SendDataAsync(data);
                OH_IPCParcel_Destroy(data);
            }
        }).detach();
    }

private:
    void SendDataAsync(OHIPCParcel* data) {
        OH_IPC_MessageOption option = { OH_IPC_REQUEST_MODE_ASYNC, 0 };
        OHIPCParcel *reply = OH_IPCParcel_Create();
        int result = OH_IPCRemoteProxy_SendRequest(proxy_, 1, data, reply, &option);
        
        if (result == OH_IPC_SUCCESS) {
            printf("Data sent successfully!\n");
        } else {
            printf("Failed to send data!\n");
        }
        
        OH_IPCParcel_Destroy(reply);
    }

    OHIPCRemoteProxy* proxy_;
};

4. 資料整合程序的資料管理與同步

整合程序作為服務端,需要接收來自多個採集程序的資料,並進行統一的儲存和管理。為提高資料處理效率,整合程序使用共享記憶體(匿名共享記憶體)來儲存並同步各採集程序傳來的資料。同時,為了監控採集程序的狀態,整合程序實現了遠端物件消亡通知。

資料整合流程

  1. 接收採集程序資料:整合程序透過 IPC Kit 接收採集程序的資料請求。
  2. 共享記憶體儲存與資料同步:使用共享記憶體實現資料共享,減少記憶體複製開銷。
  3. 註冊消亡通知回撥:設定 registerDeathRecipient,在採集程序意外退出時,清理相應資源並記錄日誌。

示例程式碼

以下程式碼展示整合程序如何接收資料並儲存至共享記憶體,同時監控採集程序的消亡狀態:

#include <IPCKit/ipc_kit.h>
#include <AbilityKit/native_child_process.h>
#include <hilog/log.h>
#include <unordered_map>
#include <mutex>

class DataAggregator {
public:
    DataAggregator() {
        remoteStub_ = OH_IPCRemoteStub_Create("DATA_AGGREGATOR", OnRequestReceived, nullptr, this);
        OH_IPCRemoteStub_AddDeathRecipient(remoteStub_, &deathRecipient_);
    }

    static int OnRequestReceived(uint32_t code, const OHIPCParcel* data, OHIPCParcel* reply, void* userData) {
        int sensorData = 0;
        if (OH_IPCParcel_ReadInt32(data, &sensorData) == OH_IPC_SUCCESS) {
            auto* aggregator = static_cast<DataAggregator*>(userData);
            aggregator->StoreData(sensorData);
        }
        return OH_IPC_SUCCESS;
    }

    void StoreData(int data) {
        std::lock_guard<std::mutex> lock(dataMutex_);
        // 假設 sharedDataBuffer_ 是共享記憶體對映的地址
        sharedDataBuffer_.emplace_back(data);  
    }

    void RegisterDeathRecipient() {
        deathRecipient_.onRemoteDied = [](void* userData) {
            auto* aggregator = static_cast<DataAggregator*>(userData);
            aggregator->HandleProcessDeath();
        };
        OH_IPCRemoteStub_RegisterDeathRecipient(remoteStub_, &deathRecipient_);
    }

    void HandleProcessDeath() {
        // 處理採集程序消亡的資源清理操作
        printf("採集程序消亡,清理資源!\n");
    }

private:
    OHIPCRemoteStub* remoteStub_;
    std::vector<int> sharedDataBuffer_;
    std::mutex dataMutex_;
    OHIPCDeathRecipient deathRecipient_;
};

5. 程序消亡通知機制的實現

在資料採集系統中,程序消亡會導致資料更新的中斷,因此整合程序需要及時感知採集程序的狀態。當採集程序意外終止時,消亡通知機制將觸發資源清理和報警操作,確保系統的穩定性。

透過在 DataAggregator 中註冊 DeathRecipient 物件來實現對採集程序的監控。當檢測到遠端採集程序消亡,整合程序即可執行相應的清理邏輯並更新系統狀態。


6. 總結

本文展示瞭如何基於HarmonyOS的IPC Kit開發多程序實時資料採集與共享系統,應用了IPC Kit中的Client-Server通訊機制、共享記憶體與消亡通知機制。該系統能夠高效採集和整合感測器資料,並及時管理程序消亡狀態,確保資料採集系統的穩定性。

透過該案例,我們可以掌握程序間通訊的非同步呼叫、共享記憶體傳輸大資料及遠端物件消亡通知的實現方式,為多程序實時資料共享系統的開發提供實用參考。

相關文章