リモートデバイスを管理する簡単な方法

私が欲しかったもの:


何が起こった:



参照資料


サービス-rdevic.es
サーバーのソースコード-rdevices-server
クライアントのソースコード-rdevices-client

中身は何ですか




rdclient-ユーザーのデバイス上で実行され、メソッドを宣言し、サーバーからの要求に応じてそれらを実行し、結果を送り返します。 Pythonで書かれています。 最初は、サーバーと通信するためにØMQを使用したかったのですが、サーバーをインストールするには、ユーザーがモジュールを作成する必要がありました。 したがって、通常のソケットが使用されます。

コネクタ -デーモンはAPIからリクエストを受信し、クライアントデバイスに送信し、結果を受信し、データベースに書き込み、通知デーモンを送信します。 Pythonと竜巻で書かれています。 Redisは、APIおよび通知サービスとの通信に使用されます。

RESTfull API-ユーザーから直接、または「コントロールパネル」を介してリクエストを受信し、それらをコネクタに渡します。 python、django、tastypieで書かれています。

プッシュ通知 -デーモンはコネクタからメソッドの完了の通知を受け取り、それらを「コントロールパネル」に渡します。 APIリクエストの数を減らすために作られました。 python、tornado、sockjsで書かれています。

ダッシュボード -デバイスを管理するためのWebベースのインターフェースは、ユーザーによって作成され、サーバーに保存されます。 マークアップには、スクリプト、JavaScript、CoffeeScript、またはIcedCoffeeScriptにhtmlが使用されます。

デバイスを作成する方法


作成するには、pipとgitをインストールしていない場合はインストールする必要があります。

そしてrdclientをインストールします:
pip install -e git://github.com/nvbn/rdevices-client.git#egg=rdclient 


次に、サイトからデバイスを作成し、 uuidをコピーする必要があります

デバイスを宣言するには、 device.pyなどのpythonファイルを作成し、 Deviceクラスから継承し、 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 

その後、デバイスの簡単なドキュメントがデバイスページに表示されます。

一部のアプリケーションには、既製のミックスインがあります。


APIの使用



最初のステップは、APIにアクセスするためのキーを作成することです

すべてのリクエストは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リクエストを行うことで取得できます。 メソッド呼び出しの結果はresponseフィールドにあります。 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\"}}" 

その実行結果は、最初の図には示されていません。

ダッシュボードの作成


まず、サイトで作成してコード編集を開く必要があります
スクリプトは、JavaScript( type="javascript" )、CoffeeScript( type="coffeescript" )、およびIcedCoffeeScript( type="iced-coffeescript" )で記述できます。
それらでダッシュボードAPIを使用できます。


パネルの例としてrdclient.mixins.RhythmboxMixinコンソール( 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> 

IcedCoffeeScriptを使用して、階段を回避できます。 これにより、スクリプト部分は次のようになります。
 <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/J177755/


All Articles