Dateien Serialisieren

alex0549

Mitglied
hi,

möchte gerne Dateien Serialisieren zum Beispiel ein Bild (jpg) oder eine txt Datei (txt) um sie dann zu verschicken.Leider gehen ja .doc sprich MS Office dateien nicht wie ich gelesen habe oder!?

Ich bräuchte das um dateien als Anhang zu verschicken. Ja ich weis das gibt es in der java.mail api aber ich sende nicht mittels TCP/IP und über den RJ45 Port sondern über den rs232 Seriellen Port.

Nur stehe ich da voll an einen Anhang zu coden.

Habe bis jetzt ein kleines Applet was wie gesagt Text über eine TextArea von einem PC mittels rs232 Port und 0 Modemkabel zu einem anderen PC sendet.

Jetzt würd ich gerne eine Art Anhang dazu konstruieren.
Gibt es vielleicht schon einen Source Code den ich an meinen anpassen kann?
 
Zuletzt bearbeitet:

Michael...

Top Contributor
möchte gerne Dateien Serialisieren zum Beispiel ein Bild (jpg) oder eine txt Datei (txt) um sie dann zu verschicken.
Was willst Du daran noch serialisieren?

Wie bekommst Du denn den Text über die Leitung? Welche Bibliothek verwendest Du?

Ich nehme mal an die Kommunikation funktioniert über Streams und so wie Du den Text per Stream überträgst kannst Du auch die bits und Bytes einer Datei übertragen.
 

alex0549

Mitglied
Ja da liegt ja das Problem denn ich arbeite erst seit zwei Wochen mit Java in Eigeninitiative sprich learning by doing.

Hmmm okay ich Poste mal meinen Code bis jetzt:

Java:
import gnu.io.CommPortIdentifier;
import gnu.io.PortInUseException;
import gnu.io.SerialPort;
import gnu.io.SerialPortEvent;
import gnu.io.SerialPortEventListener;
import gnu.io.UnsupportedCommOperationException;

import java.io.*;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Serializable;
import java.net.ConnectException;
import java.net.Socket;
import java.util.Enumeration;
import java.util.TooManyListenersException;
import javax.swing.*;

public class JGraph extends JFrame implements Serializable, Runnable{

	/**
	 * 
	 */
	private static final long serialVersionUID = 1919259915485678785L;
	private JMenu datei = new JMenu("Datei");
	private JMenuItem laden = new JMenuItem("Laden");
	private JMenuItem speichern = new JMenuItem("Save");
	private JMenuBar menuBar = new JMenuBar();
	private JPanel zeichnen = new JPanel();
	private JPanel panel1 = new JPanel();
	private JPanel panel2 = new JPanel();
	private JButton senden = new JButton();
	private JTextArea txtsenden = new JTextArea(10, 50);
	private JTextArea txtempfangen = new JTextArea(10, 50);
	private JScrollPane scrollPane = new JScrollPane(txtsenden);
	private JScrollPane scrollPane2 = new JScrollPane(txtempfangen);
	private JLabel lblsenden = new JLabel();
	private JLabel messlab1 = new JLabel();
	
	CommPortIdentifier serialPortID;
	Enumeration enumComm;
	SerialPort serialPort;
	OutputStream os;
	InputStream is;
	
	boolean serialPortoffen = false;
	
	int baudrate = 9600;
	int dataBits = SerialPort.DATABITS_8;
	int stopBits = SerialPort.STOPBITS_1;
	int parity = SerialPort.PARITY_NONE;
	
	String portName = "COM1";
	
	int secondsRuntime = 60;
	
	
	public JGraph(int i){
		
	}
	
	@SuppressWarnings("serial")
	public JGraph() {
		
		menuLaden();
		
		setTitle("Radio mail Terminal");
		setSize(1280, 800);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		
		senden.setText("Senden");
		
		zeichnen.add(senden);

		getContentPane().setLayout(new GridLayout(4,4));
	    JPanel panel1 = new JPanel();
	    panel1 = new JPanel();
	    panel1.setLayout(new BorderLayout());
	    panel1.setBackground(Color.white);
	    getContentPane().add(panel1);

	    getContentPane().setLayout(new GridLayout(4,4));
	    JPanel panel2 = new JPanel();
	    panel2 = new JPanel();
	    panel2.setLayout(new BorderLayout());
	    panel2.setBackground(Color.white);
	    getContentPane().add(panel2);
	    
	    //Create text area for panel 2  
	    txtsenden = new JTextArea();
	    txtsenden.setFont(new Font("Arial", 
		Font.ITALIC, 16));
	    txtsenden.setLineWrap(true); 
	    txtsenden.setWrapStyleWord(true);
	    txtsenden.setEditable(true);
	    JScrollPane areaScrollPane = new 
		JScrollPane(txtsenden);
	    areaScrollPane.setVerticalScrollBarPolicy(
	        JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
	    areaScrollPane.setPreferredSize(
		new Dimension(200,100));
	    areaScrollPane.setBorder(
		BorderFactory.createTitledBorder("Enter Text:"));
	    panel2.add(areaScrollPane);

	    //	  Create text area for panel 1  
	    txtempfangen = new JTextArea();
	    txtempfangen.setFont(new Font("Arial", 
		Font.ITALIC, 16));
	    txtempfangen.setLineWrap(true); 
	    txtempfangen.setWrapStyleWord(true);
	    txtempfangen.setEditable(true);
	    JScrollPane areaScrollPane2 = new 
	    JScrollPane(txtempfangen);
	    areaScrollPane2.setVerticalScrollBarPolicy(
	        JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
	    areaScrollPane2.setPreferredSize(
		new Dimension(200,100));
	    areaScrollPane2.setBorder(
		BorderFactory.createTitledBorder("Empfangener Text:"));
	    panel1.add(areaScrollPane2);
		
		this.setJMenuBar(menuBar);
		
		this.add(zeichnen,BorderLayout.WEST);
		
		setVisible(true);
		
		senden.addActionListener(new ActionListener()  {
			public void actionPerformed(ActionEvent arg0) {
				// TODO Auto-generated method stub
				sende();
			}
		});
		
	}
	
	void menuLaden(){
		datei.add(laden);
		laden.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent arg0) {
				// TODO Auto-generated method stub
				System.out.println("REINGEKLICKT");
			}
		});
		
		datei.add(speichern);
		menuBar.add(datei);
	}
	
	public static void main(String[] args) {
		Runnable r = new JGraph();
		new Thread(r).start();
	}

	public void sende() {
		// TODO Auto-generated method stub

			sendeSerialPort(txtsenden.getText());
			txtsenden.setText("");
	}
		
	
	
	boolean oeffneSerialPort(String portName) {
		// TODO Auto-generated method stub
		
		boolean foundPort = false;
		if (serialPortoffen == true) {
			System.out.println("Serial Port bereits geöffnet!");
			return false;
		}
		
		System.out.println("Öffne Serial Port...");
		enumComm = CommPortIdentifier.getPortIdentifiers();
		
		while (enumComm.hasMoreElements()) {
			serialPortID = (CommPortIdentifier) enumComm.nextElement();
			if (portName.contentEquals(serialPortID.getName())) {
				foundPort = true;
				break;
			}
		}
		if (foundPort == false)  {
			System.out.println("Serialport nicht gefunden: " +  portName);
			return false;
		}
		
		try {
			serialPort = (SerialPort) serialPortID.open("Öffnen und Senden", 500);
		} catch (PortInUseException e) {
			System.out.println("Port belegt!");
		}
		try {
			os = serialPort.getOutputStream();
		} catch (IOException e) {
			System.out.println("Keinen Zugriff auf OutputStream");
		}
		
		
		try {
			is = serialPort.getInputStream();
		} catch (IOException e) {
			System.out.println("Keinen Zugriff auf InputStream");
		}
		
		try {
			serialPort.addEventListener(new serialPortEventListener());
		} catch (TooManyListenersException e) {
			System.out.println("TooManyListenersException für Serialport");
		}
		serialPort.notifyOnDataAvailable(true);
		
		try {
			serialPort.setSerialPortParams(baudrate, dataBits, stopBits, parity);
		} catch (UnsupportedCommOperationException e) {
			System.out.println("Konnte Schnittstellen Paramter nicht setzen");
		}
	
		serialPortoffen = true;
		return true;
		
	}
	
	void schließeSerialPort(){
		
		if (serialPortoffen == true) {
			System.out.println("Schließe Serialport");
			serialPort.close();
			serialPortoffen = false;
		} else {
			System.out.println("Serialport bereits geschlossen");
		}

	}

	void sendeSerialPort(String nachricht)
	{
		System.out.println("Sende: " + nachricht);
		if (serialPortoffen != true)
			return;
		try {
			os.write(nachricht.getBytes());
		} catch (IOException e) {
			System.out.println("Fehler beim Senden");
		}
	}

	public void run() {
		// TODO Auto-generated method stub
		
		if (oeffneSerialPort(portName) == true) {
			System.out.println(serialPortoffen);
			System.out.println("OFFEN");
		}
	}

	void serialPortDatenVerfuegbar() {
		try {
			byte[] data = new byte[150];
			int num;
			while(is.available() > 0) {
				num = is.read(data, 0, data.length);
				txtempfangen.append(new String(data, 0, num) + "");
			}
		} catch (IOException e) {
			System.out.println("Fehler beim Lesen empfangener Daten");
		}
	}
	
	class serialPortEventListener implements SerialPortEventListener {
		public void serialEvent(SerialPortEvent event) {
			System.out.println("serialPortEventlistener");
			switch (event.getEventType()) {
			case SerialPortEvent.DATA_AVAILABLE:
				serialPortDatenVerfuegbar();
				break;
			case SerialPortEvent.BI:
			case SerialPortEvent.CD:
			case SerialPortEvent.CTS:
			case SerialPortEvent.DSR:
			case SerialPortEvent.FE:
			case SerialPortEvent.OUTPUT_BUFFER_EMPTY:
			case SerialPortEvent.PE:
			case SerialPortEvent.RI:
			default:
			}
		}
	}	
	
	
}
 

