Last active
November 29, 2019 14:18
-
-
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.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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