Roboten Counter-Strike (14 / 16 steg)
Steg 14: Raspberry Pi serverkod - funktionella kod
I föregående avsnitt gick vi över del av koden som sätter upp Raspberry Pi servern. I detta steg ska vi gå över den andra halvan av serverkoden.
För det första behöver vi ett sätt att tolka meddelanden som kommer in via TCP-socketen. Vi utvecklar våra egna protokoll för att tolka meddelanden: giltiga kommandon måste börja med en bokstav som betecknar typ av kommando, en parametrar som anger värdet (om tillämpligt), och slutar med en |. Som du ser i kommentarerna, den ' |' hjälper oss att undvika situationer där kommandon bli klungade tillsammans och vi krascha servern.
# Används för att tolka data.
# Vår inkommande dataprotokoll kommer först med en enda bokstav beteckna typ av kommando
# Det sedan kommer med värdet, vars slut markeras av en ' |'
# Den ' |' är nödvändiga för att förhindra högar tillsammans nätverkspaket
# Till exempel: "Y1320|" berättar Pi detta som ett "Y" kommando (torn), ange ett värde för 1320, och den ' |' anger slutet av kommandot
# Vi behöver den ' |' att avgränsa i slutet av ett kommando för att förhindra högar tillsammans för data
# Till exempel, vi kan av misstag ha kommandon som "Y1230X343" utan röret, och pi inte skulle veta vad till gör med kommandot
def parse_data(raw_data):
pipe_pos = raw_data.find('|')
command_key = raw_data [0]
command_value = raw_data [1:pipe_pos]
återkomst [command_key, command_value]
Avslutningsvis går vi över faktiska åtgärder koden. Eftersom vi definierade mycket kod som hjälpare metoder i tidigare delar av filen, ser i det här avsnittet faktiskt relativt rena. Detta är i huvudsak en if/else uttalande som växlar genom kommandon, och om det spärrarna på en rätt kommando, kör rätt rörelse koden. Och sedan i slutet av filen, när klienten avslutar, vi ska avsluta anslutningen.
samtidigt sant:
# Läs i data
raw_data = connection.recv(1024).rstrip() # rstrip tar bort avslutande blanksteg
skriva ut "Mottagna rådata för" + str(raw_data)
data = parse_data(raw_data)
# Y kommandon torn vinkeln
om data [0] == "Y":
skriva ut "fick Y riktning för:" + str(data[1])
turretX(int(data[1]))
# X kommandon snurrandet av fordonet (vänster eller höger)
Elif data [0] == "X":
om (float(data[1]) < 0):
# negativa, spin vänster
skriva ut "fick vänster X riktning för:" + str(data[1])
spinLeft(abs(float(data[1])))
Elif (float(data[1]) > 0):
# positiva, snurra höger
skriva ut "fått rätt X riktning för:" + str(data[1])
spinRight(abs(float(data[1])))
annat:
# Full stop
skriva ut "fick 0 X - fullt stopp!"
# fullStop()
# F kommandon bränning
Elif data [0] == "F":
skriva ut "Fick avfyra kommandot"
fireGun()
# W kommandon fram
Elif data [0] == "W":
skriva ut "Framåt"
moveForward()
# S kommandon omvänd
Elif data [0] == "S":
skriva ut "Omvänd"
moveReverse()
# P kommandon full-stop
Elif data [0] == "P":
skriva ut "FULLSTOP"
fullStop()
annat:
skriva ut "inget mappade kommando: (nyckel/värde) =" + str(data[0]) + "/" + str(data[1])
skriva ut 'Closed'
Connection.Close()
Och det är det för serverkoden! I nästa avsnitt, ska vi gå över klientkoden.