Michael...

Top Contributor
Für zwei Wochen Java setzt Du viel zu viel GUI - mit fragwürdigem Code - ein. ;-) Ich musste anfangs erst mal mehrere Monate auf der Konsole rumhacken.
In der
Code:
serialPortDatenVerfuegbar()
liest Du ja über einen InputStream die Daten ein, hier musst Du nur unterscheiden, ob es sich um Text oder eine Datei handelt und die bits entsprechend behandeln --> Du musst wohl oder übel ein Protokoll verwenden
 

alex0549

Mitglied
ja also hab mir von einem Bekannten ein bischen Helfen lassen und ich ziele damit auch ab mir ein applet für mein Amateurfunk zu machen damit ich per Modem was am rs232 hängt Daten über Funk versenden kann.
Also ein eigenes Protokoll?
Wie fange ich denn da am besten an?
Will es einfach halten.....ja wer nicht was?!
 

Michael...

Top Contributor
ja also hab mir von einem Bekannten ein bischen Helfen lassen und ich ziele damit auch ab mir ein applet für mein Amateurfunk zu machen damit ich per Modem was am rs232 hängt Daten über Funk versenden kann.
Nur ums klar zustellen: Das was Du das hast ist eine Applikation und kein Applet ;-) Wüsste jetzt nicht, ob Dein Vorhaben per Applet so einfach möglich wäre.

Aber wenn es um Amateurfunk geht: Da werden doch Sprachsignale gesendet und keine Texte oder Dateien? (Hatte nur mal mit zehn so ein Walkie Talkie)
 

alex0549

Mitglied
Ja, die daten werden über rs232 an ein Packet Modem weitergegeben welches die Digitalen Signale in Töne umwandelt. Vom Modem dann weiter an den Audioanschluß des Funkgerätes. Danach mittels Funkwellen ab in die weite Welt.
Auf der anderen Seite dann wieder der Umgekehrte Weg zurück zum PC.

Daten per Funk zu versenden nennt man in der Amateurfunkwelt Packet Radio.

So jetzt hab ich nen kleinen mini pc mit Windows Embedded CE 6.0 und eine JVM drauf aber keine Software zum senden von Nachrichten und Daten in Java. Gibts auch nicht im Netz zum Downloaden bzw. Ich finde keine. Deswegen habe ich begonnen die Applikation zu coden.

Aber wie schon gesagt beim Dateianhang stehe ich jetzt voll an.
 

alex0549

Mitglied
Danke für den Link.

Leider nein denn die sind alle für Win oder Linux aber ich brauch was für Win Embedded CE 6.0 das ist wieder ein ganz eigenes BBetriebssystem.

Darum meine Anstrengung in Java denn dann ist es in Zukunft egal welches OS ich habe.
Wenn ich´s denn schaffe noch einen Dateianhang zu coden denn ansonsten nützt mir das nicht viel.

Aber vielleicht hatte ja schon mal wer ein ähnliches Prob. oder eine Lösung dazu

Bin für alles Dankbar

Alex
 
M

maki

Gast
Würde mich wundern wenn da ein "richtiges" Java draufläuft, ist es vielleciht eine beschnittene Variante wie die Micro Edition?
Dann hättest du wider das Problem, dass es nciht überall läuft...
 

Michael...

Top Contributor
Wenn Du später sowie Dein Packet Modem ansprechen willst, musst Du ja wissen wie man mit diesem kommuniziert. Nehme mal an das die Kommunikation auch auf einer Art Protokoll/Telegramm basiert, dieses würde ich dann gleich für die Kommunikation des "Testsystems" benutzen.
 

alex0549

Mitglied
Auf dem Modem läuft das AX.25 Protokoll das zur Fehlerkorrektur verwendet wird.
Aber für das Modem brauche ich sonst kein bestimmtes Protokoll denn das Modem erkennt über rs232 das Daten vom PC kommen und wandelt diese Daten dann in Töne um und sendet sie weiter an den Audioanschluß des Funkgerätes.
 
Zuletzt bearbeitet:

Empire Phoenix

Top Contributor
Schick mithilfe von DataOutputStream
boolean true wenn datei sonst false
integer länge der nachfolgenden sequenz in byte
x byte daten.

Der dateiinhalt kann dir dann auch egal sein, da du die datein nur byteweise lesen können musst.

Am anderen ende,
abfrage ob true
wenn ja bytearray mit länge einrichten
die bytes reinschreiben.
abspeichern als datei (den namen könnte/sollte man vorherübermitteln im nicht datei modus und einfach solange beibehalten bis ein neuer dateiname gesendet wird.)

Ablauf dann:

false
17*2 (jeder char hat 2 byte länge)
/datei kekse.jpg
true
X (länge in byte von kekse.jpg)
byte1
byte2
byte3
...
byteX


