Skip to content
Snippets Groups Projects
Commit 939bcd44 authored by Paul-Winpenny's avatar Paul-Winpenny
Browse files

OOPified the wifi handler.

parent 7680cd6e
No related branches found
No related tags found
No related merge requests found
import queue
import socket import socket
import threading import threading
import time import time
UDP_IP = "255.255.255.255" class RoboBinConnectionHandler:
UDP_PORT = 5005 def __init__(self, udp_ip="255.255.255.255", udp_port=5005, listen_port=5006):
LISTEN_PORT = 5006 self.queue = queue.Queue(10)
self.UDP_IP = udp_ip
self.UDP_PORT = udp_port
self.LISTEN_PORT = listen_port
self.stop_event = threading.Event()
self.message_handlers = {
"PING": self.handle_ping,
"TIME": self.handle_time_request,
"CALLOVER" : self.handle_call_over,
"CUSTOM": self.handle_custom_message,
def broadcast_presence(): }
self.udp_sock = None
self.tcp_socket = None #
def broadcast_presence(self):
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
while True: while not self.stop_event.is_set():
message = b"ROBOBIN_PRESENT" message = b"ROBOBIN_PRESENT"
sock.sendto(message, (UDP_IP, UDP_PORT)) try:
sock.sendto(message, (self.UDP_IP, self.UDP_PORT))
print("Broadcasting: {}".format(message.decode())) print("Broadcasting: {}".format(message.decode()))
except OSError as e:
print(f"Broadcast error: {e}")
break
time.sleep(5) time.sleep(5)
def handle_ping(client_socket): sock.close()
print("Broadcasting stopped.")
def handle_ping(self, client_socket):
print("Received PING from client.") print("Received PING from client.")
response = b"PONG" response = b"PONG"
print("Sending PONG to client.") print("Sending PONG to client.")
client_socket.sendall(response) client_socket.sendall(response)
def handle_time_request(client_socket): def handle_time_request(self, client_socket):
current_time = time.ctime().encode() current_time = time.ctime().encode()
print(f"Sending current time: {current_time.decode()}") print(f"Sending current time: {current_time.decode()}")
client_socket.sendall(current_time) client_socket.sendall(current_time)
def handle_custom_message(client_socket, message): def handle_custom_message(self, client_socket, message):
response = f"Received custom message: {message}".encode() response = f"Received custom message: {message}".encode()
print(f"Custom handler response: {response.decode()}") print(f"Custom handler response: {response.decode()}")
client_socket.sendall(response) client_socket.sendall(response)
def handle_unknown_message(client_socket):
def handle_call_over(self, client_socket, message):
response = f"User has requested node: {message}".encode()
print(f"Call over handler response: {response.decode()}")
client_socket.sendall(response)
def handle_unknown_message(self, client_socket):
response = b"I don't know this message." response = b"I don't know this message."
print("Sending response to unknown message.") print("Sending response to unknown message.")
client_socket.sendall(response) client_socket.sendall(response)
message_handlers = { def handle_client_connection(self, client_socket):
"PING": handle_ping, try:
"TIME": handle_time_request, while not self.stop_event.is_set():
"CUSTOM": handle_custom_message, client_socket.settimeout(1)
}
def handle_client_connection(client_socket):
try: try:
while True:
request = client_socket.recv(1024) request = client_socket.recv(1024)
except socket.timeout:
continue
except OSError as e:
print(f"Client socket error: {e}")
break
if not request: if not request:
print("No request received, closing connection.") print("No request received, closing connection.")
break break
message = request.decode() message = request.decode()
print("Received from client: {}".format(message)) print("Received from client: {}".format(message))
parts = message.split(" ", 1) parts = message.split(" ", 1)
message_type = parts[0] message_type = parts[0]
message_data = parts[1] if len(parts) > 1 else None message_data = parts[1] if len(parts) > 1 else None
if message_type in message_handlers: if message_type in self.message_handlers:
if message_type == "CUSTOM" and message_data: if message_data:
message_handlers[message_type](client_socket, message_data) self.message_handlers[message_type](client_socket, message_data)
else: else:
message_handlers[message_type](client_socket) self.message_handlers[message_type](client_socket)
else: else:
handle_unknown_message(client_socket) self.handle_unknown_message(client_socket)
except ConnectionResetError: except ConnectionResetError:
print("Client connection was forcibly closed.") print("Client connection was forcibly closed.")
...@@ -73,34 +101,74 @@ def handle_client_connection(client_socket): ...@@ -73,34 +101,74 @@ def handle_client_connection(client_socket):
client_socket.close() client_socket.close()
print("Client disconnected.") print("Client disconnected.")
def listen_for_connections(): def listen_for_connections(self):
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) self.udp_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind(('', LISTEN_PORT)) self.udp_sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.udp_sock.bind(('', self.LISTEN_PORT))
while True: while not self.stop_event.is_set():
try: try:
data, addr = sock.recvfrom(1024) self.udp_sock.settimeout(1) # Timeout for blocking recvfrom call
data, addr = self.udp_sock.recvfrom(1024)
if data.decode() == "CONNECT": if data.decode() == "CONNECT":
print("Received connection request from {}".format(addr)) print("Received connection request from {}".format(addr))
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as tcp_socket: self.tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcp_socket.bind(('', 5006)) self.tcp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
tcp_socket.listen(1) self.tcp_socket.bind(('', self.LISTEN_PORT))
self.tcp_socket.listen(1)
print("Listening for TCP connection...") print("Listening for TCP connection...")
client_socket, client_addr = tcp_socket.accept() client_socket, client_addr = self.tcp_socket.accept()
print("Client connected from {}".format(client_addr)) print("Client connected from {}".format(client_addr))
threading.Thread(target=handle_client_connection, args=(client_socket,)).start() threading.Thread(target=self.handle_client_connection, args=(client_socket,)).start()
except socket.timeout:
continue
except OSError as e:
print(f"UDP socket no longer open (likely due to stop event):" )
break
except Exception as e: except Exception as e:
print(f"An error occurred while listening for connections: {e}") print(f"An error occurred while listening for connections: {e}")
# Start broadcasting and listening threads # Close sockets if stop event is set
broadcast_thread = threading.Thread(target=broadcast_presence) if self.udp_sock:
listen_thread = threading.Thread(target=listen_for_connections) self.udp_sock.close()
if self.tcp_socket:
broadcast_thread.start() self.tcp_socket.close()
listen_thread.start() print("Listening stopped.")
broadcast_thread.join() def start(self):
listen_thread.join() self.broadcast_thread = threading.Thread(target=self.broadcast_presence)
self.listen_thread = threading.Thread(target=self.listen_for_connections)
self.broadcast_thread.start()
self.listen_thread.start()
def stop(self):
print("Stopping server...")
self.stop_event.set()
# Safely close the sockets to prevent further operations on closed sockets
if self.udp_sock:
self.udp_sock.close()
if self.tcp_socket:
self.tcp_socket.close()
self.broadcast_thread.join()
self.listen_thread.join()
print("Server stopped.")
# Instantiate and start the handler
if __name__ == "__main__":
robobin_handler = RoboBinConnectionHandler()
robobin_handler.start()
print("Server started. Type 'stop' to shut down.")
# Main loop to accept CLI input
while True:
command = input("Enter command: ")
if command.strip().lower() == "stop":
robobin_handler.stop()
elif command.strip().lower() == "status":
print("Server is running.")
#printstatus() # Funciton will be added later
break
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment