2016-05-18 7 views
1

ブラウザからWebsockets購読を作成することはできますか?ブランチフィーチャー/ 1181_websocketsブランチ、gitバージョン5ca6770aa401b52a31293fdcef4a9743fb1de2c4を使用しています。Orionのウェブサイトからの定期購入

私たちはPoCをWebソケット経由でブラウザに登録しようとしました。ブラウザで実行中のJSコードを購読URLに接続しようとしました。接続は確立されましたが、クライアントからソケットを介してデータを送信する際にクラッシュしました。このユースケースはサポートされていますか?あなたはそのための実例を持っていますか? JSコード:

<!DOCTYPE html> 
<html> 
    <head> 
    <meta charset="utf-8"> 
    <title></title> 
    </head> 
    <body> 

    <button id="send" type="button" name="button">send</button> 

    <script type="text/javascript"> 
     var payload = `{"description": "One subscription to rule them all", 
     "subject": { 
      "entities": [{ 
      "idPattern": ".*", 
      "type": "Room" 
      }], 
      "condition": { 
      "attrs": ["temperature"], 
      "expression": { 
       "q": "temperature>40" 
      } 
      } 
     }, 
     "expires": "2016-04-05T14:00:00.00Z", 
     "throttling": 5 
     }`; 

     var ws = new WebSocket('ws://orion-url:9010/v2/subscriptions', 'ngsiv2-json'); 

     var button = document.getElementById('send'); 
     button.addEventListener('click', function(event) { 
     ws.send(payload) 
     }); 

    </script> 


    </body> 
</html> 

代わりに、REST APIを使用してサブスクリプションを作成し、オリオンにウェブソケット経由で通知するように依頼しました。我々は、次のJSONをPOSTさ:

{ 
    "description": "One subscription to rule them all", 
    "subject": { 
    "entities": [ 
     { 
     "idPattern": ".*", 
     "type": "Room" 
     } 
    ], 
    "condition": { 
     "attributes": [ 
     "temperature" 
     ], 
     "expression": { 
     "q": "temperature>40" 
     } 
    } 
    }, 
    "notification": { 
     "callback": "ws://my-websocket-listener:8081" 
    }, 
    "expires": "2016-04-05T14:00:00.00Z", 
    "throttling": 5 
    } 

サブスクリプションプロセスが失敗し、オリオンはメッセージで422のステータスコードを返す:

{ 
     "error": "BadRequest", 
     "description": "Invalid URL" 
    } 

を、我々はサブスクリプション要求内の任意のミスをしましたか?このユースケースはサポートされていますか?

ありがとうございます!

+0

機能/ 1181_websocketsのためにWSでの作業時にテストとして私にされた仕事実験的な枝と、ある意味では、「動いている絵」である。どのような正確なCBバージョンがあるかを知るために( 'contextBroker --version'出力から)、その情報を含めるために質問投稿を編集できますか?重要な部分はギターシェです。ありがとう! – fgalan

+0

お返事ありがとうございます。私はその情報で私の質問を編集しました。 –

答えて

2

現在、あなたのブラウザで購読および通知を受け取る、制限は以下の通りことができます。

  1. WSからは、WSやRESTのサブスクリプションを作成することができます。
  2. RESTから、WSサブスクリプションを作成することはできません。
  3. RESTサブスクリプションでのみコールバックを指定できますが、WSでは必ず "ws://"でなければなりません。 WSサブスクリプションを作成すると、作成者は受信者になります。
  4. WSサブスクリプションは、接続が切断された場合に削除されます。

ここで私は例として、少しコードを聞かせて、あなただけのオリオンのURL

<!DOCTYPE html> 
 