Vorraussetzung dabei ist das das ganze InOrder ist (Wenn ich 123 schicke ist grantiert das 123 ankommt und nciht zb 132, zudem habe ich jetzt eine zuverlässige verbindung vorrausgesetzt, ansonsten musst du imprinzip erst ein Layer einbauen das TCP/Ip simuliert
 

alex0549

Mitglied
Danke mal für den Ansatz "Empire" aber da ich ein völliger Neuanfänger bin würde ich mich noch über einen Beispiel sourcecode freuen um diesen zu studieren und zu verstehen.
Denn leider kann ich jetzt mit deinem Tip nicht viel anfangen.

Danke
 

Ebenius

Top Contributor
Nur so zwischendurch: Bist Du sicher, dass es für den Mini-PC kein Linux gibt? Wenn die Möglichkeit besteht, das OS zu tauschen um dann eine fertige Software einsetzen zu können, würde ich diesen Weg auf jeden Fall bevorzugen. Was isn das für ne Box?

Ebenius
 

alex0549

Mitglied
Das Problem ist das auf diesen Ding (mini PC der Marke i-PAN7 von der Firma Keith&Koep) nur Embedded OS laufen da es nur einen 32MB Flashrom Speicher hat und einen ARM Prozssor also keine x86 Architektur.

Und da kenn ich mich auch nicht aus ob dann die "normalen" Linux Programme dann mit der Embedded Linux Version zusammen passt.
Denn bei Windows Embedded CE ist das der Fall das "normale" Windowssoftware nicht darauf läuft.
 

Ebenius

Top Contributor
Mein Router hat 4 MB Flashrom und da läuft ein Linux. Es gibt Linuxe für ARM-Architekturen. Aber ob das nun auf deinem System so ist, weiß ich auch nicht. Trotzdem würde ich den Ansatz verfolgen…

BTW: Mit 32 MB Flashrom kannst Du eigentlich vergessen, dass da ein JRE SE drauf ist…

Ebenius
 

Empire Phoenix

Top Contributor
Code:
public class StringSerialize {
	public static final void writeString(DataOutput out,String source) throws IOException{
		int amount = source.length();
		out.writeInt(amount);
		out.writeChars(source);
	}
	
	public static final String readString(DataInput in) throws IOException{
		StringBuffer read = new StringBuffer();
		int amount = in.readInt();
		while(amount > 0){
			amount--;
			read.append(in.readChar());
		}
		return read.toString();
	}
}

Sowas, nur halt statt strings bytearrays nehmen für dateien.
Data output strem erstellen mithilfe von
new DataOutputStream(someoutputstream);

DataOutputStream (Java 2 Platform SE v1.4.2)

evtl auch interessant wenn du weniger auf byte ebene arbeiten willst:
ObjectOutputStream (Java 2 Platform SE v1.4.2)
 

alex0549

Mitglied
Deswegen mach ich auch eine JVM mit 10,3MB drauf um meine Java Applikation darauf laufen zu lassen.

Und das mit Linux hab ich mir schon überlegt aber wie schon gesagt es konnte mir keiner sagen ob "normale" Linux Software (Open Office, Linux Amateurfunksoftware) darauf geht wenn ich ein embedded Linux draufpacke.
 

alex0549

Mitglied
hmmmmm :(

also unter Zuhilfenahme meines oben geposteten source code und den Tipp von Empire habe ich Versucht das ganze zu verstehen.
Kann aber nichts daraus Konstruieren.
Meine damit wie müsste der Code aussehen wenn ich zum Beispiel die Datei "kekse.jpg" in die Applikation hinein holen möchte (ein Textfield vielleicht wo dann kekse.jpg steht?)

und wie kann ich sie dann mit meinem "senden" Button (den es ja schon gibt) Serialisieren und verschicken?

Kann diese source leider nicht in mein Programm einsetzen (Verständnis fehlt mir!)
bräuchte da ein richtiges Beispiel wie es der Reihe nach gehört also wie der DataOutputStream aussehen sollte und dann den Code unten noch dazu einfügen? ,anstatt das Wort String einfach nur durch das Wort bytearrays ersetzen?

Wie schon gesagt ein Beispiel das für meine Source oben gehen könnte mit der Beispiel Datei kekse.jpg wäre nett

Danke



Java:
public class StringSerialize {
	public static final void writeString(DataOutput out,String source) throws IOException{
		int amount = source.length();
		out.writeInt(amount);
		out.writeChars(source);
	}
	
	public static final String readString(DataInput in) throws IOException{
		StringBuffer read = new StringBuffer();
		int amount = in.readInt();
		while(amount > 0){
			amount--;
			read.append(in.readChar());
		}
		return read.toString();
	}
}
 

alex0549

Mitglied
hi,

Also da fehlt mir das Know-How dafür wie das aussehen muß. Leider! Darum bräuchte ich einen Gesamtbeispiel.

Auf der anderen Seite sprich am anderen PC läuft dann auch Java.
 
T

tuxedo

Gast
Ja, die daten werden über rs232 an ein Packet Modem weitergegeben welches die Digitalen Signale in Töne umwandelt. Vom Modem dann weiter an den Audioanschluß des Funkgerätes. Danach mittels Funkwellen ab in die weite Welt.
Auf der anderen Seite dann wieder der Umgekehrte Weg zurück zum PC.

Daten per Funk zu versenden nennt man in der Amateurfunkwelt Packet Radio.

Soso. Als Amateurfunker sollte man doch auch wissen dass hier in den allermeisten Fällen das AX.25 Protokoll eingesetzt wird?!

Einfach irgendwelche bytes auf der seriellen Schnittstelle rausschieben ist da wohl nicht so der bringer.
Selbst wenn du einen TNC am Rechner hängen hast, kannst du nicht einfach irgendwie drauf los schicken. Du musst dich an bestimmte Formate/Regeln halten.

- Alex
 

alex0549

Mitglied
Ja das hab ich auch schon mal gepostet das da das AX.25 Protokoll drauf läuft das ist aber zur Fehlerkorrektur drauf mehr nicht und das AX.25 Protokoll ist auch nur in der Software drinnen.

Also wenn wir beide die gleiche Java Applikation ohne AX.25 Protokoll verwenden funktioniert das wieder.
Das einzige was passieren kann ist das wenn die Verbindung schlecht ist und Pakete Verloren gehen das der Computer nicht merkt und eine Fehlerhafte datei empfängt oder abbricht!

Oder Irre ich mich jetzt!?
 
T

tuxedo

Gast
Ja das hab ich auch schon mal gepostet das da das AX.25 Protokoll drauf läuft das ist aber zur Fehlerkorrektur drauf mehr nicht und das AX.25 Protokoll ist auch nur in der Software drinnen.

Ja, sorry, hatte ich beim überfliegen des Threads übersehen ...

Also wenn wir beide die gleiche Java Applikation ohne AX.25 Protokoll verwenden funktioniert das wieder.
Das einzige was passieren kann ist das wenn die Verbindung schlecht ist und Pakete Verloren gehen das der Computer nicht merkt und eine Fehlerhafte datei empfängt oder abbricht!

Oder Irre ich mich jetzt!?

Ja, ich denke du irrst dich da. Auch wenn das Modem das Ax.25 Protokoll selbst handhabt (TNC??), dann musst du von außen immer noch sagen WAS du senden willst, und vor allem WOHIN. PacketRadio ist ja keine direkte Punkt-zu-Punkt Verbindung. Jeder auf der gleichen Frequenz kann mitmischen und mithören. Ob es für ihn bestimmt ist oder nicht, ergibt sich aus dem AX.25 Protokoll-Informationen.

Das ist wie mit dem Internet ... TCP/IP wird vom Betriebssystem bereitgestellt. Wenn ich jetzt in JAVA auf einem Socket eine Datei sende, dann muss ich ja auch vorher sagen WOHIN ich senden will. Das tue ich i.d.R. schon beim Verbindungsaufbau.Und beim Packet-Radio ist das genau so. Du musst vorher angeben wohin die Verbindung aufgebaut werden soll. Ein TNC bietet hierfür normalerweise einen genormten Befehlssatz. Wie der im Detail aussieht kann ich dir nicht sagen. Das musst du selbst rausfinden. Hatte immer recht einfache AX.25 Modems die dann eine AX.25 fähige Software erfordert haben, die ich nicht selbst entwickelt habe.

- Alex
 
T

tuxedo

Gast
Korrekt. Aber woher weiß das Modem zu welchem Packet-Radio Teilnehmer auf dem äther es senden soll?
PR-Pakete haben immer einen Absender und einen Empfänger. Wie TCP/IP auch. Ergo muss man das Modem entsprechend instruieren wohin geschickt werden soll. Von alleine weiß es das nicht.

Es gibt zwar auch sowas wie einen Broadcast. Aber der bedarf glaub keiner Fehlerkorrektur. Wenn dem so wäre, wäre das Netz mit einigen Teilnehmern ja ziemlich krass überfordert. Man muss bedenken das ein durchschnittliches PR-Netz Geschwindigkeiten im "nur" 4-stelligen Baud-Bereich hat. Meist 1200, 2400 oder 9600 Baud.

- Alex
 

alex0549

Mitglied
also meinst du das ich das AX.25 Protokoll in meine Javaapplikation einbauen muß!?

Aber was ist wenn ich auf 20,0000 MHz bin und mein Gegenüber auch.
Jetzt sendet mein PC die Daten über rs232 zum TNC.
Der TNC wandelt die Digitalen Daten in Töne um.
Nun sendet der TNC die Töne an den Audioanschluß des Kurzwellengerätes.
Die Kurzwelle geht auf senden.
Die Töne (umgewandelte Daten) gehen in den Äter........
Jeder der Jetzt auf der gleichen Frq. also 20,0000 MHz ist empfängt nun die Töne.
Gehen vom Kurzwellengerät an den TNC.
Der wandelt die Töne wieder in Daten um und schickt sie weiter an den PC.
Und jeder der die selbe Java Applikation am laufen hat kann sie dann lesen/sehen.

So hab ich´s mir gedacht
 
T

tuxedo

Gast
also meinst du das ich das AX.25 Protokoll in meine Javaapplikation einbauen muß!?

Nein, hab ich nicht behauptet.

Aber was ist wenn ich auf 20,0000 MHz bin und mein Gegenüber auch.
Jetzt sendet mein PC die Daten über rs232 zum TNC.
Der TNC wandelt die Digitalen Daten in Töne um.
Nun sendet der TNC die Töne an den Audioanschluß des Kurzwellengerätes.
Die Kurzwelle geht auf senden.
Die Töne (umgewandelte Daten) gehen in den Äter........
Jeder der Jetzt auf der gleichen Frq. also 20,0000 MHz ist empfängt nun die Töne.
Gehen vom Kurzwellengerät an den TNC.
Der wandelt die Töne wieder in Daten um und schickt sie weiter an den PC.
Und jeder der die selbe Java Applikation am laufen hat kann sie dann lesen/sehen.

Dazu hab ich ein paar Fragen:

1) 20Mhz = Kurzwelle? Nicht wirklich oder?
2) Bist du dir sicher dass du nen Amateurfunkschein hast?
3) Weißt du was AX.25 ist und wie es funktioniert? Allem anschein nach nicht.

So hab ich´s mir gedacht

Auf die Gefahr hin dass ich mich als Nicht-Amateurfunker-aber-alter-CB-Funker unbeliebt mache:

Da hast du falsch gedacht :)

AX.25 ? Wikipedia

Da sollte man mal gelesen haben. Auch wenn der TNC dir die AX.25 implementierung abnimmt, dann musst du immer noch mit dem TNC sprechen. Und der will dann wissen zu welchem Rufzeichen er senden muss.

