Device License SDKPlatform 13.3.7 · SDK 3.1.0

執行期

長時間 GUI Session

對長時間開啟的 GUI、服務或自動化工具維持重新驗證與執行期席位。

這個範例解決什麼問題

桌面工程工具常常會開啟數小時甚至數天。若只在啟動時驗證一次,License 在執行期間過期、被撤銷或失去席位時,程式仍可能繼續使用。licensed_session() 用來集中管理這段生命週期。

適合使用的場景

  • GUI 會長時間保持開啟,期間可能反覆執行受保護操作。
  • Policy 使用 Process 或並行席位,需要定期 Heartbeat。
  • 你需要在 License 狀態改變後,不必重啟程式就能停止高價值功能。

為什麼採用這種設計

  • 週期性重新驗證可以縮短撤銷或過期狀態被 Client 感知的時間。
  • Context manager 讓 Process Seat 與 Heartbeat 的取得、維持與釋放集中在同一個生命週期。
  • 在高價值操作前呼叫 session.check(),可避免只依賴背景計時器的最後一次結果。

程式實際怎麼執行

Session 不會自行定時做完整 License 重驗。啟用 Machine/Process 時各有一條 daemon Heartbeat thread;應用程式必須用 Timer、scheduler 或工作 checkpoint 呼叫 session.check()。

SDK 自動完成

  • 進入 context 時同步驗證。
  • 已啟用的 Heartbeat 在背景自動 ping。
  • 正常離開時停止 thread 並釋放 Process Seat。

你的程式必須負責

  • 定期呼叫 session.check() 接收背景錯誤。
  • 高價值操作前用 force_validate=True。
  • GUI 在 worker 執行阻塞網路工作。

呼叫時機/頻率

  • 例如每 15 秒 check(False)。
  • revalidate_interval_seconds=300 只讓每 5 分鐘到期的 check 做完整重驗。
  • 不用無延遲 for 迴圈。

成功時應看到

  • 一般 check 快速讀本機健康。
  • 到期/force 時更新 session.state。
  • 背景失敗在下一次 check 轉成 HeartbeatError。

失敗處理

  • 失效後禁止新工作。
  • 關閉 GUI 時離開 context。
  • 停止 Heartbeat 不等於解除 Machine。

建議整合步驟

  1. 步驟 1

    根據產品風險與離線容忍度決定 revalidate_interval_seconds。

  2. 步驟 2

    在應用程式主要生命週期外層建立 licensed_session()。

  3. 步驟 3

    在匯出、產檔、燒錄或分析等高價值操作前呼叫 session.check()。

  4. 步驟 4

    處理 Session 失效事件,停用功能並引導使用者重新連線或聯絡管理員。

完整程式碼

公開範例使用 Placeholder,重點是理解資料流與 API 行為。正式 Gateway URL、Product UUID、Namespace 與 Public Key 請向授權管理員取得;可直接運行的完整範例由管理員在 Admin SDK 整合中心下載。

python
"""Framework-neutral long-running Session pattern.

Important: revalidate_interval_seconds is NOT a timer. The application must
call session.check() from its own GUI timer, scheduler, or work checkpoint.
Machine and Process heartbeat pings run in SDK daemon threads only when their
options are enabled.
"""

from __future__ import annotations



import threading



from keygen_device_sdk import HeartbeatError, LicenseSDKError





def run_application(client, stop_event: threading.Event, first_license_key=None) -> None:

    try:

        with client.licensed_session(

            first_license_key,

            required_entitlements=("YOUR_FEATURE_CODE",),

            machine_heartbeat=True,

            process_seat=True,

            revalidate_interval_seconds=300,

        ) as session:

            while not stop_event.wait(15.0):

                # Usually a fast local heartbeat-health check. Every 300 seconds,

                # one of these calls also performs full HTTPS + TPM validation.

                session.check(force_validate=False)



                # Before export/burn/generation, run this in a GUI worker:

                # session.check(force_validate=True)

                # session.state.require("YOUR_FEATURE_CODE")

    except HeartbeatError as exc:

        print(f"Runtime heartbeat failed; disable protected work: {exc}")

    except LicenseSDKError as exc:

        print(f"Licensed session failed; disable protected work: {exc}")

上線前至少測試

  • 撤銷不重啟即可生效。
  • 斷網達門檻。
  • Process 正常釋放。
  • 無 busy loop。

常見錯誤

  • 不要把 revalidate interval 設成極長時間來規避線上驗證。
  • 不要在 Session 失效後只顯示警告但仍繼續執行受保護操作。
  • 不要把 Process Seat 與 Machine activation 混為一談。