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

私が欲しかったもの:





何が起こった:







参照資料



サービス-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は存在しません。



All Articles