Skip to content

Instantly share code, notes, and snippets.

@frankgould
Last active November 29, 2019 14:18
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save frankgould/c6ff632cedf3bcf9494e580a50de5a82 to your computer and use it in GitHub Desktop.
Save frankgould/c6ff632cedf3bcf9494e580a50de5a82 to your computer and use it in GitHub Desktop.
The primary app to handle the client socket interface to the rover server.
#!/usr/bin/env python3
# rover-client.py is the Rover client app to receive ping from Remote and respond with ACK
import sys, socket, selectors, traceback, time
import rover_libclient
from datetime import datetime
sel = selectors.DefaultSelector()
# Connection startup - Socket and Message Object Creation
def start_connection(host, port, device, request):
global sock, events, message
addr = (host, port)
print("rover-client starting connection to", addr)
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setblocking(False)
sock.connect_ex(addr)
events = selectors.EVENT_READ | selectors.EVENT_WRITE
message = rover_libclient.Message(sel, sock, addr, device, request)
sel.register(sock, events, data=message)
print("rover-client completed connection to Rover Server socket at", addr)
# Open port to local rover comm server and receive Connected before entering receive mode from remote
host, port, device = '127.0.0.1',33000,'rover'
request = dict(encoding="utf-8", content=dict(device=device, action='connect'))
start_connection(host, port, device, request) # Sends rover name and connect request
# Connection Startup (receive json field message) ---> Connected
result = ''
try:
while True:
events = sel.select(timeout=1)
# print("\nrover-client startup events triggered ******")
for key, mask in events:
message.request = {'device': 'rover', 'action': 'connect'}
try:
message.process_events(mask)
content = message.json_content
if len(content) != 0:
# print('rover-client len(content) != 0')
result = content["result"]
except Exception:
print("rover-client startup error: exception for", f"{message.addr}:\n{traceback.format_exc()}")
message.close()
if result == 'Connected':
break
# Check for a socket being monitored to continue.
if not sel.get_map():
break
except:
print("Failed to receive Connected response at startup. Attempting to poll.")
pass
# Enter receive mode for remote to send ping to respond with ACK
content = {}
#print('\nEntering main loop **********')
events = selectors.EVENT_READ
message._jsonheader_len = None # clear json values for read
message.jsonheader = None
message.response = None
message.request = None
#mask = 1
try:
while True:
events = sel.select(timeout=1)
for key, mask in events:
message = key.data
try:
# print("rover-client main loop process_events(mask):", str(mask))
message.process_events(mask)
except Exception:
print("rover-client main loop error: exception for", f"{message.addr}:\n{traceback.format_exc()}")
message.close()
# print("rover-client main loop message.json_content:", str(message.json_content))
content = message.json_content
if len(content) != 0:
device = content['device']
if device == 'rover': # If this command is for me, rover, send ACK for tests.
command = content['action']
else:
command = content['result']
print('rover-client response to ping: ', command + ' at ' + str(datetime.now())[0:19])
if device == 'rover' and command == 'ping': # Send ACK in response to ping
# print('\nCreating ACK message in response to ping from remote.')
message.request = {'device':'remote','result':'ACK'}
message.queue_request()
message.json_content = {}
# Check for a socket being monitored to continue.
if not sel.get_map():
break
except KeyboardInterrupt:
print("\ncaught keyboard interrupt, exiting\n\n")
finally:
sel.close()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment