Compare commits

...
16 Commits
Author SHA1 Message Date
hmrhkr 818c4e1ad3 added rfm init error msg 2024-01-29 11:55:11 +01:00
hmrhkr 5e2965d274 readded socat kill 2024-01-09 10:25:14 +01:00
hmrhkr e99a7e2012 moved variables for baudrate and packet_len 2024-01-09 10:21:51 +01:00
hmrhkr 82836a4ea3 readed subprocess import 2024-01-09 10:20:22 +01:00
hmrhkr f80676e266 changed back to socat keeping threaded model 2024-01-09 10:18:48 +01:00
hmrhkr ece7a3941b fixed ser reference in closing 2024-01-08 18:23:19 +01:00
hmrhkr d8cae4b086 removed socat, using pty 2024-01-08 18:21:45 +01:00
hmrhkr 2cae787e2a added socat echo=0 option back 2024-01-08 18:00:26 +01:00
hmrhkr 94be82dca6 adjusted socat baudrate option 2024-01-08 17:57:30 +01:00
hmrhkr 6b8187c2a4 added baudrate setting 2024-01-08 17:52:28 +01:00
hmrhkr a72aa16333 added rssi and snr reading, set baudrate, set packet_len to 120 2024-01-08 17:15:08 +01:00
hmrhkr 549e74daff added test server and client 2024-01-08 16:57:29 +01:00
hmrhkr ea3879fbde changed len constraint 2024-01-08 16:52:48 +01:00
hmrhkr e4d10a9f13 added condition to limit send packet size to 252 bytes 2024-01-08 16:00:41 +01:00
hmrhkr 187390e375 removed SerialEmulator.py 2024-01-08 15:27:55 +01:00
hmrhkr a7e38aedb7 populated readme 2024-01-08 15:27:32 +01:00
5 changed files with 148 additions and 55 deletions

No files matched your search

