
लॉजी ऑप्शन्स+ एजेंट IPC प्रोटोकॉल का रिवर्स-इंजीनियर्ड संस्करण। यूनिक्स सॉकेट (macOS) या नेम्ड पाइप (Windows) के माध्यम से प्रोग्रामेटिक रूप से लॉजिटेक मल्टी-होस्ट उपकरणों को स्विच करें।
Logi Options+ एजेंट IPC प्रोटोकॉल का रिवर्स-इंजीनियर्ड दस्तावेज़ीकरण। यह मैकओएस और विंडोज दोनों पर बिना रॉ HID एक्सेस के लॉजिटेक मल्टी-होस्ट उपकरणों (होस्ट स्विचिंग, डिवाइस क्वेरी) के प्रोग्रामेटिक नियंत्रण को सक्षम बनाता है।
इस परियोजना से पहले इस प्रोटोकॉल को सार्वजनिक रूप से प्रलेखित नहीं किया गया था।
macOS कर्नेल स्तर पर ब्लूटूथ इनपुट उपकरणों तक रॉ HID एक्सेस को ब्लॉक करता है। कोई अनुमति, एंटाइटलमेंट या हैक इसे बायपास नहीं करते। Logi Options+ एजेंट के पास Apple-हस्ताक्षरित एंटाइटलमेंट (com.apple.security.device.bluetooth) हैं जो इसे ब्लूटूथ HID एक्सेस प्रदान करते हैं। यह परियोजना इसके बजाय एजेंट के IPC चैनल के माध्यम से संचार करती है।
| फ़ाइल | विवरण |
|---|---|
logi-options-ipc-reverse-engineering.md | पूर्ण रिवर्स इंजीनियरिंग वृत्तांत |
software-kvm-setup.md | दो-तरफा सॉफ्टवेयर KVM सेटअप गाइड (विंडोज + मैक) |
switch_to_windows.py | मैक-साइड स्क्रिप्ट जो यूनिक्स सॉकेट IPC के माध्यम से लॉजिटेक उपकरणों और मॉनिटर इनपुट को स्विच करती है |
api-reference.md | एजेंट API संदर्भ: काम करने वाले एंडपॉइंट, प्रोटोबफ़ प्रकार, डिवाइस क्षमताएँ |
kvm.ahk | AutoHotkey v2 स्क्रिप्ट: Win+1/2/3 हॉटकी जो kvm_daemon_windows.py --switch को कॉल करती है (सिस्टम ट्रे में चलती है) |
kvm_daemon_windows.py | नामित पाइप के माध्यम से विंडोज डिवाइस स्विचिंग, DDC/CI के माध्यम से मॉनिटर स्विचिंग |
kvm_config.ini | विंडोज कॉन्फ़िगरेशन (हॉटकी, मॉनिटर इनपुट) |
query_feature_index.py | लॉजिटेक उपकरणों के लिए HID++ ChangeHost फीचर इंडेक्स खोजता है (विंडोज) |
query_agent_windows.py | नामित पाइप के माध्यम से विंडोज पर एजेंट को क्वेरी करता है |
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 स्क्रिप्ट एजेंट से स्वचालित रूप से उपकरण खोजती है (कोई हार्डकोडेड डिवाइस ID या HID पथ नहीं)। हॉटकी और मॉनिटर DDC/CI इनपुट मान कॉन्फ़िगर करने के लिए kvm_config.ini संपादित करें।
एजेंट सुनता है:
/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 फ़ील्ड है जो @type एनोटेशन के साथ इनलाइन JSON के रूप में क्रमबद्ध है। एजेंट एक सख्त प्रोटोबफ़ JSON पार्सर का उपयोग करता है; अज्ञात फ़ील्ड 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एजेंट के नामित पाइप के माध्यम से जाकर इन सभी से बचता है।
HID++ संग्रह प्रति डिवाइस भिन्न होता है। MX Master 3S COL02 पर HID++ प्रदर्शित करता है। MX Keys S COL05 का उपयोग करता है। दोनों उपयोग पेज FF43:0202 का उपयोग करते हैं। इसके साथ सत्यापित करें:
Get-PnpDeviceProperty -InstanceId "<instance_id>" -KeyName DEVPKEY_Device_HardwareIds
# UP:FF43_U:0202 देखें
फीचर इंडेक्स प्रति डिवाइस भिन्न होता है। MX Keys S पर ChangeHost (0x1814) इंडेक्स 0x0A पर है जबकि MX Mechanical पर 0x09 पर। रनटाइम पर IRoot::GetFeature के माध्यम से क्वेरी करें:
भेजें: {0x11, 0x00, 0x00, 0x0D, 0x18, 0x14, ...} (20 बाइट्स)
पढ़ें: प्रतिक्रिया बाइट 4 = फीचर इंडेक्स
डिवाइस पुनः-युग्मन HID पथ बदलता है। बोल्ट रिसीवर से सीधे BT LE पर स्विच करने से पथ पूरी तरह बदल जाता है। एजेंट से वर्तमान पथ प्राप्त करने के लिए query_agent_windows.py चलाएँ।
BT LE GATT विक्रेता संग्रह "Unknown" हो जाता है। Windows कभी-कभी HID++ GATT सेवा को आरंभ करने में विफल रहता है। डिवाइस सामान्य रूप से काम करता है लेकिन विक्रेता कमांड चैनल मृत है। समाधान: 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 जांचें |
| डिवाइस अप्राप्य | ~3s के बाद TIMEOUT | result.code जांचें |
| गलत पेलोड | INVALID_MESSAGE_RECEIVED | @type गायब या अज्ञात फ़ील्ड |
| सॉकेट हैश बदलता है | पुराना पथ गायब | हमेशा गतिशील रूप से खोजें, कभी हार्डकोड न करें |
| पुनरारंभ के बाद पुराना सॉकेट | ConnectionRefusedError | थोड़ी देर बाद पुनः प्रयास करें |
| समवर्ती क्लाइंट | ठीक काम करता है | एजेंट कई कनेक्शन संभालता है |