Custom version of https://github.com/tomelec/RPi-LoRa-KISS-TNC
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
95 lines
2.7 KiB
3 years ago
|
#!/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))
|