跳到正文
LICENTIVO / INTEGRATION

為 C/C++ 軟體實作離線電腦啟用

在目標裝置產生申請,以另一台連線電腦取得簽章回應,再匯入原裝置。範例使用共用 C 核心上的 C++ 封裝。

離線流程 · C++17更新日期

1. 選擇允許離線的策略

適用於首次啟用也無法連線的客戶電腦。策略必須允許裝置綁定模式的離線啟用;浮動工作階段無法使用此流程首次啟用。

啟用 export 功能,選擇允許離線時間,產生含產品簽章公鑰的 product.json。授權金鑰由客戶輸入。定期授權從伺服器核准啟用時開始計時,而非回應檔案匯入時。

2. 安裝原生 SDK

在 SDK 文件選擇 C 或 C++、作業系統與官網版本安裝指令,以產生的 CMake 相依設定連結專案。原生核心需要相容的編譯器、libcurl 與 OpenSSL;C++ 需要 C++17。

以下範例使用 licentivo.hpp 與 CMake 目標 Licentivo::CPP。整合套件已包含原生示範目標。將 product.json 放在程式旁,或於正式應用程式使用絕對路徑。

使用預先編譯的 CMake 套件時,可用以下 CMakeLists.txt。執行 cmake -S . -B build -DCMAKE_PREFIX_PATH=SDK_PREFIX,將 SDK_PREFIX 換成安裝器輸出的 CMake prefix 路徑,再執行 cmake --build build --config Release。原始碼套件則依安裝器說明使用 add_subdirectory,取代 find_package。

CMakeLists.txt
cmake_minimum_required(VERSION 3.18)
project(offline_app LANGUAGES C CXX)
set(CMAKE_CXX_STANDARD 17)
find_package(Licentivo 0.10 REQUIRED)
add_executable(offline offline.cpp)
target_link_libraries(offline PRIVATE Licentivo::CPP)

3. 用 SDK 匯出申請與匯入回應

將範例存為 offline.cpp,加入已設定 SDK 的 CMake 專案。在離線電腦執行 offline request YOUR_LICENSE_KEY,產生 activation.request.json;過程不啟動連線用戶端。

把申請帶到連線電腦,在廠商控制台或已關聯電子郵件的客戶入口上傳申請,下載核准回應並命名為 activation.response.json。將申請與回應一同帶回原電腦,執行 offline import YOUR_LICENSE_KEY。

C++17 · offline.cpp
#include "licentivo.hpp"
#include <fstream>
#include <iostream>
#include <iterator>
#include <stdexcept>
#include <string>

std::string readText(const char* path) {
    std::ifstream file(path);
    if (!file) throw std::runtime_error("Cannot read file");
    return {std::istreambuf_iterator<char>(file), {}};
}

int main(int argc, char** argv) {
    try {
        // product.json contains public settings; the key is entered by the customer.
        if (argc < 3) throw std::runtime_error("Usage: offline request|import LICENSE_KEY");
        licentivo::Client client("product.json", argv[2]);
        if (std::string(argv[1]) == "request") {
            std::ofstream file("activation.request.json");
            file << client.OfflineRequest();
            if (!file) throw std::runtime_error("Cannot save request");
            std::cout << "Created activation.request.json\n";
        } else if (std::string(argv[1]) == "import") {
            client.ImportOffline(readText("activation.request.json"),
                                 readText("activation.response.json"));
            client.RunFeature("export", [] {
                std::ofstream file("licensed-report.txt");
                file << "Licensed offline export\n";
                if (!file) throw std::runtime_error("Cannot save report");
            });
            std::cout << "Created licensed-report.txt\n";
        } else {
            throw std::runtime_error("Unknown operation");
        }
    } catch (const std::exception& error) {
        std::cerr << error.what() << '\n';
        return 1;
    }
}

4. 確認啟用結果

  1. 確認匯入成功且產生 licensed-report.txt。
  2. 以相同快取位置及儲存的裝置憑證重新啟動;仍有效的離線租約應允許已授權功能。
  3. 在另一台一般電腦匯入相同回應,裝置驗證應拒絕。
  4. 檢查授權到期時間與離線時間。匯入檔案不會延長原授權,也不能超出簽章允許範圍。

使用 C 介面

C 應用程式以 ln_init_file_with_license 建立未啟動的用戶端,透過 ln_offline_request 產生申請,呼叫 ln_import_offline 驗證及匯入。回傳字串以 ln_free_string 釋放,結束以 ln_destroy 關閉。整合套件中的 C 示範包含這些呼叫。

完全離線首次啟用不要呼叫 Start 或 ln_open,這些啟動介面會嘗試連線。業務程式碼無須自行解析與驗證簽章。

常見失敗與使用限制

回應無效可能是申請、產品、裝置、簽章公鑰或應用程式版本不符。必須帶回產生申請的電腦,不可修改 JSON 內容或停用驗證。

申請到期須重新產生並核准。離線租約到期須依策略續期或再次交換核准檔案。完全離線時無法進行線上計次的預留與確認。

遠端解除綁定或撤銷須等舊裝置下次連線檢查才會得知。永久離線的裝置無法立即得知伺服器變更,設定允許離線時間時應考慮此限制。