diff --git a/ModuleAPRSIS/pom.xml b/ModuleAPRSIS/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..a21e3fba890c2c5b8d7f8634690b74e3447b8252 --- /dev/null +++ b/ModuleAPRSIS/pom.xml @@ -0,0 +1,41 @@ + + + + org.josast + JOSAST-parent + 0.0.2 + + + + 4.0.0 + + ModuleAPRSIS + jar + 1.0-SNAPSHOT + Module APRSIS + + + UTF-8 + + + + + junit + junit + 3.8.1 + test + + + + + + + + + + + + + diff --git a/ModuleAPRSIS/src/main/java/org/avmdti/josast/aprsis/AThreadInputStream.java b/ModuleAPRSIS/src/main/java/org/avmdti/josast/aprsis/AThreadInputStream.java new file mode 100644 index 0000000000000000000000000000000000000000..f0c6daf6ce6d4ca608185c0290e97cc43fbfa99d --- /dev/null +++ b/ModuleAPRSIS/src/main/java/org/avmdti/josast/aprsis/AThreadInputStream.java @@ -0,0 +1,50 @@ +/** + * + */ +package org.avmdti.josast.aprsis; + +import java.util.logging.Logger; + +/** + * Simple Tread to help the use of the APRS-IS server. + * + * @author XTOPHE + * + */ +public class AThreadInputStream extends Thread { + + private static Logger logger = Logger.getLogger("AmsatLogger"); + + private boolean actif = true; + + private ICompute compute = null; + + /** + * @param compute specific treatment + */ + public AThreadInputStream(ICompute compute) { + super(); + this.compute = compute; + } + + /** + * @see java.lang.Runnable#run() + */ + public void run() + { + // set the process to actif + actif = true; + if (compute!= null) + { + while (actif) + { + actif = compute.execute(); + } + } + else + { + logger.severe("compute equal null"); + } + } + +} diff --git a/ModuleAPRSIS/src/main/java/org/avmdti/josast/aprsis/AprsIsConfiguration.java b/ModuleAPRSIS/src/main/java/org/avmdti/josast/aprsis/AprsIsConfiguration.java new file mode 100644 index 0000000000000000000000000000000000000000..8f4de3f93c0be5c1af8560d114fae06b5f608f2b --- /dev/null +++ b/ModuleAPRSIS/src/main/java/org/avmdti/josast/aprsis/AprsIsConfiguration.java @@ -0,0 +1,84 @@ +package org.avmdti.josast.aprsis; + +public class AprsIsConfiguration { + private String call = null; + + private String password = null; + + private String filter =null ; + + private String host = "rotate.aprs.net";// "first.aprs.net"; + + private int port = 14580; + /** + * @return the callSign used + */ + public String getCall() { + return call; + } + + public void setCall(String call) { + this.call = call; + } + + public String getPass() { + return password; + } + + public void setPass(String pass) { + this.password = pass; + } + + public String getFilter() { + return filter; + } + + public void setFilter(String filter) { + this.filter = filter; + } + /** + * @return hostname of the server + */ + + public String getHost() { + return host; + } + + public void setHost(String host) { + this.host = host; + } + /** + * @return the port number + */ + public int getPort() { + return port; + } + + public void setPort(int port) { + this.port = port; + } + + /** + * @param host hostname of the APRS-IS server + * @param port port number + * @param call callsign used for the connection + * @param password password + * @param filter filter used to select packet + */ + public AprsIsConfiguration(String call, String password, String filter, + String host, int port) { + super(); + this.call = call; + this.password = password; + this.filter = filter; + this.host = host; + this.port = port; + } + + public AprsIsConfiguration() { + super(); + // TODO Auto-generated constructor stub + } + + +} diff --git a/ModuleAPRSIS/src/main/java/org/avmdti/josast/aprsis/Client.java b/ModuleAPRSIS/src/main/java/org/avmdti/josast/aprsis/Client.java new file mode 100644 index 0000000000000000000000000000000000000000..eeecb73df3b728a9d09cec67fe351f1179d185db --- /dev/null +++ b/ModuleAPRSIS/src/main/java/org/avmdti/josast/aprsis/Client.java @@ -0,0 +1,103 @@ +/* + * Client.java + * + * Created on 19 avril 2006, 16:15 + * + */ + +package org.avmdti.josast.aprsis; + +import java.io.IOException; +import java.io.InputStream; +import java.net.Socket; +import java.net.UnknownHostException; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * Client used to perform the connection to the APRS-IS Serveur; + * + * @author XTOPHE + */ +public class Client { + + private static Logger logger = Logger.getLogger("AmsatLogger"); + + private Socket s = null; + + private AprsIsConfiguration Config; + + /** + * + * create a "client" to connect to an APRS-IS Server + * + * @param config + * + */ + public Client(AprsIsConfiguration config) { + Config = config; + } + + /** + * + * return an inputStream from the current connection + * + * @return InputStream when the a connection is avalailable. If the + * connection failed, null is returned. + * + */ + public void connect() { + + if (s == null) { + try { + s = new Socket(Config.getHost(), Config.getPort()) { + public void close() throws IOException { + logger.log(Level.SEVERE, "Closing " + this); + super.close(); + s = null; + } + }; + s.getOutputStream() + .write(("user " + Config.getCall() + " pass " + + Config.getPass() + + " vers josastaprssrvr 0.1\r\n").getBytes()); + s.getOutputStream().write( + ("# filter " + Config.getFilter() + "\r\n").getBytes()); + s.getOutputStream().flush(); + + } catch (UnknownHostException ex) { + + logger.severe(ex.getMessage()); + + } catch (IOException ex) { + logger.severe(ex.getMessage()); + } + } + + } + + public InputStream getInputStream() { + if (s != null) { + try { + return s.getInputStream(); + } catch (IOException ex) { + logger.log(Level.SEVERE, + "input Stream " + this + ex.getMessage()); + } + } + + return null; + } + + /** + * close the connection. + */ + public void close() { + try { + s.close(); + } catch (IOException ex) { + logger.log(Level.SEVERE, "close " + this + ex.getMessage()); + } + } + +} diff --git a/ModuleAPRSIS/src/main/java/org/avmdti/josast/aprsis/ICompute.java b/ModuleAPRSIS/src/main/java/org/avmdti/josast/aprsis/ICompute.java new file mode 100644 index 0000000000000000000000000000000000000000..b93002773534b92792495ff13d079e16b009a9a3 --- /dev/null +++ b/ModuleAPRSIS/src/main/java/org/avmdti/josast/aprsis/ICompute.java @@ -0,0 +1,17 @@ +package org.avmdti.josast.aprsis; + +/** + * + * Interface for the thread used in AThreadInputStream + * @author XTOPHE + * + */ +public interface ICompute { + /** + * This method is call each time a set of data is received + *
at the end of the treatement, the return value indicate if we wait a new set of data. + * + * @return boolean true continue, false stop the thread + */ + boolean execute(); +} diff --git a/ModuleAPRSIS/src/main/java/org/avmdti/josast/aprsis/demo/DemoAPRSIS.java b/ModuleAPRSIS/src/main/java/org/avmdti/josast/aprsis/demo/DemoAPRSIS.java new file mode 100644 index 0000000000000000000000000000000000000000..ddb5b13d80e360c34c7911fd33c8ecb9730ea1f7 --- /dev/null +++ b/ModuleAPRSIS/src/main/java/org/avmdti/josast/aprsis/demo/DemoAPRSIS.java @@ -0,0 +1,60 @@ + +package org.avmdti.josast.aprsis.demo; + + +import java.util.logging.Logger; + +import org.avmdti.josast.aprsis.AThreadInputStream; +import org.avmdti.josast.aprsis.AprsIsConfiguration; +import org.avmdti.josast.aprsis.Client; + +/** + * Simple demo to show how to use the APRS-IS module
+ * this example :
+ * create a link to the APRS-IS server
+ * Display the data received + * + * + * + * @author XTOPHE + */ +public class DemoAPRSIS { + + /** + * Creates a new instance of Main * + */ + public DemoAPRSIS() { + } + + /** + * @param args the command line arguments + */ + static public void main(String[] args) { + + Logger logger = Logger.getLogger("AmsatLogger"); + /* set the configuration */ +// AprsIsConfiguration config = new AprsIsConfiguration("F6ZZZ","PASS","b/W3ADO*/PCSAT/ANDE-1/ANDE-2/RAFT/POLLUX-1/KD4HBO-1/NMARS/PCSAT* p/PCSAT2/POLLUX-1/PC2PSK/PC2TLM/PC2XXA/ISSTLM/PC2ISS/PC2RPT/PC2XXB/PCSAT*/ANDE-1/ANDE-2/RAFT/NMARS/W3ADO* d/PCSAT2/PC2PSK/KD4HBO-1/PC2TLM/PC2XXA/ISSTLM/PC2ISS/PC2RPT/PC2XXB/PCSAT*/ANDE-1/ANDE-2/RAFT/NMARS/W3ADO*","rotate.aprs.net",14580); + + AprsIsConfiguration config = new AprsIsConfiguration("TEST-1", "PASS", + "p/PCSAT*/RS0ISS-4/ARISS b/PCSAT*/RS0ISS-4/ARISS d/PCSAT*/RS0ISS-4/ARISS", + "euro.aprs2.net", 14580); + + /* create the client */ + Client c = new Client(config); + c.connect(); + + + + DemoTreatment log = new DemoTreatment(c.getInputStream()); + AThreadInputStream thread = new AThreadInputStream(log); + thread.start(); + try { + thread.join(); + } catch (InterruptedException e) { + logger.severe(e.getMessage()); + } + c.close(); + + } + +} diff --git a/ModuleAPRSIS/src/main/java/org/avmdti/josast/aprsis/demo/DemoTreatment.java b/ModuleAPRSIS/src/main/java/org/avmdti/josast/aprsis/demo/DemoTreatment.java new file mode 100644 index 0000000000000000000000000000000000000000..08ad46b3ecd8274a2b5a1004b6e74cd32e18768f --- /dev/null +++ b/ModuleAPRSIS/src/main/java/org/avmdti/josast/aprsis/demo/DemoTreatment.java @@ -0,0 +1,42 @@ +package org.avmdti.josast.aprsis.demo; + +import java.io.IOException; +import java.io.InputStream; + + +import java.util.logging.Logger; + +import org.avmdti.josast.aprsis.ICompute; + +//import org.avmdti.josast.aprsis.persistence.Persistence; + +public class DemoTreatment implements ICompute { + Logger logger = Logger.getLogger("AmsatLogger"); + InputStream input = null; + + // TlmDecoder td = new TlmDecoder(); + public DemoTreatment(InputStream input) { + super(); + + this.input = input; + + } + + public boolean execute() { + byte bytes[] = null; + int nbBytes = 0; + try { + + bytes = new byte[1000]; + nbBytes = input.read(bytes); + System.out.print("." + nbBytes + "."); + String buff = new String(bytes).trim(); + System.out.print(buff + "\n"); + + } catch (IOException e) { + logger.severe(e.getMessage()); + } + return true; + } + +} diff --git a/ModuleAPRSIS/src/site/apt/summary.apt b/ModuleAPRSIS/src/site/apt/summary.apt new file mode 100644 index 0000000000000000000000000000000000000000..5cf7d9ce61ba2b96896749a7f9526449a58c1f00 --- /dev/null +++ b/ModuleAPRSIS/src/site/apt/summary.apt @@ -0,0 +1,3 @@ + This application demonstrates Maven 2 site generation functionalities. One of the nicer features of Maven is the ability to create an internal technical web site + at very little cost. Maven 2 extends this functionality, and gives you powerful new ways + to generate site content... \ No newline at end of file diff --git a/ModuleAPRSIS/src/site/fml/faqs.fml b/ModuleAPRSIS/src/site/fml/faqs.fml new file mode 100644 index 0000000000000000000000000000000000000000..f9a24ebaa51151e37e4709a75384034975dcab5c --- /dev/null +++ b/ModuleAPRSIS/src/site/fml/faqs.fml @@ -0,0 +1,22 @@ + + + + + + + What is APRS + +

+ APRS is a protocol used by Ham-radio. This protocol has been defined by B. Bruninga. +

+
+ What is APRS-IS + +

+ APSR-IS is a APRS frame server. The ham-radio user collect APRS data and sent them throught APRS-IS on internet. +

+
+
+ +
+
\ No newline at end of file diff --git a/ModuleAPRSIS/src/site/site.xml b/ModuleAPRSIS/src/site/site.xml new file mode 100644 index 0000000000000000000000000000000000000000..075020152cc7566ff4eb7a9ed1018f62af7b241f --- /dev/null +++ b/ModuleAPRSIS/src/site/site.xml @@ -0,0 +1,29 @@ + + + + Module APRS-IS + http://maven.apache.org/images/apache-maven-project.png + http://http://josast.free.fr/ + + + http://maven.apache.org/images/maven-small.gif + + + + + + + + + + + + + + + + ${reports} + + + + \ No newline at end of file diff --git a/ModuleAPRSIS/src/test/java/org/avmdti/josast/AThreadInputStreamTest.java b/ModuleAPRSIS/src/test/java/org/avmdti/josast/AThreadInputStreamTest.java new file mode 100644 index 0000000000000000000000000000000000000000..6aa069ea9b1fef8ee5cead7be681d91c929bcbdc --- /dev/null +++ b/ModuleAPRSIS/src/test/java/org/avmdti/josast/AThreadInputStreamTest.java @@ -0,0 +1,22 @@ +package org.avmdti.josast; + +import junit.framework.TestCase; + +public class AThreadInputStreamTest extends TestCase { + + /* + * Test method for 'org.avmdti.josast.aprsis.AThreadInputStream.run()' + */ + public void testRun() { + + + } + + /* + * Test method for 'org.avmdti.josast.aprsis.AThreadInputStream.AThreadInputStream(ICompute)' + */ + public void testAThreadInputStream() { + + } + +} diff --git a/ModuleAPRSIS/src/test/java/org/avmdti/josast/ClientTest.java b/ModuleAPRSIS/src/test/java/org/avmdti/josast/ClientTest.java new file mode 100644 index 0000000000000000000000000000000000000000..fb4026abfd7b78c9235cfbbf9dd7dce0af6683fa --- /dev/null +++ b/ModuleAPRSIS/src/test/java/org/avmdti/josast/ClientTest.java @@ -0,0 +1,73 @@ +package org.avmdti.josast; + +import java.io.InputStream; + +import org.avmdti.josast.aprsis.Client; + + +import junit.framework.Assert; +import junit.framework.TestCase; +import org.avmdti.josast.aprsis.AprsIsConfiguration; + +public class ClientTest extends TestCase { + + /* set the configuration */ + AprsIsConfiguration config = new AprsIsConfiguration("F6ZZZ","PASS","b/W3ADO*/PCSAT/ANDE-1/ANDE-2/RAFT/POLLUX-1/KD4HBO-1/NMARS/PCSAT* p/PCSAT2/POLLUX-1/PC2PSK/PC2TLM/PC2XXA/ISSTLM/PC2ISS/PC2RPT/PC2XXB/PCSAT*/ANDE-1/ANDE-2/RAFT/NMARS/W3ADO* d/PCSAT2/PC2PSK/KD4HBO-1/PC2TLM/PC2XXA/ISSTLM/PC2ISS/PC2RPT/PC2XXB/PCSAT*/ANDE-1/ANDE-2/RAFT/NMARS/W3ADO*","rotate.aprs.net",14580); + /* create the client */ + Client client = new Client (config); + + + public ClientTest(String arg0) { + super(arg0); + } + + protected void setUp() throws Exception { + super.setUp(); + } + + protected void tearDown() throws Exception { + super.tearDown(); + } + + /* + * Test method for 'org.avmdti.josast.aprsis.Client.Client(String, int, String, String, String)' + */ + public final void testClientStringIntStringStringString() { + // TODO Auto-generated method stub + + } + + /* + * Test method for 'org.avmdti.josast.aprsis.Client.connect()' + */ + public final void testConnect() { +// client.setHost("localhost"); +// client.connect(); +// InputStream in = client.getInputStream(); +// Assert.assertNotNull(in); +// client.close(); +// + + } + + /* + * Test method for 'org.avmdti.josast.aprsis.Client.getInputStream()' + */ + public final void testGetInputStream() { + InputStream in = client.getInputStream(); + Assert.assertEquals(in,null); + } + + /* + * Test method for 'org.avmdti.josast.aprsis.Client.close()' + */ + public final void testClose() { + // TODO Auto-generated method stub + + } + + + + + +} diff --git a/ModuleAPRSIS/src/test/java/org/avmdti/josast/SeveurDetest.java b/ModuleAPRSIS/src/test/java/org/avmdti/josast/SeveurDetest.java new file mode 100644 index 0000000000000000000000000000000000000000..d18a0c629e1ecec30519d162c796c4813efa3ba4 --- /dev/null +++ b/ModuleAPRSIS/src/test/java/org/avmdti/josast/SeveurDetest.java @@ -0,0 +1,47 @@ +package org.avmdti.josast; + +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.InputStreamReader; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.net.ServerSocket; +import java.net.Socket; + +/** + * Socket server for unit test. + * Simple ECHO server. + * + * @author cmercier + * + */ +public class SeveurDetest { + static final int port = 8080; + + public static void main(String[] args) throws Exception { + ServerSocket s = new ServerSocket(port); + Socket soc = s.accept(); + + // Un BufferedReader permet de lire par ligne. + BufferedReader plec = new BufferedReader( + new InputStreamReader(soc.getInputStream()) + ); + + // Un PrintWriter possède toutes les opérations print classiques. + // En mode auto-flush, le tampon est vidé (flush) à l'appel de println. + PrintWriter pred = new PrintWriter( + new BufferedWriter( + new OutputStreamWriter(soc.getOutputStream())), + true); + + while (true) { + String str = plec.readLine(); // lecture du message + if (str.equals("END")) break; + System.out.println("ECHO = " + str); // trace locale + pred.println(str); // renvoi d'un écho + } + plec.close(); + pred.close(); + soc.close(); + } + } diff --git a/ModuleAPRSIS/src/test/java/org/avmdti/josast/aprsis/AprsIsConfigurationTest.java b/ModuleAPRSIS/src/test/java/org/avmdti/josast/aprsis/AprsIsConfigurationTest.java new file mode 100644 index 0000000000000000000000000000000000000000..28a320120b59af78c6e520b5d94348ee78a718bd --- /dev/null +++ b/ModuleAPRSIS/src/test/java/org/avmdti/josast/aprsis/AprsIsConfigurationTest.java @@ -0,0 +1,51 @@ +package org.avmdti.josast.aprsis; + +import junit.framework.Assert; +import junit.framework.TestCase; + +public class AprsIsConfigurationTest extends TestCase { + + public void testSetCall() { + AprsIsConfiguration classUnderTest = new AprsIsConfiguration(); + classUnderTest.setCall("test"); + Assert.assertEquals("test", classUnderTest.getCall()); + } + + public void testSetPass() { + AprsIsConfiguration classUnderTest = new AprsIsConfiguration(); + classUnderTest.setPass("test"); + Assert.assertEquals("test", classUnderTest.getPass()); + } + + public void testSetFilter() { + AprsIsConfiguration classUnderTest = new AprsIsConfiguration(); + classUnderTest.setFilter("test"); + Assert.assertEquals("test", classUnderTest.getFilter()); + } + + public void testSetHost() { + AprsIsConfiguration classUnderTest = new AprsIsConfiguration(); + Assert.assertEquals("rotate.aprs.net", classUnderTest.getHost()); + classUnderTest.setHost("test"); + Assert.assertEquals("test", classUnderTest.getHost()); + } + + public void testSetPort() { + AprsIsConfiguration classUnderTest = new AprsIsConfiguration(); + Assert.assertEquals(14580, classUnderTest.getPort()); + classUnderTest.setPort(10); + Assert.assertEquals(10, classUnderTest.getPort()); + } + + public void testAprsIsConfiguration() { + AprsIsConfiguration classUnderTest = new AprsIsConfiguration(); + Assert.assertEquals(14580, classUnderTest.getPort()); + Assert.assertEquals("rotate.aprs.net", classUnderTest.getHost()); + Assert.assertEquals(null, classUnderTest.getFilter()); + Assert.assertEquals(null, classUnderTest.getPass()); + Assert.assertEquals(null, classUnderTest.getCall()); + + + } + +} diff --git a/pom.xml b/pom.xml index 7be68d20f4e97afcbd23caaa99ea727336b5b6ee..2f4953b095514d6f249b994d2b83fbcfed6c5813 100644 --- a/pom.xml +++ b/pom.xml @@ -725,6 +725,7 @@ ModuleSoundModem ModuleSIDS ModuleEquationKepler + ModuleAPRSIS ModuleJourJulien ModuleCubesatSim