Das ist nicht einfach wie ein Funkgerät wo man auf der einen Seite reinspricht und auf der anderen Seite wieder was rauskommt. Das ist kein Modem das aus 1000111 ein paar aufeinander folgende Töne bastelt (MOdulieren) und auf der anderen Seite die Töne wieder in 1000111 umgekehrt (DEModulieren).

Da steckt ein wenig Intelligenz drin. Ein Protokoll. Eben das AX.25 Protokoll. Und wer mit Packet-Radio etwas übertragen will muss sich selbst ein Rufzeichen geben und muss den Daten, die er senden will nocht mitgeben zu welchem Empfänger-Rufzeichen die Daten geschickt werden.

Ebenwie bei TCP/IP. Die Protokollimplementierung interessiert dich nicht. Aber du musst dir TCP/IP-Schnittstelle korrekt bedienen. Bei AX.25 ist das 1:1 das gleiche vorgehen. Nur musst du nicht direkt AX.25 sprechen, sondern dem TNC sagen was dieser im AX.25 Protokoll sagen soll.

Wenn dieses Basiswissen über Packet-Radio schon fehlet schlage ich folgendes vor:

1) Vergiss deine Implementierungs-Idee für's erste wieder
2) Spiele mal ein paar Tage/Woche mit Packet-Radio um.
3) Logg dich mal in diverse Boxen ein und schau was es so alles gibt.
4) Entdecke das mehr oder weniger raffinierte Mailsystem das dir geboten wird.
5) Verstehe dass Packet-Radio ein Netzwerk aus vielen Teilnehmern und kein reines Sprechfunken ist.

Gruß
Alex

P.S. Wie ist denn dein offizielles Amateurfunkrufzeichen?
 

alex0549

Mitglied
Der Frequenzbereich der Kurzwelle erstreckt sich definitionsgemäß von 3 MHz bis 30 MHz. Dies entspricht einer Wellenlänge von 100 m bis 10 m. Der Zusammenhang beider ist λ = c/f.

So und dass sind alle Amateurfunk frq. in Österreich

3,5–3,8 MHz
7–7,1 MHz
14–14,35 MHz
18,068–18,168 MHz
21–21,45 MHz
24,89–24,99 MHz
28–29,7 MHz

144–146 MHz
430–439,1 MHz
430–439,1 MHz
439,1–440 MHz Nur Empfangsbetrieb
439,1–440 MHz

24–24,05 GHz
77,5–78 GHz
134–136 GHz

Außerdem war das mit den 20 MHz nur ein Beispiel!

Nein weis nicht genau wie das AX.25 Protokoll arbeitet weis aber das es im groben das macht:

* Übertragung von Daten verbindungsorientiert, über einen möglicherweise gestörten Funkkanal
* Zerteilung der Daten in Pakete (Segmentierung)
* Adressierung Sender/Empfänger/Repeater
* Nummerierung der Reihenfolge der Pakete
* Übertragung von Empfangsbestätigungen von komplett übertragenen Paketen
* Austausch über Protokollzustände
* Neuanforderung/Wiederholung von gestörten Paketen
* Sicherung der Pakete durch eine Prüfsumme (CRC)

Weis auch das der TNC ein kleiner eigenständiger Rechner ist.Er besteht aus einem Mikroprozessor, einem ROM, in welchem die Firmewire gespeichert ist, einem batteriegepufferten RAM, in dem die Parametereinstellungen, die empfangenen und die zusendenden Daten gespeichert werden, sowie Modem. Der TNC setzt die vom PC gelieferten Nutzdaten in das AX.25 Protokoll um, sendet sie eigenständig aus, decodiert empfangene Pakete und fordert fehlerhafte Pakete selbständig neu an. Im Gegensatz zu einem Modem ist der TNC auch ohne angeschlossenen PC in der Lage, Daten zu verarbeiten.

Darum ist die Preisgünstigere Variante zu einem TNC ein Modem. Denn es wandelt die vom PC kommenden Datensignale in Töne um, die vom Funkgerät ausgesendet werden. Im Gegensatz zum TNC ist das Modem vergleichsweise "dumm", so dass der PC die Auswertung der Daten übernehmen muss.

Was habe ich nun nicht Verstanden beim AX.25 Protokoll?

Was habe ich in der Funktionsweise des TNC und des Modem nicht Verstanden?

Für mich steht durch die Funktionsweise des TNC fest dass ich das AX.25 Protokoll nicht in meiner Applikation brauche da das der TNC übernimmt. Doch man müßte also dem TNC die Empfangsadresse und die Absenderadresse für das AX.25 geben. Also liegt da die schwierigkeit wie ich das dann im TNC anspreche da es ja keinen source dafür in Java gibt.

Nun wäre es dann besser einfachn nur ein Modem zu nehmen. Klar das ich da eine menge Vorteile gegenüber dem TNC verliere aber rein nur zum senden wäre es möglich!?

Danke für das vorherige Feedback

PS.: Hab noch keines. Komme aus dem Militärfunkbereich
 
Zuletzt bearbeitet:
T

tuxedo

Gast
Der Frequenzbereich der Kurzwelle erstreckt sich definitionsgemäß von 3 MHz bis 30 MHz. Dies entspricht einer Wellenlänge von 100 m bis 10 m. Der Zusammenhang beider ist λ = c/f.

So und dass sind alle Amateurfunk frq. in Österreich

3,5–3,8 MHz
7–7,1 MHz
14–14,35 MHz
18,068–18,168 MHz
21–21,45 MHz
24,89–24,99 MHz
28–29,7 MHz

144–146 MHz
430–439,1 MHz
430–439,1 MHz
439,1–440 MHz Nur Empfangsbetrieb
439,1–440 MHz

24–24,05 GHz
77,5–78 GHz
134–136 GHz

Außerdem war das mit den 20 MHz nur ein Beispiel!

Gut, überredet ;-) Irren ist menschlich :)

Nein weis nicht genau wie das AX.25 Protokoll arbeitet weis aber das es im groben das macht:

* Übertragung von Daten verbindungsorientiert, über einen möglicherweise gestörten Funkkanal
* Zerteilung der Daten in Pakete (Segmentierung)
* Adressierung Sender/Empfänger/Repeater
* Nummerierung der Reihenfolge der Pakete
* Übertragung von Empfangsbestätigungen von komplett übertragenen Paketen
* Austausch über Protokollzustände
* Neuanforderung/Wiederholung von gestörten Paketen
* Sicherung der Pakete durch eine Prüfsumme (CRC)

Weis auch das der TNC ein kleiner eigenständiger Rechner ist.Er besteht aus einem Mikroprozessor, einem ROM, in welchem die Firmewire gespeichert ist, einem batteriegepufferten RAM, in dem die Parametereinstellungen, die empfangenen und die zusendenden Daten gespeichert werden, sowie Modem. Der TNC setzt die vom PC gelieferten Nutzdaten in das AX.25 Protokoll um, sendet sie eigenständig aus, decodiert empfangene Pakete und fordert fehlerhafte Pakete selbständig neu an. Im Gegensatz zu einem Modem ist der TNC auch ohne angeschlossenen PC in der Lage, Daten zu verarbeiten.

Das ist korrekt.

Darum ist die Preisgünstigere Variante zu einem TNC ein Modem. Denn es wandelt die vom PC kommenden Datensignale in Töne um, die vom Funkgerät ausgesendet werden. Im Gegensatz zum TNC ist das Modem vergleichsweise "dumm", so dass der PC die Auswertung der Daten übernehmen muss.

Auch das ist korrekt.

Was habe ich nun nicht Verstanden beim AX.25 Protokoll?

Dass du nicht auf einer Seite eine byte-Datenstrom, der die zu übertragende Datei darstellt nicht einfach reinschicken und auf der anderen Seite so auslesen kannst.


Was habe ich in der Funktionsweise des TNC und des Modem nicht Verstanden?
Keine Ahnung. Aber deine Ausführung zum Modem waren soweit korrekt.

Für mich steht durch die Funktionsweise des TNC fest dass ich das AX.25 Protokoll nicht in meiner Applikation brauche da das der TNC übernimmt. Doch man müßte also dem TNC die Empfangsadresse und die Absenderadresse für das AX.25 geben. Also liegt da die schwierigkeit wie ich das dann im TNC anspreche da es ja keinen source dafür in Java gibt.

Okay, die Absenderadresse kann man u.U. fest im TNC konfigurieren. Dann braucht man sie nicht immer.
Aber wenn du was versenden willst, musst du dem TNC nach wie vor sagen WOHIN. Einfach auf den Äter reicht nicht aus.

Nun wäre es dann besser einfachn nur ein Modem zu nehmen. Klar das ich da eine menge Vorteile gegenüber dem TNC verliere aber rein nur zum senden wäre es möglich!?