+12
View File
@@ -0,0 +1,12 @@
# Lora 2 Serial
## Mapping rfm9x SPI Device to a Serial File Interface for usage with AX.25 Kiss
creates /tmp/rfmtty and /tmp/rfmtty_client
Attach using kissattach /tmp/rfmtty_client ax0 IP_ADDRESS
with configured axports
https://github.com/dmahony/LoRa-AX25-IP-Network/wiki/Installation-Instructions
http://packet-radio.info/index.php?id=packet-radio-unter-linux-mit-linpac
-35
View File
@@ -1,35 +0,0 @@
import os, subprocess, serial, time
# this script lets you emulate a serial device
# the client program should use the serial port file specifed by client_port
# if the port is a location that the user can't access (ex: /dev/ttyUSB0 often),
# sudo is required
class SerialEmulator(object):
def __init__(self, device_port='./ttydevice', client_port='./ttyclient'):
self.device_port = device_port
self.client_port = client_port
cmd=['/usr/bin/socat','-d','-d','PTY,link=%s,raw,echo=0' %
self.device_port, 'PTY,link=%s,raw,echo=0' % self.client_port]
self.proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
time.sleep(1)
self.serial = serial.Serial(self.device_port, 9600, rtscts=True, dsrdtr=True)
self.err = ''
self.out = ''
def write(self, out):
self.serial.write(out)
def read(self):
line = ''
while self.serial.inWaiting() > 0:
line += self.serial.read(1)
return line
def __del__(self):
self.stop()
def stop(self):
self.proc.kill()
self.out, self.err = self.proc.communicate()
+50 -20
View File
@@ -1,4 +1,4 @@
import serial, subprocess, time
import serial, time, threading, subprocess
import busio
from digitalio import DigitalInOut, Direction, Pull
@@ -9,36 +9,66 @@ import adafruit_rfm9x
CS = DigitalInOut(board.CE1)
RESET = DigitalInOut(board.D25)
spi = busio.SPI(board.SCK, MOSI=board.MOSI, MISO=board.MISO)
try:
rfm = adafruit_rfm69.RFM69(spi, CS, RESET, 868.0)
except RuntimeError as error:
print('RFM69 Error: ', error)
#rfm = adafruit_rfm69.RFM69(spi, CS, RESET, 868.0)
rfm = adafruit_rfm9x.RFM9x(spi, CS, RESET, 868.0)
#rfm = adafruit_rfm9x.RFM9x(spi, CS, RESET, 868.0, baudrate=20000000)
addr = '/tmp/rfmtty'
addr_client = '/tmp/rfmtty_client'
baudrate = 115200
packet_len = 251
cmd=['/usr/bin/socat','-d','-d','PTY,link=%s,raw,echo=0' %
addr, 'PTY,link=%s,raw,echo=0' % addr_client]
socat_proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
time.sleep(1)
ser = serial.serial_for_url(addr)
print("Serieller Port: %s" % addr)
ser = serial.Serial(addr, baudrate=baudrate)
def serial_port_reader(ser, rfm):
while True:
ser_data = bytearray()
while ser.inWaiting() > 0 and len(ser_data) <= packet_len:
recieved_byte = ser.read(1)
ser_data += recieved_byte
if ser_data == b'':
pass
else:
print(f'Received serial data: {ser_data}')
rfm.send(ser_data)
def serial_port_writer(ser, rfm):
while True:
packet = None
packet = rfm.receive()
if packet is None:
pass
else:
print(f'Received lora RSSI: {rfm.last_rssi} SNR: {rfm.last_snr} data: {packet}')
ser.write(packet)
while True:
packet = None
packet = rfm.receive()
ser_data = bytearray()
while ser.inWaiting() > 0:
recieved_byte = ser.read(1)
ser_data += recieved_byte
if ser_data == b'':
reader_thread = threading.Thread(target=serial_port_reader, args=(ser,rfm), daemon=True)
reader_thread.start()
writer_thread = threading.Thread(target=serial_port_writer, args=(ser,rfm), daemon=True)
writer_thread.start()
try:
while True:
pass
else:
print(f'Received serial data: {ser_data}')
rfm.send(ser_data)
if packet is None:
pass
else:
print(f'Received lora byte: {packet}')
ser.write(packet)
socat_proc.kill()
except KeyboardInterrupt:
print("Programm durch Benutzer unterbrochen.")
finally:
socat_proc.kill()
ser.close()
reader_thread.join()
writer_thread.join()
+51
View File
@@ -0,0 +1,51 @@
import socket
import random
import string
import time
def generate_random_data(size):
return ''.join(random.choices(string.ascii_letters + string.digits, k=size)).encode('utf-8')
def start_client():
# Definiere Host und Port
host = '127.0.0.1'
port = 12345
while True:
# Erstelle einen Socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
# Verbinde zum Server
client_socket.connect((host, port))
print(f"Connected to {host}:{port}")
# Generiere eine zufällige Bytefolge
data_to_send = generate_random_data(50)
# Sende die Daten an den Server
client_socket.sendall(data_to_send)
print(f"Sent data: {data_to_send.decode('utf-8')}")
# Empfange die Antwort
received_data = client_socket.recv(1024)
print(f"Received data: {received_data.decode('utf-8')}")
# Überprüfe, ob die Antwort die gesendeten Daten sind
if received_data == data_to_send:
print("Server response matches the sent data.")
else:
print("Server response does not match the sent data.")
except Exception as e:
print(f"Error: {e}")
finally:
# Schließe die Verbindung zum Server
client_socket.close()
# Warte für eine kurze Zeit, bevor die nächste Anfrage gesendet wird
time.sleep(2)
if __name__ == "__main__":
start_client()
+35
View File
@@ -0,0 +1,35 @@
import socket
def start_server():
# Definiere Host und Port
host = '127.0.0.1'
port = 12345
# Erstelle einen Socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# Binde den Socket an Host und Port
server_socket.bind((host, port))
# Warte auf Verbindungen
server_socket.listen()
print(f"Server listening on {host}:{port}...")
while True:
# Warte auf eine Verbindung
client_socket, client_address = server_socket.accept()
print(f"Connection from {client_address}")
# Empfange und sende Daten zurück
data = client_socket.recv(1024)
print(f"Received data: {data.decode('utf-8')}")
# Sende die erhaltenen Daten zurück
client_socket.sendall(data)
# Schließe die Verbindung zum Client
client_socket.close()
if __name__ == "__main__":
start_server()