diff --git a/ping/admin.py b/ping/admin.py index 8a9827390482d2b4ce6e8bde7dd5195cf7917802..ced47caaca8a68a6796f3af79cf6979fcb8eee5d 100644 --- a/ping/admin.py +++ b/ping/admin.py @@ -8,4 +8,5 @@ admin.site.register(Experiment) admin.site.register(Metrics) admin.site.register(CurrentExperiment) admin.site.register(Network) -admin.site.register(Link) \ No newline at end of file +admin.site.register(Link) +admin.site.register(Node) \ No newline at end of file diff --git a/ping/models.py b/ping/models.py index abec77261bd3d873244e04c60d66d710140c4754..39863365bec1e58b316e14f0202539f8bc65399e 100644 --- a/ping/models.py +++ b/ping/models.py @@ -62,6 +62,8 @@ class CurrentExperiment(models.Model): scheduling = models.CharField(default="sync", max_length=10) com_graph = models.BooleanField(default=False) + com_fun = models.CharField(default="linear", max_length=64) + com_refresh = models.PositiveIntegerField(default=1) class Network(models.Model): @@ -73,7 +75,13 @@ class Network(models.Model): path_to_iotamak = models.CharField(max_length=60) + class Link(models.Model): id1 = models.PositiveIntegerField(default=0) id2 = models.PositiveIntegerField(default=0) - value = models.PositiveIntegerField(default=1) \ No newline at end of file + value = models.PositiveIntegerField(default=1) + + +class Node(models.Model): + name = models.CharField(max_length=60) + group = models.PositiveIntegerField(default=0) diff --git a/ping/templates/ping/play.html b/ping/templates/ping/play.html index 294e493af869af4e1ebdfcd1c18d9d735ede7e79..83f08bff42607614846fe96aa4cac99fb5c8bbfc 100644 --- a/ping/templates/ping/play.html +++ b/ping/templates/ping/play.html @@ -169,7 +169,7 @@ const myChart = new Chart(document.getElementById("line-chart"), { {% endif %} -<svg width="960" height="600"></svg> +<svg width="500" height="500" style="border:1px solid #000000;"></svg> <script> var graph = { @@ -182,34 +182,22 @@ var graph = { "links": [] }; - - - var svg = d3.select("svg"), width = +svg.attr("width"), height = +svg.attr("height"); -var color = d3.scaleOrdinal(d3.schemeCategory20); +var color = d3.schemeCategory10; var simulation = d3.forceSimulation() .force("link", d3.forceLink().id(function(d) { return d.id; })) .force("charge", d3.forceManyBody().strength(-2500)) .force("center", d3.forceCenter(width / 2, height / 2)); - var link = svg.append("g").attr("class", "links").selectAll("line") - .data(graph.links).enter().append("line") + var link = svg.append("g").attr("class", "links").selectAll("line").data(graph.links).enter().append("line") .attr("stroke-width", function(d) { return Math.sqrt(d.value); }); - var node = svg.append("g") - .attr("class", "nodes") - .selectAll("g") - .data(graph.nodes) - .enter().append("g") - - var circles = node.append("circle") - .attr("r", 20) - .attr("fill", function(d) { return color(d.group); }); - + var node = svg.append("g").attr("class", "nodes").selectAll("g").data(graph.nodes).enter().append("g") + var circles = node.append("circle").attr("r", 20).attr("fill", function(d) { return color[d.group]; }); var lables = node.append("text").text(function(d) {return d.id;}).attr('x', 16).attr('y', 13); node.append("title").text(function(d) { return d.id; }); @@ -239,8 +227,19 @@ const comSocket = new WebSocket( comSocket.onmessage = function (e) { graph = JSON.parse(e.data).message; console.log(graph); + console.log(typeof graph); - //simulation.nodes(graph.nodes); + svg.selectAll("*").remove(); + link = svg.append("g").attr("class", "links").selectAll("line").data(graph.links).enter().append("line") + .attr("stroke-width", function(d) { return Math.sqrt(d.value); }); + + node = svg.append("g").attr("class", "nodes").selectAll("g").data(graph.nodes).enter().append("g") + circles = node.append("circle").attr("r", 20).attr("fill", function(d) { return color[d.group]; }); + lables = node.append("text").text(function(d) {return d.id;}).attr('x', 16).attr('y', 13); + + node.append("title").text(function(d) { return d.id; }); + + simulation.nodes(graph.nodes).on("tick", ticked); simulation.force("link").links(graph.links); simulation.alpha(1).restart(); }; diff --git a/ping/views/play.py b/ping/views/play.py index 4018f9bdaa5e6c65dcd5f5490860e3803b4628b6..4b9270f643a802e492cea85067b9c01fb6ea333d 100644 --- a/ping/views/play.py +++ b/ping/views/play.py @@ -17,7 +17,7 @@ from iotAmak.tool.ssh_client import Cmd from paho.mqtt.client import Client as MQTTClient from .tool import delete_folder, get_ssh_client, canvas_event_triger, graph_event_triger, com_event_triger -from ..models import Experiment, CurrentExperiment, Metrics, Network, Link +from ..models import Experiment, CurrentExperiment, Metrics, Network, Link, Node client = MQTTClient(client_id="django-ihm") @@ -42,7 +42,8 @@ def agent_message(client, userdata, message) -> None: id1, id2 = id2, id1 link = Link.objects.filter(id1=id1, id2=id2)[0] - link.value += 1 + if link.value < 30: + link.value += 1 link.save() @@ -69,37 +70,54 @@ def agent_metric(client, userdata, message) -> None: graph_event_triger([data, exp.cycle]) +def evaporation(): + links = Link.objects.all() + + for link in links: + link.value -= 1 + if link.value <= 0: + link.value = 0 + link.save() + + def cycle_done(client, userdata, message) -> None: cur_exp = CurrentExperiment.objects.all()[0] cur_exp.cycle += 1 cur_exp.save() - data = { - "nodes": [ - {"id": "Agent_0", "group": 1}, - {"id": "Agent_1", "group": 2}, - {"id": "Agent_2", "group": 1}, - {"id": "Agent_3", "group": 3} - ], - "links": [ - { - "source": "Agent_"+str(elem.id1), - "target": "Agent_"+str(elem.id2), - "value": elem.value + if cur_exp.com_graph: + if cur_exp.cycle % cur_exp.com_refresh == 0: + for _ in range(cur_exp.com_refresh): + evaporation() + + data = { + "nodes": [ + {"id": node.name, "group": node.group} + for node in Node.objects.all() + ], + "links": [ + { + "source": "Agent_" + str(elem.id1), + "target": "Agent_" + str(elem.id2), + "value": elem.value + } + for elem in Link.objects.all() + ] } - for elem in Link.objects.all() - ] - } - com_event_triger(str(data)) + com_event_triger(data) def update_nbr_agent(client, userdata, message) -> None: + results = literal_eval(message.payload.decode("utf-8")) exp = CurrentExperiment.objects.all()[0] - subscribe(client, "agent/" + str(exp.nbr_agent) + "/log", agent_log) + + subscribe(client, "agent/" + str(results.get("id")) + "/log", agent_log) if exp.com_graph: - subscribe(client, "agent/" + str(exp.nbr_agent) + "/mail", agent_message) + subscribe(client, "agent/" + str(results.get("id")) + "/mail", agent_message) + node = Node(name="Agent_"+str(results.get("id")), group=results.get("ip")) + node.save() for i in range(exp.nbr_agent): - link = Link(id1=i, id2=exp.nbr_agent) + link = Link(id1=i, id2=results.get("id")) link.save() exp.nbr_agent += 1 exp.save() @@ -131,7 +149,10 @@ def experiment_load(request): if "com_graph" in config: cur_exp.com_graph = True + cur_exp.com_fun = config.get("com_graph").get("fun") + cur_exp.com_refresh = config.get("com_graph").get("refresh") Link.objects.all().delete() + Node.objects.all().delete() cur_exp.scheduling = config.get("scheduling_type") @@ -300,9 +321,9 @@ def experiment_share(request): def experiment_stop(request): - get_nohup() client.publish("ihm/exit") client.publish("ihm/step") + get_nohup() return HttpResponseRedirect(reverse('ping:play'))