Wenn du nur ein Modem benutzt, wäre das wohl von der Logik her passender zu dem was du vorhast. Aber dann musst du dich noch selbst um das Timing der Audiosignale die es ausgibt kümmern (wenn ich mich nicht irre). Denn das würde normalerweise die Packet-Radio-Software in form des AX.25 Protokolls übernehmen. Auch müsstest du dann eine eigene CRC Prüfung einbauen...

Danke für das vorherige Feedback

Bitte.

PS.: Hab noch keines. Komme aus dem Militärfunkbereich

Und da braucht man keine Rufzeichen oder Kennungen? Also zumindest was Feuerwehr und Polizei angeht gibts da Kennungen.

Alles in allem: Ein TNC wäre die wohl bessere wahl. Allerdings solltest du dich erstmal schlau machen wie man einen TNC auf der seriellen Konsole bedient. Erst dann weißt du wie du die Daten mit Java rausschicken musst. Einfach die Datei in Form von einzelnen Bytes auf die serielle Schnittstelle geben reicht da bei weitem nicht aus.

- Alex
 

alex0549

Mitglied
Über ein Modem warum nicht?

Wenn ich ein und die selbe Frq auf beiden Funkgeräten habe und Station1 ruft Station2 dann empfängt die Station2 ja auch die Töne von Station1.

Also wenn der PC von Station1 die Daten an das Modem sendet welches es in Töne Moduliert und diese dann an das Funkgerät weitergibt welches es dann sendet....

.....dann gehen die Töne in den Äter.........

das Funkgerät der Station2 empfängt die Töne, gibt sie weiter an das Modem, das Moduliert die Töne um in Daten und gibt diese dann an den PC der Station2 weiter.

Natürlich gibt es hier keine Empfangsadresse und jeder der die selbe Frq hat hört die Töne und jeder der auch ein Modem dran hat und die selbe Applikation sieht die Nachricht.
Und auch klar das ich die Sicherheiten zwecks Fehlerkorrektur usw... auch nicht habe.

Aber ansonsten müßte es gehen rein Technisch gesehen.....

Abgesehen von den ganzen Amateurfunkbestimmungen also rein Technisch gesehen!!!

Doch nun wieder zurück zu meinem Problem mit dem Anhang senden.
Wie könnte denn das genau aussehen mit dem Serialisieren, dem FileInputStream usw.. im Beispiel meines keks.jpg
Und die Oberfläche in der Applikation? Vielleicht ein TextField wo der Dateipfad eingetragen werden muß?

Danke für Antworten und Tipps
 
Zuletzt bearbeitet:

Empire Phoenix

Top Contributor
gibt nen file open dialog, und ann halt byteweise schicken, wenn das tnwhatever so configureirt ist das es nur den payload für die ax25 krams haben will sollte das gehen.

Ansonsten GOOGLE, datei lesen und so kann helfen. Bzw. mehr als stichworte werde ich schon aus Zeitgründen nicht geben können.
 

alex0549

Mitglied
Okay so könnte ein AX.25 Protokoll aussehen oder?

Java:
/* 
 *
 */


 
package javax25.net;
	
	

import java.io.*;



public class Ax25Frame
{  
    public static final int  I     = 0x00;
    public static final int  RR    = 0x01;
    public static final int  RNR   = 0x05;
    public static final int  REJ   = 0x09;
    public static final int  SABM  = 0x2F;
    public static final int  SABME = 0x6F;
    public static final int  DISC  = 0x43;
    public static final int  DM    = 0x0F;
    public static final int  UA    = 0x63;
    public static final int  FRMR  = 0x87;
    public static final int  UI    = 0x03;
    
    public static final int  PID_SEGMENT = 0x08;
    public static final int  PID_ARP	 = 0xCD;
    public static final int  PID_NETROM  = 0xCF;
    public static final int  PID_IP	 = 0xCC;
    public static final int  PID_X25	 = 0x01;
    public static final int  PID_TEXNET  = 0xC3;
    public static final int  PID_FLEXNET = 0xCE;
    public static final int  PID_NO_L3   = 0xF0;

    protected boolean  _pf; 
    protected int      _pid; 
    protected int      _type; 
    protected int      _seqr = -1, _seqs = -1; 
    protected String   _port; 
    protected String   _from, _to; 
    protected String[] _digis; 
    protected int      _digied; 
    protected byte[]   _content;
    
    public int getPid()
	

        {return _pid;}


    public int getType()
	

       {return _type;}


    public int getSeqR()
	

       {return _seqr; }


    public int getSeqS()
	

       {return _seqs; }


    public boolean getPF()
	

     {return _pf;}


    public String getPort()
	

    {return _port; }


    public String getFrom()
	

    {return _from; }


    public String getTo()
	

      {return _to; }


    public String[] getDigis()
	

 {return _digis; }



	

    /**
     * The number of digis which has actually digipeated the frame
     */


    public int getDigied()
	

     {return _digied; }


	

    /**
     * Return true if digi number i has actually digipeated the frame
     */


    public boolean isDigied(int i)
	

 {return i <= _digied; }


    
	
	

    /**
     * Get packet content as an array of bytes. To show text content
     * it is necessary to convert to string and using the correct encoding
     */


    public byte[] getContent()
	

 {return _content; }


    
    
	
	

    /**
     * Return a string, indicating the frame type
     */


    public String printType()    
	

    {
        switch (_type) {
	   case I:    return "I    ";
	   case SABM: return "SABM ";
  	   case SABME:return "SABME";
	   case DISC: return "DISC ";
	   case DM:   return "DM   ";
	   case UA:   return "UA   ";
	   case RR:   return "RR   ";
	   case RNR:  return "RNR  ";
	   case REJ:  return "REJ  ";
	   case FRMR: return "FRMR ";
	   case UI:   return "UI   ";
	   default:   return "[???]";
       } 
    }


    
	
	

    /**
     * Return a string, indicating the PID (if the frame is an I or UI frame
     */


    public String printPid()
	

    {
        switch (_pid) {
	    case PID_SEGMENT: return "SEGMENT"; 
            case PID_ARP:     return "ARP    ";     
            case PID_NETROM:  return "NETROM ";  
            case PID_IP:      return "IP     "; 
            case PID_X25:     return "X25    "; 
            case PID_TEXNET:  return "TEXNET "; 
            case PID_FLEXNET: return "FLEXNET"; 
            case PID_NO_L3:   return "Text   "; 
	    default:          return "[???]  "; 
        }
    }


}
 

alex0549

Mitglied
Jetzt weis ich woran wir vorbei geredet haben.
Ihr dachtet im üblichen Amateurfunknetz was ja auf Grund seiner geringen Frq. beschränkt ist und darum haben sie bei Packet Radio ein Netz aufgebaut und das Funktioniert im Prinzip sowie im LAN/WAN mittels IP adressen beim Funknetz halt mit den Rufzeichen.
So sind alle auf einer Frequenz (Packet Radio Frq.) und wenn ich einen bestimmten in diesem Netz eine Nachricht schicken will dann mache ich das indem ich als Empfänger sein Rufzeichen eingebe.

Ich glaube das es das im Prinzip ist was ihr meintet oder?

Mein Denkansatz war aber von vornherein kein Netz sondern eine Peer to Peer Verbindung. Also wirklich nur zwei Stationen auf einer Frequenz.
Darum bräuchte ich keine Adressierung und auch kein AX.25 Protokoll sondern einfach nur eine eigene simplere Fehlerkorrektur.
Denn wenn Station A etwas auf 20,000 Mhz sendet und Station B die einzige Station ist die auch auf 20,000 Mhz ist dann kann nur sie die Daten empfangen. Meine das ist mit dem Broadcast in einem Netzwerk vergleichbar. Denn wenn anstatt 2 Stationen nun 5 Stationen auf dieser einen Frq. wären dann würden wenn eine Station Daten sendet die anderen 4 auch alle die Daten empfangen.

Also wie gesagt mich Interessiert im Moment nur die Peer to Peer Verbindung, sprich 2 Stationen (Sender/Empfänger) auf einer Frq.

Würde euch trotzdem bitten mir vielleicht noch bei der Serialisierung zu helfen.

Hab jetzt mit nem oeffnen.addActionListener einen Button geschaffen der mir ein Fenster aufmacht mit dem ich die Datei auswählen kann die ich einlesen möchte.

