Se va a realizar también una visualización web de los datos recopilados en Google Charts, la descarga de datos a MatLab y un pequeño análisis de los mismos.
domingo, 10 de febrero de 2019
Proyecto: Introducción
Se va a realizar también una visualización web de los datos recopilados en Google Charts, la descarga de datos a MatLab y un pequeño análisis de los mismos.
Soy Ingeniero Electrónico especializado en automatización y estudiante del máster universitario en ingeniería de control, automatización y robótica. Este blog es parte del aprendizaje necesario para el desarrollo de la asignatura TICs.
sábado, 9 de febrero de 2019
Tema 03 - Sesion 06 (31/01/19)
Soy Ingeniero Electrónico especializado en automatización y estudiante del máster universitario en ingeniería de control, automatización y robótica. Este blog es parte del aprendizaje necesario para el desarrollo de la asignatura TICs.
miércoles, 30 de enero de 2019
Tema 03 - Sesion 05 (29/01/19)
<script type="text/javascript">
function myCallback(dataWeGotViaJsonp) {
jsonData = dataWeGotViaJsonp['feeds'];
};
</script>
<script type="text/javascript" src="https://api.thingspeak.com/channels/[CHANNEL_ID]/feeds.json?api_key=[API_KEY]&results=10&callback=myCallback"></script>
var data = new google.visualization.DataTable();
data.addColumn('datetime','Time');
data.addColumn('number','CPU');
data.addColumn('number','RAM');
for(var i=0; i<jsonData.length; i++) {
var timestamp = jsonData[i]['created_at'];
var cpu = jsonData[i]['field1'];
var ram = jsonData[i]['field2'];
data.addRow([new Date(timestamp), parseFloat(cpu), parseFloat(ram)]);
};
var options = {
title: 'Computer performance', legend: {position: 'bottom'},
curveType: 'function', colors: ['red','blue'],
series: {0: {targetAxisIndex:0},1:{targetAxisIndex:1}},
vAxes: {0: {title: '%CPU'},1:{title: '%RAM'}}
};
var chart = new google.visualization.LineChart(document.getElementById('curve_chart'));
chart.draw(data,options);
}
Estudié ingeniería electrónica, industrial y automática en la UPV/EHU. Actualmente estudio el máster de ingeniería de control, automatización y robótica en la Escuela de Ingenería de Bilbao. Este blog forma parte de las tareas a realizar en la asignatura de Aplicación de las TICs en Investigación
lunes, 28 de enero de 2019
Tema 03 - Sesion 03 y 04 (24/01/19)
import psutil
import httplib
import urllib
Estas tres librerías son las que van a permitir realizar, tanto la lectura del consumo, como las peticiones HTTP necesarias para subir los datos a la red.A continuación, se debe realizar una conexión TCP al servidor deseado, por lo que se añade tanto la dirección del servidor como la definición de la conexión:
server = 'api.thingspeak.com'
connTCP = httplib.HTTPSConnection(server)
Write_apkey = 'GTXNVDI95SFSUDRQ'
Delete_apkey = 'KEJU9WAA6A7VQS2C'
Se pueden poner visualizaciones con print a modo de depuración, es decir, a la hora de ejecutar el código, se se ejecuta la linea print, significa que el programa hasta esa linea es correcto. Se realiza la conexión:print("Estableciendo conexion TCP..."),
connTCP.connect()
print("Conexion TCP establecida")
Una vez realizada la conexión, debemos establecer las reglas del diálogo con el servidor. Empleando la información obtenida del REST API, se incluyen aquellos campos necesarios, que son el formato y la llave de escritura de la que disponemos en nuestra pagina de ThingSpeak.En este código se puede ver el recurso DELETE, la URI relativa a la que apunta el programa, las cabeceras y el contenido del mensaje. Debido a que el contenido del mensaje es una librería Python que el servidor web puede no reconocer, se decodifica a json para realizar una petición que sí entienda.
La última línea sirve para añadir la longitud del mensaje en la librería de la cabecera.
methodC1 = "DELETE"
relative_uriC1 = "/channels/680589/feeds.json"
headersC1 = {'Host': server,
'Content-Type': 'application/x-www-form-urlencoded'}
payloadC1 = {'api_key': Delete_apkey}
payload_encodedC1 = urllib.urlencode(payloadC1)
headersC1['Content-Length'] = len(payload_encodedC1)
Para realizar la conexión y el envío de la petición, se emplea el código a continuación:connTCP.request(methodC1, relative_uriC1, body=payload_encodedC1,
headers=headersC1)
respuestaC1 = connTCP.getresponse()
statusC1 = respuestaC1.status
print(str(statusC1))
El comando STATUS nos va a devolver el resultado de la conexión, siendo 200 una petición correcta.Con esta petición, se ha solicitado el borrado del canal previo a la subida de los datos.
try:
while(True):
cpuPercent = psutil.cpu_percent(interval=15)
ramPercent = psutil.virtual_memory().percent
print("%CPU: " + str(cpuPercent)),
print("\t%RAM: " + str(ramPercent))
method = "POST"
relative_uri = "/update.json"
headers = {'Host' : server,
'Content-Type' :
'application/x-www-form-urlencoded'}
payload ={'api_key' : Write_apkey,
'field1': cpuPercent,
'field2': ramPercent}
payload_encoded = urllib.urlencode(payload)
headers['Content-Length'] = len(payload_encoded)
print("Enviando peticion HTTP..."),
connTCP.request(method, relative_uri, body=payload_encoded,
headers=headers)
print("Peticion enviada")
print("Esperando respuesta HTTP...")
respuesta = connTCP.getresponse()
status = respuesta.status
print(str(status))
except KeyboardInterrupt:
connTCP.close()
print("Se ha pulsado CTRL+C. Saliendo del programa")
EJERCICIO 2: Creación de un canal, subida de datos y borrado del canal al finalizar
Soy Ingeniero Electrónico especializado en automatización y estudiante del máster universitario en ingeniería de control, automatización y robótica. Este blog es parte del aprendizaje necesario para el desarrollo de la asignatura TICs.
sábado, 26 de enero de 2019
Tema 03 - Sesión 03, Preparación (24/01/19)
a ) Ver qué es lo que ocurre cuando se solicita la URI anteriormente indicada.
b) Introducir un DNI válido y ver a qué URI se envía la petición.
La petición se envía a https://august-outlet-228919.appspot.com/obtener Letra. Como tiene espacio, en la petición este se convertirá en un %
c) Obtener los siguientes parámetros:
- Nombre del parámetro asociado al DNI: nan
- Nombre y el valor de los parámetros ocultos adicionales: ezkutua: kalkulatu
d) Editar manualmente en Burp la petición HTTP para obtener la letra y comprobar que la respuesta HTTP contiene la letra en el cuerpo del mensaje.
La petición a enviar será de la forma:
POST /obtener%20Letra HTTP/1.1
Host: august-outlet-228919.appspot.com
Content-Type: application/x-www-form-urlencoded
Content-Length: [largura_mensaje]
nan=22725983&ezkutua=kalkulatu
Donde [largura_mensaje] deberá sustituirse por el valor adecuado en cada caso. Burp lo rellena automáticamente. El valor de nan también deberá modificarse a conveniencia.
| Petición de letra |
| Respuesta entregada por el servidor |
POST /update HTTP/1.1
- [channel api_key] habrá que sustituirlo entero por el api_key del canal.
- [valor_campor_1] y [valor_campor_2]: se deberán sustituir por lo valores que se quieren subir al canal.
- [largura_mensaje]: se deberá sustituir por la largura del mensaje (depende de cada caso y Burp lo rellena automáticamente)
![]() |
| Respuesta del servidor: está vacia |
![]() |
![]() |
POST /update.json HTTP/1.1
La respuesta entregada por el servidor así como los datos actualizados en el canal pueden observarse a continuación:
![]() |
| Respuesta del servidor |


