From ae9a65663203641f0309da3804a0e650c215198f Mon Sep 17 00:00:00 2001 From: Simon Duquennoy Date: Sat, 9 Jun 2018 14:38:19 +0200 Subject: [PATCH] Added examples/benchmarks directory, with code for testbed nightly runs --- examples/benchmarks/rpl-req-resp/Makefile | 26 ++ examples/benchmarks/rpl-req-resp/node.c | 156 ++++++++++ examples/benchmarks/rpl-req-resp/parse.py | 269 +++++++++++++++++ .../benchmarks/rpl-req-resp/project-conf.h | 48 +++ examples/benchmarks/rpl-req-resp/sim.csc | 275 ++++++++++++++++++ examples/benchmarks/testbeds/cooja8.c | 14 + examples/benchmarks/testbeds/sics-firefly.c | 31 ++ 7 files changed, 819 insertions(+) create mode 100644 examples/benchmarks/rpl-req-resp/Makefile create mode 100644 examples/benchmarks/rpl-req-resp/node.c create mode 100644 examples/benchmarks/rpl-req-resp/parse.py create mode 100644 examples/benchmarks/rpl-req-resp/project-conf.h create mode 100644 examples/benchmarks/rpl-req-resp/sim.csc create mode 100644 examples/benchmarks/testbeds/cooja8.c create mode 100644 examples/benchmarks/testbeds/sics-firefly.c diff --git a/examples/benchmarks/rpl-req-resp/Makefile b/examples/benchmarks/rpl-req-resp/Makefile new file mode 100644 index 000000000..4be6d431b --- /dev/null +++ b/examples/benchmarks/rpl-req-resp/Makefile @@ -0,0 +1,26 @@ +CONTIKI_PROJECT = node +all: $(CONTIKI_PROJECT) + +MODULES_REL += ../testbeds +MODULES += os/services/deployment +MODULES += os/services/simple-energest + +CONFIG?=CONFIG_TSCH_OPTIMS + +ifeq ($(CONFIG),CONFIG_CSMA) +MAKE_MAC = MAKE_MAC_CSMA +else ifeq ($(CONFIG),CONFIG_TSCH) +MAKE_MAC = MAKE_MAC_TSCH +MODULES += os/services/orchestra +else ifeq ($(CONFIG),CONFIG_TSCH_OPTIMS) +MAKE_MAC = MAKE_MAC_TSCH +MODULES += os/services/orchestra +CFLAGS += -DCONFIG_OPTIMS=1 +else ifeq ($(CONFIG),CONFIG_TSCH_OPTIMS2) +MAKE_MAC = MAKE_MAC_TSCH +MODULES += os/services/orchestra +CFLAGS += -DCONFIG_OPTIMS=2 +endif + +CONTIKI = ../../.. +include $(CONTIKI)/Makefile.include diff --git a/examples/benchmarks/rpl-req-resp/node.c b/examples/benchmarks/rpl-req-resp/node.c new file mode 100644 index 000000000..4b92415f9 --- /dev/null +++ b/examples/benchmarks/rpl-req-resp/node.c @@ -0,0 +1,156 @@ +/* + * Copyright (c) 2018, RISE SICS. + * 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. + * + * This file is part of the Contiki operating system. + * + */ + +/** + * \file + * Benchmark: the root sends requests to all nodes in a randomized + * order, and receives resopnses back. + * \author + * Simon Duquennoy + */ + +#include "contiki.h" +#include "contiki-net.h" +#include "services/deployment/deployment.h" + +/* Log configuration */ +#include "sys/log.h" +#define LOG_MODULE "App" +#define LOG_LEVEL LOG_LEVEL_INFO + +#define UDP_PORT 8214 +#define SEND_INTERVAL (CLOCK_SECOND) + +static struct simple_udp_connection udp_conn; + +/*---------------------------------------------------------------------------*/ +PROCESS(app_process, "App process"); +AUTOSTART_PROCESSES(&app_process); + +/*---------------------------------------------------------------------------*/ +static void +udp_rx_callback(struct simple_udp_connection *c, + const uip_ipaddr_t *sender_addr, + uint16_t sender_port, + const uip_ipaddr_t *receiver_addr, + uint16_t receiver_port, + const uint8_t *data, + uint16_t datalen) +{ + uint32_t count; + int is_response; + /* Copy and parse payload */ + memcpy(&count, data, sizeof(uint32_t)); + /* Most significant bit: request (0) / response (1) */ + is_response = count & 0x80000000; + count &= 0x7fffffff; + + if(is_response) { + LOG_INFO("Received response %"PRIu32" from ", count); + LOG_INFO_6ADDR(sender_addr); + LOG_INFO_("\n"); + } else { + LOG_INFO("Received request %"PRIu32" from ", count); + LOG_INFO_6ADDR(sender_addr); + LOG_INFO_("\n"); + LOG_INFO("Sending response %"PRIu32" to ", count); + LOG_INFO_6ADDR(sender_addr); + LOG_INFO_("\n"); + /* Set most significant bit to signal a response */ + count |= 0x80000000; + simple_udp_sendto(&udp_conn, &count, sizeof(count), sender_addr); + } +} +/*---------------------------------------------------------------------------*/ +PROCESS_THREAD(app_process, ev, data) +{ + static struct etimer timer; + static uip_ipaddr_t dest_ipaddr; + + PROCESS_BEGIN(); + + /* Initialize UDP connection */ + simple_udp_register(&udp_conn, UDP_PORT, NULL, + UDP_PORT, udp_rx_callback); + + if(node_id == ROOT_ID) { + /* Wait 5 seconds before starting */ + etimer_set(&timer, CLOCK_SECOND * 5); + PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&timer)); + + /* We are the root, start a DAG */ + NETSTACK_ROUTING.root_start(); + /* Set dest_ipaddr with DODAG ID, so we get the prefix */ + NETSTACK_ROUTING.get_root_ipaddr(&dest_ipaddr); + /* Setup a periodic timer that expires after 10 seconds. */ + etimer_set(&timer, CLOCK_SECOND * 10); + /* Wait until all nodes have joined */ + do { + PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&timer)); + etimer_reset(&timer); + + if(deployment_node_count() > NETSTACK_MAX_ROUTE_ENTRIES) { + LOG_WARN("Not enough routing entries for deployment: %u/%u\n", + deployment_node_count(), NETSTACK_MAX_ROUTE_ENTRIES); + } + LOG_INFO("Node count: %u/%u\n", uip_sr_num_nodes(), deployment_node_count()); + + } while(uip_sr_num_nodes() < deployment_node_count()); + + /* Now start requesting nodes at random */ + etimer_set(&timer, SEND_INTERVAL); + while(uip_sr_num_nodes() == deployment_node_count()) { + static uint32_t count = 0; + uint16_t dest_id; + + PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&timer)); + etimer_reset(&timer); + + /* Select a destination at random. Iterate until we do not select ourselve */ + do { + dest_id = deployment_id_from_index(random_rand() % deployment_node_count()); + } while(dest_id == ROOT_ID); + /* Prefix was already set, set IID now */ + deployment_iid_from_id(&dest_ipaddr, dest_id); + + /* Request: most significant bit not unset */ + LOG_INFO("Sending request %"PRIu32" to ", count); + LOG_INFO_6ADDR(&dest_ipaddr); + LOG_INFO_("\n"); + simple_udp_sendto(&udp_conn, &count, sizeof(count), &dest_ipaddr); + count++; + } + } + + PROCESS_END(); +} +/*---------------------------------------------------------------------------*/ diff --git a/examples/benchmarks/rpl-req-resp/parse.py b/examples/benchmarks/rpl-req-resp/parse.py new file mode 100644 index 000000000..a15b9c49b --- /dev/null +++ b/examples/benchmarks/rpl-req-resp/parse.py @@ -0,0 +1,269 @@ +#!/usr/bin/env python + +import re +import os +import fileinput +import math +import yaml +import pandas as pd +from pandas import * +from pylab import * +from datetime import * +from collections import OrderedDict +from IPython import embed +import matplotlib as mpl + +pd.set_option('display.max_rows', 48) +pd.set_option('display.width', None) +pd.set_option('display.max_columns', None) + +networkFormationTime = None +parents = {} + +def calculateHops(node): + hops = 0 + while(parents[node] != None): + node = parents[node] + hops += 1 + # safeguard, in case of scrambled logs + if hops > 50: + return hops + return hops + +def calculateChildren(node): + children = 0 + for n in parents.keys(): + if(parents[n] == node): + children += 1 + return children + +def updateTopology(child, parent): + global parents + if not child in parents: + parents[child] = {} + if not parent in parents: + parents[parent] = None + parents[child] = parent + +def parseRPL(log): + res = re.compile('.*? rank (\d*).*?dioint (\d*).*?nbr count (\d*)').match(log) + if res: + rank = int(res.group(1)) + trickle = (2**int(res.group(2)))/(60*1000.) + nbrCount = int(res.group(3)) + return {'event': 'rank', 'rank': rank, 'trickle': trickle } + res = re.compile('parent switch: .*? -> .*?-(\d*)$').match(log) + if res: + parent = int(res.group(1)) + return {'event': 'switch', 'pswitch': parent } + res = re.compile('sending a (.+?) ').match(log) + if res: + message = res.group(1) + return {'event': 'sending', 'message': message } + res = re.compile('links: 6G-(\d+)\s*to 6G-(\d+)').match(log) + if res: + child = int(res.group(1)) + parent = int(res.group(2)) + updateTopology(child, parent) + return None + res = re.compile('links: end of list').match(log) + if res: + # This was the last line, commit full topology + return {'event': 'topology' } + return None + +def parseEnergest(log): + res = re.compile('Radio Tx\s*:\s*(\d*)/\s*(\d+)').match(log) + if res: + tx = float(res.group(1)) + total = float(res.group(2)) + return {'channel-utilization': 100.*tx/total } + res = re.compile('Radio total\s*:\s*(\d*)/\s*(\d+)').match(log) + if res: + radio = float(res.group(1)) + total = float(res.group(2)) + return {'duty-cycle': 100.*radio/total } + return None + +def parseApp(log): + res = re.compile('Sending (.+?) (\d+) to 6G-(\d+)').match(log) + if res: + type = res.group(1) + id = int(res.group(2)) + dest = int(res.group(3)) + return {'event': 'send', 'type': type, 'id': id, 'node': dest } + res = re.compile('Received (.+?) (\d+) from 6G-(\d+)').match(log) + if res: + type = res.group(1) + id = int(res.group(2)) + src = int(res.group(3)) + return {'event': 'recv', 'type': type, 'id': id, 'src': src } + return None + +def parseLine(line): + res = re.compile('\s*([.\d]+)\\tID:(\d+)\\t\[(.*?):(.*?)\](.*)$').match(line) + if res: + time = float(res.group(1)) + nodeid = int(res.group(2)) + level = res.group(3).strip() + module = res.group(4).strip() + log = res.group(5).strip() + return time, nodeid, level, module, log + return None, None, None, None, None + +def doParse(file): + global networkFormationTime + + time = None + lastPrintedTime = 0 + + arrays = { + "packets": [], + "energest": [], + "ranks": [], + "trickle": [], + "switches": [], + "topology": [], + } + +# print("\nProcessing %s" %(file)) + # Filter out non-printable chars from log file + os.system("cat %s | tr -dc '[:print:]\n\t' | sponge %s" %(file, file)) + for line in open(file, 'r').readlines(): + # match time, id, module, log; The common format for all log lines + time, nodeid, level, module, log = parseLine(line) + + if time == None: + # malformed line + continue + + if time - lastPrintedTime >= 60: +# print("%u, "%(time / 60),end='', flush=True) + lastPrintedTime = time + + entry = { + "timestamp": timedelta(seconds=time), + "node": nodeid, + } + + try: + if module == "App": + ret = parseApp(log) + if(ret != None): + entry.update(ret) + if(ret['event'] == 'send' and ret['type'] == 'request'): + # populate series of sent requests + entry['pdr'] = 0. + arrays["packets"].append(entry) + if networkFormationTime == None: + networkFormationTime = time + elif(ret['event'] == 'recv' and ret['type'] == 'response'): + # update sent request series with latency and PDR + txElement = [x for x in arrays["packets"] if x['event']=='send' and x['id']==ret['id']][0] + txElement['latency'] = time - txElement['timestamp'].seconds + txElement['pdr'] = 100. + + if module == "Energest": + ret = parseEnergest(log) + if(ret != None): + entry.update(ret) + arrays["energest"].append(entry) + + if module == "RPL": + ret = parseRPL(log) + if(ret != None): + entry.update(ret) + if(ret['event'] == 'rank'): + arrays["ranks"].append(entry) + arrays["trickle"].append(entry) + elif(ret['event'] == 'switch'): + arrays["switches"].append(entry) + elif(ret['event'] == 'sending'): + if not ret['message'] in arrays: + arrays[ret['message']] = [] + arrays[ret['message']].append(entry) + elif(ret['event'] == 'topology'): + for n in parents.keys(): + nodeEntry = entry.copy() + nodeEntry["node"] = n + nodeEntry["hops"] = calculateHops(n) + nodeEntry["children"] = calculateChildren(n) + arrays["topology"].append(nodeEntry) + except: # typical exception: failed str conversion to int, due to lossy logs + print("Exception: %s" %(str(sys.exc_info()[0]))) + continue + +# print("") + + # Remove last few packets -- might be in-flight when test stopped + arrays["packets"] = arrays["packets"][0:-10] + + dfs = {} + for key in arrays.keys(): + if(len(arrays[key]) > 0): + df = DataFrame(arrays[key]) + dfs[key] = df.set_index("timestamp") + + return dfs + +def outputStats(dfs, key, metric, agg, name, metricLabel = None): + if not key in dfs: + return + + df = dfs[key] + perNode = getattr(df.groupby("node")[metric], agg)() + perTime = getattr(df.groupby([pd.Grouper(freq="2Min")])[metric], agg)() + + print(" %s:" %(metricLabel if metricLabel != None else metric)) + print(" name: %s" %(name)) + print(" per-node:") + print(" x: [%s]" %(", ".join(["%u"%x for x in sort(df.node.unique())]))) + print(" y: [%s]" %(', '.join(["%.4f"%(x) for x in perNode]))) + print(" per-time:") + print(" x: [%s]" %(", ".join(["%u"%x for x in range(0, 2*len(df.groupby([pd.Grouper(freq="2Min")]).mean().index), 2)]))) + print(" y: [%s]" %(', '.join(["%.4f"%(x) for x in perTime]).replace("nan", "null"))) + +def main(): + if len(sys.argv) < 1: + return + else: + file = sys.argv[1].rstrip('/') + + # Parse the original log + dfs = doParse(file) + + if len(dfs) == 0: + return + + print("global-stats:") + print(" pdr: %.4f" %(dfs["packets"]["pdr"].mean())) + print(" loss-rate: %.e" %(1-(dfs["packets"]["pdr"].mean()/100))) + print(" packets-sent: %u" %(dfs["packets"]["pdr"].count())) + print(" packets-received: %u" %(dfs["packets"]["pdr"].sum()/100)) + print(" latency: %.4f" %(dfs["packets"]["latency"].mean())) + print(" duty-cycle: %.2f" %(dfs["energest"]["duty-cycle"].mean())) + print(" channel-utilization: %.2f" %(dfs["energest"]["channel-utilization"].mean())) + print(" network-formation-time: %.2f" %(networkFormationTime)) + print("stats:") + + # Output relevant metrics + outputStats(dfs, "packets", "pdr", "mean", "Round-trip PDR (%)") + outputStats(dfs, "packets", "latency", "mean", "Round-trip latency (s)") + + outputStats(dfs, "energest", "duty-cycle", "mean", "Radio duty cycle (%)") + outputStats(dfs, "energest", "channel-utilization", "mean", "Channel utilization (%)") + + outputStats(dfs, "ranks", "rank", "mean", "RPL rank (ETX-128)") + outputStats(dfs, "switches", "pswitch", "count", "RPL parent switches (#)") + outputStats(dfs, "trickle", "trickle", "mean", "RPL Trickle period (min)") + + outputStats(dfs, "DIS", "message", "count", "RPL DIS sent (#)", "rpl-dis") + outputStats(dfs, "unicast-DIO", "message", "count", "RPL uDIO sent (#)", "rpl-udio") + outputStats(dfs, "multicast-DIO", "message", "count", "RPL mDIO sent (#)", "rpl-mdio") + outputStats(dfs, "DAO", "message", "count", "RPL DAO sent (#)", "rpl-dao") + outputStats(dfs, "DAO-ACK", "message", "count", "RPL DAO-ACK sent (#)", "rpl-daoack") + + outputStats(dfs, "topology", "hops", "mean", "RPL hop count (#)") + outputStats(dfs, "topology", "children", "mean", "RPL children count (#)") + +main() diff --git a/examples/benchmarks/rpl-req-resp/project-conf.h b/examples/benchmarks/rpl-req-resp/project-conf.h new file mode 100644 index 000000000..1140bb9e5 --- /dev/null +++ b/examples/benchmarks/rpl-req-resp/project-conf.h @@ -0,0 +1,48 @@ +#ifndef PROJECT_CONF_H_ +#define PROJECT_CONF_H_ + +/* Testbed configuration */ +#define ROOT_ID 1 +#if CONTIKI_TARGET_COOJA +#define DEPLOYMENT_MAPPING deployment_cooja8 +#else /* CONTIKI_TARGET_COOJA */ +#define DEPLOYMENT_MAPPING deployment_sics_firefly +#endif /* CONTIKI_TARGET_COOJA */ +#define IEEE802154_CONF_PANID 0x8921 + +/* Logging */ +#define LOG_CONF_LEVEL_RPL LOG_LEVEL_INFO +#define LOG_CONF_LEVEL_MAC LOG_LEVEL_WARN +#define LOG_CONF_WITH_COMPACT_ADDR 1 + +/* Provisioning */ +#define NETSTACK_MAX_ROUTE_ENTRIES 25 +#define NBR_TABLE_CONF_MAX_NEIGHBORS 8 + +#if CONFIG_OPTIMS >= 1 + +/* RPL configuration */ +#define RPL_MRHOF_CONF_SQUARED_ETX 1 +#define RPL_CONF_MAX_RANKINC 0 + +/* TSCH configuration */ +#define TSCH_CONF_RX_WAIT 1000 +#define ORCHESTRA_CONF_UNICAST_PERIOD 7 + +#if CONFIG_OPTIMS == 2 + +/* Five nines reliability paper used the config below */ +#define RPL_CONF_DIO_INTERVAL_MIN 14 /* 2^14 ms = 16.384 s */ +#define RPL_CONF_DIO_INTERVAL_DOUBLINGS 6 /* 2^(14+6) ms = 1048.576 s */ +#define RPL_CONF_PROBING_INTERVAL (60 * CLOCK_SECOND) + +/* Five nines reliability paper used the config below */ +#define TSCH_CONF_KEEPALIVE_TIMEOUT (20 * CLOCK_SECOND) +#define TSCH_CONF_MAX_KEEPALIVE_TIMEOUT (60 * CLOCK_SECOND) +//#define TSCH_CONF_EB_PERIOD (16 * CLOCK_SECOND) +//#define TSCH_CONF_MAX_EB_PERIOD (50 * CLOCK_SECOND) + +#endif +#endif + +#endif /* PROJECT_CONF_H_ */ diff --git a/examples/benchmarks/rpl-req-resp/sim.csc b/examples/benchmarks/rpl-req-resp/sim.csc new file mode 100644 index 000000000..d973a1d8d --- /dev/null +++ b/examples/benchmarks/rpl-req-resp/sim.csc @@ -0,0 +1,275 @@ + + + [APPS_DIR]/mrm + [APPS_DIR]/mspsim + [APPS_DIR]/avrora + [APPS_DIR]/serial_socket + [APPS_DIR]/powertracker + + My simulation + 123456 + 1000000 + + org.contikios.cooja.radiomediums.UDGM + 50.0 + 100.0 + 1.0 + 1.0 + + + 40000 + + + org.contikios.cooja.contikimote.ContikiMoteType + mtype90 + Cooja Mote Type #1 + [CONTIKI_DIR]/examples/benchmarks/rpl-req-resp/node.c + make node.cooja TARGET=cooja + org.contikios.cooja.interfaces.Position + org.contikios.cooja.interfaces.Battery + org.contikios.cooja.contikimote.interfaces.ContikiVib + org.contikios.cooja.contikimote.interfaces.ContikiMoteID + org.contikios.cooja.contikimote.interfaces.ContikiRS232 + org.contikios.cooja.contikimote.interfaces.ContikiBeeper + org.contikios.cooja.interfaces.RimeAddress + org.contikios.cooja.contikimote.interfaces.ContikiIPAddress + org.contikios.cooja.contikimote.interfaces.ContikiRadio + org.contikios.cooja.contikimote.interfaces.ContikiButton + org.contikios.cooja.contikimote.interfaces.ContikiPIR + org.contikios.cooja.contikimote.interfaces.ContikiClock + org.contikios.cooja.contikimote.interfaces.ContikiLED + org.contikios.cooja.contikimote.interfaces.ContikiCFS + org.contikios.cooja.contikimote.interfaces.ContikiEEPROM + org.contikios.cooja.interfaces.Mote2MoteRelations + org.contikios.cooja.interfaces.MoteAttributes + false + + + + org.contikios.cooja.interfaces.Position + 12.478629242391953 + 42.201041276604826 + 0.0 + + + org.contikios.cooja.contikimote.interfaces.ContikiMoteID + 1 + + + org.contikios.cooja.contikimote.interfaces.ContikiRadio + 250.0 + + + org.contikios.cooja.contikimote.interfaces.ContikiEEPROM + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== + + mtype90 + + + + org.contikios.cooja.interfaces.Position + 25.625935608473608 + 82.53975431376661 + 0.0 + + + org.contikios.cooja.contikimote.interfaces.ContikiMoteID + 2 + + + org.contikios.cooja.contikimote.interfaces.ContikiRadio + 250.0 + + + org.contikios.cooja.contikimote.interfaces.ContikiEEPROM + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== + + mtype90 + + + + org.contikios.cooja.interfaces.Position + 51.615094138350024 + 59.70602651475372 + 0.0 + + + org.contikios.cooja.contikimote.interfaces.ContikiMoteID + 3 + + + org.contikios.cooja.contikimote.interfaces.ContikiRadio + 250.0 + + + org.contikios.cooja.contikimote.interfaces.ContikiEEPROM + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== + + mtype90 + + + + org.contikios.cooja.interfaces.Position + 41.04314122620578 + 121.24693889311891 + 0.0 + + + org.contikios.cooja.contikimote.interfaces.ContikiMoteID + 4 + + + org.contikios.cooja.contikimote.interfaces.ContikiRadio + 250.0 + + + org.contikios.cooja.contikimote.interfaces.ContikiEEPROM + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== + + mtype90 + + + + org.contikios.cooja.interfaces.Position + 64.9463558635099 + 104.25039302469283 + 0.0 + + + org.contikios.cooja.contikimote.interfaces.ContikiMoteID + 5 + + + org.contikios.cooja.contikimote.interfaces.ContikiRadio + 250.0 + + + org.contikios.cooja.contikimote.interfaces.ContikiEEPROM + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== + + mtype90 + + + + org.contikios.cooja.interfaces.Position + 93.59263858654369 + 75.40399148300003 + 0.0 + + + org.contikios.cooja.contikimote.interfaces.ContikiMoteID + 6 + + + org.contikios.cooja.contikimote.interfaces.ContikiRadio + 250.0 + + + org.contikios.cooja.contikimote.interfaces.ContikiEEPROM + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== + + mtype90 + + + + org.contikios.cooja.interfaces.Position + 75.6297158696234 + 139.97002035548905 + 0.0 + + + org.contikios.cooja.contikimote.interfaces.ContikiMoteID + 7 + + + org.contikios.cooja.contikimote.interfaces.ContikiRadio + 250.0 + + + org.contikios.cooja.contikimote.interfaces.ContikiEEPROM + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== + + mtype90 + + + + org.contikios.cooja.interfaces.Position + 104.34293924684245 + 116.07658566915099 + 0.0 + + + org.contikios.cooja.contikimote.interfaces.ContikiMoteID + 8 + + + org.contikios.cooja.contikimote.interfaces.ContikiRadio + 250.0 + + + org.contikios.cooja.contikimote.interfaces.ContikiEEPROM + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== + + mtype90 + + + + org.contikios.cooja.plugins.SimControl + 280 + 2 + 160 + 400 + 0 + + + org.contikios.cooja.plugins.Visualizer + + true + org.contikios.cooja.plugins.skins.IDVisualizerSkin + org.contikios.cooja.plugins.skins.GridVisualizerSkin + org.contikios.cooja.plugins.skins.TrafficVisualizerSkin + org.contikios.cooja.plugins.skins.UDGMVisualizerSkin + 2.4250860844175466 0.0 0.0 2.4250860844175466 35.26895372864869 -46.9106236441515 + + 400 + 3 + 400 + 1 + 1 + + + org.contikios.cooja.plugins.LogListener + + App + + + + 827 + 0 + 665 + 681 + -1 + + + org.contikios.cooja.plugins.TimeLine + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + 500.0 + + 1539 + 1 + 263 + 0 + 709 + + diff --git a/examples/benchmarks/testbeds/cooja8.c b/examples/benchmarks/testbeds/cooja8.c new file mode 100644 index 000000000..f6ccaec97 --- /dev/null +++ b/examples/benchmarks/testbeds/cooja8.c @@ -0,0 +1,14 @@ +#include "services/deployment/deployment.h" + +/** \brief A mapping table for a 8-node Cooja mote simulation. */ +const struct id_mac deployment_cooja8[] = { + { 1, {{0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01}}}, + { 2, {{0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02}}}, + { 3, {{0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03}}}, + { 4, {{0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04}}}, + { 5, {{0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05}}}, + { 6, {{0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06}}}, + { 7, {{0x00,0x07,0x00,0x07,0x00,0x07,0x00,0x07}}}, + { 8, {{0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08}}}, + { 0, {{0}}} +}; diff --git a/examples/benchmarks/testbeds/sics-firefly.c b/examples/benchmarks/testbeds/sics-firefly.c new file mode 100644 index 000000000..0478dc65d --- /dev/null +++ b/examples/benchmarks/testbeds/sics-firefly.c @@ -0,0 +1,31 @@ +#include "services/deployment/deployment.h" + +/** \brief The 25-node RISE SICS node testbed. Firefly-reva nodes. */ +const struct id_mac deployment_sics_firefly[] = { + { 1, {{0x00,0x12,0x4b,0x00,0x06,0x0d,0xb6,0x14}}}, + { 2, {{0x00,0x12,0x4b,0x00,0x06,0x0d,0xb1,0xe7}}}, + { 3, {{0x00,0x12,0x4b,0x00,0x06,0x0d,0xb4,0x35}}}, + { 4, {{0x00,0x12,0x4b,0x00,0x06,0x0d,0xb1,0xcf}}}, + { 5, {{0x00,0x12,0x4b,0x00,0x06,0x0d,0xb2,0x06}}}, + { 6, {{0x00,0x12,0x4b,0x00,0x06,0x0d,0xb1,0x5f}}}, + { 8, {{0x00,0x12,0x4b,0x00,0x06,0x0d,0xb1,0x91}}}, + { 7, {{0x00,0x12,0x4b,0x00,0x06,0x0d,0xb1,0x29}}}, + { 9, {{0x00,0x12,0x4b,0x00,0x06,0x0d,0xb1,0xc6}}}, + { 10, {{0x00,0x12,0x4b,0x00,0x06,0x0d,0xb1,0x63}}}, + { 12, {{0x00,0x12,0x4b,0x00,0x06,0x0d,0xb2,0x03}}}, + { 11, {{0x00,0x12,0x4b,0x00,0x06,0x0d,0xb4,0x3b}}}, + { 13, {{0x00,0x12,0x4b,0x00,0x06,0x0d,0xb6,0x0d}}}, + { 14, {{0x00,0x12,0x4b,0x00,0x06,0x0d,0xb5,0x66}}}, + { 15, {{0x00,0x12,0x4b,0x00,0x06,0x0d,0xb5,0x8a}}}, + { 16, {{0x00,0x12,0x4b,0x00,0x06,0x0d,0xb4,0x49}}}, + { 17, {{0x00,0x12,0x4b,0x00,0x06,0x0d,0xb1,0x35}}}, + { 18, {{0x00,0x12,0x4b,0x00,0x06,0x0d,0xb2,0x15}}}, + { 19, {{0x00,0x12,0x4b,0x00,0x06,0x0d,0xb5,0xfc}}}, + { 20, {{0x00,0x12,0x4b,0x00,0x06,0x0d,0xb1,0xa8}}}, + { 21, {{0x00,0x12,0x4b,0x00,0x06,0x0d,0xb1,0x6a}}}, + { 22, {{0x00,0x12,0x4b,0x00,0x06,0x0d,0xb4,0x5b}}}, + { 23, {{0x00,0x12,0x4b,0x00,0x06,0x0d,0xb1,0xe6}}}, + { 24, {{0x00,0x12,0x4b,0x00,0x06,0x0d,0xb6,0x00}}}, + { 25, {{0x00,0x12,0x4b,0x00,0x06,0x0d,0xb1,0xb8}}}, + { 0, {{0}}} +};