Java:
oeffnen.addActionListener(new ActionListener() {
		public void actionPerformed(ActionEvent arg0) {
				// TODO Auto-generated method stub
				int returnval = jf.showOpenDialog(null);
				File file = jf.getSelectedFile();
				System.out.println(returnval);

Doch wie "source code" mäßig also InputStream kann ich sie einlesen?
 
Zuletzt bearbeitet:
T

tuxedo

Gast
Ich glaube das es das im Prinzip ist was ihr meintet oder?

Jepp. Ein Ax.25 Packet-Radio "Ding" ist ein "Netzwerk", basierend auf dem AX.25 Protokoll.

Mein Denkansatz war aber von vornherein kein Netz sondern eine Peer to Peer Verbindung. Also wirklich nur zwei Stationen auf einer Frequenz.

Dann brauchst du keinen TNC, sondern ein Modem.
Dann kommen aber wirklich gravierende Dinge auf dich zu:

Du brauchst ein eigenes Protokoll!
Weil:

Du musst eine Fehlererkennung einbauen: Du kannst nicht davon ausgehen dass die Daten zu 100% Fehlerfrei gesendet und empfangen werden. Wenn irgendwo eine 1 als 0 erkannt wird oder umgekehrt ist deine Datei kaputt...

Du musst die Daten "fragmentieren". Grund: Du kannst keine 1MB große Datei "am Stück" senden. Prinzipiell würde das gehen: Einfach den PTT aufreisen und 1MB am Stück mit einer einzigen "Dauersendung" über den Äther jagen. ABER: Wenn die Datei bei den ersten 200kbyte mit einem einzigen Bit falsch übertragen wird, musst du von vorne anfangen -> Das kostet unnötig Zeit. Die Übertragungsperformance bricht im besten fall ein. Aber ich gehe davon aus dass du kein 1MB am Stück fehlerfrei übertragen kannst... Also: Zerhacken in einzelne Stücke, durchnummerieren, einzeln schicken, und nach jedem einzelnen Fragen "kams auch richtig an?". Womit wir wieder bei der Fehlererkennung und dem Protokoll wären.

Dann musst du noch mitbedenken dass du nicht sicherstellen kannst DASS du alleine auf der Frequenz bist. Es könnten andere "mitkriegen" dass hier PacketRadio betrieben wird und ihr PacketRadion mit einschalten. Dann muss dein eigenes Protokoll in der Lage sein Daten die von anderen gesendet werden zu erkennen und zu ververfen. Ob das überhaupt zuverlässig geht wage ich noch zu bezweifeln. Es sollten schon alle das gleiche Protokoll sprechen.

Hinzu kommt noch:
Ich bin mir nicht 100% sicher ob wenn du am Seriellen Port deines PCs eine "1" rausschickst, das Modem von alleine weiß dass es daraus den entsprechenden Ton für eine 1 machen muss. Könnte sein dass da noch etwas mehr "intelligenz" dazu gehört und man den COM-Port des PCs mit mehr als nur auch der TX Leitung befeuern muss. Gibts ja nocht CTS und Co....

Alles in allem: Ein äußerst schwieriges und langwieriges unterfangen für einen der Probleme mit einem FileinputStream hat :bahnhof:
 

alex0549

Mitglied
Danke für eure Tipps und Antworten

Werd mich mal wieder ans Werk machen :rtfm: und wenns euch Interessiert werd ich meinen Erfolg dann hier wieder Posten.
Könnte aber ne weile dauern ;)
 
T

tuxedo

Gast
Du willst dich jetzt nicht wirklich hinsetzen und so ein Protokoll selbst schreiben?

Wieso das Rad neu erfinden? AX.25 macht genau das. Mit dem feinen Unterschied dass du mit mehreren kommunizieren kannst.

Wenn du schon nen TNC hast, musst du ja einfach schauen wie du mit dem Dateien vom einen Teilnehmer zu einem anderen überträgst. Protokoll und Fehlererkennung werden dir da ja abgenommen.

Ich tippe mal drauf dass du einfach auf der seriellen Schnittstelle eine bestimmte sequenz senden musst um die Übertragung einzuleiten und dann den Datenstrom der Datei hinterher schickst.

Wenn du Glück hast, dann erledigt der TNC alles andere für dich. Das sollte sich dann, mit entsprechendem Wissen über Streams und der seriellen Schnittstelle in 1-2 Tagen machen lassen.

Der andere Ansatz, alles selbst zu machen dauert Wochen, wenn nicht sogar Monate bis du dich da eingearbeitet hast, die riesen Lernkurve bewältigt hast und mit den ganzen Kinderkrankheiten eines solchen Systems zurecht gekommen bist.

- Alex
 

alex0549

Mitglied
ja hast recht.
Hab mich erkundigt. Der TNC macht das mit dem Protokoll.
Versuch jetzt rauszufinden ob es eine bestimmte sequenz gibt und wenn ja welche das ist.

Zu gleich habe ich nun den nächsten Brocken zwischen meinen Beinen liegen.
Nämlich den, das ich meinen Text den ich in die TextArea "txtsenden" eingebe, mit AES veschlüsseln möchte wenn ich den senden Button drücke.Und einen zweiten Button brauche ich dann um den Text nach erhalt in der TextArea "txtempfangen" wieder zu entschlüsseln.
Hab zwar einiges an scripts gefunden weis aber nicht wie ich es einbauen kann.
Also meine source sieht so aus:

Java:
import gnu.io.CommPortIdentifier;
import gnu.io.PortInUseException;
import gnu.io.SerialPort;
import gnu.io.SerialPortEvent;
import gnu.io.SerialPortEventListener;
import gnu.io.UnsupportedCommOperationException;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Serializable;
import java.util.Enumeration;
import java.util.TooManyListenersException;

import javax.swing.*;
import javax.swing.plaf.FileChooserUI;

public class JGraph extends JFrame implements Serializable, Runnable{

	/**
	 * Mail Terminal zum senden von Daten über Funk
	 */
	private static final long serialVersionUID = 001;
	private JMenu datei = new JMenu("Datei");
	private JMenuItem laden = new JMenuItem("Laden");
	private JMenuItem speichern = new JMenuItem("Save");
	private JMenuBar menuBar = new JMenuBar();
	private JPanel zeichnen = new JPanel();
	private JButton senden = new JButton();
	private JButton oeffnen = new JButton();
	private JTextArea txtsenden = new JTextArea(10, 50);
	private JTextArea txtempfangen = new JTextArea(10, 50);
	private JFileChooser jf = new JFileChooser();
	
	CommPortIdentifier serialPortID;
	Enumeration enumComm;
	SerialPort serialPort;
	OutputStream os;
	InputStream is;
	
	boolean serialPortoffen = false;
	
	int baudrate = 4800;
	int dataBits = SerialPort.DATABITS_8;
	int stopBits = SerialPort.STOPBITS_1;
	int parity = SerialPort.PARITY_NONE;
	
	String portName = "COM1";
	
	
	
	
	public JGraph(int i){
		
	}
	
	@SuppressWarnings("serial")
	public JGraph() {
		
		menuLaden();
		
		setTitle("Radio mail Terminal");
		setSize(1280, 800);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		
		senden.setText("Senden");
		oeffnen.setText("Öffnen");
		zeichnen.add(senden);
		zeichnen.add(oeffnen);
		getContentPane().setLayout(new GridLayout(4,4));
	    JPanel panel1 = new JPanel();
	    panel1 = new JPanel();
	    panel1.setLayout(new BorderLayout());
	    panel1.setBackground(Color.white);
	    getContentPane().add(panel1);

	    getContentPane().setLayout(new GridLayout(4,4));
	    JPanel panel2 = new JPanel();
	    panel2 = new JPanel();
	    panel2.setLayout(new BorderLayout());
	    panel2.setBackground(Color.white);
	    getContentPane().add(panel2);
	    
	    //erstellt TextArea fürs senden  
	    txtsenden = new JTextArea();
	    txtsenden.setFont(new Font("Arial", 
		Font.ITALIC, 16));
	    txtsenden.setLineWrap(true); 
	    txtsenden.setWrapStyleWord(true);
	    txtsenden.setEditable(true);
	    JScrollPane areaScrollPane = new 
		JScrollPane(txtsenden);
	    areaScrollPane.setVerticalScrollBarPolicy(
	        JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
	    areaScrollPane.setPreferredSize(
		new Dimension(200,100));
	    areaScrollPane.setBorder(
		BorderFactory.createTitledBorder("Enter Text:"));
	    panel2.add(areaScrollPane);

	    //erstellt TextArea fürs empfangen  
	    txtempfangen = new JTextArea();
	    txtempfangen.setFont(new Font("Arial", 
		Font.ITALIC, 16));
	    txtempfangen.setLineWrap(true); 
	    txtempfangen.setWrapStyleWord(true);
	    txtempfangen.setEditable(true);
	    JScrollPane areaScrollPane2 = new 
	    JScrollPane(txtempfangen);
	    areaScrollPane2.setVerticalScrollBarPolicy(
	        JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
	    areaScrollPane2.setPreferredSize(
		new Dimension(200,100));
	    areaScrollPane2.setBorder(
		BorderFactory.createTitledBorder("Empfangener Text:"));
	    panel1.add(areaScrollPane2);
		
		this.setJMenuBar(menuBar);
		
		this.add(zeichnen,BorderLayout.WEST);
		
		setVisible(true);
		
		senden.addActionListener(new ActionListener()  {
			public void actionPerformed(ActionEvent arg0) {
				// TODO Auto-generated method stub
				sende();
			}
		});
		
		oeffnen.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				// TODO Auto-generated method stub
				int returnval = jf.showOpenDialog(null);
				File file = jf.getSelectedFile();
				System.out.println(returnval);
			}
		});
	}
	
	void menuLaden(){
		datei.add(laden);
		laden.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent arg0) {
				// TODO Auto-generated method stub
				
			}
		});
		
		datei.add(speichern);
		menuBar.add(datei);
	}
	
	public static void main(String[] args) {
		Runnable r = new JGraph();
		new Thread(r).start();
	}

	public void sende() {
		// TODO Auto-generated method stub

			sendeSerialPort(txtsenden.getText());
			txtsenden.setText("");
			
	}
		
	
	
	boolean oeffneSerialPort(String portName) {
		// TODO Auto-generated method stub
		
		boolean foundPort = false;
		if (serialPortoffen == true) {
			System.out.println("Serial Port bereits geöffnet!");
			return false;
		}
		
		System.out.println("Öffne Serial Port...");
		enumComm = CommPortIdentifier.getPortIdentifiers();
		
		while (enumComm.hasMoreElements()) {
			serialPortID = (CommPortIdentifier) enumComm.nextElement();
			if (portName.contentEquals(serialPortID.getName())) {
				foundPort = true;
				break;
			}
		}
		if (foundPort == false)  {
			System.out.println("Serialport nicht gefunden: " +  portName);
			return false;
		}
		
		try {
			serialPort = (SerialPort) serialPortID.open("Öffnen und Senden", 500);
		} catch (PortInUseException e) {
			System.out.println("Port belegt!");
		}
		try {
			os = serialPort.getOutputStream();
		} catch (IOException e) {
			System.out.println("Keinen Zugriff auf OutputStream");
		}
		
		
		try {
			is = serialPort.getInputStream();
		} catch (IOException e) {
			System.out.println("Keinen Zugriff auf InputStream");
		}
		
		try {
			serialPort.addEventListener(new serialPortEventListener());
		} catch (TooManyListenersException e) {
			System.out.println("TooManyListenersException für Serialport");
		}
		serialPort.notifyOnDataAvailable(true);
		
		try {
			serialPort.setSerialPortParams(baudrate, dataBits, stopBits, parity);
		} catch (UnsupportedCommOperationException e) {
			System.out.println("Konnte Schnittstellen Paramter nicht setzen");
		}
	
		serialPortoffen = true;
		return true;
	}
	
	void schließeSerialPort(){
		
		if (serialPortoffen == true) {
			System.out.println("Schließe Serialport");
			serialPort.close();
			serialPortoffen = false;
		} else {
			System.out.println("Serialport bereits geschlossen");
		}

	}

	void sendeSerialPort(String nachricht)
	{
		System.out.println("Sende: " + nachricht);
		if (serialPortoffen != true)
			return;
		try {
			os.write(nachricht.getBytes());
		} catch (IOException e) {
			System.out.println("Fehler beim Senden");
		}
	}

	public void run() {
		// TODO Auto-generated method stub
		
		if (oeffneSerialPort(portName) == true) {
			System.out.println(serialPortoffen);
			
		}
	}

	void serialPortDatenVerfuegbar() {
		try {
			byte[] data = new byte[150];
			int num;
			while(is.available() > 0) {
				num = is.read(data, 0, data.length);
				txtempfangen.append(new String(data, 0, num) + "");
			
			}
		} catch (IOException e) {
			System.out.println("Fehler beim Lesen empfangener Daten");
		}
	}
	
	class serialPortEventListener implements SerialPortEventListener {
		public void serialEvent(SerialPortEvent event) {
			System.out.println("serialPortEventlistener");
			switch (event.getEventType()) {
			case SerialPortEvent.DATA_AVAILABLE:
				serialPortDatenVerfuegbar();
				break;
			case SerialPortEvent.BI:
			case SerialPortEvent.CD:
			case SerialPortEvent.CTS:
			case SerialPortEvent.DSR:
			case SerialPortEvent.FE:
			case SerialPortEvent.OUTPUT_BUFFER_EMPTY:
			case SerialPortEvent.PE:
			case SerialPortEvent.RI:
			default:
			}
		}
	}		
}
 
