
مهندس عكسيًا لبروتوكول IPC الخاص بعميل Logi Options+. قم بتبديل أجهزة Logitech متعددة المضيفين برمجيًا عبر مقبس Unix (macOS) أو أنبوب مسمى (Windows).
توثيق هندسي عكسي لبروتوكول IPC لعامل Logi Options+. يتيح التحكم البرمجي في أجهزة Logitech متعددة المضيفين (تبديل المضيف، استعلامات الجهاز) دون الوصول المباشر إلى HID، على كل من macOS و Windows.
لم يتم توثيق هذا البروتوكول بشكل علني قبل هذا المشروع.
يحظر macOS الوصول المباشر إلى HID لأجهزة الإدخال عبر Bluetooth على مستوى النواة. لا توجد أذونات أو صلاحيات أو اختراقات تتجاوز ذلك. يمتلك عامل Logi Options+ صلاحيات موقععة من Apple (com.apple.security.device.bluetooth) تمنحه الوصول إلى HID عبر Bluetooth. يتواصل هذا المشروع مع العامل عبر قناة IPC الخاصة به بدلاً من ذلك.
| الملف | الوصف |
|---|---|
logi-options-ipc-reverse-engineering.md | السجل الكامل للهندسة العكسية |
software-kvm-setup.md | دليل إعداد KVM برمجي ثنائي الاتجاه (Windows + Mac) |
switch_to_windows.py | سكريبت جانب Mac يقوم بتبديل أجهزة Logitech وإدخال الشاشة عبر IPC مقبس Unix |
api-reference.md | مرجع API للعامل: نقاط النهاية العاملة، أنواع protobuf، قدرات الجهاز |
kvm.ahk | سكريبت AutoHotkey v2: مفاتيح اختصار Win+1/2/3 تستدعي kvm_daemon_windows.py --switch (يعمل في علبة النظام) |
kvm_daemon_windows.py | تبديل أجهزة Windows عبر named pipe، تبديل الشاشة عبر DDC/CI |
kvm_config.ini | إعدادات Windows (مفاتيح الاختصار، مدخلات الشاشة) |
query_feature_index.py | يكتشف فهرس ميزة ChangeHost الخاصة بـ HID++ لأجهزة Logitech (Windows) |
query_agent_windows.py | يستعلم من العامل على Windows عبر named pipe |
config.ini | إعدادات UnifiedSwitch القديمة (تم استبدالها بـ kvm_daemon_windows.py) |
python3 switch_to_windows.py 0 # التبديل إلى المضيف 0 (DisplayPort)
python3 switch_to_windows.py 1 # التبديل إلى المضيف 1 (HDMI)
python3 switch_to_windows.py --dry-run 0 # عرض ما سيحدث دون تنفيذ
يتطلب تشغيل Logi Options+ وتثبيت m1ddc (brew install m1ddc).
# بدء مستمع مفاتيح الاختصار AHK (يعمل في علبة النظام، بدون وحدة تحكم)
# يتطلب AutoHotkey v2: winget install AutoHotkey.AutoHotkey
start kvm.ahk
# أو التبديل مباشرة من سطر الأوامر
python kvm_daemon_windows.py --switch 1
# عرض الأجهزة المكتشفة ومفاتيح الاختصار المهيأة دون تبديل
python kvm_daemon_windows.py --dry-run
يتطلب تشغيل Logi Options+. تركيب التبعيات: pip install pywin32.
يستمع سكريبت AHK لمفاتيح Win+1/2/3 ويستدعي kvm_daemon_windows.py --switch N لكل منها. يقوم سكريبت Python باكتشاف الأجهزة تلقائيًا من العامل (بدون معرفات جهاز ثابتة أو مسارات HID). عدّل kvm_config.ini لتكوين مفاتيح الاختصار وقيم إدخال DDC/CI للشاشة.
يستمع العامل على:
/tmp/logitech_kiros_agent-<hash>\\.\pipe\logitech_kiros_agent-<hash>نفس بروتوكول الاتصال على كلا النظامين. تنسيق الإطار الثنائي:
LE32(total_len) + BE32(proto_name_len) + "json" + BE32(msg_len) + JSON_message
لتبديل جهاز إلى مضيف مختلف:
{
"msg_id": "1",
"verb": "SET",
"path": "/change_host/<device_id>/host",
"payload": {
"@type": "type.googleapis.com/logi.protocol.devices.ChangeHost",
"host": 0
}
}
الحمولة هي حقل google.protobuf.Any يتم تسلسله كـ JSON مضمن مع تعليق @type. يستخدم العامل محلل JSON صارم خاص بـ protobuf؛ الحقول غير المعروفة تسبب INVALID_MESSAGE_RECEIVED.
تستخدم الطلبات msg_id (snake_case). الردود تستخدم msgId (camelCase). الأفعال هي سلاسل: "GET", "SET", "SUBSCRIBE", "BROADCAST".
انظر logi-options-ipc-reverse-engineering.md للحصول على توثيق كامل للبروتوكول.
للتشغيل الآلي طويل الأمد، أعد الاتصال عند BrokenPipeError وأعد اكتشاف مسار المقبس/الناقل.
تنطبق هذه عند إرسال أوامر HID++ مباشرة، وليس من خلال العامل.
kvm_daemon_windows.pyيتجنبها جميعًا بالمرور عبر named pipe الخاص بالعامل.
مجموعة HID++ تختلف حسب الجهاز. يعرض MX Master 3S HID++ على COL02. يستخدم MX Keys S COL05. كلاهما يستخدم صفحة الاستخدام FF43:0202. تحقق باستخدام:
Get-PnpDeviceProperty -InstanceId "<instance_id>" -KeyName DEVPKEY_Device_HardwareIds
# ابحث عن: UP:FF43_U:0202
فهارس الميزات تختلف حسب الجهاز. تكون ChangeHost (0x1814) في الفهرس 0x0A على MX Keys S ولكن في 0x09 على MX Mechanical. استعلم في وقت التشغيل عبر IRoot::GetFeature:
إرسال: {0x11, 0x00, 0x00, 0x0D, 0x18, 0x14, ...} (20 بايت)
قراءة: البايت 4 من الاستجابة = فهرس الميزة
إعادة إقران الجهاز يغير مسارات HID. التبديل من مستقبل Bolt إلى BT LE المباشر يغير المسار بالكامل. قم بتشغيل query_agent_windows.py للحصول على المسارات الحالية من العامل.
مجموعة بائع GATT BT LE تصبح "غير معروفة". تفشل Windows أحيانًا في تهيئة خدمة GATT الخاصة بـ HID++. يعمل الجهاز بشكل طبيعي ولكن قناة أوامر البائع معطلة. الإصلاح: قم بإيقاف تشغيل Bluetooth وتشغيله في إعدادات Windows. هذه مشكلة في Windows/البرامج الثابتة.
| الإصدار | الحالة |
|---|---|
| Logi Options+ 2.0.840907 | يعمل (macOS Tahoe, Windows 11) |
بروتوكول الاتصال ومسارات API الأساسية (/devices/list, /change_host/<id>/host) كانت مستقرة. إعادة إقران الجهاز كسرت مسارات HID وأرقام المجموعات لكن بروتوكول IPC نفسه لم يتأثر.
هذا المشروع لأغراض تعليمية وبحثية فقط. إنه يوثق بروتوكولًا غير موثق وغير مدعوم يمكن لـ Logitech تغييره أو إزالته في أي وقت. المؤلفون غير مسؤولين عن أي ضرر أو فقدان بيانات أو تعطل الأجهزة أو وظائف معطلة ناتجة عن استخدام هذا الرمز أو التوثيق. استخدم على مسؤوليتك الخاصة.
هذا المشروع ليس تابعًا أو معتمدًا من Logitech.
| السيناريو | ما يحدث | الاكتشاف |
|---|
| العامل غير قيد التشغيل | المقبس/الناقل غير موجود | connect() يرفع FileNotFoundError أو ConnectionRefusedError |
| إعادة تشغيل العامل أثناء الجلسة | انقطاع الاتصال | send() يرفع BrokenPipeError; recv() يُرجع فارغًا |
| الجهاز على مضيف آخر | NO_SUCH_PATH | تحقق من result.code |
| جهاز غير قابل للوصول | TIMEOUT بعد حوالي 3 ثوانٍ | تحقق من result.code |
| حمولة مشوهة | INVALID_MESSAGE_RECEIVED | @type مفقود أو حقول غير معروفة |
| تغيير هاش المقبس | المسار القديم اختفى | اكتشف دائمًا بشكل ديناميكي، لا تقم بتثبيته أبدًا |
| مقبس قديم بعد إعادة التشغيل | ConnectionRefusedError | أعد المحاولة بعد تأخير قصير |
| عملاء متزامنون | يعمل بشكل جيد | العامل يعالج اتصالات متعددة |