From 86169177c51e6310d797b11c99741d6f73ccfd27 Mon Sep 17 00:00:00 2001 From: Niclas Finne Date: Wed, 1 Jun 2011 20:24:40 +0200 Subject: [PATCH] Started on UDP server support for CollectView --- .../sics/contiki/collect/CollectServer.java | 15 ++- .../sics/contiki/collect/UDPConnection.java | 117 ++++++++++++++++++ 2 files changed, 130 insertions(+), 2 deletions(-) create mode 100644 tools/collect-view/src/se/sics/contiki/collect/UDPConnection.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 f1bb0fc1e..5895c308b 100644 --- a/tools/collect-view/src/se/sics/contiki/collect/CollectServer.java +++ b/tools/collect-view/src/se/sics/contiki/collect/CollectServer.java @@ -1443,6 +1443,7 @@ public class CollectServer implements SerialConnectionListener { String command = null; String logFileToLoad = null; String comPort = null; + int port = -1; for(int i = 0, n = args.length; i < n; i++) { String arg = args[i]; if (arg.length() == 2 && arg.charAt(0) == '-') { @@ -1454,6 +1455,13 @@ public class CollectServer implements SerialConnectionListener { usage(arg); } break; + case 'p': + if (i + 1 < n) { + port = Integer.parseInt(args[++i]); + } else { + usage(arg); + } + break; case 'r': resetSensorLog = true; break; @@ -1485,7 +1493,9 @@ public class CollectServer implements SerialConnectionListener { CollectServer server = new CollectServer(); SerialConnection serialConnection; - if (command == null) { + if (port > 0) { + serialConnection = new UDPConnection(server, port); + } else if (command == null) { serialConnection = new SerialDumpConnection(server); } else if (command == STDIN_COMMAND) { serialConnection = new StdinConnection(server); @@ -1516,11 +1526,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]] [-c command] [COMPORT]"); + System.err.println("Usage: java CollectServer [-n] [-i] [-r] [-f [file]] [-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(" -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"); System.exit(arg != null ? 1 : 0); diff --git a/tools/collect-view/src/se/sics/contiki/collect/UDPConnection.java b/tools/collect-view/src/se/sics/contiki/collect/UDPConnection.java new file mode 100644 index 000000000..258b94f16 --- /dev/null +++ b/tools/collect-view/src/se/sics/contiki/collect/UDPConnection.java @@ -0,0 +1,117 @@ +/* + * Copyright (c) 2011, 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. + * + * ----------------------------------------------------------------- + * + * UDPConnection + * + * Authors : Niclas Finne + * Created : 1 June 2011 + */ + +package se.sics.contiki.collect; + +import java.io.IOException; +import java.net.DatagramPacket; +import java.net.DatagramSocket; +import java.net.InetAddress; + +/** + * + */ +public class UDPConnection extends SerialConnection { + + private final int port; +private DatagramSocket serverSocket; + + public UDPConnection(SerialConnectionListener listener, int port) { + super(listener); + this.port = port; + } + + @Override + public String getConnectionName() { + return ""; + } + + @Override + public void open(String comPort) { + close(); + this.comPort = comPort == null ? "" : comPort; + + isClosed = false; + try { + serverSocket = new DatagramSocket(port); + + /* Start thread listening on UDP */ + Thread readInput = new Thread(new Runnable() { + public void run() { + byte[] data = new byte[1024]; + try { + while (isOpen) { + DatagramPacket packet = new DatagramPacket(data, data.length); + serverSocket.receive(packet); + + InetAddress addr = packet.getAddress(); + System.out.println("UDP: received " + packet.getLength() + " bytes from " + addr.getHostAddress() + ":" + packet.getPort()); + // TODO handle data +// serialData(line); + } + System.out.println("SerialConnection UDP terminated."); + closeConnection(); + } catch (IOException e) { + lastError = "Error when reading from SerialConnection UDP: " + e; + System.err.println(lastError); + if (!isClosed) { + e.printStackTrace(); + closeConnection(); + } + } + } + }, "UDP thread"); + isOpen = true; + serialOpened(); + readInput.start(); + + } catch (Exception e) { + lastError = "Failed to open UDP server at port " + port + ": " + e; + System.err.println(lastError); + e.printStackTrace(); + closeConnection(); + } + } + + @Override + protected void doClose() { + if (serverSocket != null) { + serverSocket.close(); + serverSocket = null; + } + } + +}