Xlera8

मानव-इंटरफ़ेसिंग डिवाइस: डिस्क्रिप्टर डकैती के लिए पैकिंग

हमने शुरुआत की एक सप्ताह पहले HID विवरणकों का पता लगाना, और मैंने आपको दिखाया है कि माइक्रोपायथन फोर्क का उपयोग करके कच्चे एचआईडी पैकेट कैसे भेजें। हमारे सामने अभी भी कार्य है - एक टचस्क्रीन डिवाइस बनाना। इसके लिए, आइए आपको टचस्क्रीन से मौजूदा डिस्क्रिप्टर को कैप्चर करने के लिए टूल दें, फिर आपको दिखाएंगे कि इसे कैसे संशोधित किया जाए और अंत में यह कैसे निकलता है।

डकैती के लिए पैकिंग

जब इस तरह के साहसिक कार्य की बात आती है, तो हम उपकरणों और हथियारों के बिना नहीं जा सकते - यह खतरनाक हो सकता है! उनके बिना, आप अपना प्रोजेक्ट बीच में भी छोड़ सकते हैं! यहां आपके सामने आने वाली किसी भी बाधा से निपटने के लिए पर्याप्त उच्च परिशुद्धता वाले उपकरण और गोला-बारूद मौजूद हैं। वेब-आधारित टूल को छोड़कर, ये टूल लिनक्स के लिए हैं, लेकिन कृपया याद रखें कि आप हमेशा वर्चुअल मशीन या रास्पबेरी पाई का उपयोग कर सकते हैं। वैसे भी कोई भी डकैती के लिए विंडोज़ का उपयोग नहीं करेगा, टेलीमेट्री वगैरह का क्या हाल है।

पहला उपकरण विवरणकों को पढ़ने के लिए है - हमें सीखने के लिए एक उपकरण की आवश्यकता है, यह एक कीकार्ड की तरह है जिसे आप सुरक्षा गार्ड को फ्लैश कर सकते हैं और वॉल्ट प्रविष्टि पर स्कैन कर सकते हैं। बेशक, आरएफआईडी के साथ, आप पर्याप्त उदाहरण चाहते हैं, कुछ कार्डों और सभी के बीच बिट्स की तुलना करें। अभी के लिए, HID डिस्क्रिप्टर की प्रामाणिकता जांच नहीं है, लेकिन ऐसा लगता है यह भविष्य में बदल सकता है। हमेशा की तरह उन्हें जोड़ने का काम Apple और Microsoft पर छोड़ दें। लिनक्स पर, डिस्क्रिप्टर देखना सरल है - रूट के रूप में, इसमें जाएं /sys/bus/usb/devices/, इसके आधार पर अपना डिवाइस ढूंढें lsusb डिवाइस ट्री पथ, फिर VID/PID वाली निर्देशिका का अनुसरण करें। उस निर्देशिका में एक शामिल होगा report_descriptor फ़ाइल - hexdump यह। संपूर्ण कमांड इस तरह दिख सकती है:

