You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

95 lines
2.7 KiB

#!/usr/bin/python
# -*- coding: utf-8 -*-
from __future__ import print_function
RECV_BUFFER_LENGTH = 1024
import sys
from threading import Thread
import socket
from KissHelper import SerialParser
import KissHelper
def logf(message):
print(message, file=sys.stderr)
class KissServer(Thread):
'''TCP Server to be connected by the APRS digipeater'''
txQueue = None
# host and port as configured in aprx/aprx.conf.lora-aprs < interface > section
def __init__(self, txQueue, host="127.0.0.1", port=10001):
Thread.__init__(self)
self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.socket.bind((host, port))
self.socket.listen(1)
self.data = str()
self.txQueue = txQueue
self.connection = None
def run(self):
parser = SerialParser(self.queue_frame)
while True:
self.connection = None
self.connection, client_address = self.socket.accept()
parser.reset()
logf("KISS-Server: Connection from %s" % client_address[0])
while True:
data = self.connection.recv(RECV_BUFFER_LENGTH)
if data:
parser.parse(data)
else:
self.connection.close()
break
def queue_frame(self, frame):
print("KISS frame:", repr(frame))
decoded_data = KissHelper.decode_kiss(frame)
print("Decoded:", decoded_data)
self.txQueue.put(decoded_data, block=False)
def __del__(self):
self.socket.shutdown()
def send(self, data, metadata):
try:
encoded_data = KissHelper.encode_kiss(data)
except Exception as e:
print("KISS encoding went wrong (exception while parsing)")
traceback.print_tb(e.__traceback__)
encoded_data = None
if encoded_data != None:
print("To Server: " + repr(encoded_data))
if self.connection:
self.connection.sendall(encoded_data)
else:
print("KISS encoding went wrong")
if __name__ == '__main__':
'''Test program'''
import time
from multiprocessing import Queue
TCP_HOST = "0.0.0.0"
TCP_PORT = 10001
# frames to be sent go here
KissQueue = Queue()
server = KissServer(TCP_HOST, TCP_PORT, KissQueue)
server.setDaemon(True)
server.start()
while True:
server.send(
"\xc0\x00\x82\xa0\xa4\xa6@@`\x9e\x8ar\xa8\x96\x90q\x03\xf0!4725.51N/00939.86E[322/002/A=001306 Batt=3.99V\xc0")
data = KissQueue.get()
print("Received KISS frame:" + repr(data))