TODOPIC

Otros Microcontroladores / Dispositivos programables => Raspberry Pi y similares => Mensaje iniciado por: MarioZ12 en 26 de Febrero de 2016, 18:16:54

Título: Socket + Raspi
Publicado por: MarioZ12 en 26 de Febrero de 2016, 18:16:54
Hola gente!!!!!
Estoy intentando hacer un modesto control de ambiente para un vivero que tengo en el patio de mi casa y pensaba en usar socket para transferir los datos ya que tengo señal del Wi-Fi en el vivero. Los socket los tengo funcionando con la info y el ejemplo publicado aquí http://www.firtec.com.ar/cms/10-notas-tecnicas/8-c18 (http://www.firtec.com.ar/cms/10-notas-tecnicas/8-c18) y aquí http://www.firtec.com.ar/cms/10-notas-tecnicas/33-socket-bloqueantes (http://www.firtec.com.ar/cms/10-notas-tecnicas/33-socket-bloqueantes), todo funciona de perlas sin embargo necesito enviar varios datos como temperatura, humedad, etc,  por lo que entiendo necesito varios puertos en la misma IP.
La pregunta es si estoy en lo correcto, es esa la forma de hacerlo?
Alguien tiene algún link con info de como implementar varios puertos en una IP?

Desde ya muchas gracias!!!!
Mario.
Título: Re:Socket + Raspi
Publicado por: KILLERJC en 26 de Febrero de 2016, 18:37:35
Respecto a crear multiples puertos para cada dato, No hace falta... Voy a guiarme por el primer link que pasaste.

El cliente es el que envia los datos... y lo hace aca:

Código: Python
  1. sock.sendto("Voltios:% .2f" % Va, (UDP_IP, UDP_PORT))
Escrito de otra forma:

Código: [Seleccionar]
sock.sendto ( string_a_enviar , direccion_a_enviar(port y ip))
Observaras que envia un string que es "Voltios: %.2f" donde la variable es Va, y lo hace a traves de UDP a ese puerto e IP. Supongamos que enviaste "Voltios: 1.25"
Luego tu servidor:

Código: Python
  1. data, addr = sock.recvfrom(1024)
  2.     label.config(text = data)

Recibe con la primer linea, un buffer de un maximo de hasta 1024 caracteres. es decir  el buffer de entrada tiene el string "Voltios: 1.25", y da como resultado un par de datos:
-  data ( el contenido del buffer )
-  addr desde donde se envia la informacion ( IP del cliente ).

Luego en la segunda linea, lo que hace es cambiarle el texto al "label" (a la etiqueta) es decir lo que se muestra en la pantalla, Lo cual ese string "Voltios: 1.25" lo pone en el label y eso es lo que vos estas viendo.

Luego llama de nuevo a esa funcion para pedir de nuevo los datos.

Si quisieras enviar varias cosas, podrias crear un string y enviarlo... Suponete algo asi:

Código: Python
  1. Voltio = 2
  2. Temperatura = 5
  3. Humedad = 90
  4.  
  5. '''
  6. Creo el string
  7. '''
  8. str_a_enviar = "Voltio: %.2f Temp: %.2f Hum : %.2f" % (Voltio, Temperatura, Humedad)
  9.  
  10. '''
  11. Y ahora envio el string ese
  12. '''
  13. sock.sendto( str_a_enviar, (UDP_IP, UDP_PORT))


Si cambias eso en tu cliente, sin cambiar el servidor, verias algo asi en el label ( o lo que es igual a lo que llega del servidor ):

Citar
Voltio: 2.00 Temp: 5.00 Hum : 90.00


O tambien incluso podes enviar los datos separados por un caracter, supongamos el '-' y la string quedaria:

2.00-5.00-90.00

La cual vos sabes el orden y podes separarlo con un str_recibida.split('-') lo que te devolveria una lista ["2.00","5.00","90.00"]
En fin, tus decisiones a partir de aca.

Obviamente podes encontrar la info de la API en la web, sobre los sockets/split/etc

Python 2.7
https://docs.python.org/2/library/socket.html

Python 3.5
https://docs.python.org/3/library/socket.html

Título: Re:Socket + Raspi
Publicado por: MarioZ12 en 26 de Febrero de 2016, 20:08:01
Siiiiiiiiii genial... eso mismo es lo que quiero hacer...muchas gracias KILLERJC
Estoy dando mis primeros pasos en Python pero no deja de sorprenderme.
Gracias por prestarme tu tiempo, el fin de semana lo pruebo a ver como funciona.

Un cordial saludo!!!
Mario
Título: Re:Socket + Raspi
Publicado por: PalitroqueZ en 26 de Febrero de 2016, 20:49:19
concuerdo con lo escrito por KILLERJC

la única justificación que yo vería en utilizar otro puerto, es que existiera otro dispositivo (otra tarjeta de red física)