From 5e12c368f5ed5fbf5d91cfcfbe25229e1630d5a2 Mon Sep 17 00:00:00 2001 From: holgerlembke Date: Mon, 21 Nov 2016 20:01:26 +0100 Subject: [PATCH 01/14] Create UdpRunnable.java --- .../cc/arduino/packages/discoverers/simpleudp/UdpRunnable.java | 1 + 1 file changed, 1 insertion(+) create mode 100644 arduino-core/src/cc/arduino/packages/discoverers/simpleudp/UdpRunnable.java diff --git a/arduino-core/src/cc/arduino/packages/discoverers/simpleudp/UdpRunnable.java b/arduino-core/src/cc/arduino/packages/discoverers/simpleudp/UdpRunnable.java new file mode 100644 index 00000000000..830bc9c3a83 --- /dev/null +++ b/arduino-core/src/cc/arduino/packages/discoverers/simpleudp/UdpRunnable.java @@ -0,0 +1 @@ +gf From 8c72d288996685245582a3006417f7b4b91726d9 Mon Sep 17 00:00:00 2001 From: holgerlembke Date: Mon, 21 Nov 2016 20:01:36 +0100 Subject: [PATCH 02/14] Add files via upload --- .../discoverers/simpleudp/UdpRunnable.java | 169 +++++++++++++++++- 1 file changed, 168 insertions(+), 1 deletion(-) diff --git a/arduino-core/src/cc/arduino/packages/discoverers/simpleudp/UdpRunnable.java b/arduino-core/src/cc/arduino/packages/discoverers/simpleudp/UdpRunnable.java index 830bc9c3a83..925c058d4b0 100644 --- a/arduino-core/src/cc/arduino/packages/discoverers/simpleudp/UdpRunnable.java +++ b/arduino-core/src/cc/arduino/packages/discoverers/simpleudp/UdpRunnable.java @@ -1 +1,168 @@ -gf +/* +* This file is part of Arduino. +* +* Arduino is free software; you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation; either version 2 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software +* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +* +* As a special exception, you may use this file as part of a free software +* library without restriction. Specifically, if other files instantiate +* templates or use macros or inline functions from this file, or you compile +* this file and link it with other files to produce an executable, this +* file does not by itself cause the resulting executable to be covered by +* the GNU General Public License. This exception does not however +* invalidate any other reasons why the executable file might be covered by +* the GNU General Public License. +* +* Copyright 2013 Arduino LLC (http://www.arduino.cc/) +*/ + +package cc.arduino.packages.discoverers.simpleudp; + +import cc.arduino.packages.BoardPort; +import processing.app.BaseNoGui; +import processing.app.Platform; +import processing.app.debug.TargetBoard; + +import java.net.DatagramSocket; +import java.net.DatagramPacket; +import java.net.InetAddress; +import java.net.UnknownHostException; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Collections; + + +import java.util.*; + + + +public class UdpRunnable implements Runnable { + + private boolean running = true; + // local, thread save list + public final List udpBoardPorts = Collections.synchronizedList(new LinkedList<>()); + + private int hasip(String ip) { + int i = 0; + for (BoardPort port : udpBoardPorts) { + if (port.getAddress().equals(ip)) { + return i; + } + i++; + } + + return -1; + } + + public void run(){ + System.out.println("MyRunnable running"); + + while (running) + { + try + { + DatagramSocket socket = new DatagramSocket(8531, InetAddress.getByName("0.0.0.0")); + socket.setBroadcast(true); + System.out.println("Listen on " + socket.getLocalAddress() + " from " + socket.getInetAddress() + " port " + socket.getBroadcast()); + byte[] buf = new byte[512]; + DatagramPacket packet = new DatagramPacket(buf, buf.length); + while (true) { + System.out.println("Waiting for data"); + socket.receive(packet); + System.out.print(packet.getLength()); + System.out.print(" Data received from "); + + String board = null; + InetAddress senderip = packet.getAddress(); + System.out.println(senderip); + + String msg = new String(packet.getData()); + String[] lines = msg.split("\\n"); + + System.out.println(""); + + System.out.print(">>>"); + System.out.print(lines[0]); + System.out.println("<<<<"); + + // msg typ 1 + if (lines[0].equals("1")) { + if (hasip(senderip.toString())==-1) { + BoardPort port = new BoardPort(); + + port.setAddress(senderip.toString()); + port.setProtocol("network"); + port.setOnlineStatus(true); + port.setLabel(lines[1]+" at "+senderip.toString()); + + udpBoardPorts.add(port); + } + } + } + + } + catch (UnknownHostException e) { + e.printStackTrace(); + } + catch ( Exception e ) + { + running=false; + } + } + + } + + public void terminate() + { + running = false; + } + + +} + +/* + even more simple device discovery protocol + + send a broadcase to port 8531 + + message format + + 1\Ndisplayname\N + + 1 - id of this message type + future protocols can choose different numbers to implement more details + + + Use Collections.synchronizedList(). + + +*/ + + + + + + + + + + + + + + + + From 6af1bb84caed34cf41bfb30604f994fc67451892 Mon Sep 17 00:00:00 2001 From: holgerlembke Date: Mon, 21 Nov 2016 20:02:18 +0100 Subject: [PATCH 03/14] Add files via upload --- .../discoverers/SimpleUDPDiscovery.java | 108 ++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100644 arduino-core/src/cc/arduino/packages/discoverers/SimpleUDPDiscovery.java diff --git a/arduino-core/src/cc/arduino/packages/discoverers/SimpleUDPDiscovery.java b/arduino-core/src/cc/arduino/packages/discoverers/SimpleUDPDiscovery.java new file mode 100644 index 00000000000..a0407ce6a2f --- /dev/null +++ b/arduino-core/src/cc/arduino/packages/discoverers/SimpleUDPDiscovery.java @@ -0,0 +1,108 @@ +/* + * This file is part of Arduino. + * + * Arduino is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + * As a special exception, you may use this file as part of a free software + * library without restriction. Specifically, if other files instantiate + * templates or use macros or inline functions from this file, or you compile + * this file and link it with other files to produce an executable, this + * file does not by itself cause the resulting executable to be covered by + * the GNU General Public License. This exception does not however + * invalidate any other reasons why the executable file might be covered by + * the GNU General Public License. + * + * Copyright 2013 Arduino LLC (http://www.arduino.cc/) + */ + +package cc.arduino.packages.discoverers; + +import cc.arduino.packages.BoardPort; +import cc.arduino.packages.Discovery; +import cc.arduino.packages.discoverers.simpleudp.UdpRunnable; + +import java.util.LinkedList; +import java.util.List; +import java.util.Timer; + +public class SimpleUDPDiscovery implements Discovery { + + private Timer udpBoardsListerTimer; + private final List udpBoardPorts; + private Thread thread; + private UdpRunnable runner; + //private SerialBoardsLister serialBoardsLister = new SerialBoardsLister((SerialBoardsLister)this); + + public SimpleUDPDiscovery() { + this.udpBoardPorts = new LinkedList<>(); + } + + @Override + public List listDiscoveredBoards() { + return getudpBoardPorts(false); + } + + @Override + public List listDiscoveredBoards(boolean complete) { + return getudpBoardPorts(complete); + } + + private List getudpBoardPorts(boolean complete) { + if (complete) { + return new LinkedList<>(udpBoardPorts); + } + List onlineBoardPorts = new LinkedList<>(); + for (BoardPort port : runner.udpBoardPorts) { + if (port.isOnline() == true) { + onlineBoardPorts.add(port); + } + } + return onlineBoardPorts; + } + + public void setudpBoardPorts(List newudpBoardPorts) { + udpBoardPorts.clear(); + udpBoardPorts.addAll(newudpBoardPorts); + } + + public void forceRefresh() { + runner.udpBoardPorts.clear(); + } + + public void setUploadInProgress(boolean param) { + //serialBoardsLister.uploadInProgress = param; + } + + public void pausePolling(boolean param) { + //serialBoardsLister.pausePolling = param; + } + + @Override + public void start() { +//System.out.println("SimpleUDPDiscovery.start!!!"); + + runner = new UdpRunnable(); + thread = new Thread(runner); + thread.start(); + + forceRefresh(); + } + + @Override + public void stop() { + runner.terminate(); + } +} + From 62b9721b1e17d05dbadaf6a44f9d30c69ece9d3a Mon Sep 17 00:00:00 2001 From: holgerlembke Date: Mon, 21 Nov 2016 20:02:55 +0100 Subject: [PATCH 04/14] Add files via upload --- arduino-core/src/cc/arduino/packages/DiscoveryManager.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/arduino-core/src/cc/arduino/packages/DiscoveryManager.java b/arduino-core/src/cc/arduino/packages/DiscoveryManager.java index 01259e8e052..67128ad7569 100644 --- a/arduino-core/src/cc/arduino/packages/DiscoveryManager.java +++ b/arduino-core/src/cc/arduino/packages/DiscoveryManager.java @@ -31,6 +31,7 @@ import cc.arduino.packages.discoverers.NetworkDiscovery; import cc.arduino.packages.discoverers.SerialDiscovery; +import cc.arduino.packages.discoverers.SimpleUDPDiscovery; import java.util.ArrayList; import java.util.List; @@ -42,11 +43,13 @@ public class DiscoveryManager { private final List discoverers; private final SerialDiscovery serialDiscoverer = new SerialDiscovery(); private final NetworkDiscovery networkDiscoverer = new NetworkDiscovery(); + private final SimpleUDPDiscovery udpworkDiscoverer = new SimpleUDPDiscovery(); public DiscoveryManager() { discoverers = new ArrayList<>(); discoverers.add(serialDiscoverer); discoverers.add(networkDiscoverer); + discoverers.add(udpworkDiscoverer); // Start all discoverers for (Discovery d : discoverers) { From 3eb29bc41924a825c61e03baa5c4ad661bcd31c3 Mon Sep 17 00:00:00 2001 From: holgerlembke Date: Mon, 21 Nov 2016 21:48:33 +0100 Subject: [PATCH 05/14] Add files via upload --- .../packages/discoverers/simpleudp/UdpRunnable.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/arduino-core/src/cc/arduino/packages/discoverers/simpleudp/UdpRunnable.java b/arduino-core/src/cc/arduino/packages/discoverers/simpleudp/UdpRunnable.java index 925c058d4b0..feedcd9e543 100644 --- a/arduino-core/src/cc/arduino/packages/discoverers/simpleudp/UdpRunnable.java +++ b/arduino-core/src/cc/arduino/packages/discoverers/simpleudp/UdpRunnable.java @@ -100,10 +100,11 @@ public void run(){ // msg typ 1 if (lines[0].equals("1")) { - if (hasip(senderip.toString())==-1) { + int portexists = hasip(senderip.toString().substring(1)); + if (portexists==-1) { BoardPort port = new BoardPort(); - port.setAddress(senderip.toString()); + port.setAddress(senderip.toString().substring(1)); port.setProtocol("network"); port.setOnlineStatus(true); port.setLabel(lines[1]+" at "+senderip.toString()); @@ -144,9 +145,8 @@ public void terminate() 1 - id of this message type future protocols can choose different numbers to implement more details - - Use Collections.synchronizedList(). + BoardPort needs lastseen-time-thing for removing not anymore pinging boards. */ From 6c32970437fe11a476d1d330eed412b563206df5 Mon Sep 17 00:00:00 2001 From: holgerlembke Date: Tue, 22 Nov 2016 13:34:07 +0100 Subject: [PATCH 06/14] Add files via upload --- arduino-core/src/cc/arduino/packages/BoardPort.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/arduino-core/src/cc/arduino/packages/BoardPort.java b/arduino-core/src/cc/arduino/packages/BoardPort.java index 0e85ffe135d..ef1788df73c 100644 --- a/arduino-core/src/cc/arduino/packages/BoardPort.java +++ b/arduino-core/src/cc/arduino/packages/BoardPort.java @@ -42,6 +42,7 @@ public class BoardPort { private String label; private final PreferencesMap prefs; private boolean online; + private long lastseen; public BoardPort() { this.prefs = new PreferencesMap(); @@ -115,4 +116,14 @@ public String getISerial() { public String toString() { return this.address+"_"+this.vid+"_"+this.pid; } + + + public void setLastseen(long lastseen) { + this.lastseen = lastseen; + } + + public long getLastseen() { + return lastseen; + } + } From c33e1a0b8c760509d44ae9d081dc1aeef06d14d7 Mon Sep 17 00:00:00 2001 From: holgerlembke Date: Tue, 22 Nov 2016 13:34:34 +0100 Subject: [PATCH 07/14] Add files via upload --- .../discoverers/SimpleUDPDiscovery.java | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/arduino-core/src/cc/arduino/packages/discoverers/SimpleUDPDiscovery.java b/arduino-core/src/cc/arduino/packages/discoverers/SimpleUDPDiscovery.java index a0407ce6a2f..3894612bfa8 100644 --- a/arduino-core/src/cc/arduino/packages/discoverers/SimpleUDPDiscovery.java +++ b/arduino-core/src/cc/arduino/packages/discoverers/SimpleUDPDiscovery.java @@ -30,6 +30,7 @@ package cc.arduino.packages.discoverers; import cc.arduino.packages.BoardPort; +import processing.app.BaseNoGui; import cc.arduino.packages.Discovery; import cc.arduino.packages.discoverers.simpleudp.UdpRunnable; @@ -60,6 +61,9 @@ public List listDiscoveredBoards(boolean complete) { } private List getudpBoardPorts(boolean complete) { + + zapLongNotSeen(); + if (complete) { return new LinkedList<>(udpBoardPorts); } @@ -77,8 +81,17 @@ public void setudpBoardPorts(List newudpBoardPorts) { udpBoardPorts.addAll(newudpBoardPorts); } - public void forceRefresh() { - runner.udpBoardPorts.clear(); + public void zapLongNotSeen() { + long jetzt = System.currentTimeMillis(); + long alt = jetzt - 60000; // 60 sekunden nicht gesehen? Alt + + List timeouts = new LinkedList<>(); + for (BoardPort port : runner.udpBoardPorts) { + if (port.getLastseen() < alt) { + timeouts.add(port); + } + } + udpBoardPorts.removeAll(timeouts); } public void setUploadInProgress(boolean param) { @@ -96,8 +109,6 @@ public void start() { runner = new UdpRunnable(); thread = new Thread(runner); thread.start(); - - forceRefresh(); } @Override From a81ef2a06e19bdbed8a5a7616552a35df24b3353 Mon Sep 17 00:00:00 2001 From: holgerlembke Date: Tue, 22 Nov 2016 13:34:51 +0100 Subject: [PATCH 08/14] Add files via upload --- .../discoverers/simpleudp/UdpRunnable.java | 65 +++++++++---------- 1 file changed, 32 insertions(+), 33 deletions(-) diff --git a/arduino-core/src/cc/arduino/packages/discoverers/simpleudp/UdpRunnable.java b/arduino-core/src/cc/arduino/packages/discoverers/simpleudp/UdpRunnable.java index feedcd9e543..3b5f8463b30 100644 --- a/arduino-core/src/cc/arduino/packages/discoverers/simpleudp/UdpRunnable.java +++ b/arduino-core/src/cc/arduino/packages/discoverers/simpleudp/UdpRunnable.java @@ -68,7 +68,7 @@ private int hasip(String ip) { } public void run(){ - System.out.println("MyRunnable running"); +//System.out.println("MyRunnable running"); while (running) { @@ -76,44 +76,63 @@ public void run(){ { DatagramSocket socket = new DatagramSocket(8531, InetAddress.getByName("0.0.0.0")); socket.setBroadcast(true); - System.out.println("Listen on " + socket.getLocalAddress() + " from " + socket.getInetAddress() + " port " + socket.getBroadcast()); +//System.out.println("Listen on " + socket.getLocalAddress() + " from " + socket.getInetAddress() + " port " + socket.getBroadcast()); byte[] buf = new byte[512]; DatagramPacket packet = new DatagramPacket(buf, buf.length); while (true) { - System.out.println("Waiting for data"); +//System.out.println("Waiting for data"); socket.receive(packet); - System.out.print(packet.getLength()); - System.out.print(" Data received from "); +//System.out.print(packet.getLength()); +//System.out.print(" Data received from "); String board = null; InetAddress senderip = packet.getAddress(); - System.out.println(senderip); +//System.out.println(senderip); String msg = new String(packet.getData()); String[] lines = msg.split("\\n"); - System.out.println(""); +//System.out.println(""); - System.out.print(">>>"); - System.out.print(lines[0]); - System.out.println("<<<<"); +//System.out.print(">>>"); +//System.out.print(lines[0]); +//System.out.println("<<<<"); // msg typ 1 if (lines[0].equals("1")) { + // check the IP has an entry, if not, create new one int portexists = hasip(senderip.toString().substring(1)); - if (portexists==-1) { + if (portexists == -1) { + // new port BoardPort port = new BoardPort(); port.setAddress(senderip.toString().substring(1)); port.setProtocol("network"); port.setOnlineStatus(true); - port.setLabel(lines[1]+" at "+senderip.toString()); + port.setLabel(lines[1]+" at "+senderip.toString().substring(1)); + port.setLastseen(System.currentTimeMillis()); + + port.getPrefs().put("port", lines[2]); +/* + ServiceInfo info = serviceEvent.getInfo(); + if (info.hasData()) { + port.getPrefs().put("distro_version", info.getPropertyString("distro_version")); + } +*/ + + port.getPrefs().put("board", board); + port.getPrefs().put("ssh_upload", "no"); + port.getPrefs().put("tcp_check", "no"); + port.getPrefs().put("auth_upload", "no"); udpBoardPorts.add(port); + } else { + // only update + BoardPort port = udpBoardPorts.get(portexists); + port.setLastseen(System.currentTimeMillis()); } } } - } catch (UnknownHostException e) { e.printStackTrace(); @@ -123,7 +142,6 @@ public void run(){ running=false; } } - } public void terminate() @@ -145,24 +163,5 @@ public void terminate() 1 - id of this message type future protocols can choose different numbers to implement more details - - BoardPort needs lastseen-time-thing for removing not anymore pinging boards. - */ - - - - - - - - - - - - - - - - From ec6a5737d41569b048b33af80c01de322c866255 Mon Sep 17 00:00:00 2001 From: holgerlembke Date: Tue, 22 Nov 2016 18:33:14 +0100 Subject: [PATCH 09/14] Add files via upload --- .../discoverers/simpleudp/UdpRunnable.java | 44 +++++++------------ 1 file changed, 17 insertions(+), 27 deletions(-) diff --git a/arduino-core/src/cc/arduino/packages/discoverers/simpleudp/UdpRunnable.java b/arduino-core/src/cc/arduino/packages/discoverers/simpleudp/UdpRunnable.java index 3b5f8463b30..6290bd5c56e 100644 --- a/arduino-core/src/cc/arduino/packages/discoverers/simpleudp/UdpRunnable.java +++ b/arduino-core/src/cc/arduino/packages/discoverers/simpleudp/UdpRunnable.java @@ -85,7 +85,6 @@ public void run(){ //System.out.print(packet.getLength()); //System.out.print(" Data received from "); - String board = null; InetAddress senderip = packet.getAddress(); //System.out.println(senderip); @@ -100,37 +99,28 @@ public void run(){ // msg typ 1 if (lines[0].equals("1")) { - // check the IP has an entry, if not, create new one + // check the IP has an entry, if not, create new one, else use exsting one + BoardPort port; int portexists = hasip(senderip.toString().substring(1)); if (portexists == -1) { // new port - BoardPort port = new BoardPort(); - - port.setAddress(senderip.toString().substring(1)); - port.setProtocol("network"); - port.setOnlineStatus(true); - port.setLabel(lines[1]+" at "+senderip.toString().substring(1)); - port.setLastseen(System.currentTimeMillis()); - - port.getPrefs().put("port", lines[2]); -/* - ServiceInfo info = serviceEvent.getInfo(); - if (info.hasData()) { - port.getPrefs().put("distro_version", info.getPropertyString("distro_version")); - } -*/ - - port.getPrefs().put("board", board); - port.getPrefs().put("ssh_upload", "no"); - port.getPrefs().put("tcp_check", "no"); - port.getPrefs().put("auth_upload", "no"); - + port = new BoardPort(); udpBoardPorts.add(port); } else { - // only update - BoardPort port = udpBoardPorts.get(portexists); - port.setLastseen(System.currentTimeMillis()); + port = udpBoardPorts.get(portexists); } + + port.setAddress(senderip.toString().substring(1)); + port.setProtocol("network"); + port.setOnlineStatus(true); + port.setLabel(lines[1]+" at "+senderip.toString().substring(1)); + port.setLastseen(System.currentTimeMillis()); + + port.getPrefs().put("port", lines[2]); + port.getPrefs().put("board", ""); + port.getPrefs().put("ssh_upload", "no"); + port.getPrefs().put("tcp_check", "no"); + port.getPrefs().put("auth_upload", "no"); } } } @@ -159,7 +149,7 @@ public void terminate() message format - 1\Ndisplayname\N + 1\Ndisplayname\Nuploadport\N 1 - id of this message type future protocols can choose different numbers to implement more details From 2de5af3e983c86821e3ae4b6ae06651ca667ac90 Mon Sep 17 00:00:00 2001 From: holgerlembke Date: Tue, 22 Nov 2016 18:34:36 +0100 Subject: [PATCH 10/14] Add files via upload --- .../discoverers/simpleudp/UdpRunnable.java | 66 +++++++++---------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/arduino-core/src/cc/arduino/packages/discoverers/simpleudp/UdpRunnable.java b/arduino-core/src/cc/arduino/packages/discoverers/simpleudp/UdpRunnable.java index 6290bd5c56e..e6b8c66e2cf 100644 --- a/arduino-core/src/cc/arduino/packages/discoverers/simpleudp/UdpRunnable.java +++ b/arduino-core/src/cc/arduino/packages/discoverers/simpleudp/UdpRunnable.java @@ -44,7 +44,7 @@ import java.util.List; import java.util.Collections; - + import java.util.*; @@ -53,22 +53,22 @@ public class UdpRunnable implements Runnable { private boolean running = true; // local, thread save list - public final List udpBoardPorts = Collections.synchronizedList(new LinkedList<>()); + public final List udpBoardPorts = Collections.synchronizedList(new LinkedList<>()); private int hasip(String ip) { int i = 0; - for (BoardPort port : udpBoardPorts) { - if (port.getAddress().equals(ip)) { - return i; - } - i++; - } + for (BoardPort port : udpBoardPorts) { + if (port.getAddress().equals(ip)) { + return i; + } + i++; + } return -1; } public void run(){ -//System.out.println("MyRunnable running"); + //System.out.println("MyRunnable running"); while (running) { @@ -76,45 +76,45 @@ public void run(){ { DatagramSocket socket = new DatagramSocket(8531, InetAddress.getByName("0.0.0.0")); socket.setBroadcast(true); -//System.out.println("Listen on " + socket.getLocalAddress() + " from " + socket.getInetAddress() + " port " + socket.getBroadcast()); + //System.out.println("Listen on " + socket.getLocalAddress() + " from " + socket.getInetAddress() + " port " + socket.getBroadcast()); byte[] buf = new byte[512]; DatagramPacket packet = new DatagramPacket(buf, buf.length); while (true) { -//System.out.println("Waiting for data"); + //System.out.println("Waiting for data"); socket.receive(packet); -//System.out.print(packet.getLength()); -//System.out.print(" Data received from "); + //System.out.print(packet.getLength()); + //System.out.print(" Data received from "); InetAddress senderip = packet.getAddress(); -//System.out.println(senderip); + //System.out.println(senderip); String msg = new String(packet.getData()); - String[] lines = msg.split("\\n"); + String[] lines = msg.split("\\n"); -//System.out.println(""); + //System.out.println(""); -//System.out.print(">>>"); -//System.out.print(lines[0]); -//System.out.println("<<<<"); + //System.out.print(">>>"); + //System.out.print(lines[0]); + //System.out.println("<<<<"); // msg typ 1 if (lines[0].equals("1")) { // check the IP has an entry, if not, create new one, else use exsting one - BoardPort port; + BoardPort port; int portexists = hasip(senderip.toString().substring(1)); if (portexists == -1) { - // new port - port = new BoardPort(); - udpBoardPorts.add(port); + // new port + port = new BoardPort(); + udpBoardPorts.add(port); } else { - port = udpBoardPorts.get(portexists); + port = udpBoardPorts.get(portexists); } - port.setAddress(senderip.toString().substring(1)); - port.setProtocol("network"); - port.setOnlineStatus(true); - port.setLabel(lines[1]+" at "+senderip.toString().substring(1)); - port.setLastseen(System.currentTimeMillis()); + port.setAddress(senderip.toString().substring(1)); + port.setProtocol("network"); + port.setOnlineStatus(true); + port.setLabel(lines[1]+" at "+senderip.toString().substring(1)); + port.setLastseen(System.currentTimeMillis()); port.getPrefs().put("port", lines[2]); port.getPrefs().put("board", ""); @@ -124,8 +124,8 @@ public void run(){ } } } - catch (UnknownHostException e) { - e.printStackTrace(); + catch (UnknownHostException e) { + e.printStackTrace(); } catch ( Exception e ) { @@ -143,7 +143,7 @@ public void terminate() } /* - even more simple device discovery protocol + even more simple device discovery protocol send a broadcase to port 8531 @@ -152,6 +152,6 @@ public void terminate() 1\Ndisplayname\Nuploadport\N 1 - id of this message type - future protocols can choose different numbers to implement more details + future protocols can choose different numbers to implement more details */ From de9650e5dc78413ecee31008ce15e60815d01388 Mon Sep 17 00:00:00 2001 From: holgerlembke Date: Tue, 22 Nov 2016 22:28:16 +0100 Subject: [PATCH 11/14] Add files via upload --- .../discoverers/simpleudp/UdpRunnable.java | 40 +++++++++++++++---- 1 file changed, 32 insertions(+), 8 deletions(-) diff --git a/arduino-core/src/cc/arduino/packages/discoverers/simpleudp/UdpRunnable.java b/arduino-core/src/cc/arduino/packages/discoverers/simpleudp/UdpRunnable.java index e6b8c66e2cf..9e00c23c27c 100644 --- a/arduino-core/src/cc/arduino/packages/discoverers/simpleudp/UdpRunnable.java +++ b/arduino-core/src/cc/arduino/packages/discoverers/simpleudp/UdpRunnable.java @@ -44,7 +44,6 @@ import java.util.List; import java.util.Collections; - import java.util.*; @@ -121,6 +120,19 @@ public void run(){ port.getPrefs().put("ssh_upload", "no"); port.getPrefs().put("tcp_check", "no"); port.getPrefs().put("auth_upload", "no"); + } else + // msg typ 2 + if (lines[0].equals("2")) { + int portexists = hasip(senderip.toString().substring(1)); + if (portexists != -1) { + BoardPort port = udpBoardPorts.get(portexists); + String[] pairs = msg.split("&"); + for (String pair : pairs) + { + String[] params = pair.split(":"); + port.getPrefs().put(params[0],params[1]); + } + } } } } @@ -129,7 +141,7 @@ public void run(){ } catch ( Exception e ) { - running=false; + running = false; } } } @@ -138,8 +150,6 @@ public void terminate() { running = false; } - - } /* @@ -149,9 +159,23 @@ public void terminate() message format - 1\Ndisplayname\Nuploadport\N - - 1 - id of this message type - future protocols can choose different numbers to implement more details + 1\nsomethinginascci. + 1 - simple menu setup + 1\ndisplayname\nuploadport\n + + creates a menu entry "displayname" assigned to the senders ip, sets the upload port to "uploadport" + + 2 - set optional parameters + 2\nA:B&C:D&E:F + can set optional parameters + + Message looks like 2\nA:B&C:D&E:F + + will set + port.getPrefs().put("A", "B"); + port.getPrefs().put("C", "D"); + port.getPrefs().put("F", "F"); + + multiple messages can be send */ From d07b96f45f7349307581fbccff5a4f032a28c03e Mon Sep 17 00:00:00 2001 From: holgerlembke Date: Tue, 22 Nov 2016 23:12:41 +0100 Subject: [PATCH 12/14] Add files via upload --- .../discoverers/simpleudp/UdpRunnable.java | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/arduino-core/src/cc/arduino/packages/discoverers/simpleudp/UdpRunnable.java b/arduino-core/src/cc/arduino/packages/discoverers/simpleudp/UdpRunnable.java index 9e00c23c27c..c4d597a7920 100644 --- a/arduino-core/src/cc/arduino/packages/discoverers/simpleudp/UdpRunnable.java +++ b/arduino-core/src/cc/arduino/packages/discoverers/simpleudp/UdpRunnable.java @@ -155,7 +155,7 @@ public void terminate() /* even more simple device discovery protocol - send a broadcase to port 8531 + send a broadcast to port 8531 message format @@ -166,6 +166,8 @@ public void terminate() creates a menu entry "displayname" assigned to the senders ip, sets the upload port to "uploadport" + if an entry is already attached to that sender ip the data is updated + 2 - set optional parameters 2\nA:B&C:D&E:F can set optional parameters @@ -177,5 +179,17 @@ public void terminate() port.getPrefs().put("C", "D"); port.getPrefs().put("F", "F"); - multiple messages can be send + multiple messages can be send, any number of pairs can be send + + so this is ok + 2\nA:B&C:D&E:F + or + 2\nA:B&C:D + 2\nE:F + or + 2\nA:B + 2\nC:D + 2\nE:F + */ + From 5f4198fcc733c78d54651d0ee9f9ba093ce0664b Mon Sep 17 00:00:00 2001 From: holgerlembke Date: Tue, 22 Nov 2016 23:18:42 +0100 Subject: [PATCH 13/14] Add files via upload --- .../discoverers/simpleudp/UdpRunnable.java | 26 ++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/arduino-core/src/cc/arduino/packages/discoverers/simpleudp/UdpRunnable.java b/arduino-core/src/cc/arduino/packages/discoverers/simpleudp/UdpRunnable.java index c4d597a7920..7061a5b9d90 100644 --- a/arduino-core/src/cc/arduino/packages/discoverers/simpleudp/UdpRunnable.java +++ b/arduino-core/src/cc/arduino/packages/discoverers/simpleudp/UdpRunnable.java @@ -190,6 +190,30 @@ public void terminate() 2\nA:B 2\nC:D 2\nE:F - + + +Basic example: +============== + +call this in loop(): + +void PostMyself(void) { + static unsigned long ticker = 0; + + if (millis() - ticker > 15000) { + IPAddress broadcastIp(WiFi.localIP() | ( ~WiFi.subnetMask())); + + WiFiUDP udp; + udp.begin(8765); + udp.beginPacket(broadcastIp, 8531); + udp.print("1\nesp8266 " + initmsg1 + "\n8266\n"); + udp.endPacket(); + delay(1); + + ticker = millis(); + } +} + + */ From 511b0087929c60da39deaa9ef7d373d4f493a37d Mon Sep 17 00:00:00 2001 From: holgerlembke Date: Wed, 23 Nov 2016 11:04:19 +0100 Subject: [PATCH 14/14] Add files via upload --- .../packages/discoverers/SimpleUDPDiscovery.java | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/arduino-core/src/cc/arduino/packages/discoverers/SimpleUDPDiscovery.java b/arduino-core/src/cc/arduino/packages/discoverers/SimpleUDPDiscovery.java index 3894612bfa8..ff83c4f8537 100644 --- a/arduino-core/src/cc/arduino/packages/discoverers/SimpleUDPDiscovery.java +++ b/arduino-core/src/cc/arduino/packages/discoverers/SimpleUDPDiscovery.java @@ -41,13 +41,11 @@ public class SimpleUDPDiscovery implements Discovery { private Timer udpBoardsListerTimer; - private final List udpBoardPorts; private Thread thread; private UdpRunnable runner; //private SerialBoardsLister serialBoardsLister = new SerialBoardsLister((SerialBoardsLister)this); public SimpleUDPDiscovery() { - this.udpBoardPorts = new LinkedList<>(); } @Override @@ -65,7 +63,7 @@ private List getudpBoardPorts(boolean complete) { zapLongNotSeen(); if (complete) { - return new LinkedList<>(udpBoardPorts); + return new LinkedList<>(runner.udpBoardPorts); } List onlineBoardPorts = new LinkedList<>(); for (BoardPort port : runner.udpBoardPorts) { @@ -77,11 +75,11 @@ private List getudpBoardPorts(boolean complete) { } public void setudpBoardPorts(List newudpBoardPorts) { - udpBoardPorts.clear(); - udpBoardPorts.addAll(newudpBoardPorts); } public void zapLongNotSeen() { +//System.out.println("zap"); + long jetzt = System.currentTimeMillis(); long alt = jetzt - 60000; // 60 sekunden nicht gesehen? Alt @@ -89,9 +87,10 @@ public void zapLongNotSeen() { for (BoardPort port : runner.udpBoardPorts) { if (port.getLastseen() < alt) { timeouts.add(port); +//System.out.println("Alt!"); } } - udpBoardPorts.removeAll(timeouts); + runner.udpBoardPorts.removeAll(timeouts); } public void setUploadInProgress(boolean param) {