<html> 
 
    <head> 
 
     <meta charset="utf-8"> 
 
     <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script> 
 
     <script type="text/javascript"> 
 
      $(function() { 
 
       window.WebSocket = window.WebSocket || window.MozWebSocket; 
 
\t \t // Here change with your URL 
 
       var websocket = new WebSocket('ws://127.0.0.1:9010', 'ngsiv2-json'); 
 
       websocket.onopen = function() { 
 
        $('h1').css('color', 'green'); 
 
       }; 
 
       websocket.onerror = function() { 
 
        $('h1').css('color', 'red'); 
 
       }; 
 
       websocket.onmessage = function (message) { 
 
        console.log(message.data); 
 
        console.log(message); 
 
        $('div').append(message.data + '<br/>'); 
 
       }; 
 

 
       $('#send').click(function(e) { 
 
        e.preventDefault(); 
 
        if ($('#txt').val().length > 0) 
 
        { 
 
         websocket.send($('#txt').val()); 
 
         $('#txt').val(''); 
 
        } 
 
       }); 
 

 
       $('#new').click(function(e) { 
 
        e.preventDefault(); 
 
        var msg = "{\"verb\":\"POST\",\"url\":\"/v2/entities\", \ 
 
           \"params\":{\"options\":\"keyValues\"}, \ 
 
           \"payload\":{\"type\":\"1\",\"id\":\"1\",\"temp\":1}}"; 
 

 
        $('#txt').val(JSON.stringify(JSON.parse(msg), null, 2)); 
 
       }); 
 

 
       $('#upd').click(function(e) { 
 
        e.preventDefault(); 
 
        var msg = "{\"verb\":\"POST\",\"url\":\"/v2/entities/1\", \ 
 
           \"params\":{\"options\":\"keyValues\"},\"payload\":{\"temp\": 1}}"; 
 
        $('#txt').val(JSON.stringify(JSON.parse(msg), null, 2)); 
 
       }); 
 

 
       $('#get').click(function(e) { 
 
        e.preventDefault(); 
 
        var msg = "{\"verb\":\"GET\",\"url\":\"/v2/entities/1\"}"; 
 
        $('#txt').val(JSON.stringify(JSON.parse(msg), null, 2)); 
 
       }); 
 

 
       $('#del').click(function(e) { 
 
        e.preventDefault(); 
 
        var msg = "{\"verb\":\"DELETE\",\"url\":\"/v2/entities/1\"}"; 
 
        $('#txt').val(JSON.stringify(JSON.parse(msg), null, 2)); 
 
       }); 
 

 
       $('#sub').click(function(e) { 
 
        e.preventDefault(); 
 
        var msg = "{\"verb\":\"POST\",\"url\":\"/v2/subscriptions\", \ 
 
           \"payload\":{\"description\":\"My subscription\", \ 
 
           \"subject\":{\"entities\":[{\"id\":\"1\",\"type\":\"1\"}], \ 
 
           \"condition\":{\"attributes\":[\"temp\"],\"expression\":{\"q\":\"temp>40\"}}}, \ 
 
           \"notification\":{\"callback\":\"ws://\",\"attributes\":[\"temp\"], \ 
 
           \"throttling\":5},\"expires\":\"2017-04-05T14:00:00.00Z\"}}"; 
 
        $('#txt').val(JSON.stringify(JSON.parse(msg), null, 2)); 
 
       }); 
 
      }); 
 
     </script> 
 
    </head> 
 
    <body> 
 
     <h1>WebSockets test</h1> 
 
     <form> 
 
      <table border="0"> 
 
      <tr> 
 
       <td colspan="2"> 
 
        <textarea rows="35" cols="70" id="txt"></textarea> 
 
       </td> 
 
      </tr> 
 
      <tr> 
 
       <td> 
 
        <button id="new">New</button> 
 
        <button id="upd">Update</button> 
 
        <button id="get">Show</button> 
 
        <button id="del">Delete</button> 
 
        <button id="sub">Subcription</button> 
 
       </td> 
 
       <td align="right"> 
 
        <button id="send">Send</button> 
 
       </td> 
 
      </tr> 
 
      </table> 
 
     </form> 
 
     <br/> 
 
     <p>Server:</p> 
 
     <div></div> 
 
    </body> 
 
</html>

でURLを変更する必要が私はJSの専門家ではないよ...しかし、この私はオリオン

乾杯

関連する問題