POST /update.xml HTTP/1.1
Content-Type: application/json
Content-Length: [largura_mensaje]
{"api_key":"[channel_api_key]","field1":=[valor_campo_1],"field2":=[valor_campo_2]}
Estudié ingeniería electrónica, industrial y automática en la UPV/EHU. Actualmente estudio el máster de ingeniería de control, automatización y robótica en la Escuela de Ingenería de Bilbao. Este blog forma parte de las tareas a realizar en la asignatura de Aplicación de las TICs en Investigación
martes, 22 de enero de 2019
Tema 03 - Sesión 02 (17/01/19)
En nuestro caso se ha elegido la gratuita, que únicamente permite subir datos limitados en cantidad y tiempo, cada 15 segundos máximo. Sin embargo, para nuestro uso educacional es suficiente. El funcionamiento de este sistema es sencillo.
Soy Ingeniero Electrónico especializado en automatización y estudiante del máster universitario en ingeniería de control, automatización y robótica. Este blog es parte del aprendizaje necesario para el desarrollo de la asignatura TICs.
domingo, 20 de enero de 2019
Tema 03 - Sesión 01 (15/01/19)
Las peticiones HTTP van a ir encapsuladas en una conexión TCP, de esta forma se asegura una la entrega de los datos en secuencia y sin errores. Por otro lado, una conexión TCP viene identificada por el par (IP_Origen – Puerto_Origen)-(IP_Destino-Puerto_Destino).
Todas las aplicaciones de un ordenador tienen un puerto, que le permite al ordenador saber a dónde mandar los paquetes que llegan de Internet.
Las operaciones/métodos que se pueden realizar sobre un recurso son las siguientes:
- Post: permite escribir.
- Get: Permite leer
- Put: permite actualizar
- Delete: permite borrar
Para cargar una página web que a simple vista puede parecer sencillas, se están realizando multitud de transacciones en unos pocos milisegundos. Por ejemplo, solo para cargar la página principal de Google se realizan 9 transacciones-. Sin embargo, para cargar la cuenta de Gmail, se realizan más de 200, que además aumentan de forma constante por estar haciendo peticiones continuas al servidor para mantener la bandeja de entrada actualizada.
Método RequestURI HTTP/1.1
Cabeceras
CRLF*
Cuerpo del mensaje (en octetos**)
HTTP/1.1 Status Descripción
Se profundizará mas en ello en la próxima sesión.
Estudié ingeniería electrónica, industrial y automática en la UPV/EHU. Actualmente estudio el máster de ingeniería de control, automatización y robótica en la Escuela de Ingenería de Bilbao. Este blog forma parte de las tareas a realizar en la asignatura de Aplicación de las TICs en Investigación










