. E-1 Controlando sensores virtuales desde python

Hemos visto como podemos comunicarnos con el socket (42001) de Scratch a través de telnet pero sólo para recibir mensajes. Ahora veremos un pequeño programa de python con el que vamos a poder crear y asignar valores a sensors virtuales.

 

Este programa sólo tiene una función sendScratchCommand(cmd) para calcular el tamaño del mensaje (comando) que se enviará.

 

Abre el socket en el host 127.0.0.1 y puerto 42001.

 

Solicita información del sensor/broadcast por teclado con la estructura:

  1. El primer texto debe ser sensor o broadcast según lo que queramos enviar
  2. El segundo, el nombre del sensor (si enviamos un comando de sensor virtual) o el mensaje para el boradcast
  3. El tercero (sólo para sensor) el valor del sensor.

 

Finálmente se calcula el tamaño del mensaje y se envía al socket.

 

 

 

 

 

 

 

Como ejemplo veremos el efecto de las dos siguientes llamadas al programa python:

python sensor_virtual.py
connecting...
connected
formato:      [sensor | broadcast] nombre_sensor num: sensor control_luz 12
closing socket...
done

 

python sensor_virtual.py
connecting...
connected
formato:      [sensor | broadcast] nombre_sensor num: broadcast prueba_mensaje
broadcast "prueba_mensaje"
closing socket...
done

 

Si ahora miramos en Scratch veremos:

 

Podemos usar el mensaje nuevo_mensaje para lanzar cualquier acción.

Podemos utilizar el valor del sensor control_luz para tomar cualquier decisión.

 

Con un programa similar incrustado en una página web podríamos controlar un programa de Scratch desde cualquier punto de Internet, o se podría controlar cualquier accionador de Arduino también desde cualquier ordenador conectado a Internet. Por ejemplo se podría encender o apagar una cámara desde cualquier parte del mundo.

 

 


Código python para poder copiarlo

from array import array
import socket
import time

HOST = '127.0.0.1'
PORT = 42001

def sendScratchCommand(cmd):
    n = len(cmd)
    a = array('c')
    a.append(chr((n >> 24) & 0xFF))
    a.append(chr((n >> 16) & 0xFF))
    a.append(chr((n >>  8) & 0xFF))
    a.append(chr(n & 0xFF))
    scratchSock.send(a.tostring() + cmd)

print("connecting...")
scratchSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
scratchSock.connect((HOST, PORT))
print("connected")

resp=raw_input("formato:      [sensor | broadcast] nombre_sensor num: ")
datos=resp.split(' ')

opcion=datos[0]

if opcion == "sensor" :
        sensor=datos[1]
        valor=datos[2]
        comando= "sensor-update " + sensor + " " + valor
        sendScratchCommand(comando)
if opcion == "broadcast" :
        sensor=datos[1]
        mensaje="broadcast \"" + sensor +"\""
        print mensaje
        sendScratchCommand(mensaje)

print("closing socket...")
scratchSock.close()
print("done")