# Dateien Serialisieren



## alex0549 (8. Jun 2010)

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?


----------



## Michael... (8. Jun 2010)

alex0549 hat gesagt.:


> 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 (8. Jun 2010)

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:


```
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... (8. Jun 2010)

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 
	
	
	
	





```
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 (8. Jun 2010)

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... (8. Jun 2010)

alex0549 hat gesagt.:


> 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 (8. Jun 2010)

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.


----------



## maki (8. Jun 2010)

Ist hier etwas dabei: pr_soft [DeltaLima.org]


----------



## alex0549 (8. Jun 2010)

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


----------



## maki (8. Jun 2010)

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... (8. Jun 2010)

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 (8. Jun 2010)

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.


----------



## Empire Phoenix (9. Jun 2010)

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 (9. Jun 2010)

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 (9. Jun 2010)

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 (9. Jun 2010)

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 (9. Jun 2010)

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 (9. Jun 2010)

```
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 (9. Jun 2010)

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 (9. Jun 2010)

Danke Empire

werde mal ein wenig dran basteln.


----------



## alex0549 (9. Jun 2010)

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




```
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();
	}
}
```


----------



## Michael... (9. Jun 2010)

Prinzipiell musst Du einfach nur die Datei Einlesen (z.B. per FileInputStream) und über den OutputStream wiederrausschreiben. Siehe: JavaInsel#Dateinen und Datenströme
Die Frage ist nur welche "Sprache" versteht das gegenüber am anderen "Ende" des Streams


----------



## alex0549 (9. Jun 2010)

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.


----------



## tuxedo (9. Jun 2010)

alex0549 hat gesagt.:


> 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 (9. Jun 2010)

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!?


----------



## tuxedo (9. Jun 2010)

alex0549 hat gesagt.:


> 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


----------



## Empire Phoenix (9. Jun 2010)

Weiß nicht , aber vonner logik her sollte das doch das ax25 machen oder? Also verlorene Packete neusenden.


----------



## tuxedo (9. Jun 2010)

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 (9. Jun 2010)

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


----------



## tuxedo (9. Jun 2010)

> 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.
> ...



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 (*MO*dulieren) und auf der anderen Seite die Töne wieder in 1000111 umgekehrt (*DEM*odulieren).

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 (9. Jun 2010)

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


----------



## tuxedo (9. Jun 2010)

alex0549 hat gesagt.:


> 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
> 
> ...



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)
> ...



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.
> ...


----------



## Michael... (9. Jun 2010)

tuxedo hat gesagt.:


> Einfach die Datei in Form von einzelnen Bytes auf die serielle Schnittstelle geben reicht da bei weitem nicht aus.


Meine Rede ;-)


----------



## alex0549 (9. Jun 2010)

Ü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


----------



## Empire Phoenix (9. Jun 2010)

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 (9. Jun 2010)

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


```
/* 
 *
 */


 
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 (10. Jun 2010)

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.


```
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?


----------



## Michael... (10. Jun 2010)

alex0549 hat gesagt.:


> Doch wie "source code" mäßig also InputStream kann ich sie einlesen?


Mit einem FileInputStream (hatte ich glaube ich schon mal erwähnt).
Hier mal was zum Dateien kopieren per FileInput- und FileOutputStreamJavaInsel#Kopieren... Sollte Deinen Anforderungen ziemlich nahe kommen, nur, dass Du den FileOutputStream durch den OutputStream an Dein Modem oder was auch immer ersetzen musst.


----------



## tuxedo (10. Jun 2010)

> 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 (10. Jun 2010)

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


----------



## tuxedo (10. Jun 2010)

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 (14. Jun 2010)

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:


```
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:
			}
		}
	}		
}
```


----------



## tuxedo (14. Jun 2010)

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 (14. Jun 2010)

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?


----------



## Michael... (14. Jun 2010)

alex0549 hat gesagt.:


> Aber nun zu meinem Problem mit der AES Verschlüsselung.
> Wie und wo kann ich da ansetzen?


Using AES with Java Technology


----------



## alex0549 (14. Jun 2010)

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


```
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));
     }
   }
```


----------



## Michael... (14. Jun 2010)

alex0549 hat gesagt.:


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


Du packst den Anteil zum Verschlüsseln in eine Methode, liest per getText() denn Inhalt der TextArea aus und übergibts in der Methode, die Dir natürlich den verschlüsselten Text() zurück liefern sollte.


----------



## alex0549 (14. Jun 2010)

also müsste ich in Zeile 37 ansetzen?

müsste also heißen 

```
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


----------



## tuxedo (14. Jun 2010)

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 (14. Jun 2010)

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?


----------



## Michael... (15. Jun 2010)

Ich muss da Tuxedo zustimmen. Du beschäftigst Dich da mit diversen Details und scheinst doch noch Probleme mit den Grundlagen der Programmierung zu haben. Hast Du denn schon mal mit einer anderen Programmiersprache zu tun gehabt, oder ist Java Dein Einstieg in die Programmierung?

Hier mal ein Bsp, wie man Methoden (z.B. zur Verschlüsselung) anwenden kann:

```
public static String encrypt(String input) {
		//Hier musst Du einfach nur den gewünschten Verschlüsselungsalgorithmus anwenden
		//bzw. die relevanten Codezeilen aus dem AES Beispiel
		char[] chars = input.toCharArray();
		for(int i=0; i<chars.length; i++)
			chars[i] +=1;
		return new String(chars);
	}

	public static void main(String[] args) {
		String text = "Hallo";
		System.out.println("Aus \"" + text + "\" wird: " + encrypt(text));
	}
```


----------

