aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorOmar Tarabai <tarabai@devegypt.com>2014-06-30 14:17:28 +0000
committerOmar Tarabai <tarabai@devegypt.com>2014-06-30 14:17:28 +0000
commit0e07f3b3f6df0f56bc5b23820977864828616845 (patch)
treee0f893649d2a30122f8c2efdc4d8a52b4688d050 /src
parentd7fe7afd48a1a57ab8005d728dcde607ed3ebeb2 (diff)
downloadgnunet-0e07f3b3f6df0f56bc5b23820977864828616845.tar.gz
gnunet-0e07f3b3f6df0f56bc5b23820977864828616845.zip
initial sensor reporting component code
Diffstat (limited to 'src')
-rw-r--r--src/include/gnunet_sensor_service.h4
-rw-r--r--src/sensor/Makefile.am3
-rw-r--r--src/sensor/gnunet-service-sensor-reporting.c161
-rw-r--r--src/sensor/gnunet-service-sensor.c39
-rw-r--r--src/sensor/sensor.h16
-rw-r--r--src/sensor/sensors/average-ping-rtt6
-rw-r--r--src/sensor/sensors/datacache-bytes-stored2
-rw-r--r--src/sensor/sensors/gnunet-version2
-rw-r--r--src/sensor/sensors/known-peers2
-rw-r--r--src/sensor/sensors/nse2
-rw-r--r--src/sensor/sensors/peerstore-memory2
-rw-r--r--src/sensor/sensors/transport-bytes-received2
-rw-r--r--src/sensor/sensors/transport-tcp-bytes-transmitted2
-rw-r--r--src/sensor/sensors/transport-tcp-sessions-active2
14 files changed, 230 insertions, 15 deletions
diff --git a/src/include/gnunet_sensor_service.h b/src/include/gnunet_sensor_service.h
index cd840dd75..19dcbbb75 100644
--- a/src/include/gnunet_sensor_service.h
+++ b/src/include/gnunet_sensor_service.h
@@ -171,7 +171,7 @@ struct SensorInfo
171 /* 171 /*
172 * Time interval to send sensor information to collection point (e.g. every 30 mins) 172 * Time interval to send sensor information to collection point (e.g. every 30 mins)
173 */ 173 */
174 struct GNUNET_TIME_Relative *collection_interval; 174 struct GNUNET_TIME_Relative collection_interval;
175 175
176 /* 176 /*
177 * Flag specifying if value is to be communicated to the p2p network 177 * Flag specifying if value is to be communicated to the p2p network
@@ -181,7 +181,7 @@ struct SensorInfo
181 /* 181 /*
182 * Time interval to communicate value to the p2p network 182 * Time interval to communicate value to the p2p network
183 */ 183 */
184 struct GNUNET_TIME_Relative *p2p_interval; 184 struct GNUNET_TIME_Relative p2p_interval;
185 185
186 /* 186 /*
187 * Execution task (OR GNUNET_SCHEDULER_NO_TASK) 187 * Execution task (OR GNUNET_SCHEDULER_NO_TASK)
diff --git a/src/sensor/Makefile.am b/src/sensor/Makefile.am
index a1c8881fa..08b536d0a 100644
--- a/src/sensor/Makefile.am
+++ b/src/sensor/Makefile.am
@@ -35,7 +35,8 @@ gnunet_sensor_LDADD = \
35 35
36gnunet_service_sensor_SOURCES = \ 36gnunet_service_sensor_SOURCES = \
37 gnunet-service-sensor.c \ 37 gnunet-service-sensor.c \
38 gnunet-service-sensor-analysis.c 38 gnunet-service-sensor-analysis.c \
39 gnunet-service-sensor-reporting.c
39gnunet_service_sensor_LDADD = \ 40gnunet_service_sensor_LDADD = \
40 $(top_builddir)/src/util/libgnunetutil.la \ 41 $(top_builddir)/src/util/libgnunetutil.la \
41 $(top_builddir)/src/statistics/libgnunetstatistics.la \ 42 $(top_builddir)/src/statistics/libgnunetstatistics.la \
diff --git a/src/sensor/gnunet-service-sensor-reporting.c b/src/sensor/gnunet-service-sensor-reporting.c
new file mode 100644
index 000000000..2808f01b8
--- /dev/null
+++ b/src/sensor/gnunet-service-sensor-reporting.c
@@ -0,0 +1,161 @@
1/*
2 This file is part of GNUnet.
3 (C)
4
5 GNUnet is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published
7 by the Free Software Foundation; either version 3, or (at your
8 option) any later version.
9
10 GNUnet is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with GNUnet; see the file COPYING. If not, write to the
17 Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 Boston, MA 02111-1307, USA.
19*/
20
21/**
22 * @file sensor/gnunet-service-sensor-reporting.c
23 * @brief sensor service reporting functionality
24 * @author Omar Tarabai
25 */
26#include "platform.h"
27#include "gnunet_util_lib.h"
28#include "sensor.h"
29#include "gnunet_peerstore_service.h"
30
31#define LOG(kind,...) GNUNET_log_from (kind, "sensor-reporting",__VA_ARGS__)
32
33/**
34 * Context of reporting to collection
35 * point
36 */
37struct CollectionReportingContext
38{
39
40 /**
41 * Sensor information
42 */
43 struct SensorInfo *sensor;
44
45 /**
46 * Reporting task (OR GNUNET_SCHEDULER_NO_TASK)
47 */
48 GNUNET_SCHEDULER_TaskIdentifier task;
49
50};
51
52/**
53 * Our configuration.
54 */
55static const struct GNUNET_CONFIGURATION_Handle *cfg;
56
57/**
58 * Handle to peerstore service
59 */
60static struct GNUNET_PEERSTORE_Handle *peerstore;
61
62/**
63 * My peer id
64 */
65struct GNUNET_PeerIdentity peerid;
66
67
68/**
69 * Stop sensor reporting module
70 */
71void SENSOR_reporting_stop()
72{
73 LOG (GNUNET_ERROR_TYPE_DEBUG, "Stopping sensor reporting module.\n");
74 if (NULL != peerstore)
75 {
76 GNUNET_PEERSTORE_disconnect(peerstore);
77 peerstore = NULL;
78 }
79}
80
81/**
82 * Task scheduled to send values to collection point
83 *
84 * @param cls closure, a 'struct CollectionReportingContext *'
85 * @param tc unused
86 */
87void report_collection_point
88(void *cls, const struct GNUNET_SCHEDULER_TaskContext* tc)
89{
90 struct CollectionReportingContext *crc = cls;
91
92 crc->task = GNUNET_SCHEDULER_NO_TASK;
93}
94
95/**
96 * Iterator for defined sensors
97 * Watches sensors for readings to report
98 *
99 * @param cls unused
100 * @param key unused
101 * @param value a 'struct SensorInfo *' with sensor information
102 * @return #GNUNET_YES to continue iterations
103 */
104static int
105init_sensor_reporting (void *cls,
106 const struct GNUNET_HashCode *key,
107 void *value)
108{
109 struct SensorInfo *sensor = value;
110 struct CollectionReportingContext *crc;
111
112 if (NULL != sensor->collection_point)
113 {
114 LOG (GNUNET_ERROR_TYPE_INFO,
115 "Will start reporting sensor `%s' values to collection point `%s' every %s.\n",
116 sensor->name, GNUNET_i2s_full(sensor->collection_point),
117 GNUNET_STRINGS_relative_time_to_string(sensor->collection_interval, GNUNET_YES));
118 crc = GNUNET_new (struct CollectionReportingContext);
119 crc->sensor = sensor;
120 crc->task =
121 GNUNET_SCHEDULER_add_delayed(sensor->collection_interval,
122 &report_collection_point,
123 crc);
124 }
125 if (GNUNET_YES == sensor->p2p_report)
126 {
127 LOG (GNUNET_ERROR_TYPE_INFO,
128 "Will start reporting sensor `%s' values to p2p network every %s.\n",
129 sensor->name,
130 GNUNET_STRINGS_relative_time_to_string(sensor->p2p_interval, GNUNET_YES));
131 }
132 return GNUNET_YES;
133}
134
135/**
136 * Start the sensor reporting module
137 *
138 * @param c our service configuration
139 * @param sensors multihashmap of loaded sensors
140 * @return #GNUNET_OK if started successfully, #GNUNET_SYSERR otherwise
141 */
142int
143SENSOR_reporting_start(const struct GNUNET_CONFIGURATION_Handle *c,
144 struct GNUNET_CONTAINER_MultiHashMap *sensors)
145{
146
147 GNUNET_assert(NULL != sensors);
148 cfg = c;
149 GNUNET_CRYPTO_get_peer_identity(cfg, &peerid);
150 GNUNET_CONTAINER_multihashmap_iterate(sensors, &init_sensor_reporting, NULL);
151 peerstore = GNUNET_PEERSTORE_connect(cfg);
152 if (NULL == peerstore)
153 {
154 LOG (GNUNET_ERROR_TYPE_ERROR, _("Could not connect to peerstore service.\n"));
155 SENSOR_reporting_stop();
156 return GNUNET_SYSERR;
157 }
158 return GNUNET_OK;
159}
160
161/* end of gnunet-service-sensor-reporting.c */
diff --git a/src/sensor/gnunet-service-sensor.c b/src/sensor/gnunet-service-sensor.c
index 83e611bfb..0e5133d6f 100644
--- a/src/sensor/gnunet-service-sensor.c
+++ b/src/sensor/gnunet-service-sensor.c
@@ -159,6 +159,7 @@ static void
159shutdown_task (void *cls, 159shutdown_task (void *cls,
160 const struct GNUNET_SCHEDULER_TaskContext *tc) 160 const struct GNUNET_SCHEDULER_TaskContext *tc)
161{ 161{
162 SENSOR_reporting_stop();
162 SENSOR_analysis_stop(); 163 SENSOR_analysis_stop();
163 GNUNET_CONTAINER_multihashmap_iterate(sensors, &destroy_sensor, NULL); 164 GNUNET_CONTAINER_multihashmap_iterate(sensors, &destroy_sensor, NULL);
164 GNUNET_CONTAINER_multihashmap_destroy(sensors); 165 GNUNET_CONTAINER_multihashmap_destroy(sensors);
@@ -238,6 +239,8 @@ load_sensor_from_cfg(struct GNUNET_CONFIGURATION_Handle *cfg, const char *sectio
238 char *starttime_str; 239 char *starttime_str;
239 char *endtime_str; 240 char *endtime_str;
240 unsigned long long time_sec; 241 unsigned long long time_sec;
242 char *dummy;
243 struct GNUNET_CRYPTO_EddsaPublicKey public_key;
241 244
242 sensor = GNUNET_new(struct SensorInfo); 245 sensor = GNUNET_new(struct SensorInfo);
243 //name 246 //name
@@ -307,6 +310,10 @@ load_sensor_from_cfg(struct GNUNET_CONFIGURATION_Handle *cfg, const char *sectio
307 if(GNUNET_OK == GNUNET_CONFIGURATION_get_value_number(cfg, sectionname, "LIFETIME", &time_sec)) 310 if(GNUNET_OK == GNUNET_CONFIGURATION_get_value_number(cfg, sectionname, "LIFETIME", &time_sec))
308 { 311 {
309 sensor->lifetime = GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_SECONDS, time_sec); 312 sensor->lifetime = GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_SECONDS, time_sec);
313 if (sensor->lifetime.rel_value_us < sensor->interval.rel_value_us)
314 GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
315 "Lifetime of sensor data is preferred to be higher than interval for sensor `%s'.\n",
316 sensor->name);
310 } 317 }
311 else 318 else
312 sensor->lifetime = sensor->interval; 319 sensor->lifetime = sensor->interval;
@@ -352,7 +359,36 @@ load_sensor_from_cfg(struct GNUNET_CONFIGURATION_Handle *cfg, const char *sectio
352 GNUNET_free(sensor); 359 GNUNET_free(sensor);
353 return NULL; 360 return NULL;
354 } 361 }
355 //TODO: reporting mechanism 362 //reporting mechanism
363 if (GNUNET_OK == GNUNET_CONFIGURATION_get_value_string(cfg, sectionname, "COLLECTION_POINT", &dummy))
364 {
365 if(GNUNET_OK != GNUNET_CONFIGURATION_get_value_number(cfg, sectionname, "COLLECTION_INTERVAL", &time_sec))
366 {
367 GNUNET_log(GNUNET_ERROR_TYPE_ERROR, _("Error reading sensor collection interval\n"));
368 }
369 else
370 {
371 sensor->collection_interval = GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_SECONDS, time_sec);
372 if (GNUNET_OK == GNUNET_CRYPTO_eddsa_public_key_from_string(dummy, strlen(dummy), &public_key))
373 {
374 sensor->collection_point = GNUNET_new(struct GNUNET_PeerIdentity);
375 sensor->collection_point->public_key = public_key;
376 }
377 }
378 }
379 sensor->p2p_report = GNUNET_NO;
380 if (GNUNET_YES == GNUNET_CONFIGURATION_get_value_yesno(cfg, sectionname, "P2P_REPORT"))
381 {
382 if(GNUNET_OK != GNUNET_CONFIGURATION_get_value_number(cfg, sectionname, "P2P_INTERVAL", &time_sec))
383 {
384 GNUNET_log(GNUNET_ERROR_TYPE_ERROR, _("Error reading sensor p2p reporting interval\n"));
385 }
386 else
387 {
388 sensor->p2p_interval = GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_SECONDS, time_sec);
389 sensor->p2p_report = GNUNET_YES;
390 }
391 }
356 //execution task 392 //execution task
357 sensor->execution_task = GNUNET_SCHEDULER_NO_TASK; 393 sensor->execution_task = GNUNET_SCHEDULER_NO_TASK;
358 //running 394 //running
@@ -991,6 +1027,7 @@ run (void *cls,
991 reload_sensors(); 1027 reload_sensors();
992 schedule_all_sensors(); 1028 schedule_all_sensors();
993 SENSOR_analysis_start(c, sensors); 1029 SENSOR_analysis_start(c, sensors);
1030 SENSOR_reporting_start(c, sensors);
994 statistics = GNUNET_STATISTICS_create("sensor", cfg); 1031 statistics = GNUNET_STATISTICS_create("sensor", cfg);
995 GNUNET_CRYPTO_get_peer_identity(cfg, &peerid); 1032 GNUNET_CRYPTO_get_peer_identity(cfg, &peerid);
996 peerstore = GNUNET_PEERSTORE_connect(cfg); 1033 peerstore = GNUNET_PEERSTORE_connect(cfg);
diff --git a/src/sensor/sensor.h b/src/sensor/sensor.h
index 0a301327d..9966be951 100644
--- a/src/sensor/sensor.h
+++ b/src/sensor/sensor.h
@@ -77,3 +77,19 @@ void SENSOR_analysis_stop();
77int 77int
78SENSOR_analysis_start(const struct GNUNET_CONFIGURATION_Handle *c, 78SENSOR_analysis_start(const struct GNUNET_CONFIGURATION_Handle *c,
79 struct GNUNET_CONTAINER_MultiHashMap *sensors_mhm); 79 struct GNUNET_CONTAINER_MultiHashMap *sensors_mhm);
80
81/**
82 * Stop sensor reporting module
83 */
84void SENSOR_reporting_stop();
85
86/**
87 * Start the sensor reporting module
88 *
89 * @param c our service configuration
90 * @param sensors multihashmap of loaded sensors
91 * @return #GNUNET_OK if started successfully, #GNUNET_SYSERR otherwise
92 */
93int
94SENSOR_reporting_start(const struct GNUNET_CONFIGURATION_Handle *c,
95 struct GNUNET_CONTAINER_MultiHashMap *sensors);
diff --git a/src/sensor/sensors/average-ping-rtt b/src/sensor/sensors/average-ping-rtt
index 36888c982..5cda1852c 100644
--- a/src/sensor/sensors/average-ping-rtt
+++ b/src/sensor/sensors/average-ping-rtt
@@ -25,8 +25,8 @@ EXT_PROCESS = avgping.sh
25EXPECTED_DATATYPE = numeric 25EXPECTED_DATATYPE = numeric
26 26
27# Reporting mechanism 27# Reporting mechanism
28COLLECTION_POINT = JLAPIAOB2DJA4B4I676TCOCVU0DUIRMKKUSM71BLLGCV3OHMUQ80 28COLLECTION_POINT = NCEKA096482PC84GFTG61EHAVXY3BQDTPB5FANATQD5CDADJ2HP0
29COLLECTION_INTERVAL = 7200 29COLLECTION_INTERVAL = 7200
30 30
31P2P_REPORT = NO 31P2P_REPORT = YES
32#P2P_INTERVAL = 32P2P_INTERVAL = 300
diff --git a/src/sensor/sensors/datacache-bytes-stored b/src/sensor/sensors/datacache-bytes-stored
index b55ee8083..05172b14b 100644
--- a/src/sensor/sensors/datacache-bytes-stored
+++ b/src/sensor/sensors/datacache-bytes-stored
@@ -25,7 +25,7 @@ GNUNET_STAT_NAME = # bytes stored
25EXPECTED_DATATYPE = numeric 25EXPECTED_DATATYPE = numeric
26 26
27# Reporting mechanism 27# Reporting mechanism
28COLLECTION_POINT = JLAPIAOB2DJA4B4I676TCOCVU0DUIRMKKUSM71BLLGCV3OHMUQ80 28COLLECTION_POINT = NCEKA096482PC84GFTG61EHAVXY3BQDTPB5FANATQD5CDADJ2HP0
29COLLECTION_INTERVAL = 120 29COLLECTION_INTERVAL = 120
30 30
31P2P_REPORT = NO 31P2P_REPORT = NO
diff --git a/src/sensor/sensors/gnunet-version b/src/sensor/sensors/gnunet-version
index b9941f77f..b6ab56a5f 100644
--- a/src/sensor/sensors/gnunet-version
+++ b/src/sensor/sensors/gnunet-version
@@ -25,7 +25,7 @@ EXT_ARGS = -v
25EXPECTED_DATATYPE = string 25EXPECTED_DATATYPE = string
26 26
27# Reporting mechanism 27# Reporting mechanism
28COLLECTION_POINT = JLAPIAOB2DJA4B4I676TCOCVU0DUIRMKKUSM71BLLGCV3OHMUQ80 28COLLECTION_POINT = NCEKA096482PC84GFTG61EHAVXY3BQDTPB5FANATQD5CDADJ2HP0
29COLLECTION_INTERVAL = 86400 29COLLECTION_INTERVAL = 86400
30 30
31P2P_REPORT = NO 31P2P_REPORT = NO
diff --git a/src/sensor/sensors/known-peers b/src/sensor/sensors/known-peers
index 5c7c1aeaa..d7db9b149 100644
--- a/src/sensor/sensors/known-peers
+++ b/src/sensor/sensors/known-peers
@@ -25,7 +25,7 @@ GNUNET_STAT_NAME = # peers known
25EXPECTED_DATATYPE = numeric 25EXPECTED_DATATYPE = numeric
26 26
27# Reporting mechanism 27# Reporting mechanism
28COLLECTION_POINT = JLAPIAOB2DJA4B4I676TCOCVU0DUIRMKKUSM71BLLGCV3OHMUQ80 28COLLECTION_POINT = NCEKA096482PC84GFTG61EHAVXY3BQDTPB5FANATQD5CDADJ2HP0
29COLLECTION_INTERVAL = 120 29COLLECTION_INTERVAL = 120
30 30
31P2P_REPORT = NO 31P2P_REPORT = NO
diff --git a/src/sensor/sensors/nse b/src/sensor/sensors/nse
index f95cc34de..856f37640 100644
--- a/src/sensor/sensors/nse
+++ b/src/sensor/sensors/nse
@@ -25,7 +25,7 @@ GNUNET_STAT_NAME = # nodes in the network (estimate)
25EXPECTED_DATATYPE = numeric 25EXPECTED_DATATYPE = numeric
26 26
27# Reporting mechanism 27# Reporting mechanism
28COLLECTION_POINT = JLAPIAOB2DJA4B4I676TCOCVU0DUIRMKKUSM71BLLGCV3OHMUQ80 28COLLECTION_POINT = NCEKA096482PC84GFTG61EHAVXY3BQDTPB5FANATQD5CDADJ2HP0
29COLLECTION_INTERVAL = 120 29COLLECTION_INTERVAL = 120
30 30
31P2P_REPORT = NO 31P2P_REPORT = NO
diff --git a/src/sensor/sensors/peerstore-memory b/src/sensor/sensors/peerstore-memory
index 6d6c54600..9a5f65d10 100644
--- a/src/sensor/sensors/peerstore-memory
+++ b/src/sensor/sensors/peerstore-memory
@@ -25,7 +25,7 @@ EXT_PROCESS = peerstore-memory.sh
25EXPECTED_DATATYPE = numeric 25EXPECTED_DATATYPE = numeric
26 26
27# Reporting mechanism 27# Reporting mechanism
28COLLECTION_POINT = JLAPIAOB2DJA4B4I676TCOCVU0DUIRMKKUSM71BLLGCV3OHMUQ80 28COLLECTION_POINT = NCEKA096482PC84GFTG61EHAVXY3BQDTPB5FANATQD5CDADJ2HP0
29COLLECTION_INTERVAL = 7200 29COLLECTION_INTERVAL = 7200
30 30
31P2P_REPORT = NO 31P2P_REPORT = NO
diff --git a/src/sensor/sensors/transport-bytes-received b/src/sensor/sensors/transport-bytes-received
index 5c45d6cb1..d3ce67412 100644
--- a/src/sensor/sensors/transport-bytes-received
+++ b/src/sensor/sensors/transport-bytes-received
@@ -25,7 +25,7 @@ GNUNET_STAT_NAME = # bytes total received
25EXPECTED_DATATYPE = numeric 25EXPECTED_DATATYPE = numeric
26 26
27# Reporting mechanism 27# Reporting mechanism
28COLLECTION_POINT = JLAPIAOB2DJA4B4I676TCOCVU0DUIRMKKUSM71BLLGCV3OHMUQ80 28COLLECTION_POINT = NCEKA096482PC84GFTG61EHAVXY3BQDTPB5FANATQD5CDADJ2HP0
29COLLECTION_INTERVAL = 120 29COLLECTION_INTERVAL = 120
30 30
31P2P_REPORT = NO 31P2P_REPORT = NO
diff --git a/src/sensor/sensors/transport-tcp-bytes-transmitted b/src/sensor/sensors/transport-tcp-bytes-transmitted
index cf45c0c86..c566ee488 100644
--- a/src/sensor/sensors/transport-tcp-bytes-transmitted
+++ b/src/sensor/sensors/transport-tcp-bytes-transmitted
@@ -25,7 +25,7 @@ GNUNET_STAT_NAME = # bytes transmitted via TCP
25EXPECTED_DATATYPE = numeric 25EXPECTED_DATATYPE = numeric
26 26
27# Reporting mechanism 27# Reporting mechanism
28COLLECTION_POINT = JLAPIAOB2DJA4B4I676TCOCVU0DUIRMKKUSM71BLLGCV3OHMUQ80 28COLLECTION_POINT = NCEKA096482PC84GFTG61EHAVXY3BQDTPB5FANATQD5CDADJ2HP0
29COLLECTION_INTERVAL = 120 29COLLECTION_INTERVAL = 120
30 30
31P2P_REPORT = NO 31P2P_REPORT = NO
diff --git a/src/sensor/sensors/transport-tcp-sessions-active b/src/sensor/sensors/transport-tcp-sessions-active
index 810313091..1f5c81125 100644
--- a/src/sensor/sensors/transport-tcp-sessions-active
+++ b/src/sensor/sensors/transport-tcp-sessions-active
@@ -25,7 +25,7 @@ GNUNET_STAT_NAME = # TCP sessions active
25EXPECTED_DATATYPE = numeric 25EXPECTED_DATATYPE = numeric
26 26
27# Reporting mechanism 27# Reporting mechanism
28COLLECTION_POINT = JLAPIAOB2DJA4B4I676TCOCVU0DUIRMKKUSM71BLLGCV3OHMUQ80 28COLLECTION_POINT = NCEKA096482PC84GFTG61EHAVXY3BQDTPB5FANATQD5CDADJ2HP0
29COLLECTION_INTERVAL = 120 29COLLECTION_INTERVAL = 120
30 30
31P2P_REPORT = NO 31P2P_REPORT = NO