Soy David, y mi objetivo con este repositorio/artículo es desmitificar los enchufes tratando de explicarlos de la manera más simple posible.
En estos ejemplos, voy a usar NodeJ y partículas (cualquier versión servirá) para mostrar cómo el hardware puede hablar con NodeJS y viceversa. Pero no se equivoquen, esto no significa que las herramientas que elijo son la única forma de hacerlo. Esto es lo que personalmente sé.
Cualquier dispositivo integrado con conectividad de red funcionará de manera similar, y cualquier idioma con soporte de enchufes también servirá.
La estructura de repo
Creo que hay una gran medida de misterio alrededor de los enchufes. Muchas personas les han hecho sonar aterradores a lo largo de los años, y mi objetivo es demostrar que no son tan misteriosos o complicados. Espero que al final piense en los enchufes como una solución más simple para un problema específico.
Especialmente en sistemas integrados, donde cada byte cuenta.
Los enchufes son la base de toda la conectividad de red. Cada dispositivo conectado usa enchufes. Además de los enchufes, tendrá protocolos, que no son más que reglas que especifiquen cómo los datos deben enviarse o procesarse después de que se reciba. El popular protocolo HTTP es un ejemplo de esto. Sabiendo esto, puede imitar cualquier dispositivo con cualquier idioma que tenga soporte de socket. ¿Cómo? Enviando bytes que se adhieran a protocolos específicos (reglas). Estas reglas están disponibles gratuitamente en línea.
Podrías hacer una aplicación que pretende ser un:
¿Por qué la gente cree que los enchufes son complicados?
Probablemente porque las personas tienden a usar palabras que transmiten complejidad, como:
Con solo leer estos pocos puntos, podrías pensar, esto no es para mí. Pero los enchufes son en realidad muy sencillos. Por ejemplo, para obtener una respuesta de un servidor web, solo necesita enviar el siguiente texto:
GET / HTTP/1.1
Esto es todo. El servidor tomará este texto, lo analizará y comprenderá que está haciendo un:
/contact para obtener la página de contacto.No hay mucho más en eso. Una impresora comprenderá otro encabezado, de manera similar, un servidor DNS necesitará algo específico para su protocolo (reglas).
Difícil de creer? Use una aplicación Telnet para conectarse a su sitio favorito utilizando este comando (solo se admitirá una conexión insegura a través del puerto 80).
SITE 80GET / HTTP/1.1Para una conexión segura, puede usar OpenSSL de la siguiente manera:
Openssl s_client -connect google.com:443GET / HTTP/1.1Otro ejemplo sería enviar un correo electrónico conectando directamente a un servidor SMTP. La mayoría de los servidores SMTP actuales están asegurados por contraseñas y usan el cifrado, lo que hace que sea difícil probarlo rápidamente. Pero si tuviera acceso a un servidor SMTP simple, podría escribir lo siguiente:
telnet example.com smtpHELO client.example.comMAIL from: <[email protected]>RCPT to: <[email protected]>DATAFrom: [email protected]To: [email protected]Subject: Test messageQUITComo puede ver, esto no?.
Ahora que tenemos una mejor comprensión de los protocolos, deberá diseñar una estructura común para la comunicación. Supongamos que desea enviar la temperatura de su casa a su servidor NodeJS. Su flujo de bytes podría verse así:
45,40.1,50,90,100,102.5
La coma actúa como el separador para cada medición. Puede elegir cualquier personaje que desee, pero, solo para saber, la coma hará que sus datos sean compatibles con el formato CSV (valores separados por comas). En el otro extremo, necesita algún código que verifique el separador, y cuando eso suceda, tiene su valor.
Como puede ver en este ejemplo, no hay encabezado u datos opcionales. Usted decide qué va en su protocolo.
Según el ejemplo anterior, puede agregar humedad a su protocolo, como este:
45:80,40:85,32.1:82,50:89
Nuevamente, la coma separa sus datos, mientras que el colon diferencia su conjunto de datos. Además: recuerde ... los protocolos necesitan buena documentación, para que otros desarrolladores puedan dar sentido a los datos que tendrán que administrar.
Otra cosa importante es que su ejemplo habla sobre un protocal de ASCII, para aprender cómo funciona un binario, puede leer el siguiente artículo que escribí titulado: How-to-to-Deconstruct-with-c-c and-nodejs.
Las computadoras funcionan en 1s y 0s, y este es un hecho. No hay forma de que el ejemplo distinga una aplicación compilada de los datos regulares. Todo se almacena como una serie de bits. Lo que significa que incluso los datos que se envían a través de Internet están en 1s y 0s.
Probablemente esté preguntando, entonces, ¿por qué debería preocuparme por los tipos? Porque dependiendo de su tipo, sus datos binarios serán diferentes. Por ejemplo: un número entero de 1 será 00000001 , donde un entero de 31 se convertirá en 00011111 .
Esto significa que, en el otro extremo de la conexión, debe saber lo que está obteniendo. Digamos que quieres hacer una comparación simple.
if ( data == 1 ) {
true
} Si convirtió sus datos como si fuera un entero, pero lo envió como un char, entonces comparará int 31 con int 1 . Pero si sabe que está enviando un personaje, puede compararlo con el tipo correcto:
if ( data == '1' ) {
true
} Ahora Char 1 es en realidad 31 , y la comparación funcionará. En la carpeta de ejemplo Hardware2NodeJS , encontrará un código de muestra que explica la diferencia en la práctica.
En Internet, los dos protocolos más populares para enviar datos son TCP y UDP. Verá que las personas se agregan /ip al final del nombre. IP significa (Protocolo de Internet) y, en resumen, puede considerarlo como el sistema de direcciones de Internet. Esto significa que puede usar TCP o UDP no solo en Internet, ya que TCP y UDP son la forma en que se empaquetan los datos, qué sistema de direcciones usará depende de usted.
TCP y UDP son protocolos, y ahora debe saber que esta palabra significa reglas, y estos dos protocolos no son más que reglas que explican cómo empacar datos. El otro extremo comprende las mismas reglas, y puede desempaquetar la información recibida, y viceversa.
La mayor parte de Internet usa TCP, porque queremos la seguridad de que lo que enviamos se recibirá en su totalidad en el otro extremo. Por ejemplo, si envía un documento, no desea que falten letras o palabras. Con muchos formatos, si faltan piezas en el encabezado, lo que le dice al sistema cómo comprender el archivo, el sistema le informará que el archivo está dañado y no se puede leer.
Por supuesto, hay formatos que son más resistentes y no necesitan el 100 por ciento de los datos. Algunas películas, imágenes y formatos de música, por ejemplo, pueden tener algo de contenido, y solo vivimos con eso. Una imagen o película puede tener algunos artefactos extraños; La música puede tener algunos golpes y ruidos.
Este protocolo es muy útil al enviar datos de productos de hardware. Digamos que estamos recopilando datos del sensor de muchos dispositivos, utilizando un módem celular, y tenemos que pagar por cada byte que enviamos. En este caso, debemos considerar lo siguiente: ¿Vale la pena pagar más por la mayor fidelidad que tendríamos con TCP? ¿O es mejor aceptar la pérdida de algunas medidas, pero pagar menos por nuestra transferencia de datos?
Normalmente, me defraudaría TCP, pero si tiene un buen caso en contra de usarlo, UDP es su próxima mejor opción.
Espero que este repositorio lo haya ayudado a comprender mejor qué son los enchufes. Si algo no estaba claro, golpéame en Twitter e intentaré arreglar cualquier punto en el proyecto que no esté claro.
Quiero agradecer a todas las buenas personas que me ayudaron con este proyecto, incluido:
Si disfrutó de este proyecto, considere darle un?. Y consulte mi cuenta GitHub, donde encontrará recursos adicionales que puede encontrar útiles o interesantes.
Este proyecto es presentado por 0x4447 LLC, una compañía de software que se especializa en la creación de soluciones personalizadas además de AWS. Siga este enlace para obtener más información: https://0x4447.com. Alternativamente, envíe un correo electrónico a [email protected].