Detección de pulsación de botón a través de la red informática

Me gustaría hacer un dispositivo en red (similar a la llamada de servicio de habitaciones de hotel) que tenga múltiples líneas de entrada que puedan identificarse de forma única en una computadora en la red.

Encontré un producto con una funcionalidad similar.

¿Supongo que el dispositivo requerirá un microcontrolador interconectado con un controlador de E/S Ethernet? ¿Necesito tener un sistema operativo para generar paquetes de mensajes TCP/IP que puedan detectarse en una PC? Amablemente sugiera un esquema de bloques que pueda seguir para hacer esto.

Esta pregunta es demasiado amplia.
@OlinLathrop: De acuerdo, solicito un esquema, puedo comenzar a trabajar, agradecería si obtengo una hoja de ruta y puedo explorar los detalles.

Respuestas (3)

No me queda claro qué es exactamente lo que quieres. Creo que es como lo siguiente: tienes un número de líneas que tendrán que ser interconectadas por un microcontrolador, y este microcontrolador envía una señal a una computadora. La computadora procesa esta señal.

Para la parte del microcontrolador, puede usar un chip con ethernet integrado como el PIC18F67J60 que mencionó Olin. También puede usar un chip más pequeño (más fácil de programar) con un chip ethernet externo como el ENC28J60 . Puede escribir software para el microcontrolador utilizando la pila TCP/IP de Microchip , la pila TCP/IP de Olin Lathrop (consulte la sección "Firmware de ejemplo de red") o la implementación de Matthew Schinkel en Jalv2 .

Dado que el microcontrolador envía una señal a la computadora, lo más fácil es hacer que la computadora sea el servidor y el microcontrolador el cliente. Eso significaría que necesita algún tipo de servidor en la computadora. Te recomiendo que busques un servidor HTTP, porque hay la mayor cantidad de información disponible para él. Para Linux, puede usar un servidor LAMP ; para Windows, use WAMP o XAMPP.

Tendrá que crear un script del lado del servidor que procese la solicitud del cliente. El cliente tiene que llamar a ese script. Podría, por ejemplo, realizar la solicitud del cliente /button.php?button=17cuando se haya presionado el botón número 17. Entonces, el script del lado del servidor podría ser así:

<?php
if (!isset($_GET['button'])) {                    // Check if ?button exists
    die('The button variable is mandatory.');     // If not, quit
}

$button = (int) $_GET['button'];                  // Cast ?button to an integer
if ($button == 0) {                               // Check if it was an integer
    die('Invalid button number.');                // If not, quit
}

// Do stuff with $button

Aquí hay un esquema de bloques:

ingrese la descripción de la imagen aquí

Déjame explicarte esto.

  • Los botones y otras E/S forman la entrada para el microcontrolador que va a utilizar. Estos serían los botones con los que se conectará, pero también podrían ser otras cosas, como dispositivos I2C / SPI, o lo que sea.

  • Puede obtener información de este IO con programación básica de chips . El chip tiene que leer valores de las entradas.

  • El chip (podría ser un PIC) con ethernet (podría estar integrado) procesa la información de entrada y la transmite a la IP del servidor , por ejemplo, 192.168.0.10.

  • Para esto, primero debe enviarse al enrutador en la IP 192.168.0.1 usando la pila TCP/IP . No notarás esto en el chip. Es como ponerse en contacto con el servidor directamente.

  • El enrutador procesa el paquete y lo envía al servidor en 192.168.0.10. No tienes que hacer esto, el enrutador lo hace solo.

  • El servidor recibe una solicitud HTTP y necesita procesarla. Envía una respuesta al enrutador en 192.168.0.10, que la reenvía al chip. Esto no se muestra en el esquema de bloques porque no es necesario en esta aplicación: los datos deben enviarse desde el chip al servidor , pero no de regreso.

  • El servidor puede usar los datos del chip para mostrarlos en una pantalla, almacenarlos en un archivo o hacer otra cosa con ellos. Eso depende completamente de ti.

