दूरस्थ उपकरणों का प्रबंधन करने का एक आसान तरीका

मैं क्या चाहता था:


क्या हुआ:



संदर्भ


सेवा - rdevic.es
सर्वर स्रोत कोड - rdevices- सर्वर
क्लाइंट स्रोत कोड - rdevices- क्लाइंट

अंदर क्या है




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

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

Restfull API - उपयोगकर्ताओं से या "कंट्रोल पैनल" के माध्यम से सीधे अनुरोध प्राप्त करता है और उन्हें कनेक्टर में भेजता है। अजगर, django और tastypie में लिखा है।

पुश सूचनाएँ - डेमॉन कनेक्टर से विधियों के पूरा होने की सूचना प्राप्त करता है और उन्हें "नियंत्रण कक्ष" में भेजता है। एपीआई अनुरोधों की संख्या को कम करने के लिए बनाया गया है। अजगर, बवंडर और sockjs में लिखा है।

डैशबोर्ड - उपकरणों के प्रबंधन के लिए एक वेब-आधारित इंटरफ़ेस उपयोगकर्ता द्वारा बनाया गया है और सर्वर पर संग्रहीत है। मार्कअप के लिए, स्क्रिप्ट के लिए HTML का उपयोग किया जाता है - जावास्क्रिप्ट, कॉफीस्क्रिप्ट या IcedCfishScript।

डिवाइस कैसे बनाएं


इसे बनाने के लिए, आपको पाइप और गिट स्थापित करने की आवश्यकता होगी यदि आपने उन्हें स्थापित नहीं किया है।

और rdclient स्थापित करें:
pip install -e git://github.com/nvbn/rdevices-client.git#egg=rdclient 


अब आपको साइट के माध्यम से डिवाइस बनाने और इसे uuid कॉपी करने की आवश्यकता है।

एक उपकरण घोषित करने के लिए, आपको एक अजगर फ़ाइल बनाने की आवश्यकता है, उदाहरण के लिए, device.py , Device वर्ग से इनहेरिट करना, method(result, [arg1], [arg2], ..) साथ तरीकों को सजाने method(result, [arg1], [arg2], ..) और Meta में uuid निर्दिष्ट करें।
मापदंडों का एक सार और विधि का परिणाम आवश्यक है, लेकिन इसका उपयोग केवल जानकारीपूर्ण उद्देश्यों के लिए किया जाता है।

एक साधारण उपकरण का एक उदाहरण:
 from rdclient import Device, method class MyDevice(Device): class Meta: uuid = 'DEVICE_UUID' @method('None') def print_123(self): print 123 @method('int', a='int', b='int') def sum_a_and_b(self, a, b): return a + b 


अब आप ग्राहक शुरू कर सकते हैं:
 rdclient device.py 

उसके बाद, डिवाइस के लिए एक संक्षिप्त दस्तावेज डिवाइस पेज पर दिखाई देगा।

कुछ अनुप्रयोगों के लिए, तैयार मिश्रण हैं:


एपीआई का उपयोग



पहला कदम एपीआई का उपयोग करने के लिए एक कुंजी बनाना है।

सभी अनुरोधों को json या xml में होना चाहिए और इसे हेडर में स्पष्ट रूप से निर्दिष्ट किया जाना चाहिए, उदाहरण के लिए:

 Accept: application/json Content-type: application/json 


एक विधि को कॉल करने के लिए, आपको एक POST अनुरोध भेजने की आवश्यकता है rdevic.es/api/v1/device_method_call?username=USERNAME&api_key=API_KEY rdevic.es/api/v1/device_method_call?username=USERNAME&api_key=API_KEY ऑब्जेक्ट (json या xml में) वाले शरीर के साथ:
 { method: METHOD_NAME, device: DEVICE_UUID, request: { arg1: 'arg1Value', arg2: 'arg2Value' } } 

जवाब आएगा:
 { method_id: METHOD_ID, request: { arg1: 'arg1Value', arg2: 'arg2Value' }, response: {}, state: 0, text_state: 'started', id: CALL_ID, resource_uri: '/api/v1/device_method_call/CALL_ID/', } 

अपडेट किया गया संस्करण resource_uri?username=USERNAME&api_key=API_KEY पर GET अनुरोध प्राप्त करके प्राप्त किया जा सकता है resource_uri?username=USERNAME&api_key=API_KEYresponse फ़ील्ड में विधि कॉल का परिणाम है। state में विधि की निष्पादन स्थिति। संभावित मूल्य:
 STATE_CREATED = 0 STATE_FINISHED = 1 STATE_ERROR = 2 

अनुरोध curl साथ किया जा सकता है:
 curl "http://rdevic.es/api/v1/device_method_call/?username=nvbn&api_key=45932208bfb91d5ba8c9ab82137026c76ece69a8" -H "Accept: application/json" -H "Content-type: application/json" -X POST -d "{\"method\":\"arduino_write\",\"device\":\"bcc97caa-a09b-11e2-a15d-009c02975edf\",\"request\":{\"data\": \"clear\nwrite:Hello habr\!\n\"}}" 

इसके निष्पादन का परिणाम पहली तस्वीर में नहीं दिखाया गया है।

डैशबोर्ड निर्माण


सबसे पहले आपको इसे साइट पर बनाने और कोड संपादन खोलने की आवश्यकता है।
लिपियों को जावास्क्रिप्ट में लिखा जा सकता है ( type="javascript" ), type="coffeescript" ( type="coffeescript" ) और आईसेकॉफ़स्क्रिप्ट ( type="iced-coffeescript" )।
आप उनमें डैशबोर्ड एपी का उपयोग कर सकते हैं, यह प्रदान करता है:


एक पैनल के उदाहरण के रूप में - रिदमबॉक्स ( rdclient.mixins.RhythmboxMixin ) के लिए एक कंसोल:
 <script type='text/javascript'> dashboard.ready(function(){ dashboard.getDevice(DEVICE_ID, function(device){ $('#prev').click(function(){ device.rhythmbox_previous({}); }); $('#next').click(function(){ device.rhythmbox_next({}); }); $('#play-pause').click(function(){ device.rhythmbox_play_pause({}); }); }); }); </script> <button class='btn' id='prev'>Prev</button> <button class='btn' id='play-pause'>Play/pause</button> <button class='btn' id='next'>Next</button> 

सीढ़ियों से बचने के लिए आप IcedCfishScript का उपयोग कर सकते हैं। इसके साथ, स्क्रिप्ट भाग इस तरह दिखेगा:
 <script type='text/iced-coffeescript'> await dashboard.ready await dashboard.getDevice DEVICE_ID, defer device $('#prev').click => device.rhythmbox_previous {} $('#next').click => device.rhythmbox_next {} $('#play-pause').click => device.rhythmbox_play_pause {} </script> 


भविष्य की योजना


अब परियोजना केवल बुनियादी सुविधाओं को लागू करती है। अभी भी योजना बनाई है:


PS सभी कुंजी और लेख में uuid कोई नहीं है।

Source: https://habr.com/ru/post/In177755/


All Articles