Describe BereBere/k2o2p5 here.
Recibiendo datos de un GPS de k2o a processing y guardandolos en un xml.
1 /*
2 *Este sketch recibe la posicion del GPS por OSC a travez de k2o y los guarda en un archivo xml.
3 *Necesita las librerias oscP5 y proxml (http://processing.org/reference/libraries/index.html).
4 *Necesita correr k2oplay en mismo puerto usado por oscP5 con este comando:
5 *
6 *k2oplay log.txt osc.udp://localhost:54321
7 *
8 *k2o: http://k2o.znerol.ch/
9 */
10
11 import proxml.*;
12 import oscP5.*;
13 import netP5.*;
14
15 OscP5 oscP5;
16 NetAddress myRemoteLocation;
17
18 //elemento xml que va a guardar los datos
19 XMLElement waypoints;
20
21 XMLInOut xmlInOut;
22
23
24 float lat = 0.0;
25 float lon = 0.0;
26 float alt = 0.0;
27
28 void setup(){
29 size(400,400);
30 smooth();
31 background(255);
32 oscP5 = new OscP5(this,54321);
33 //Carga el archivo xml
34 xmlInOut = new XMLInOut(this);
35 try{
36 xmlInOut.loadElement("waypoints.xml");
37 }
38 catch(Exception e){
39 //si no existe el archivo, crea un elemento xml nuevo
40 xmlEvent(new XMLElement("waypoints"));
41 }
42 }
43
44 void xmlEvent(XMLElement element){
45 waypoints = element;
46 }
47
48 void draw(){
49 xmlData();
50 delay(10000);
51 //espera 10 segundos antes de tomar la siguiente muestra.
52 }
53
54 void oscEvent(OscMessage theOscMessage) {
55 /* compara las direcciones y si encuentra la correcta imprime el valor */
56
57 if(theOscMessage.checkAddrPattern("/kismet/gps/lat")==true){
58 lat = theOscMessage.get(0).floatValue();
59 println("lat:"+ lat);
60 }
61 if(theOscMessage.checkAddrPattern("/kismet/gps/lon")==true){
62 lon = theOscMessage.get(0).floatValue();
63 println("lon:"+ lon);
64 }
65
66 if(theOscMessage.checkAddrPattern("/kismet/gps/alt")==true){
67 alt = theOscMessage.get(0).floatValue();
68 println("alt:"+ alt);
69 }
70 }
71
72 //Funcion que guarda las variables de posicion en el xml.
73 void xmlData(){
74 XMLElement wp = new XMLElement("wp");
75 waypoints.addChild(wp);
76 wp.addAttribute("lat",lat);
77 wp.addAttribute("lon",lon);
78 wp.addAttribute("alt", alt);
79 xmlInOut.saveElement(waypoints, "waypoints.xml");
80 }
Este es el archivo xml creado, cada 10 segundos se agrega un nuevo waypoint:
1 <?xml version="1.0" encoding="ISO-8859-1"?>
2 <waypoints>
3 <wp lat="0.0" alt="0.0" lon="0.0"/>
4 <wp lat="0.0" alt="0.0" lon="0.0"/>
5 <wp alt="8731.47" lat="4.632837" lon="-74.06216"/>
6 <wp alt="8772.06" lat="4.632893" lon="-74.06216"/>
7 <wp alt="8790.54" lat="4.63292" lon="-74.062164"/>
8 <wp alt="8809.02" lat="4.632942" lon="-74.06218"/>
9 <wp alt="8826.51" lat="4.632972" lon="-74.062195"/>
10 <wp alt="8838.39" lat="4.632995" lon="-74.06219"/>
11 <wp alt="8831.79" lat="4.632987" lon="-74.06219"/>
12 </waypoints>
V.02 guarda datos recibidos desde arduino, k20 en un xml
1 import processing.serial.*;
2 import proxml.*;
3 import oscP5.*;
4 import netP5.*;
5
6 OscP5 oscP5;
7 NetAddress myRemoteLocation;
8
9 //------------XML
10 //elemento xml que va a guardar los datos
11 XMLElement waypoints;
12 XMLInOut xmlInOut;
13 float lat = 0.0;
14 float lon = 0.0;
15 float alt = 0.0;
16
17 String essid="no_ssid";
18
19 Serial puerto;
20 int[] datosEntrantes = new int[2]; // arreglo para recibir los tres datos
21 int cuantosDatos = 0; // contador
22 boolean hayDatos = false; // control de verdad
23 int mic, foto ;
24
25
26 ////fecha y hora
27 int dia = day();
28 int mes = month();
29 int seg = second();
30 int minuto = minute();
31 int hora = hour();
32
33
34 void setup() {
35 // asuntos seriales
36 println(Serial.list());
37 puerto = new Serial(this,"/dev/ttyUSB1", 9600);
38 puerto.write(65); // Envia el primer dato para iniciar el toma y dame
39
40 ///////////////XML
41 oscP5 = new OscP5(this,54321);
42 //Carga el archivo xml
43 xmlInOut = new XMLInOut(this);
44 try{
45 xmlInOut.loadElement("waypoints.xml");
46 }
47 catch(Exception e){
48 //si no existe el archivo, crea un elemento xml nuevo
49 xmlEvent(new XMLElement("waypoints"));
50 }
51 }
52
53 void xmlEvent(XMLElement element){
54 waypoints = element;
55 }
56
57 void draw() {
58
59 xmlData();
60 delay(10000);
61
62 if (hayDatos == false) { //si no hay datos envia uno
63 puerto.write(65);
64 }
65 }
66
67 void oscEvent(OscMessage theOscMessage) {
68 /* compara las direcciones y si encuentra la correcta imprime el valor */
69
70 if(theOscMessage.checkAddrPattern("/kismet/gps/lat")==true){
71 lat = theOscMessage.get(0).floatValue();
72 println("lat:"+ lat);
73 }
74 if(theOscMessage.checkAddrPattern("/kismet/gps/lon")==true){
75 lon = theOscMessage.get(0).floatValue();
76 println("lon:"+ lon);
77 }
78
79 if(theOscMessage.checkAddrPattern("/kismet/gps/alt")==true){
80 alt = theOscMessage.get(0).floatValue();
81 println("alt:"+ alt);
82 }
83 if(theOscMessage.checkAddrPattern("/kismet/network/XX/ssid")==true){
84 essid = theOscMessage.get(0).stringValue();
85 println("essid:"+ essid);
86 }
87
88 }
89
90 // esta función corre cada vez que llega un dato serial
91 void serialEvent(Serial puerto) {
92 if (hayDatos == false) {
93 hayDatos = true; // de ahora en adelante el dato de envío se dará por el toma y dame
94 }
95 // Lee el dato y lo añade al arreglo en su última casilla
96 datosEntrantes[cuantosDatos] = puerto.read();
97 cuantosDatos++;
98
99 if (cuantosDatos > 1 ) { // Si ya hay tres datos en el arreglo
100 mic = datosEntrantes[0];
101 foto = datosEntrantes[1];
102 // println("Valores de los potenciometros: " + mic+ "," + foto );
103 puerto.write(65); // y envía para pedir más
104 cuantosDatos = 0; // y todo empieza de nuevo
105 }
106 }
107
108 //Funcion que guarda las variables de posicion en el xml.
109 void xmlData(){
110 XMLElement wp = new XMLElement("wp");
111 waypoints.addChild(wp);
112 wp.addAttribute("hora", hora);
113 wp.addAttribute("minuto", minuto);
114 wp.addAttribute("segundo", seg);
115 wp.addAttribute("lat",lat);
116 wp.addAttribute("lon",lon);
117 wp.addAttribute("alt", alt);
118 wp.addAttribute("mic", mic);
119 wp.addAttribute("foto", foto);
120 wp.addAttribute("essid", essid);
121 xmlInOut.saveElement(waypoints, "waypoints.xml");
122 }
123
xml data:
1 <?xml version="1.0" encoding="ISO-8859-1"?>
2 <waypoints>
3 <wp lon="0.0" segundo="16" hora="15" essid="no_ssid" foto="165" alt="0.0" lat="0.0" minuto="8" mic="14"/>
4 <wp lon="0.0" segundo="16" hora="15" essid="no_ssid" foto="161" alt="0.0" lat="0.0" minuto="8" mic="13"/>
5 <wp lon="0.0" segundo="16" hora="15" essid="no_ssid" foto="165" alt="0.0" lat="0.0" minuto="8" mic="12"/>
6 <wp lon="0.0" segundo="16" hora="15" essid="no_ssid" foto="166" alt="0.0" lat="0.0" minuto="8" mic="13"/>
7 <wp lon="0.0" segundo="16" hora="15" essid="no_ssid" foto="167" alt="0.0" lat="0.0" minuto="8" mic="13"/>
8 <wp lon="0.0" segundo="16" hora="15" essid="no_ssid" foto="165" alt="0.0" lat="0.0" minuto="8" mic="13"/>
9 </waypoints>
wardriving log: log.xml
v.02.1
changeLog>> arregle la actualización y escritura del tiempo, dividí el código en scripts independientes para organizarlo un poco.
TODO:
* Aniadir datos de sensores en cada wp
* Orgnizar los datos en una estructura de arbol en el archivo xml.
* h:m:s de cada uno de los wps.
