2016-05-18 2 views
1

Возможно ли создать подписку на веб-сайты из браузера? Мы используем функцию ветки/1181_websockets branch, git version 5ca6770aa401b52a31293fdcef4a9743fb1de2c4.Подписки через websockets в Orion

Мы создали PoC, пытающийся подписаться на браузер через веб-сайты. Мы попытались подключить некоторый 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> 

В качестве альтернативы, мы попытались создать подписку с помощью API REST, прося 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" 
    } 

ли мы делаем какую-либо ошибку в запросе подписки? Поддерживается ли этот вариант использования?

Спасибо!

+0

функция/1181_websockets является экспериментальная ветвь и, в некотором смысле, «движущаяся картина». Чтобы узнать, какая именно версия CB у вас есть (из вывода 'contextBroker --version'), вы могли бы изменить свой вопрос, чтобы включить эту информацию? Важная часть - гиташ. Благодаря! – 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 для Orion

Приветствия

Смежные вопросы