Stap 14: Raspberry Pi servercode - functionele Code
In de vorige sectie gingen we over het deel van de code die de Raspberry Pi-server ingesteld. In deze stap gaan we tijdens de tweede helft van de servercode.
Eerste plaats moeten wij een manier om te ontleden berichten die via de TCP-socket binnenkomen. Wij ontwikkelen onze eigen protocol voor het interpreteren van berichten: geldige opdrachten moeten beginnen met een letter die betekent het type opdracht, een parameters waarmee de waarde (indien van toepassing), en eindigt met een |. Zoals u in de commentaren zien kunt, de ' |' helpt ons vermijden waar opdrachten worden gebundelde samen en we de server crash.
# Use this to parse the data.# Our incoming data protocol comes first with a single capital letter signifying the type of command# It then comes with the value, whose ending is marked by a '|'# The '|' is necessary to prevent bunching together of network packets # For example: `Y1320|` tells the Pi that this is a 'Y' command (turret), set it to a value of 1320, and the '|' indicates end of this command# We need the '|' to demarcate the end of a command to prevent bunching together of data# For example, we might accidentally have commands like `Y1230X343` without the pipe, and the pi wouldn't know what to do with the command def parse_data(raw_data): pipe_pos = raw_data.find('|') command_key = raw_data[0] command_value = raw_data[1:pipe_pos] return [command_key, command_value]
Tot slot, we gaan over de werkelijke actiecode. Aangezien wij een heleboel code gedefinieerd als helper methodes in vorige delen van het bestand, deze sectie ziet er eigenlijk relatief schone. Dit is in wezen een if/else-instructie die schakelt door middel van de opdrachten, en als het zakken op een juiste opdracht, wordt de juiste beweging code uitgevoerd. En aan het einde van het bestand, zodra de cliënt heeft afgesloten, we zullen sluit vervolgens de verbinding.
while True: # Read in data raw_data = connection.recv(1024).rstrip() # rstrip removes trailing spaces print "Received raw data of " + str(raw_data) data = parse_data(raw_data) # Y commands the turret angle if data[0] == "Y": print "Received Y direction for: " + str(data[1]) turretX(int(data[1])) # X commands the spin of the vehicle (left or right) elif data[0] == "X": if (float(data[1]) < 0): # negative, spin left print "Received LEFT X direction for: " + str(data[1]) spinLeft(abs(float(data[1]))) elif (float(data[1]) > 0): # positive, spin right print "Received RIGHT X direction for: " + str(data[1]) spinRight(abs(float(data[1]))) else: # Full stop print "received 0 X - full stop!" # fullStop() # F commands firing elif data[0] == "F": print "Received Firing command" fireGun() # W commands forward elif data[0] == "W": print "FORWARD" moveForward() # S commands reverse elif data[0] == "S": print "REVERSE" moveReverse() # P commands full-stop elif data[0] == "P": print "FULLSTOP" fullStop() else: print "No mapped command: (Key/Value) = " + str(data[0]) + "/" + str(data[1]) print 'Closed'connection.close()
En dat is het voor de servercode! In het volgende gedeelte gaan we over de clientcode.