2017-01-03 3 views
1

Ich untersuche die Möglichkeit, eine Flask-Anwendung als Schnittstelle zu einem eingebetteten System zu verwenden. Ich habe schon zuvor flask verwendet (ich habe einige sehr einfache Flask-Sites geschrieben, um externe Systeme als Reaktion auf eine Seitenladung abzufragen, um ein Diagramm zu füllen), aber ich bin mir nicht sicher, wie ich Daten in die Flask-Anwendung pushen würde und weiter zu den Browsern des Benutzers.Wie streame ich Daten durch eine Flaschenanwendung?

Ich plante, Daten aus einer C++ - Anwendung, die auf dem eingebetteten Gerät ausgeführt wird, in die Flask-Anwendung (die ebenfalls auf dem eingebetteten Gerät ausgeführt wird) unter Verwendung von ZeroMQ zu übertragen.

Von was ich gelesen habe, wäre etwas wie flask-socketIO eine Möglichkeit, Dinge von Flask zum Browser des Benutzers zu bekommen.

Die eine Sache, die mir nicht klar ist, ist, ob es möglich ist,/wie Sie Daten von ZeroMQ erhalten würden und das an den Browser weiterleiten?

+0

kann ein Duplikat von [ein anderes SO Beitrag] (http: // stackoverflow.com/questions/27548880/updating-webpage-from-background-thread-using-socket-io-but-without-event-trigge) wenn die Verwendung eines Hintergrundthreads der richtige Ansatz ist? –

+0

Ich habe es mit Websockets und Gevent gemacht, und es hat ziemlich gut funktioniert. Kann mein Beispiel hier überprüfen: https://github.com/reptilicus/zmq/blob/master/exmaples/diffusion/web_server/server.py – reptilicus

+0

Auch versuchte ich socketio und fand es ein Stück Scheiße – reptilicus

Antwort

4

Falls jemand anderes will das Gleiche tun, ist dies der einfachste Beispiel ist, könnte ich die Dinge einkochen am Beispiel von Reptilicus auf Basis ...

Anleitung

  1. Stellen Sie den Code unten gelegt heraus in der Struktur, die unten erwähnt wird.
  2. Installieren Sie die Python-Module unter
  3. Führen Sie den Server
  4. Führen Sie die Datenquelle
  5. Öffnen Sie einen Webbrowser und navigieren Sie zu http://localhost:25000/

Wenn alles geklappt hat aufgeführt Sie zusammen eine sehr einfache Seite sehen sollte diese Linien:

enter image description here

Pyt hon/Module

Dies waren die Versionen, die meine Testimplementierung verwendete. Andere mögen auch arbeiten.

  • Python v3.5.2
  • Pyzmq v15.2.0
  • GEVENT v1.2.0
  • karellen-geventws v1.0.1 (erforderlich über GEVENT-websocket für Python 3 -Träger)
  • Flask v0. 10.1
  • Flask-Sockets v0.2.1

Sie auch eine Kopie Reconnecting Websocket benötigen, availab le here.

-Code Layout

\ZmqFlaskForwarder 
    \static 
     \js 
      application.js 
      reconnecting-websocket.min.js 
    \templates 
     index.html 
    data_source.py 
    server.py 

Server App (server.py)

import zmq.green as zmq 
import json 
import gevent 
from flask_sockets import Sockets 
from flask import Flask, render_template 
import logging 
from gevent import monkey 

monkey.patch_all() 

app = Flask(__name__) 
logging.basicConfig(level=logging.INFO) 
logger = logging.getLogger(__name__) 

sockets = Sockets(app) 
context = zmq.Context() 

ZMQ_LISTENING_PORT = 12000 

@app.route('/') 
def index(): 
    logger.info('Rendering index page') 
    return render_template('index.html') 

@sockets.route('/zeromq') 
def send_data(ws): 
    logger.info('Got a websocket connection, sending up data from zmq') 
    socket = context.socket(zmq.SUB) 
    socket.connect('tcp://localhost:{PORT}'.format(PORT=ZMQ_LISTENING_PORT)) 
    socket.setsockopt_string(zmq.SUBSCRIBE, "") 
    poller = zmq.Poller() 
    poller.register(socket, zmq.POLLIN) 
    gevent.sleep() 
    received = 0 
    while True: 
     received += 1 
     # socks = dict(poller.poll()) 
     # if socket in socks and socks[socket] == zmq.POLLIN: 
     data = socket.recv_json() 
     logger.info(str(received)+str(data)) 
     ws.send(json.dumps(data)) 
     gevent.sleep() 

if __name__ == '__main__': 
    logger.info('Launching web server') 
    from gevent import pywsgi 
    from geventwebsocket.handler import WebSocketHandler 
    server = pywsgi.WSGIServer(('', 25000), app, handler_class=WebSocketHandler) 
    logger.info('Starting serving') 
    server.serve_forever() 

Datenquelle (data_source.py)

import zmq 
import random 
import sys 
import time 
import json 

port = "12000" 

context = zmq.Context() 
socket = context.socket(zmq.PUB) 
socket.bind("tcp://*:%s" % port) 
while True: 
    first_data_element = random.randrange(2,20) 
    second_data_element = random.randrange(0,360) 
    message = json.dumps({'First Data':first_data_element, 'Second Data':second_data_element}) 
    print(message) 
    socket.send_string(message) 
    time.sleep(0.5) 

Client-JavaScript (application.js)

ws = new ReconnectingWebSocket("ws://" + location.host + '/zeromq') 

ws.onmessage = function(message) { 
    payload = JSON.parse(message.data); 
    $('#latest_data').html('<h2> Data: ' + message.data + '</h2>'); 
}; 

Vorlage (index.html)

<!DOCTYPE html> 
<html> 
    <head> 
    <title>Python Websockets ZeroMQ demo</title> 
    </head> 
    <body> 
    <div class="container"> 
     <h2> Simple ZeroMQ data streaming via web sockets! </h2> 
     <div id="latest_data"></div> 
    </div> 
    <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script> 
    <script type="text/javascript" src="static/js/reconnecting-websocket.min.js"></script> 
    <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/d3/4.2.6/d3.min.js"></script> 
    <script type="text/javascript" src="static/js/application.js"></script> 
    </body> 
</html> 
+0

Das ist etwas, das ich schon eine Weile gesucht habe. Vielen Dank. Auf einem PC ist es perfekt, der andere - wenn ich eine Seite schließe, zeigt es einen Fehler * geventwebsocket.exceptions.WebSocketError: Socket ist tot ..dist-packages/geventwebsocket/websocket.py * ABER der andere PC ist Präfekt. Thnx – jaromrax

Verwandte Themen