Moin
Ich arbeite zZt an einem Projekt für einen Forumuser, um eine art "Ausleih"-Server zu realisieren. Dabei wird ein Barcode-Scanner verwendet um Strichcodes von Gegenständen einzulesen sowie eine Web-Oberfläche die der Ausleiher bedienen kann... Soviel zur groben Beschreibung
Ich nutze multiprocessing.Queue's um sowohl Eingaben als auch die Barcodes zu handhaben, als auch zur Logausgabe..
Habe 3 verschiedene Scripts erstellt:
-
Main.py: Haupt-Process von dem aus die anderen beiden Initialisiert werden und rückführend die Daten verarbeitet werden.
Spoiler anzeigen
-
PHP
#!/usr/bin/python3# coding: utf-8## Werkzeug Verleih fuer JumpY# 12.01.2016 Copyright (C) by meigrafd (meiraspi@gmail.com) published under the MIT License#import multiprocessing as mpimport timefrom Barcode import *from WebSocket import *#-------------------------------------------------------------------HID_device = '/dev/hidraw0'WebSocketHost = "0.0.0.0"WebSocketPort = 7070#-------------------------------------------------------------------# Main processif __name__ == '__main__': # Create instance of queues and processes logQueue = mp.Queue() BarcodeQueue = mp.Queue() WebSocketQueue = mp.Queue() BarcodeProcess = ProcessBarcode(BarcodeQueue, logQueue) WebSocketProcess = ProcessWebSocket(WebSocketQueue, logQueue) processList = [mp.Process(target=BarcodeProcess.Run, args=(HID_device,)), mp.Process(target=WebSocketProcess.Run, args=(WebSocketPort,WebSocketHost))]# starting child processes for i in range(0, len(processList)): processList[i].start()# Endless loop of main program try: while True: if not logQueue.empty(): print(logQueue.get())if not WebSocketQueue.empty(): request = WebSocketQueue.get() request = request.strip() returnlist = "" requestsplit = request.split(':') requestsplit.append("dummy") print("processing command: {}".format(command)) command = requestsplit[0] value = requestsplit[1] if value == "dummy": value = "0" if command == "localping": returnlist += "\n localping:ok"elif command == "get_user": ID = BarcodeQueue.get() returnlist += "\n get_user:" + str(ID)if returnlist: WebSocketProcess.send_msg(returnlist) time.sleep(0.1) except (KeyboardInterrupt, SystemExit): print("Schliesse Programm..")[/php][/spoiler][/list][list]
Spoiler anzeigen
-
PHP
[b]Barcode.py[/b]: Wartet permanent darauf das der Ausleiher ein Strichcode einliegt, und fügt diesen dann in ein Queue ein.[spoiler][code=php]# coding: utf-8import time, sysclass ProcessBarcode: def __str__(self): self.nachricht = "Process Barcode" return self.nachrichtdef __init__(self, BarcodeQueue, logQueue): self.BQueue = BarcodeQueue self.lQueue = logQueuedef Run(self, Device): import random while True: time.sleep(10) bla=0 for x in range(0,10): bla += (random.randint(1,200)) self.BQueue.put(bla) self.lQueue.put("Barcode: {}".format(bla)) time.sleep(10)return[/php][/spoiler][/list][list]
Spoiler anzeigen
-
PHP
Alles anzeigen[b]WebSocket.py[/b]: Kümmert sich um alles was vom oder zum Web-Interface betrifft und fügt Abfragen in ein Queue ein. (in dieser Datei hab ich die Probleme) [spoiler][code=php] # coding: utf-8 import time, sys from websocket_server import WebsocketServer from functools import partial class ProcessWebSocket: def __str__(self): self.nachricht = "Process WebSocket" return self.nachricht def __init__(self, WebSocketQueue, logQueue): self.WSQueue = WebSocketQueue self.lQueue = logQueue # Called for every client connecting (after handshake) def new_client(self, client, server): self.lQueue.put("WebSocket: New client connected and was given id %d" % client['id']) self.client = client self.server = server self.server.send_message(client, "You are connected") # Called for every client disconnecting def client_left(self, client, server): if client['id']: self.lQueue.put("WebSocket: Client(%d) disconnected" % client['id']) self.client = None # Called when a client sends a message def message_received(self, client, server, message): self.WSQueue.put(message) self.lQueue.put("WebSocket: {}".format(message)) def send_msg(self, message): self.server.send_message(self.client, message) def Run(self, WebSocketPort, WebSocketHost): server = WebsocketServer(host=WebSocketHost, port=WebSocketPort) server.set_fn_new_client( partial(ProcessWebSocket.new_client, self) ) server.set_fn_client_left( partial(ProcessWebSocket.client_left, self) ) server.set_fn_message_received( partial(ProcessWebSocket.message_received, self) ) server.run_forever() [/php][/spoiler][/list] [list]
Spoiler anzeigen
PHPwebsocket_server.py: Ist nicht von mir. Beinhaltet eine WebSocket_Server Klasse. Quelle: https://github.com/Pithikos/python-websocket-server[/list]Zum debuggen gibt Barcode.py nur zufällige Zahlen aus. Main.py soll eigentlich auch noch Verbindung zu einer MySQL-Datenbank aufnehmen, aber das nutze ich auch erst mal nicht da nicht weiter wichtig fürs debuggen...So, nun aber zum Fehler:Sobald das Web-Interface eine Anfrage "get_user" stellt und Main.py eine Antwort zurück schicken soll, erhalte ich eine Fehlermeldung:[code]pi@raspberrypi:~/Verleih$ ./Main.py Listening on port 7070 for clients..Barcode: 1118WebSocket: New client connected and was given id 1processing command: get_userTraceback (most recent call last): File "./Main.py", line 62, in <module> WebSocketProcess.send_msg(returnlist) File "/home/pi/Verleih/WebSocket.py", line 34, in send_msg self.server.send_message(message)AttributeError: 'ProcessWebSocket' object has no attribute 'server'
...an diesem Problem kracksel ich jetzt schon seit 3 Stunden rum aber kriegs nicht hin =(
Weiß jemand Rat?