1. اختر سياسة عدم الاتصال بالإنترنت
لبرنامج C++ على حاسوب معزول عن الشبكة، صدّر طلب تفعيل مرتبطًا بالجهاز، ووافق عليه من حاسوب متصل بالإنترنت، ثم استورد الاستجابة الموقّعة على الحاسوب الأصلي. يتطلب تبادل الملفات هذا ترخيصًا مرتبطًا بالجهاز تسمح سياسته بالتفعيل دون اتصال. وتظل التراخيص العائمة بحاجة إلى جلسة متصلة بالإنترنت.
تُحسب حصة الأجهزة من التفعيلات الحالية وتعود عند التحرير. تبقى التراخيص العادية محسوبة دون اتصال، وتعيد التراخيص العائمة الحصة تلقائيًا أيضًا عند انتهاء الإيجار.
- انسخ معرّف المنتج من لوحة التحكم > المنتجات. افتح مفاتيح التوقيع العامة للمنتج نفسه والصق جميع أزواج معرّف المفتاح والمفتاح العام في كود التهيئة بدلاً من YOUR_PRODUCT_ID وYOUR_KEY_ID وYOUR_PUBLIC_KEY. يمكن للتكامل السريع توليد هذا الكود. لا يلزم ملف إعداد للمنتج؛ يتصل SDK افتراضياً بـ https://www.licentivo.com.
2. قم بتثبيت SDK الأصلي
ثبّت CMake 3.18 أو إصدارًا أحدث أولًا. على Windows x64، استخدم Visual Studio 2022 C++ Build Tools وحزمة SDK المطابقة لـ MSVC، مع -G "Visual Studio 17 2022" -A x64. وعلى Linux x64، استخدم مترجمات C11/C++17. استبدل SDK_PREFIX بمسار بادئة CMake الذي يعرضه برنامج التثبيت. احفظ المثال باسم offline.cpp، واحفظ ملف CMakeLists.txt أدناه في المجلد نفسه. أكمل التثبيت والبناء على حاسوب متصل، ثم انسخ الملف التنفيذي وتبعياته اللازمة للتشغيل إلى الحاسوب غير المتصل.
ثبّت حزمة تطوير libcurl المشتركة المتوافقة مع المترجم والمعمارية. في Windows مع MSVC x64، استبدل CURL_DIR بمجلد يحتوي على CURLConfig.cmake، وأضف مجلد bin الخاص بـ curl إلى PATH للتشغيل المحلي ووزّع ملفات DLL المطلوبة مع التطبيق؛ وفي Linux ثبّت حزمة تطوير libcurl المشتركة الخاصة بتوزيعتك.
& ([scriptblock]::Create((Invoke-WebRequest 'https://www.licentivo.com/assets/sdk/releases/v0.11.6/install.ps1').Content)) -Language cpp -Toolchain msvccurl --fail --silent --show-error --location --proto '=https' --proto-redir '=https' 'https://www.licentivo.com/assets/sdk/releases/v0.11.6/install.sh' | bash -s -- cppcmake_minimum_required(VERSION 3.18)
project(offline_activation LANGUAGES C CXX)
find_package(Licentivo 0.11.6 REQUIRED)
add_executable(offline offline.cpp)
target_link_libraries(offline PRIVATE Licentivo::CPP)
set_target_properties(offline PROPERTIES CXX_STANDARD 17 CXX_STANDARD_REQUIRED ON)cmake -S . -B build -G "Visual Studio 17 2022" -A x64 -DCMAKE_PREFIX_PATH="SDK_PREFIX" -DCURL_DIR="CURL_DIR"
if ($LASTEXITCODE -ne 0) { throw 'CMake configure failed. Check the SDK prefix and matching libcurl development package.' }
cmake --build build --config Release --target offline
if ($LASTEXITCODE -ne 0) { throw 'Build failed.' }set -e
cmake -S . -B build -DCMAKE_BUILD_TYPE=Release -DCMAKE_PREFIX_PATH="SDK_PREFIX"
cmake --build build --target offline3. التصدير والاستيراد باستخدام SDK
احفظ المثال باسم offline.cpp وأضفه إلى مشروع CMake الذي يدعم SDK. قم بتشغيل الطلب دون اتصال YOUR_LICENSE_KEY على الكمبيوتر غير المتصل بالإنترنت. وينتج التنشيط.request.json دون فتح عميل عبر الإنترنت.
انقل هذا الطلب إلى جهاز كمبيوتر متصل. في وحدة تحكم المورد أو بوابة العميل المرتبطة، قم بتحميل الطلب وتنزيل الاستجابة المعتمدة له. احفظه كتنشيط.response.json، ثم أعد كلا الملفين إلى الكمبيوتر الأصلي وقم بتشغيل الاستيراد دون اتصال YOUR_LICENSE_KEY.
#include "licentivo.hpp"
#include <fstream>
#include <iostream>
#include <iterator>
#include <stdexcept>
#include <string>
// BEGIN LICENTIVO PRODUCT
// Copy Product ID and all key ID/public key pairs from Console > Products > Signing public keys.
static const std::string PRODUCT_ID = "YOUR_PRODUCT_ID";
static const std::string TRUSTED_KEYS_JSON = R"({"YOUR_KEY_ID":"YOUR_PUBLIC_KEY"})";
// END LICENTIVO PRODUCT
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 settings are in code; the key is entered by the customer.
if (argc < 3) throw std::runtime_error("Usage: offline request|import LICENSE_KEY");
auto client = licentivo::Client::ForProduct(PRODUCT_ID, TRUSTED_KEYS_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;
}
}./build/Release/offline.exe request YOUR_LICENSE_KEY./build/Release/offline.exe import YOUR_LICENSE_KEY./build/offline request YOUR_LICENSE_KEY./build/offline import YOUR_LICENSE_KEY4. التحقق من النتيجة
- تأكد من نجاح الاستيراد وإنشاء licensed-report.txt.
- أعد التشغيل باستخدام بيانات اعتماد الجهاز المخزن ونفس موقع ذاكرة التخزين المؤقت. يجب أن يسمح عقد الإيجار غير المتصل بالإنترنت الذي لا يزال ساريًا بالميزة المستحقة.
- حاول الاستيراد على جهاز كمبيوتر عادي آخر: يجب أن يرفض التحقق من صحة الجهاز تلك الاستجابة.
- تحقق من انتهاء صلاحية التفويض ومدة عدم الاتصال بالإنترنت. لا يؤدي استيراد الملف إلى تمديد الترخيص الأصلي أو السماح باستخدامه بما يتجاوز الحدود الموقعة.
باستخدام واجهة C
في C، أنشئ عميلًا لم يبدأ تشغيله باستخدام ln_init_product، مع معرّف المنتج والمفاتيح العامة الموثوقة ومفتاح ترخيص العميل. أنشئ الطلب باستخدام ln_offline_request، ثم تحقّق من الطلب والاستجابة واستوردهما باستخدام ln_import_offline. حرّر السلاسل النصية المعادة باستخدام ln_free_string، وحرّر العميل باستخدام ln_destroy.
عند التفعيل الأول دون أي اتصال بالإنترنت، لا تستدعِ ln_start أو ln_open، فهما يحاولان بدء التشغيل عبر الإنترنت. استخدم مسار الطلب والاستيراد الموضح أعلاه، واترك التحقق من الاستجابة الموقّعة إلى SDK؛ ولا تنفّذ تحليل التوقيعات داخل شيفرة التطبيق.
الأعطال الشائعة والحدود التشغيلية
تحقق من معرّف المنتج وجميع أزواج معرّف المفتاح والمفتاح العام وترخيص العميل. المفاتيح العامة تخص المنتج؛ التراخيص وبيانات اعتماد الأجهزة منفصلة. لا توزّع مفاتيح الاختبار أو مفاتيح API الإدارية.
يمكن أن تعني الاستجابة غير الصالحة أن الطلب الأصلي أو المنتج أو الجهاز أو مفتاح التوقيع أو إصدار التطبيق غير متطابق. قم بإحضار الاستجابة الموقعة مرة أخرى إلى الكمبيوتر الذي أنشأ الطلب الخاص بها. لا تقم بتحرير حمولات JSON أو تعطيل التحقق.
الطلب منتهي الصلاحية يحتاج إلى طلب جديد وموافقة. يحتاج عقد الإيجار المنتهي إلى التجديد أو تبادل ملفات أخرى معتمدة وفقًا للسياسة. عمليات الاحتياطي/الالتزام المُقاسة عبر الإنترنت غير متاحة أثناء عدم الاتصال بالإنترنت بشكل كامل.
يصبح إلغاء الربط أو الإلغاء عن بعد معروفًا عند الفحص التالي عبر الإنترنت للجهاز القديم. لا يمكن للجهاز غير المتصل بالإنترنت بشكل دائم أن يتعلم على الفور التغيير من جانب الخادم. اختر مدة عدم الاتصال بالإنترنت مع وضع هذا القيد في الاعتبار.