Orion

时间:2016-05-18 16:51:01

标签: fiware-orion

是否可以从浏览器创建websockets订阅?我们使用分支功能/ 1181_websockets分支,git版本 5ca6770aa401b52a31293fdcef4a9743fb1de2c4

我们让PoC尝试通过websockets订阅浏览器。我们尝试将浏览器中运行的一些JS代码连接到订阅URL。建立连接,但是当通过套接字从客户端发送数据时,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
    }

订阅过程失败,Orion返回422状态代码,其中包含以下消息:

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

我们在订阅请求中是否有任何错误?这个用例是否受支持?

谢谢!

1 个答案:

答案 0 :(得分:2)

目前您可以订阅浏览器并接收通知,限制如下:

  1. 您可以从WS创建WS或REST订阅。
  2. 从REST中,您无法创建WS订阅。
  3. 只有在REST订阅中您才能指定回调,在WS中始终必须是&#34; ws://&#34;。如果您创建WS订阅,则创建者将成为接收者。
  4. 如果连接已关闭,则会删除WS订阅。
  5. 这里我以一些代码为例,您只需要通过Orion的URL更改网址

    &#13;
    &#13;
    <!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>
    &#13;
    &#13;
    &#13;

    我不是JS专家......但是当我在Orion的WS工作时,这对我来说是一项测试

    干杯

相关问题