2016-05-18 2 views
1

Ist es möglich, ein WebSockets-Abonnement über einen Browser zu erstellen? Wir verwenden die Verzweigungsfunktion/1181_websockets-Verzweigung, Git-Version 5ca6770aa401b52a31293fdcef4a9743fb1de2c4.Abonnements über Websockets in Orion

Wir haben einen PoC gemacht, der versucht, einen Browser über Websockets zu abonnieren. Wir haben versucht, einen JS-Code, der im Browser ausgeführt wird, mit der Subskriptions-URL zu verbinden. Die Verbindung wurde hergestellt, aber orion stürzte ab, wenn Daten vom Client über den Socket gesendet wurden. Wird dieser Anwendungsfall unterstützt? Hast du ein funktionierendes Beispiel dafür? Der Code 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> 

Als Alternative haben wir versucht, ein Abonnement mit dem REST-API zu erstellen, Orion fragen uns über WebSockets zu benachrichtigen. Wir verzeichnen die folgende 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 
    } 

Das Abonnement fehlschlägt und Orion liefert einen 422-Statuscode mit der Meldung:

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

Haben wir einen Fehler in dem Zeichnungsantrag? Wird dieser Anwendungsfall unterstützt?

Danke!

+0

Funktion/1181_websockets Arbeit ist ein experimenteller Zweig und in gewissem Sinne ein "bewegendes Bild". Um zu wissen, welche genaue CB-Version Sie haben (aus der 'contextBroker --version'-Ausgabe), könnten Sie Ihren Frage-Post bearbeiten, um diese Informationen aufzunehmen? Der wichtige Teil ist der Githasch. Vielen Dank! – fgalan

+0

Danke für Ihre Antwort. Ich habe meine Frage mit diesen Informationen bearbeitet. –

Antwort

2

Aktuell können Sie mit Ihrem Browser abonnieren und Benachrichtigungen erhalten, sind die Einschränkung der folgende:

  1. Von WS Sie einen WS oder REST-Abonnement erstellen können.
  2. Von REST können Sie kein WS-Abonnement erstellen.
  3. Nur in den REST-Abonnements können Sie den Rückruf angeben, in WS muss immer "ws: //" sein. Wenn Sie ein WS-Abonnement erstellen, ist der Ersteller der Empfänger.
  4. WS-Abonnement werden gelöscht, wenn eine Verbindung geschlossen wird.

Hier lasse ich ein wenig Code wie beispielsweise nur die URL von Ihrem Orion 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>

Ich bin kein JS Experte ändern muss ... aber das als Test für mich arbeiten, wenn ich im WS für Orion

Prost