-->

通过在猎户座的WebSockets订阅(Subscriptions via websockets i

2019-09-28 12:36发布

是否有可能创建一个从浏览器中的WebSockets订阅? 我们正在使用的分支功能/ 1181_websockets分支机构,Git版本5ca6770aa401b52a31293fdcef4a9743fb1de2c4。

我们做了一个的PoC尝试通过WebSockets向订阅浏览器。 我们试图连接在浏览器中订阅网址运行一些JS代码。 已建立连接,而是通过插座从客户端发送数据时,猎户座坠毁。 是该用例的支持? 你有这方面的工作的例子吗? 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订阅,询问猎户然后通过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"
    }

难道我们做出的订阅请求的任何错误? 是该用例的支持?

谢谢!

Answer 1:

目前,你可以用你的浏览器订阅和接收通知,限制如下:

  1. 从WS您可以创建一个WS或REST订阅。
  2. 从静止您不能创建一个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; // 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猎户座

干杯



文章来源: Subscriptions via websockets in Orion