From b56198dc3cc43195d070ee4bb1e1644378e7b975 Mon Sep 17 00:00:00 2001 From: Niclas Finne Date: Thu, 2 Feb 2012 17:38:33 +0100 Subject: [PATCH] Added option to read sensor data from TCP connection --- .../sics/contiki/collect/CollectServer.java | 23 +++- .../contiki/collect/TCPClientConnection.java | 130 ++++++++++++++++++ 2 files changed, 151 insertions(+), 2 deletions(-) create mode 100644 tools/collect-view/src/se/sics/contiki/collect/TCPClientConnection.java diff --git a/tools/collect-view/src/se/sics/contiki/collect/CollectServer.java b/tools/collect-view/src/se/sics/contiki/collect/CollectServer.java index cc7785f24..cb75ab9c3 100644 --- a/tools/collect-view/src/se/sics/contiki/collect/CollectServer.java +++ b/tools/collect-view/src/se/sics/contiki/collect/CollectServer.java @@ -1474,6 +1474,7 @@ public class CollectServer implements SerialConnectionListener { boolean resetSensorLog = false; boolean useSensorLog = true; boolean useSerialOutput = true; + String host = null; String command = null; String logFileToLoad = null; String comPort = null; @@ -1482,6 +1483,18 @@ public class CollectServer implements SerialConnectionListener { String arg = args[i]; if (arg.length() == 2 && arg.charAt(0) == '-') { switch (arg.charAt(1)) { + case 'a': + if (i + 1 < n) { + host = args[++i]; + int pIndex = host.indexOf(':'); + if (pIndex > 0) { + port = Integer.parseInt(host.substring(pIndex + 1)); + host = host.substring(0, pIndex); + } + } else { + usage(arg); + } + break; case 'c': if (i + 1 < n) { command = args[++i]; @@ -1527,7 +1540,12 @@ public class CollectServer implements SerialConnectionListener { CollectServer server = new CollectServer(); SerialConnection serialConnection; - if (port > 0) { + if (host != null) { + if (port <= 0) { + port = 60001; + } + serialConnection = new TCPClientConnection(server, host, port); + } else if (port > 0) { serialConnection = new UDPConnection(server, port); } else if (command == null) { serialConnection = new SerialDumpConnection(server); @@ -1560,11 +1578,12 @@ public class CollectServer implements SerialConnectionListener { if (arg != null) { System.err.println("Unknown argument '" + arg + '\''); } - System.err.println("Usage: java CollectServer [-n] [-i] [-r] [-f [file]] [-p port] [-c command] [COMPORT]"); + System.err.println("Usage: java CollectServer [-n] [-i] [-r] [-f [file]] [-a host:port] [-p port] [-c command] [COMPORT]"); System.err.println(" -n : Do not read or save sensor data log"); System.err.println(" -r : Clear any existing sensor data log at startup"); System.err.println(" -i : Do not allow serial output"); System.err.println(" -f : Read serial data from standard in"); + System.err.println(" -a : Connect to specified host:port"); System.err.println(" -p : Read data from specified UDP port"); System.err.println(" -c : Use specified command for serial data input/output"); System.err.println(" COMPORT: The serial port to connect to"); diff --git a/tools/collect-view/src/se/sics/contiki/collect/TCPClientConnection.java b/tools/collect-view/src/se/sics/contiki/collect/TCPClientConnection.java new file mode 100644 index 000000000..bcc681f1f --- /dev/null +++ b/tools/collect-view/src/se/sics/contiki/collect/TCPClientConnection.java @@ -0,0 +1,130 @@ +/* + * Copyright (c) 2012, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * ----------------------------------------------------------------- + * + * TCPClientConnection + * + * Authors : Niclas Finne + */ + +package se.sics.contiki.collect; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.PrintStream; +import java.net.Socket; + +/** + * + */ +public class TCPClientConnection extends SerialConnection { + + private final String host; + private final int port; + + private Socket client; + private BufferedReader in; + private PrintStream out; + + public TCPClientConnection(SerialConnectionListener listener, String host, int port) { + super(listener); + this.host = host; + this.port = port; + } + + @Override + public String getConnectionName() { + return "'; + } + + @Override + public void open(String comPort) { + close(); + this.comPort = comPort == null ? "" : comPort; + + isClosed = false; + try { + client = new Socket(host, port); + in = new BufferedReader(new InputStreamReader(client.getInputStream())); + out = new PrintStream(client.getOutputStream()); + System.out.println("Opened TCP connection to " + host + ':' + port); + /* Start thread listening on UDP */ + Thread readInput = new Thread(new Runnable() { + public void run() { + try { + String line; + while (isOpen && (line = in.readLine()) != null) { + serialData(line); + } + } catch (IOException e) { + lastError = "Error when reading from SerialConnection TCP: " + e; + System.err.println(lastError); + if (!isClosed) { + e.printStackTrace(); + closeConnection(); + } + } finally { + System.out.println("SerialConnection TCP terminated."); + closeConnection(); + } + } + }, "TCP thread"); + isOpen = true; + serialOpened(); + readInput.start(); + + } catch (Exception e) { + lastError = "Failed to open TCP connection to " + host + ':' + port + ": " + e; + System.err.println(lastError); + e.printStackTrace(); + closeConnection(); + } + } + + @Override + protected void doClose() { + try { + if (in != null) { + in.close(); + in = null; + } + if (out != null) { + out.close(); + out = null; + } + if (client != null) { + client.close(); + client = null; + } + } catch (IOException e) { + e.printStackTrace(); + } + } + +}