¿Cómo puedo transmitir datos a través de una aplicación de matraz?

Estoy investigando la posibilidad de usar una aplicación Flask como una interfaz para un sistema integrado. He usado matraz antes (escribí algunos sitios de matraz muy básicos para sondear sistemas externos en respuesta a una carga de página para llenar un gráfico, por ejemplo) pero no estoy seguro de cómo iría a insertar datos en la aplicación del matraz y en el navegador (s) del usuario.

Estaba planeando enviar datos desde una aplicación C ++ que se ejecuta en el dispositivo integrado a la aplicación del flask (también se ejecuta en el dispositivo integrado) utilizando ZeroMQ .

Por lo que he leído, algo como flask-socketIO sería una posibilidad para obtener cosas de Flask al navegador del usuario.

Lo único que no me queda claro es si es posible / ¿cómo haría para recibir datos de ZeroMQ y enviarlos al navegador?

En caso de que alguien más quiera hacer lo mismo, este es el ejemplo más simple al que podría resumir las cosas basándose en el ejemplo de reptilicus …

Instrucciones

  1. Establezca el siguiente código establecido en la estructura mencionada a continuación.
  2. Instale los módulos de Python listados abajo
  3. Ejecuta el servidor
  4. Ejecutar la fuente de datos
  5. Abra un navegador web y navegue a http://localhost:25000/

Si todo funcionara deberías ver una página muy básica en este sentido:

introduzca la descripción de la imagen aquí

Python / Módulos

Estas fueron las versiones que usó mi implementación de prueba. Otros pueden trabajar también.

  • Python v3.5.2
  • Pyzmq v15.2.0
  • gevent v1.2.0
  • karellen-geventws v1.0.1 (requerido sobre gevent-websocket para el soporte de Python 3)
  • Frasco v0.10.1
  • Frasco-Sockets v0.2.1

También necesita una copia de Reconnecting Websocket , disponible aquí .

Diseño de código

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

Aplicación de servidor (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() 

Fuente de datos (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) 

Cliente JavaScript (application.js)

 ws = new ReconnectingWebSocket("ws://" + location.host + '/zeromq') ws.onmessage = function(message) { payload = JSON.parse(message.data); $('#latest_data').html('

Data: ' + message.data + '

'); };

Plantilla (index.html)

    Python Websockets ZeroMQ demo   

Simple ZeroMQ data streaming via web sockets!