kopia lustrzana https://github.com/glidernet/python-ogn-client
rodzic
a612ca9965
commit
74f6f9671f
|
@ -1,4 +1,7 @@
|
||||||
# CHANGELOG
|
# CHANGELOG
|
||||||
|
## unreleased
|
||||||
|
- client: catch errors while connecting (fixes #74 and #91)
|
||||||
|
|
||||||
## 1.0.0: - 2020-10-15
|
## 1.0.0: - 2020-10-15
|
||||||
- client: changed socket mode from blocking to 5s timeout (fixes #89)
|
- client: changed socket mode from blocking to 5s timeout (fixes #89)
|
||||||
- parser: Added optional distance/bearing/normalized_quality calculation if parameter "calculate_relatives" is True (fixes #86)
|
- parser: Added optional distance/bearing/normalized_quality calculation if parameter "calculate_relatives" is True (fixes #86)
|
||||||
|
|
|
@ -15,32 +15,45 @@ def create_aprs_login(user_name, pass_code, app_name, app_version, aprs_filter=N
|
||||||
class AprsClient:
|
class AprsClient:
|
||||||
def __init__(self, aprs_user, aprs_filter='', settings=settings):
|
def __init__(self, aprs_user, aprs_filter='', settings=settings):
|
||||||
self.logger = logging.getLogger(__name__)
|
self.logger = logging.getLogger(__name__)
|
||||||
self.logger.info("Connect to OGN as {} with filter '{}'".format(aprs_user, (aprs_filter if aprs_filter else 'full-feed')))
|
|
||||||
self.aprs_user = aprs_user
|
self.aprs_user = aprs_user
|
||||||
self.aprs_filter = aprs_filter
|
self.aprs_filter = aprs_filter
|
||||||
self.settings = settings
|
self.settings = settings
|
||||||
|
|
||||||
self._kill = False
|
self._kill = False
|
||||||
|
|
||||||
def connect(self):
|
def connect(self, retries=1, wait_period=15):
|
||||||
# create socket, connect to server, login and make a file object associated with the socket
|
# create socket, connect to server, login and make a file object associated with the socket
|
||||||
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
while retries > 0:
|
||||||
self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)
|
retries -= 1
|
||||||
self.sock.settimeout(5)
|
try:
|
||||||
|
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||||
|
self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)
|
||||||
|
self.sock.settimeout(5)
|
||||||
|
|
||||||
if self.aprs_filter:
|
if self.aprs_filter:
|
||||||
port = self.settings.APRS_SERVER_PORT_CLIENT_DEFINED_FILTERS
|
port = self.settings.APRS_SERVER_PORT_CLIENT_DEFINED_FILTERS
|
||||||
else:
|
else:
|
||||||
port = self.settings.APRS_SERVER_PORT_FULL_FEED
|
port = self.settings.APRS_SERVER_PORT_FULL_FEED
|
||||||
|
|
||||||
self.sock.connect((self.settings.APRS_SERVER_HOST, port))
|
self.sock.connect((self.settings.APRS_SERVER_HOST, port))
|
||||||
self.logger.debug('Server port {}'.format(port))
|
|
||||||
|
|
||||||
login = create_aprs_login(self.aprs_user, -1, self.settings.APRS_APP_NAME, self.settings.APRS_APP_VER, self.aprs_filter)
|
login = create_aprs_login(self.aprs_user, -1, self.settings.APRS_APP_NAME, self.settings.APRS_APP_VER, self.aprs_filter)
|
||||||
self.sock.send(login.encode())
|
self.sock.send(login.encode())
|
||||||
self.sock_file = self.sock.makefile('rw')
|
self.sock_file = self.sock.makefile('rw')
|
||||||
|
|
||||||
self._kill = False
|
self._kill = False
|
||||||
|
|
||||||
|
self.logger.info("Connect to OGN ({}:{}) as {} with filter: {}".format(self.settings.APRS_SERVER_HOST, port, self.aprs_user, "'" + self.aprs_filter + "'" if self.aprs_filter else 'none (full-feed)'))
|
||||||
|
break
|
||||||
|
except (socket.error, ConnectionError) as e:
|
||||||
|
self.logger.error('Connect error: {}'.format(e))
|
||||||
|
if retries > 0:
|
||||||
|
self.logger.info('Waiting {}s before next connection try ({} attempts left).'.format(wait_period, retries))
|
||||||
|
sleep(wait_period)
|
||||||
|
else:
|
||||||
|
self._kill = True
|
||||||
|
self.logger.info('Giving up.')
|
||||||
|
|
||||||
def disconnect(self):
|
def disconnect(self):
|
||||||
self.logger.info('Disconnect')
|
self.logger.info('Disconnect')
|
||||||
|
@ -49,7 +62,7 @@ class AprsClient:
|
||||||
self.sock.shutdown(0)
|
self.sock.shutdown(0)
|
||||||
self.sock.close()
|
self.sock.close()
|
||||||
except OSError:
|
except OSError:
|
||||||
self.logger.error('Socket close error', exc_info=True)
|
self.logger.error('Socket close error')
|
||||||
|
|
||||||
self._kill = True
|
self._kill = True
|
||||||
|
|
||||||
|
@ -75,14 +88,14 @@ class AprsClient:
|
||||||
|
|
||||||
callback(packet_str, **kwargs)
|
callback(packet_str, **kwargs)
|
||||||
except socket.error:
|
except socket.error:
|
||||||
self.logger.error('socket.error', exc_info=True)
|
self.logger.error('socket.error')
|
||||||
except OSError:
|
except OSError:
|
||||||
self.logger.error('OSError', exc_info=True)
|
self.logger.error('OSError')
|
||||||
except UnicodeDecodeError:
|
except UnicodeDecodeError:
|
||||||
self.logger.error('UnicodeDecodeError', exc_info=True)
|
self.logger.error('UnicodeDecodeError')
|
||||||
|
|
||||||
if autoreconnect and not self._kill:
|
if autoreconnect and not self._kill:
|
||||||
self.connect()
|
self.connect(retries=100)
|
||||||
else:
|
else:
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
Ładowanie…
Reference in New Issue