Python Forum
how to split socket data onto multiple clients for separate processing - Printable Version

+- Python Forum (https://python-forum.io)
+-- Forum: Python Coding (https://python-forum.io/forum-7.html)
+--- Forum: Networking (https://python-forum.io/forum-12.html)
+--- Thread: how to split socket data onto multiple clients for separate processing (/thread-36034.html)



how to split socket data onto multiple clients for separate processing - ConcealedFox70 - Jan-11-2022

i am controlling 4 stepper motors as a mecanum robot in python socket to esp8266 arduino with a limited amount of pins. i would like to add a pair of servos for a camera gimbal but it will have to be controlled by my raspberry pi because i have no spare pins on the esp8266.

i have the server running pygame joystick and will need to split the controller data to a second client. i see two issues here. firstly how do i run a pair of clients on the same server with each their own dedicated tasks? and second how do i differentiate the two clients so they receive the right data?

below is my current server script that only controls the 4 stepper motors. how do i start adding the two servo controls for my raspberry pi? currently using left joystick and both triggers on my gamepad and would like to use the right joystick for the camera gimbal

import socket
import pygame
from pygame.locals import *

m1x = 0.0
m2x = 0.0
m3x = 0.0
m4x = 0.0
m1y = 0.0
m2y = 0.0
m3y = 0.0
m4y = 0.0
m1rx = 0.0
m2rx = 0.0
m3rx = 0.0
m4rx = 0.0
value_tl = 0.0
value_tr = 0.0
pause_state = False
connected = False
m1 = 15000
m2 = 15000
m3 = 15000
m4 = 15000
startline = '<'
finishline = '>'

pygame.init()
clock = pygame.time.Clock()
pygame.joystick.init()
joysticks = [pygame.joystick.Joystick(i) for i in range(pygame.joystick.get_count())]
for joystick in joysticks:
    print(joystick.get_name())

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((socket.gethostbyname(socket.gethostname()), 1324))
s.listen()
print('listening')
client, address = s.accept()
print(f'Connected from {address}')
connected = True

if 'FrSky' in joystick.get_name():
    while True:
        pass
else:
    while True:
        joysticks = [pygame.joystick.Joystick(i) for i in range(pygame.joystick.get_count())]
        for event in pygame.event.get():
            if event.type == JOYAXISMOTION:
                if event.axis == 0:
                    value_x = event.value
                    m1x = value_x
                    m2x = value_x * (-1)
                    m3x = value_x * (-1)
                    m4x = value_x
                if event.axis == 1:
                    value_y = event.value * (-1)
                    m1y = value_y
                    m2y = value_y
                    m3y = value_y
                    m4y = value_y
                if event.axis == 2:
                    value_rx = event.value
                    m1rx = value_rx * (-1)
                    m2rx = value_rx * (-1)
                    m3rx = value_rx
                    m4rx = value_rx
                if event.axis == 4:
                    value_tl = round(event.value + 1, 4)
                if event.axis == 5:
                    value_tr = round(event.value + 1, 4)
            if event.type == JOYBUTTONDOWN:
                if event.button == 7:
                    pause_state = not pause_state
            value_t = ((value_tr) - (value_tl)) / 2
            m1t = value_t * (-1)
            m2t = value_t * (-1)
            m3t = value_t
            m4t = value_t
            m1 = round((m1x + m1y + m1t + 2) * 15000, 0)
            m2 = round((m2x + m2y + m2t + 2) * 15000, 0)
            m3 = round((m3x + m3y + m3t + 2) * 15000, 0)
            m4 = round((m4x + m4y + m4t + 2) * 15000, 0)
        if pause_state == False:
            try:
                print(f'm 1 {m1} 2 {m2} 3 {m3} 4 {m4}')
                data = (f'{startline}{m1},{m2},{m3},{m4}{finishline}')
                data = bytes(data, 'utf-8')
                client.send(data)
            except ConnectionAbortedError:
                print('client aborted')
                connected = False
                while not connected:
                    try: 
                        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
                        s.bind((socket.gethostbyname(socket.gethostname()), 1324))
                        s.listen()
                        print('listening')
                        client, address = s.accept()
                        print(f'Connected from {address}')
                        connected = True
                    except socket.error:
                        clock.tick(0.5)
            except ConnectionResetError:
                print('client lost')
                connected = False
                while not connected:
                    try: 
                        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
                        s.bind((socket.gethostbyname(socket.gethostname()), 1324))
                        s.listen()
                        print('listening')
                        client, address = s.accept()
                        print(f'Connected from {address}')
                        connected = True
                    except socket.error:
                        clock.tick(0.5)
                    
        else:
            print('pause')
            pause_data = (f'{startline}{15000},{15000},{15000},{15000}{finishline}')
            pause_data = bytes(pause_data, 'utf-8')
            client.send(pause_data)
            while pause_state:
                for event in pygame.event.get():
                            if event.type == JOYBUTTONDOWN:
                                if event.button == 7:
                                    pause_state = not pause_state
                                
        clock.tick(60)
client.close()