• #by-own #raspberrypi #developRobot

Kapitel 05: Tornado Webserver

Als Python-Webserver verwenden wir den Tornado Server. Tornado wird im Kapitel über die Einrichtung des RaspberryPi installiert. Es wird daher direkt das Skript vorgestellt. Es sollen dabei folgende Funktionalitäten gewährleistet werden:

  • Alle Hardwre-Komponeten sollen über diesen WebSocket Server mit der Java-Applikation kommunizieren können.
  • Es soll eine Handler eingerichtet werden, so dass Nachrichten an einzelne Komponenten gesendet werden können.

Kurze Erläuterungen:

Das Dictionary (in anderen Sprachen wie Java ist diese Datenstruktur als Map bekannt, es handelt sich um eine Key-Value-Liste) ws_clients_dictionary wird verwendet um alle Clients einzeln in diese Dictionary bei Ihrer ersten Anmeldung am Server zu registrieren. Dabei muss sicher sein, das die Erste Nachricht der einzelnen Komponente immer der Name selbst ist. 

Soll eine Nachricht nun an eine bestimmte Komponente gesendet werden, so wird der Name vorangestellt. Die Nachricht wird anhand des ";" gesplittet und kann dann durch die If-Anweisungen an eine einzelne Komponente versendet werden.

Im Standard Fall oder wenn keine Name passt, wird die Nachricht an die Java-Applikation gesendet.

from tornado import websocket
import tornado.ioloop

ws_clients_dictionary = {};
ws_clients = []

class EchoWebSocket(websocket.WebSocketHandler):

    def open(self):
        if self not in ws_clients:
            ws_clients.append(self)
        print ("Websocket Opened")

    def on_message(self, message):
        if(message.startswith('Name')):
            values = message.split(':')
            ws_clients_dictionary[values[1]] = self
        
        if(message.startswith('motorControllWS')):
            values = message.split(':')
            ws_clients_dictionary['motorControllWS'].write_message(values[1]+':'+values[2]);
        
        if(message.startswith('robotArm')):
            values = message.split(':')
            ws_clients_dictionary['robotArm'].write_message(values[1]+':'+values[2]);
        
        if(message.startswith('laser')):
            values = message.split(':')
            ws_clients_dictionary['laser'].write_message("laser"+':'+values[1]);
        
        else:
            values = message.split(':')
            if 'Java' in ws_clients_dictionary:
               ws_clients_dictionary['Java'].write_message(values[0]+':'+values[1]);
            else:
               print('Java application not regitered now')

        print (message)

    def on_close(self):
        if self in ws_clients:
            ws_clients.remove(self)
        print ("Websocket closed")

application = tornado.web.Application([(r"/", EchoWebSocket),])

if __name__ == "__main__":
    application.listen(9000)
    tornado.ioloop.IOLoop.instance().start()

Der Webserver wird später über die Java-Anwendung gestartet. Zu den ersten Entewicklungsprozess kann dieser jedoch auch jederzeit mit dem Befehl :

python3 ws-server.py

gestartet werden. Auf der Konsole werden dann die einzelnen Nachrichten angezeigt.

Im Nächsten Schritt wird nun die zunächst die Hardware Programmiert sowie die Websocket Clients für die einzelnen Komponenten, so dass sich im späteren Verlauf die auf die Java-Welt bzw. Spring-Boot Welt konzentriert werden kann.

© 2019 by-own
Wir benutzen Cookies

Wir nutzen Cookies auf unserer Website. Einige von ihnen sind essenziell für den Betrieb der Seite, während andere uns helfen, diese Website und die Nutzererfahrung zu verbessern (Tracking Cookies). Sie können selbst entscheiden, ob Sie die Cookies zulassen möchten. Bitte beachten Sie, dass bei einer Ablehnung womöglich nicht mehr alle Funktionalitäten der Seite zur Verfügung stehen.