2016-05-18 49 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的猎户座工作

干杯