sudo hexdump -v -e '/1 "%02X "' /sys/bus/usb/devices/3-6.2/3-6.2:1.1/0003:0C40:8000.0022/report_descriptor`

फिर, आपको इस पथ को खोजने के लिए रूट की भी आवश्यकता हो सकती है, इसलिए इसका उपयोग करें sudo -i यदि आपको अवश्य करना हो। प्रारूप स्ट्रिंग में hexdump कमांड आपको पार्सर-अनुकूल आउटपुट देता है। विशेष रूप से, पार्सिंग के लिए, मैं उपयोग करता हूं इस वेबपेज - यह अद्भुत है, यहाँ तक कि ऐसे टैब भी जोड़ना जो डिस्क्रिप्टर के विभिन्न अनुभागों को चित्रित करते हैं, जिससे इसका आउटपुट और अधिक पठनीय हो जाता है! आप इस वेबपेज को स्थानीय रूप से भी सहेज सकते हैं, यह एक बहुत ही साफ-सुथरा टूल है। इसके अलावा, आप अन्य स्थानीय टूल भी आज़मा सकते हैं यह एक!

अब, आपको एक डिवाइस के लिए एक डिस्क्रिप्टर मिल गया है जिसके व्यवहार की आप नकल करना चाहते हैं, और आप इसे यह देखने के लिए पार्स कर सकते हैं कि यह किस चीज़ को प्रभावित करता है। आश्चर्यजनक! लेकिन ऐसा कुछ नहीं जिसे आप एक नज़र में समझ सकें, अभी तक नहीं? अकेले डिस्क्रिप्टर मानसिक मानचित्र बनाने में सक्षम नहीं है, इसमें कई रिपोर्ट आईडी हो सकती हैं, और कुछ डिस्क्रिप्टर भ्रमित करने के लिए पर्याप्त सामान्य होंगे। उदाहरण के लिए, कई उपकरणों में डिस्क्रिप्टर होते हैं जो वास्तव में फ़र्मवेयर अपडेट के लिए अंतिम बिंदु होते हैं, इसलिए आप यह पता लगाने में समय बर्बाद कर रहे होंगे कि डिस्क्रिप्टर का वास्तव में कभी उपयोग नहीं किया जाता है। आइए देखें कि जब हम इसके साथ इंटरैक्ट करते हैं तो हमारा डिवाइस वास्तव में क्या भेजता है, हमें किस रिपोर्ट आईडी से सीखना चाहिए - और सबसे महत्वपूर्ण बात यह है कि लिनक्स ओएस इसकी व्याख्या कैसे करता है।

उसके लिए हमें सिर्फ VID और PID की जरूरत है. एक बार फिर जड़ के रूप में, पर जाएँ /sys/kernel/debug/hid/, फिर अपने वीआईडी ​​और पीआईडी ​​के साथ एक निर्देशिका ढूंढें cat इसके events फ़ाइल। वहां, आपको अपने डिवाइस से प्राप्त प्रत्येक घटना का एक सुंदर-मुद्रित मानव पठनीय विवरण मिलेगा, जैसे ही वह प्रकट होगा। कभी-कभी मुद्रण प्रक्रिया ख़राब हो जाती है और बीच में ही बंद हो जाती है - यह जिस तरह से हो रहा है उसमें कुछ गड़बड़ी हो सकती है cat'एड, लेकिन आमतौर पर यह कोई बड़ा नुकसान नहीं है। यह यह देखने का एक शानदार तरीका है कि जब आपके HID डिवाइस में गतिविधि होती है तो वास्तव में क्या होता है। पहला बाइट रिपोर्ट आईडी है, फिर पैकेट को प्राप्त होने के तरीके से मुद्रित किया जाता है, और उसके बाद, हम ओएस से पार्सिंग परिणाम देखते हैं। यह बस एक अद्भुत उपकरण है! यहां एक उदाहरण कमांडलाइन है:

sudo cat /sys/kernel/debug/hid/0003:2E8A:0005.0029/events

अंतिम लेकिन महत्वपूर्ण बात, आप घटनाओं को देखने का एक तरीका चाहेंगे क्योंकि आपके ओएस की इनपुट परतें वास्तव में उनकी व्याख्या करती हैं। हां, यह अलग है - यदि कोई पैकेट आता है, तो जरूरी नहीं कि उसे ओएस-स्तरीय इनपुट इवेंट में परिवर्तित किया जाए, कभी-कभी इसे छोड़ दिया जाता है क्योंकि यह एक निश्चित शर्त को पूरा नहीं करता है। उदाहरण के लिए, कुछ बिंदु पर, मेरे टचस्क्रीन पैकेट को त्याग दिया जा रहा था क्योंकि मैं केवल निर्देशांक भेज रहा था, और ओएस को यह बताने वाला एक महत्वपूर्ण बिट छोड़ दिया गया था कि एक टचस्क्रीन वर्तमान में एक नकली स्पर्श के विपरीत एक वैध टच इवेंट बता रहा है। वह बिट सामने और बीच में है डिजिटाइज़र बिल्डिंग पर माइक्रोसॉफ्ट के 'एपनोट्स', और यह देखते हुए कि मेरे ओएस ने मेरे निर्मित ईवेंट को 'अंदर' नहीं लिया, मुझे एपनोट में देखने और यह जांचने के लिए दबाव की आवश्यकता थी कि मेरे पैकेट में क्या कमी हो सकती है।

इसके लिए मेरे पास मेरी अपनी छोटी पायथन लिपि यह इनपुट लाइब्रेरी परतों द्वारा प्राप्त घटनाओं को प्रिंट करता है, और यह स्क्रिप्ट अब एक दशक से मेरी सेवा कर रही है। बस इसे डाउनलोड करें और चलाएं - आपको पायथन `evdev` लाइब्रेरी को स्थापित करने की आवश्यकता होगी, लेकिन यह डेबियन/उबंटू रिपॉजिटरी और `पिप` दोनों से समान रूप से उपलब्ध है। आपको इसे रूट के रूप में चलाने की भी आवश्यकता है, लेकिन ऐसा तब होता है जब आप इसे `./listen_keys.py` के रूप में स्वचालित रूप से चलाते हैं।

मैं उन सभी अलग-अलग कमांडों को चलाना पसंद करता हूँ tmux, विभिन्न चल रहे कार्यों के लिए अलग-अलग छोटे फलक - यहां मेरा कार्यक्षेत्र है जब मैं टचस्क्रीन कोड विकसित और डिबग कर रहा था, जहां ए) कच्चे एचआईडी इवेंट प्रिंटिंग दिखाता है, बी) एचआईडी डिस्क्रिप्टर प्रिंटिंग दिखाता है, और सी) इनपुट इवेंट डिस्प्ले कोड दिखाता है।

एक आदर्श भेष

इन उपकरणों के साथ, टचस्क्रीन बनाना एक शाम का काम था। मैं जिस XPT2046 लाइब्रेरी का उपयोग कर रहा था, उसके निर्देशांक मेरे पास थे, इसलिए मुझे बस एक डिस्क्रिप्टर बनाना था। प्रारंभ में, मैंने कोड के साथ [] द्वारा प्रदान किए गए "पूर्ण स्थिति माउस" डिस्क्रिप्टर का पुन: उपयोग करने के बारे में सोचा था, लेकिन इनपुट इवेंट प्रिंटिंग स्क्रिप्ट ने मुझे दिखाया है कि उस स्क्रिप्ट से दबाए गए माउस बटन भी यूआई द्वारा नहीं उठाए गए थे - और जबकि MOUSE_ABS ईवेंट दिखाई दिए, उन्होंने मेरे डेस्कटॉप को किसी भी तरह से प्रभावित नहीं किया।

माउस डिस्क्रिप्टर कार्य को डीबग करना मज़ेदार नहीं लगा, विशेष रूप से यह देखते हुए कि मेरे पास सीखने के लिए कोई कार्यशील माउस भी नहीं है! इसके बजाय, मैंने संपूर्ण माउस डिस्क्रिप्टर को डिजिटाइज़र डिस्क्रिप्टर में फिर से बनाने का निर्णय लिया, क्योंकि मेरे पास डिजिटाइज़र डिस्क्रिप्टर और पैकेट दोनों हैं! पूर्ण माउस डिस्क्रिप्टर को माइक्रोपायथन स्रोतों में अलग से उजागर किया गया था, और ट्विकिंग के लिए भी तैयार था! बदल रहा है USAGE और USAGE_PAGE केवल USB टचस्क्रीन के डिस्क्रिप्टर की श्रेणियों ने मेरे OS को मेरे RP2040 बोर्ड को डिजिटाइज़र के रूप में पहचानने में मदद की।

वास्तविक परिवर्तन मुश्किल नहीं थे - XPT2046 लाइब्रेरी ने दो पूर्णांक निर्देशांक प्रदान किए, इसलिए मैंने एक डिस्क्रिप्टर से एक संरचना की प्रतिलिपि बनाई जिसमें एक एक्स और एक वाई मान का वर्णन किया गया, प्रत्येक 16 बिट लंबा और इसलिए मेरे यूएसबी टचस्क्रीन की तरह, प्रत्येक को दो बाइट्स में विभाजित किया गया। HID पैकेट डिबग प्रिंट तंत्र की मदद से, मैं तुरंत नोटिस कर सकता था कि मेरे ऊपरी और निचले बाइट की अदला-बदली हुई थी, क्योंकि मेरा OS निर्देशांक की सही ढंग से व्याख्या नहीं कर रहा था। इसे ठीक करने के बाद, मेरे पैकेट सही ढंग से पार्स हो जाएंगे लेकिन इनपुट इवेंट के बीच दिखाई नहीं दे रहे थे, और फैक्ट्री-निर्मित यूएसबी टचस्क्रीन पैकेट की तुलना मेरे DIY टचस्क्रीन के हाथ से निर्मित पैकेट से करने पर, मैं देख सकता था कि एक "वैध टच" बिट था याद आ रही थी। इसे जोड़ने से डिवाइस सभी उद्देश्यों और उद्देश्यों के लिए टचस्क्रीन की तरह व्यवहार करने लगा!

अब, मेरे पास एक DIY यूएसबी-कनेक्टेड टचस्क्रीन है, और इसमें बस एक अलग टचस्क्रीन से एक एचआईडी डिस्क्रिप्टर चुराना था, फिर उसका काफी बारीकी से अनुकरण करना था। साथ ही, जब भी मैं चाहूं, मैं अपने टचस्क्रीन को एक अलग रिपोर्ट आईडी के साथ पैकेट भेजकर टचपैड मोड में स्विच कर सकता हूं जो फर्मवेयर के माउस डिस्क्रिप्टर से मेल खाता है - इसमें पूर्ण लैपटॉप टचपैड बनने के लिए केवल दो माउस बटन की कमी है! यह देखते हुए कि मैं इसका उपयोग पहनने योग्य डिस्प्ले को प्रोटोटाइप करने के लिए कर रहा हूं, यह बेहद मददगार होगा।

अंदर और बाहर, हमने सामान सुरक्षित किया

जैसा कि है, नव नामांकित यूएसबी टचस्क्रीन को कुछ फ़िल्टरिंग और अंशांकन की आवश्यकता है, लेकिन वे छोटे सुधार हैं - शायद लिनक्स XPT2046 ड्राइवरों से कुछ फ़िल्टरिंग एल्गोरिदम भी चुरा सकते हैं! यह प्लग एंड प्ले है, इसका उपयोग करना आसान है, और इसे हैक किया जा सकता है - अब वह एसपीआई टचस्क्रीन नहीं रही जो इसे होना चाहिए था। सबसे बढ़कर, यह एक महान उदाहरण है कि, यदि आप थोड़ा अजीब एचआईडी डिवाइस बनाना चाहते हैं, तो ऐसा करना कहीं भी मुश्किल नहीं है, और लिनक्स आपको एक शक्तिशाली टूलकिट प्रदान करता है जो आपको किसी भी एचआईडी समस्या को नोटिस करने में मदद करता है, चाहे आप कितनी भी दूर तक जाना चाहें जाना।

यदि आप HID को समझते हैं तो आप बहुत सी चीज़ें कर सकते हैं। उदाहरण के लिए, आप यूएसबी-यूएआरटी सीरियल नंबरों के साथ संघर्ष किए बिना, एक ब्रेल डिस्प्ले बना सकते हैं जो क्रॉस-संगत है। ऊपर हैकाडे डिस्कॉर्ड पर, [mupf] एक XBox एडेप्टिव कंट्रोलर-संगत डिवाइस को हैक कर रहा है जो OS भेजने के लिए मैग्नेटोमीटर और जाइरो का उपयोग करता है, जिसमें HID डिस्क्रिप्टर को मूल Xbox एडेप्टिव कंट्रोलर के डंप किए गए डिस्क्रिप्टर द्वारा भारी रूप से सूचित किया जाता है। HID विनिर्देश बड़ी संख्या में चीजों का वर्णन करता है, यहां तक ​​​​कि यूएसबी-कनेक्टेड कैरेक्टर डिस्प्ले, और चीजें जैसे - आप सभी चीजों की HID की मदद से क्वाटरनियन भेज सकते हैं!

HID का समर्थन आपके इनपुट डिवाइस को अनुकूल बनाता है और उसे सॉफ़्टवेयर जगत में बेहतर इंटरैक्ट करने में मदद करता है। HID, इसके मूल में, सभी मुख्य ऑपरेटिंग सिस्टमों द्वारा समझी जाने वाली भाषा है, और आपके डिवाइस को एक HID इंटरफ़ेस देने से आप अपने डिवाइस और किसी भी प्रकार के सॉफ़्टवेयर के बीच मालिकाना भाषा की एक परत जोड़ने से बच सकते हैं, जिसके साथ आप इंटरैक्ट करना चाहते हैं। और, निःसंदेह, HID एक महान हैकर टूल है - यह स्मार्टफोन ऑटोमेशन टूल अकेले इसकी गवाही देगा!

अगली बार, मैं आपको I2C HID के बारे में और अधिक बताना चाहूँगा - I2C पर HID पैकेट और डिस्क्रिप्टर भेजना, बिना USB पोर्ट की आवश्यकता के और केवल I2C कनेक्शन का उपयोग करना, जो अब तक काफी सर्वव्यापी है! उस संदर्भ में, मैं आपको दिखाऊंगा कि फ्रेमवर्क लैपटॉप टचपैड का पुन: उपयोग कैसे करें, जो अपने संचार के लिए I2C-HID का उपयोग करता है। मैं QMK को संशोधित करने की उम्मीद कर रहा हूं ताकि हम किसी भी QMK-नियंत्रित कीबोर्ड में I2C टचपैड जोड़ने का अभ्यास कर सकें, लेकिन हम केवल KMK को संशोधित करने पर समझौता कर सकते हैं, जो कि QMK के समकक्ष है लेकिन सर्किटपाइथॉन में है। मैं आपको यह भी दिखाऊंगा कि आप I2C-HID डिवाइस को अपने लिनक्स SBC से कैसे जल्दी से कनेक्ट कर सकते हैं - यह आपकी कल्पना से कहीं अधिक आसान है! और, यदि तारे संरेखित होते हैं और RP2 माइक्रोपाइथन में I2040C परिधीय मोड समर्थन पर्याप्त रूप से स्थिर हो जाता है, तो हम मिठाई के रूप में अपना स्वयं का RP2040-संचालित I2C HID परिधीय भी बना सकते हैं।

हमारे साथ चैट करें

नमस्ते! मैं आपकी कैसे मदद कर सकता हूँ?