[proxy] try to contact again nodes when they go offline

This commit is contained in:
giomba 2019-12-15 17:48:47 +01:00
parent 70fdffda98
commit 18bc5a48a5
4 changed files with 64 additions and 34 deletions

View File

@ -2,7 +2,6 @@ package netpp;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.net.URI;
import java.util.Date;
import javax.json.Json;
@ -15,19 +14,20 @@ import org.eclipse.californium.core.CoapResponse;
public class Handler implements CoapHandler {
private URI uri;
private Resource resource;
private Node node;
public Handler(URI uri, Resource resource) {
this.uri = uri;
this.resource = resource;
System.err.println("[D] new handler for " + this.uri);
public Handler(Node node) {
this.node = node;
node.setStatus(Status.WAIT);
System.err.println("[D] new handler for " + this.node.getURI());
}
@Override
public void onLoad(CoapResponse response) {
String content = response.getResponseText();
System.out.println("[D] from " + this.uri + " update received at " + new Date() + " > " + content);
System.out.println("[D] from " + this.node.getURI() + " update received at " + new Date() + " > " + content);
this.node.setStatus(Status.ONLINE);
JsonArray jsonSenML = null;
try {
@ -41,8 +41,8 @@ public class Handler implements CoapHandler {
String res_name = res.getString("n"); // name of resource
int res_value = res.getJsonNumber("v").intValue(); // value of resource
resource.setName(res_name);
resource.setValue(res_value);
this.node.getResource().setName(res_name);
this.node.getResource().setValue(res_value);
} catch (Exception ex) {
ex.printStackTrace();
System.err.println("[E] " + ex);
@ -51,7 +51,8 @@ public class Handler implements CoapHandler {
@Override
public void onError() {
System.err.println("[E] failed " + uri);
node.setStatus(Status.OFFLINE);
System.err.println("[E] failed " + this.node.getURI());
}
}

View File

@ -25,6 +25,11 @@ public class Main {
final String prefix = args[0];
final int n = Integer.parseInt(args[1]);
/* run server */
CoapServer server = new CoapServer();
server.start();
System.err.println("[D] server started");
/* subscribe to every node specified */
System.err.println("[I] now subscribing to node [2; " + n + "] in " + prefix + "/64");
@ -33,27 +38,40 @@ public class Main {
for (int i = 2; i <= n; i++) { // node 1 is the gateway, skip. And mind the <=
String uri_string = "coap://[" + prefix + ":" + COOJA_MAGIC + "::" + Integer.toString(i, 16) + "]" + resource;
System.err.println("[I] subscribing to " + uri_string);
nodeList.add(new Node(i, uri_string));
}
/* run server */
CoapServer server = new CoapServer();
for (Node node : nodeList) {
Node node = new Node(i, uri_string);
nodeList.add(node);
server.add(node.getResource());
}
server.start();
System.err.println("[D] server started");
/* thread sleep */
try {
Thread.sleep(5 * 60 * 1000); // 5 min
} catch (InterruptedException ex) {
System.err.println(ex);
}
/* shutting down everything */
for (Node node : nodeList) {
node.finalize();
/* periodically check for offline nodes */
while (true) {
System.err.println("[D] check for offline nodes...");
Node offline_node = null;
for (Node node : nodeList) {
if (node.getStatus() == Status.OFFLINE) {
System.err.println("[I] detected offline node");
offline_node = node;
break;
}
}
if (offline_node != null) {
System.err.println("[I] tryng again to contact " + offline_node.getURI());
nodeList.remove(offline_node);
server.remove(offline_node.getResource());
Node new_node = new Node(0, offline_node.getURI().toString());
nodeList.add(new_node);
server.add(new_node.getResource());
}
/* thread sleep */
try {
Thread.sleep(5 * 1000); // 5 sec
} catch (InterruptedException ex) {
System.err.println(ex);
}
}
}

View File

@ -5,7 +5,8 @@ import java.net.URISyntaxException;
import org.eclipse.californium.core.CoapClient;
import org.eclipse.californium.core.CoapObserveRelation;
import org.eclipse.californium.core.CoapResource;
enum Status { OFFLINE, WAIT, ONLINE };
public class Node {
private URI uri;
@ -14,6 +15,7 @@ public class Node {
private CoapObserveRelation relation;
private Handler handler;
Resource resource;
Status status = Status.OFFLINE;
public Node(int quickname, String uriString) {
try {
@ -21,7 +23,7 @@ public class Node {
this.client = new CoapClient(uri);
this.quickname = quickname;
this.resource = new Resource(this.quickname); /* this name will be overwritten when an update is received */
this.handler = new Handler(this.uri, resource);
this.handler = new Handler(this);
this.relation = client.observe(handler);
} catch (URISyntaxException e) {
System.err.println("[F] Invalid URI: " + e.getMessage());
@ -29,10 +31,20 @@ public class Node {
}
}
CoapResource getResource() {
Resource getResource() {
return this.resource;
}
URI getURI() {
return this.uri;
}
Status getStatus() {
return this.status;
}
void setStatus(Status status) {
this.status = status;
}
/* be kind with the poor resource constrained node */
@Override
public void finalize() {

View File

@ -15,12 +15,11 @@ public class Resource extends CoapResource {
public Resource(int quickname) {
super(Integer.toString(quickname, 16));
// setObservable(true); // TODO -- do we need to make this observable?
System.err.println("[D] resource created: " + super.getName());
}
public void handleGET(CoapExchange exchange) {
// TODO build the proper JSON object
/* an RFC8428 (SenML) compliant JSON */
JsonArray senml = Json.createArrayBuilder()
.add(
Json.createObjectBuilder()