Device License SDKPlatform 13.3.7 · SDK 3.1.0

授權場景

長時間執行、Heartbeat 與並行席位

讓長時間 GUI 或自動化程式在執行期間持續感知 License 狀態,而不是只在啟動時檢查一次。

為什麼啟動時驗證一次不夠

程式啟動後,License 可能過期、被撤銷、失去 Entitlement,或因其他實例取得席位而超過 Process 限制。若 Client 永遠沿用啟動時的結果,管理端狀態就無法在合理時間內生效。

哪些工作自動、哪些不自動

工作SDK 是否自動你的責任
進入 Session同步註冊/驗證一次GUI 請放到 worker,因為會阻塞網路。
Machine Heartbeatmachine_heartbeat=True 時由一條 daemon thread 自動 ping定期 session.check() 接收背景失敗。
Process Heartbeatprocess_seat=True 時由另一條 daemon thread 自動 ping正常離開 context 釋放 Process Seat。
完整 License 重驗不會自動排程用 GUI Timer、服務 scheduler 或工作 checkpoint 呼叫 session.check()。
Check-incheck_in_on_start 只有進入時一次後續依 next_check_in 自行排程。

revalidate_interval_seconds 到底是什麼

它不是 Timer,也不會建立執行緒。它只是一個『當 session.check() 被呼叫時,距離上次完整驗證是否已經夠久』的門檻。例如每 15 秒由 GUI worker 呼叫一次 session.check(),並設定 revalidate_interval_seconds=300:前 19 次通常只做快速本機 Heartbeat 健康檢查;達 300 秒的那一次才同步執行 HTTPS + TPM 完整重驗。

licensed_session() 的正確骨架

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}")

GUI 整合模式

  1. Worker 擁有 Session

    進入 context、session.check() 與 force validation 都在 worker thread 執行。

  2. UI Timer 只發出工作要求

    例如每 15 秒要求 worker 執行一次 check,不要讓 UI thread 等待 HTTPS。

  3. 高價值操作先 force check

    匯出、燒錄、產檔或分析前由 worker 呼叫 session.check(force_validate=True),成功後才執行。

  4. 把錯誤傳回 UI

    HeartbeatError、LicenseInvalidError 或 GatewayError 都應停用功能並顯示可理解訊息。

  5. 關閉時離開 context

    停止 Heartbeat thread 並釋放 Process Seat;Server Machine 不會因此解除。

間隔怎麼選

前景 check 頻率與完整重驗間隔是兩個不同參數。前景 check 可較短,用來及時接收背景 Heartbeat 失敗;完整重驗間隔則依撤銷速度、網路負載與離線容忍度設定。高價值操作仍可 force_validate,不必把整體間隔設得非常短。

  • UI/服務有明確的 check scheduler
  • revalidate interval 不由終端使用者任意修改
  • 網路失敗與 License 無效使用不同錯誤狀態
  • Process Seat 在程式正常結束時釋放
  • 異常中止依 Heartbeat timeout 回收
  • 撤銷測試不需要重啟程式即可生效
下一步

把文件轉成可驗證的整合流程

先在測試 License 上完成首次註冊、後續驗證、撤銷與斷線測試,再將相同模式接入正式功能。

查看 Quickstart