-
Notifications
You must be signed in to change notification settings - Fork 30
/
lorawan-parsing-example.py
104 lines (80 loc) · 3 KB
/
lorawan-parsing-example.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
# This is an example showing how to use the ns-3 SimulationExecutionManager to
# get from compilation to result visualization.
import sem
import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import interp1d
from io import StringIO
# Define campaign parameters
############################
script = 'lorawan-sem-example'
# ns_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'ns-3')
ns_path = '/Users/davide/Work/sem/examples/ns-3'
campaign_dir = "/tmp/sem-test/lorawan-parsing-example"
# Create campaign
#################
campaign = sem.CampaignManager.new(ns_path, script, campaign_dir,
runner='ParallelRunner',
overwrite=False, optimized=False)
print(campaign)
# Run simulations
#################
# Parameter space
#################
nDevices_values = [100, 500, 1000, 1500, 2000, 2500]
radius_values = [5500]
simulationTime_values = [600]
appPeriod_values = [600]
runs = 10
param_combinations = {
'nDevices': nDevices_values,
'radius': radius_values,
'simulationTime': simulationTime_values,
'appPeriod': appPeriod_values,
}
campaign.run_missing_simulations(sem.list_param_combinations(
param_combinations), runs=runs)
print("Simulations done.")
####################################
# View results of first simulation #
####################################
def parse_string_as_numpy_array(string, **kwargs):
return np.loadtxt(StringIO(string), **kwargs)
def outcome_to_number(string):
string = string.decode('UTF-8')
if string == 'R':
return 0
if string == 'U':
return 1
if string == 'N':
return 2
if string == 'I':
return 3
for result in [campaign.db.get_complete_results({'nDevices': 1000})[0]]:
# Plot network topology
plt.figure()
positions = parse_string_as_numpy_array(result['endDevices.dat'])
plt.scatter(positions[:, 0], positions[:, 1], s=2, c=positions[:, 2])
plt.scatter(0, 0, s=20, marker='^', c='black')
plt.xlim([-radius_values[0], radius_values[0]])
plt.ylim([-radius_values[0], radius_values[0]])
plt.title("Network topology")
# Plot gateway occupation metrics
plt.figure()
path_occupancy = parse_string_as_numpy_array(
result['occupiedReceptionPaths.dat'])
t = np.linspace(path_occupancy[0, 0], 5, num=1001, endpoint=True)
plt.plot(t, interp1d(
path_occupancy[:, 0], path_occupancy[:, 1], kind='previous')(t))
packets = parse_string_as_numpy_array(result['packets.dat'],
converters={5: outcome_to_number})
successful_packets = packets[:, 5] == 0
failed_packets = packets[:, 5] != 0
plt.scatter(packets[successful_packets, 0],
np.zeros([sum(successful_packets)]), s=40, c='green',
marker='^')
plt.scatter(packets[failed_packets, 0], np.zeros([sum(failed_packets)]),
s=40, c='red', marker='^')
plt.xlim([0, 5])
plt.title("Occupied reception paths")
plt.show()