T

tuxedo

Gast
Hast du schonmal was vom Divide'n'Conquer Prinzip gehört?

Wenn man ein riesen Problem hat bricht man das in kleinere Probleme auf und bearbeitet die dann, je nach zur verfügung stehenden Ressourcen im worst-case einzeln.

Ergo:

GUI weglassen,
erstmal nur Console benutzen,
schauen wie man den TNC auf der seriellen Konsole bedient.
Wenn du Windows-Nutzer bist kannst du ja auch Java erstmal weglassen und mit "HyperTerminal" direkt die serielle Schnittstelle ansprechen um ein gefühl dafür zu bekommen wie man den TNC bedient.

- Alex
 

alex0549

Mitglied
Ja okay werd mich mal intensiver mit dem TNC beschäftigen.
Aber nun zu meinem Problem mit der AES Verschlüsselung.
Wie und wo kann ich da ansetzen?
 

alex0549

Mitglied
Ja hab das schon ausprobiert doch wie sage ich das es meinem Text aus der TextArea "txtsenden" Verschlüsseln soll?

Java:
 import java.security.*;
   import javax.crypto.*;
   import javax.crypto.spec.*;
   import java.io.*;

   /**
   * This program generates a AES key, retrieves its raw bytes, and
   * then reinstantiates a AES key from the key bytes.
   * The reinstantiated key is used to initialize a AES cipher for
   * encryption and decryption.
   */

   public class AES {

     /**
     * Turns array of bytes into string
     *
     * @param buf	Array of bytes to convert to hex string
     * @return	Generated hex string
     */
     public static String asHex (byte buf[]) {
      StringBuffer strbuf = new StringBuffer(buf.length * 2);
      int i;

      for (i = 0; i < buf.length; i++) {
       if (((int) buf[i] & 0xff) < 0x10)
	    strbuf.append("0");

       strbuf.append(Long.toString((int) buf[i] & 0xff, 16));
      }

      return strbuf.toString();
     }

     public static void main(String[] args) throws Exception {

       String message="This is just an example";

       // Get the KeyGenerator

       KeyGenerator kgen = KeyGenerator.getInstance("AES");
       kgen.init(128); // 192 and 256 bits may not be available


       // Generate the secret key specs.
       SecretKey skey = kgen.generateKey();
       byte[] raw = skey.getEncoded();

       SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");


       // Instantiate the cipher

       Cipher cipher = Cipher.getInstance("AES");

       cipher.init(Cipher.ENCRYPT_MODE, skeySpec);

       byte[] encrypted =
         cipher.doFinal((args.length == 0 ?
          "This is just an example" : args[0]).getBytes());
       System.out.println("encrypted string: " + asHex(encrypted));

       cipher.init(Cipher.DECRYPT_MODE, skeySpec);
       byte[] original =
         cipher.doFinal(encrypted);
       String originalString = new String(original);
       System.out.println("Original string: " +
         originalString + " " + asHex(original));
     }
   }
 

alex0549

Mitglied
also müsste ich in Zeile 37 ansetzen?

müsste also heißen
Java:
 public void Verschlüsseln () }
verschluesseln(txtsenden.getText());

"txtsenden" so heißt meine TextArea in der ich den Text eingebe.

aber wie sage ich dem "senden" Button das er auch die Verschlüsselung starten soll und zwar in der Reihenfolge:

1) Verschlüsseln
2) senden
 
T

tuxedo

Gast
Nochmal zur herangehensweise:

Wenn man vor hat ein Auto von Grund auf selbst zu bauen.... Sollte man nicht erst schauen dass man die vier Räder angetrieben bekommt bevor man sich um die elektrischen Scheibenheber kümmert? Gut, die Scheibenheber wird man auch brauchen wenn das Auto mal fährt. Aber wenn man noch keinen Plan hat wie man einen Motor baut, dann ist das investieren von Zeit in die Fensterhebertechnik doch fraglich, oder?

- Alex
 

alex0549

