Ich arbeite an einer Python-App. Für die grundlegende Implementierung muss ein Raspberry Pi mit einem Hauptserver verbunden sein und Nachrichten freigeben. Der Server wird eine Python-App ausführen, um Daten zu analysieren und Informationen an den Raspberry Pi zurückzugeben.Python und Socket.IO - App hängt nach der Verbindung
Ich implementiere dieses System mit python-socketio für den Server-Teil und socketio.client für den Raspberry Pi-Code.
Mein Problem ist, dass ich eine Verbindung zum Server herstellen kann und eine Antwortnachricht erhalten kann, aber dann hängt das Programm auf der Clientseite.
Code Meines Servers ist:
import socketio
import eventlet
from flask import Flask
# Define Socket.IO server and application wrapper
sio = socketio.Server()
app = Flask(__name__)
@sio.on('connect', namespace = '/test')
def connect(sid, environ):
print 'New Connection ' + sid
sio.emit("server_response", sid, room = sid, namespace = '/test')
@sio.on('message', namespace = '/test')
def message(sid, data):
print 'message ' + sid + " " + data
sio.emit("server_reply", data = "Hello", room = sid, namespace = '/test')
@sio.on('disconnect', namespace = '/test')
def disconnect(sid):
print 'disconnect ' + sid
if __name__ == '__main__':
# Wrap Flask application with Socket.IO's middleware
app = socketio.Middleware(sio, app)
# Deploy as an eventlet WSGI server
eventlet.wsgi.server(eventlet.listen(('',8000)), app)
Wie für den Client-Teil ich diesen Code bin mit:
from socketIO_client import SocketIO, BaseNamespace
global sio
global testNamespace
global myId
class testNamespace(BaseNamespace):
def on_server_response(self, userID):
myId = userID
print "Socket connection accepted"
print "I was assigned the id: " + myId
def on_server_reply(self, data):
print "message response: " + data
if __name__ == "__main__":
# Establish the connection
sio = SocketIO('localhost', 8000)
testNamespace = sio.define(testNamespace, '/test')
print "Going to emit message"
testNamespace.emit("message", "Hello")
sio.wait()
Aus irgendeinem Grund habe ich den Server-Antwort mit der ID zugewiesen, aber dann das Programm erreicht nie die Zeile
print "Going to emit message"
Ich dachte zunächst, es war etwas mit dem Namespace verwandt Aber da Druckanweisungen nie vorkommen, verstehe ich nicht, was ich falsch mache.
EDIT
Ich habe bemerkt, dass, wenn on_server_response ich versuchen, die Nachricht Hallo zu emittieren mit
self.emit("message", "Hello")
Ich bin in der Lage, die Nachricht an den Server zu senden und bekommen es Antworten . Was ich jetzt nicht verstehe ist wie man Ereignisse außerhalb der Klassendefinition auf dem Hauptprogramm ausgeben kann.