2016-05-18 48 views
1

是否可以從瀏覽器創建websockets訂閱?我們使用分支功能/ 1181_websockets分支,git版本5ca6770aa401b52a31293fdcef4a9743fb1de2c4通過Orion中的websockets訂閱

我們做了一個PoC試圖通過websockets訂閱瀏覽器。我們嘗試將瀏覽器中運行的一些JS代碼連接到訂閱網址。連接已建立,但通過套接字從客戶端發送數據時,orion崩潰。這個用例是否支持?你有一個工作的例子嗎? 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創建訂閱,要求Orion通過websockets通知我們。我們發佈了以下JSON:

{ 
    "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是一個實驗分支,在某種意義上說,是一個「動態圖片」。爲了知道你有哪個確切的CB版本(來自'contextBroker --version'輸出),你可以編輯你的問題帖子來包含這些信息嗎?重要的部分是githash。謝謝! – fgalan

+0

感謝您的回覆。我用這些信息編輯了我的問題。 –

回答

2

目前,你可以用你的瀏覽器訂閱和接收通知,限制如下:

  1. 從WS您可以創建一個WS或REST訂閱。
  2. 從REST無法創建WS訂閱。
  3. 只有在REST訂閱中,您可以指定回調,在WS中必須始終爲「ws://」。如果您創建WS訂閱,創建者將成爲接收者。
  4. 如果連接關閉,WS訂閱將被刪除。

在這裏,我讓小小的代碼示例,你只需要通過你的獵戶座的URL更改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>

我不是一個JS高手......但是這工作在我作爲一個測試,當我在WS的獵戶座工作

乾杯