También puede, como sugiere Olin en los comentarios, usar un servidor TCP en lugar de un servidor HTTP. Esto es posible y más eficiente (que es un profesional teórico, no lo notará). Recomendaría un principiante en redes para ir con un servidor HTTP. Hay un montón de información sobre el tema y es muy fácil empezar. Si ya sabe cosas sobre redes, también puede construir un servidor TCP. Ninguno de los dos servidores sería más complejo de implementar en el lado del cliente.

1: No veo cómo un chip "más pequeño" que el 18F67J60 sería más fácil de programar. El tamaño es ortogonal a la dificultad. La ventaja del '67J60 es que tiene incorporado MAC/PHY. 2: También tengo una pila de red gratuita para la línea 'J60, incluida en la versión de herramientas de desarrollo de PIC en embedinc.com/pic/dload.htm . 3: ¿Por qué la complejidad de HTTP cuando puede crear un servidor TCP simple solo para aceptar datos de estos dispositivos?
Gracias por una respuesta tan detallada. Entonces, si le leí correctamente, el esquema sería leer los pines que se monitorearán, codificarlos en una solicitud HTTP y enviarlos a través de TCP/IP (usando la fuente de la biblioteca que mencionó). En el lado de la PC, decodifique el mensaje y utilícelo en alguna aplicación. ¿Alguna información específica de la red de la que deba ocuparme?
@OlinLathrop 1: el 18F67J60 tiene una hoja de datos de casi 500 páginas. Por ejemplo, el 16F88 tiene menos de la mitad; por lo que podría ser más fácil para los principiantes (incluido yo). 2: gracias, lo editaré. 3: hay mucha más información disponible en los servidores HTTP. Dado que existen soluciones de código abierto para HTTP, no hará que el código sea mucho más complejo.
@OlinLathrop: ¿A qué protocolo de nivel realmente necesito subir dado que mi intención es solo detectar el estado de la línea (Alto/Bajo) en mi aplicación de escritorio?
@Bleamer exactamente. No necesitará detalles específicos de la red, aunque sería útil tener una dirección IP estática o un nombre de host del servidor para que pueda codificarlo en el chip. Además, la codificación de la solicitud HTTP no será tan difícil, es una cadena base con la adición del número de botón.
@CamilStaps: Gracias. ¿Este sería el esquema más minimalista? Perdón por mi comprensión de las redes.
@Bleamer no es el minimalista, sino el más fácil en mi opinión. Agregué un esquema de bloques con una explicación para ti.
@Bleamer no hay problema :) ¡buena suerte!
El PIC 16F88 es demasiado pequeño para admitir una pila de red TCP. Una gran parte del manual '67J60 describe los detalles de MAC/PHY. O usa el software existente para manejarlo, o tiene que leer la hoja de datos equivalente para el MAC/PHY externo. La hoja de datos del '67J60 se ve grande porque está todo en un solo documento.
@OlinLathrop: ¿Sugieres ir con 18F67J60?
@OlinLathrop cierto, es un mal ejemplo. Pero estoy seguro de que hay chips con los que es más fácil empezar que el 18F67J60 que tienen suficiente memoria de programa para una pila TCP/IP. Por otro lado, nunca probé el 18F67J60, y podría ser bastante fácil comenzar con él.
@Bleamer: Estaba pensando en escribir su propio servidor TCP en el extremo de la computadora host. Eso es algo fácil de hacer. Sí, creo que un 18F67J60 es un buen chip para esto, o su hermano mayor, el 18F87J60, si tienes muchos botones para conectar. Es la versión de 80 pines del '67J60 de 64 pines.

Sugeriría usar un microcontrolador de bajo costo que uso llamado "Electric Imp", es pequeño (del tamaño de una tarjeta SD) y contiene todo lo que necesita para tener un botón que haga una conexión segura a través de wifi a Internet e incluso funcione en Potencia de la batería.

Por supuesto, una vez que presiona el botón en Internet, tiene 1001 opciones diferentes con lo que puede hacer con eso.

Una característica realmente agradable es que las actualizaciones de su código se envían al dispositivo desde Internet, por lo que se puede actualizar en el campo.

Obtenga un micro con capacidad Ethernet, como el PIC18F67J60, y conecte todos los botones a él. El micro rebota los botones. Cuando ve actividad que vale la pena informar, abre una conexión TCP a un servidor conocido en un puerto conocido, envía la información y cierra la conexión.