Mitglied
okay wenn du das mit dem Modem/TNC meinst das ist in arbeit und nun mache ich in der zwischenzeit hier weiter.
Ist doch nicht schlecht oder?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Thomasneuling Java Jar datei erstellen, von Projekt, dass auch Javafx Dateien, FXML Dateien und CSS Dateien, sowie Bilder enthält? Allgemeine Java-Themen 14
G Dateien lesen Allgemeine Java-Themen 3
OnDemand Unterschiedliche jar Dateien zusammen führen Allgemeine Java-Themen 8
A Sicheres Löschen von Dateien Allgemeine Java-Themen 7
O git ignore für Intellji braucht es die .idea Dateien? Allgemeine Java-Themen 8
Master3000 Dateien zwischen verschiedenen Netzwerken senden Allgemeine Java-Themen 17
L Jar Dateien in Classpath laden ab JDK 9+ Allgemeine Java-Themen 11
d.lumpi JDA eclipse dateien versenden Allgemeine Java-Themen 4
O Produziert das Tool "jpackage" (ab JDK 14) .exe Dateien, die auf einer Zielumgebung ohne JRE lauffähig sind ?` Allgemeine Java-Themen 7
O Wie kann ich in Apache POI (Excel Dateien schreiben) Datumszellen in Excel erzeugen Allgemeine Java-Themen 6
T Meine Frage lautet wie ich 2 CSV Dateien miteinander in Java verbinde und Spalten die zueinander gehören durch den gleichen Key zusammen ausgebe? Allgemeine Java-Themen 5
L Dateien richtig auslesen Allgemeine Java-Themen 6
L Eclipse Runnable Jar mit Dateien Allgemeine Java-Themen 8
W Server-Thread schreibt nicht alle Dateien Allgemeine Java-Themen 6
MiMa Logging mit log4j2 in verschiedene Dateien? Allgemeine Java-Themen 22
I Klassen aus Jar-Dateien aus anderem Ordner laden Allgemeine Java-Themen 3
O jar und EXE Dateien, Pfade zur Laufzeit Allgemeine Java-Themen 1
W Dateien werden nicht gelöscht - warum? Allgemeine Java-Themen 12
B Dateien / Bilder von "webapp" Ordner bekommen? Allgemeine Java-Themen 1
P Erste Schritte Dateien löschen Allgemeine Java-Themen 4
H Erste Schritte Ausführbare Dateien lassen sich nicht starten Allgemeine Java-Themen 5
I Java als exe veröffentlichen inkl. kompletter Dateien Allgemeine Java-Themen 4
M Drucken von Dateien Allgemeine Java-Themen 10
J jar Dateien unter Windows 7 mit spezifischer jdk öffnen Allgemeine Java-Themen 2
I Laden von Informationen aus Dateien: Austauschbarkeit: 2 Dateien sinnvoll? Allgemeine Java-Themen 2
N Temporäre Dateien Allgemeine Java-Themen 3
Bluedaishi Druck Probleme mit PDF dateien Allgemeine Java-Themen 4
M Dateien schneller kopieren Allgemeine Java-Themen 1
M Dateien nach kopieren vergleichen Allgemeine Java-Themen 9
Arif Input/Output Dateien im Jar-Programm speichern Allgemeine Java-Themen 12
D Collections.sort funktioniert nicht in exportierten .class Dateien Allgemeine Java-Themen 10
K Große JSON-Dateien schnell und effizient verarbeiten Allgemeine Java-Themen 16
J Programm zum Download von CSV-Dateien Allgemeine Java-Themen 4
V Eclipse .class Dateien Allgemeine Java-Themen 9
B Download von dateien Allgemeine Java-Themen 2
K Nicht alle class-Dateien im JRE? Allgemeine Java-Themen 2
MiMa Log4j in Dateien mit eigenem Namen schreiben Allgemeine Java-Themen 3
D Kopieren von Dateien aus einem Ordner in einen anderen Allgemeine Java-Themen 6
C Dateien in Jar aufrufen Allgemeine Java-Themen 14
X NetBeans Bilder und andere Dateien ins .jar schreiben und wieder aus .jar lesen Allgemeine Java-Themen 6
JavaWolf165 Externe .jar-Dateien in .jar-Datei intigrieren Allgemeine Java-Themen 0
X Dateien für Benutzer Sperren Allgemeine Java-Themen 4
D Dateien aus den Internet herunterladen Allgemeine Java-Themen 6
L Methoden Dateien älter als 30 Tage? Allgemeine Java-Themen 11
J .exe Dateien werden nicht gestartet obwohl Pfad richtig Allgemeine Java-Themen 6
RalleYTN Classpath Native Dateien(DLL, SO, JNILIB) Allgemeine Java-Themen 2
J Java .jar Dateien zusammenführen Allgemeine Java-Themen 1
L Best Practice Log Dateien analysieren und eventuell passende Daten am Chart darstellen Allgemeine Java-Themen 1
F Platzsparende Alternative zu .txt-Dateien Allgemeine Java-Themen 12
X Dateien von der Jar zum Ordner kopieren. Allgemeine Java-Themen 4
Ananaskirsche Input/Output Dateien im Ordner Allgemeine Java-Themen 8
A Input/Output Liste der Dateien in einem Ordner in einer Jar Datei erhalten Allgemeine Java-Themen 11
X Herunterladen von Dateien aus dem Internet Allgemeine Java-Themen 2
V Input/Output Sound Dateien aus Jar laden Allgemeine Java-Themen 18
M Dateien aus einem Verzeichnis auf einem Server auflisten Allgemeine Java-Themen 5
H PDFBox akzeptiert Dateien nicht Allgemeine Java-Themen 1
B Java - einlesen von Dateien und herausschneiden von XML Dokumenten Allgemeine Java-Themen 5
A Input/Output Spätes Schreiben von Dateien der JVM Allgemeine Java-Themen 3
M Zwei unterschiedliche JAR Dateien mit ANT erstellen Allgemeine Java-Themen 8
Thallius Dateien Zippen und wieder heraus lesen? Allgemeine Java-Themen 4
T Dateien zur Laufzeit in Java-Programm packen? Allgemeine Java-Themen 3
Maxim6394 Jar Dateien starten nicht Allgemeine Java-Themen 7
U Eclipse Java Programm beschädigt .tar.gz dateien beim Entpacken Allgemeine Java-Themen 7
GUI-Programmer Mp3 Dateien bearbeiten und speichern Allgemeine Java-Themen 3
S Exklusive Sperre auf Dateien: FileChannel, FileLock Allgemeine Java-Themen 0
Bluedaishi Dateien löschen die älter als das aktuelle Datum sind Allgemeine Java-Themen 9
OnDemand Dateien einlesen und vergleichen Allgemeine Java-Themen 1
T Ordner samt Dateien kopieren Allgemeine Java-Themen 11
R Importieren von Txt-Dateien in AbstractTableModel Allgemeine Java-Themen 0
C Dateien komprimieren und verschlüsseln Allgemeine Java-Themen 3
F Eclipse Eclipse kompiliert nicht mehr die aktuellen Dateien Allgemeine Java-Themen 2
R Java Dateien "verschlüsseln" Allgemeine Java-Themen 2
L Passwortgeschützte Dateien Allgemeine Java-Themen 6
A Datentypen Dateien umbenennen mit Dateiendungen - Dateiendungen ausgeben Allgemeine Java-Themen 2
L Reparieren beschädigter PDF Dateien Allgemeine Java-Themen 3
F Dateien ins Array lagern und Optionen zur Auswahl, Allgemeine Java-Themen 5
J XML Dateien vergleichen Allgemeine Java-Themen 9
B Umbenennen von Dateien Allgemeine Java-Themen 2
B Erste Schritte Plugin erkennen und Class Dateien anzeigen lassen Allgemeine Java-Themen 3
W Best Practice Dateien parsen Allgemeine Java-Themen 3
B Dateien verschwinden aus bin Ordner?! Allgemeine Java-Themen 5
B Dateien prüfen auf Gleichheit Allgemeine Java-Themen 5
M Java Dateien verschieben Allgemeine Java-Themen 2
R Wav-Dateien wiederholt abspielen Allgemeine Java-Themen 2
L Methoden Verarbeitung von Größen Dateien Allgemeine Java-Themen 9
B Alt-Griechisch Zeichen in Dateien Allgemeine Java-Themen 2
M JAR Dateien nur mit Compiler Level 1.6 ausführbar Allgemeine Java-Themen 8
E Zugriff auf Dateien im Filesystem überwachen Allgemeine Java-Themen 5
G .jar Dateien lassen sich nicht mehr öffnen Allgemeine Java-Themen 2
M Datentypen Jar-Dateien öffnen nicht mit Java Allgemeine Java-Themen 4
C Mit Java PDF Dateien bearbeiten. Allgemeine Java-Themen 2
B Input/Output .java-Dateien auslesen Allgemeine Java-Themen 17
B Methoden Alle Methoden und Variablen aus Java-Dateien auslesen. Allgemeine Java-Themen 7
E Vorschläge, effizientes Hashing von Dateien für vergleich Allgemeine Java-Themen 7
W Vergleich eines Datenträgers auf neue Dateien Allgemeine Java-Themen 14
C Java-Dateien in einheitlichen Zeichensatz umwandeln Allgemeine Java-Themen 10
E Dateien aus / im JAR Allgemeine Java-Themen 2
K LibreOffice Tabelle Dateien im Format .ods bearbeiten Allgemeine Java-Themen 2
L Input/Output Dateien erstellen, wenn ein JAR ausgeführt wird Allgemeine Java-Themen 13
L Generieren Zufallsdaten aus CSV dateien Allgemeine Java-Themen 11

Ähnliche Java Themen

Neue Themen


Oben