Sou David, e meu objetivo com este repositório/artigo é desmistificar os soquetes, tente explicá -los da maneira mais simples possível.
Nesses exemplos, vou usar o NodeJS e o Partícula (qualquer versão serve) para mostrar como o hardware pode conversar com o NodeJS e vice -versa. Mas não se engane, isso não significa que as ferramentas que eu escolho são a única maneira de fazer isso. É isso que eu pessoalmente conheço.
Qualquer dispositivo incorporado com conectividade de rede funcionará da mesma forma, e qualquer idioma com suporte de soquetes também servirá.
A estrutura do repo
Eu acredito que há uma grande medida de mistério em torno de soquetes. Muitas pessoas os fizeram parecer assustadores ao longo dos anos, e meu objetivo é provar que não são tão misteriosos ou complicados. Espero que, no final, você pense nos soquetes como uma solução mais simples para um problema específico.
Especialmente em sistemas incorporados, onde todos os bytes contam.
Os soquetes são a base para toda a conectividade de rede. Todo dispositivo conectado usa soquetes. No topo dos soquetes, você terá protocolos, que não são mais nada além de regras que especificam como os dados devem ser enviados ou processados após o recebimento. O popular protocolo HTTP é um exemplo disso. Sabendo disso, você pode imitar qualquer dispositivo com qualquer idioma que tenha suporte ao soquete. Como? Enviando bytes que aderem a protocolos específicos (regras). Essas regras estão disponíveis gratuitamente online.
Você pode fazer um aplicativo que finge ser A:
Por que as pessoas acreditam que os soquetes são complicados?
Provavelmente porque as pessoas tendem a usar palavras que transmitem complexidade, como:
Apenas lendo esses poucos pontos que você pode pensar, isso não é para mim. Mas os soquetes são realmente muito diretos. Por exemplo, para obter uma resposta de um servidor da web, você só precisa enviar o seguinte texto:
GET / HTTP/1.1
É isso. O servidor levará este texto, analisá -lo e entenderá que você está fazendo:
/contact para obter a página de contato.Não há muito mais nisso. Uma impressora entenderá outro cabeçalho, da mesma forma que um servidor DNS precisará de algo específico para seu protocolo (regras).
Difícil de acreditar? Use um aplicativo Telnet para conectar -se ao seu site favorito usando este comando (apenas uma conexão insegura será suportada pela porta 80).
SITE 80GET / HTTP/1.1Para uma conexão segura, você pode usar o OpenSSL da seguinte maneira:
Openssl s_client -connect google.com:443GET / HTTP/1.1Outro exemplo seria enviar um email conectando -se diretamente a um servidor SMTP. A maioria dos servidores SMTP atuais é protegida por senhas e usa a criptografia, o que dificulta o teste rapidamente. Mas se você tivesse acesso a um servidor SMTP simples, você poderá digitar o seguinte:
telnet example.com smtpHELO client.example.comMAIL from: <[email protected]>RCPT to: <[email protected]>DATAFrom: [email protected]To: [email protected]Subject: Test messageQUITComo você pode ver, não é?
Agora que temos uma melhor compreensão dos protocolos, você precisará projetar uma estrutura comum para a comunicação. Digamos que você queira enviar a temperatura da sua casa para o seu servidor NodeJS. Seu fluxo de bytes poderia parecer assim:
45,40.1,50,90,100,102.5
A vírgula atua como o separador para cada medição. Você pode escolher qualquer caractere que desejar, mas, apenas para saber, a vírgula tornará seus dados compatíveis com o formato CSV (valores separados por vírgula). Por outro lado, você precisa de algum código que verifique o separador e, quando isso acontecer - você tem seu valor.
Como você pode ver neste exemplo, não há cabeçalho ou dados opcionais. Você decide o que vai no seu protocolo.
Com base no exemplo acima, você pode adicionar umidade ao seu protocolo, assim:
45:80,40:85,32.1:82,50:89
Novamente, a vírgula separa seus dados, enquanto o cólon diferencia seu conjunto de dados. Além disso: lembre -se ... os protocolos precisam de uma boa documentação, para que outros desenvolvedores possam entender os dados que terão que gerenciar.
Outra coisa importante é que o exemplo dele fala sobre uma protocall ASCII, para saber como um binário funciona, você pode ler o seguinte artigo que escrevi intitulado: Como de como-decostruir-With-Cith-C-NodeJS.
Os computadores trabalham em 1s e 0s, e isso é um fato. Não há como o exemplo distinguir um aplicativo compilado de dados regulares. Tudo é armazenado como uma série de bits. O que significa que mesmo os dados enviados pela Internet estão em 1s e 0s.
Você provavelmente está perguntando, então por que devo me preocupar com os tipos. Porque, dependendo do seu tipo, seus dados binários serão diferentes. Por exemplo: Um número inteiro de 1 será 00000001 , onde um número inteiro de 31 se tornará 00011111 .
Isso significa que, no outro extremo da conexão, você precisa saber o que está recebendo. Digamos que você queira fazer uma comparação simples.
if ( data == 1 ) {
true
} Se você converteu seus dados como se fosse um número inteiro, mas você os enviou como um char, comparará Int 31 com Int 1 . Mas se você souber que está enviando um personagem, pode compará -lo com o tipo certo:
if ( data == '1' ) {
true
} Agora, o char 1 tem 31 , e a comparação funcionará. Na pasta Exemplo de Hardware2NodeJS , você encontrará código de exemplo que explica a diferença na prática.
Na Internet, os dois protocolos mais populares para enviar dados são TCP e UDP. Você verá que as pessoas adicionam /IP no final do nome. IP significa (Internet Protocol) e, em suma, você pode pensar nisso como o sistema de endereços da Internet. Isso significa que você pode usar o TCP ou o UDP não apenas na Internet, porque o TCP e o UDP são a maneira como os dados são embalados, qual sistema de endereço você usará com você.
TCP e UDP são protocolos e, a essa altura, você deve saber que essa palavra significa regras, e esses dois protocolos nada mais são do que regras que explicam como embalar dados. O outro lado entende as mesmas regras e pode descompactar as informações recebidas e vice -versa.
A maior parte da Internet usa o TCP, porque queremos a garantia de que o que enviamos será recebido na íntegra no outro lado. Por exemplo, se você enviar um documento, não deseja que as letras ou palavras faltem. Com muitos formatos, se as peças estiverem ausentes no cabeçalho, o que informa ao sistema como entender o arquivo, o sistema informará que o arquivo está corrompido e não pode ser lido.
Obviamente, existem formatos mais resilientes e não precisam de 100 % dos dados. Alguns filmes, imagens e formatos de música, por exemplo, podem ter algum conteúdo faltando, e nós apenas vivemos com isso. Uma imagem ou filme pode ter alguns artefatos estranhos; A música pode ter alguns brinquedos e ruídos.
Este protocolo é muito útil ao enviar dados de produtos de hardware. Digamos que estamos coletando dados de sensores de muitos dispositivos, usando um modem celular, e temos que pagar por cada byte que enviamos. Nesse caso, devemos considerar o seguinte: vale a pena pagar mais pela fidelidade mais alta que teríamos com o TCP? Ou é melhor aceitar a perda de algumas medidas, mas pagar menos pela nossa transferência de dados?
Normalmente, eu não havia como padrão o TCP, mas se você tiver um bom caso contra usá -lo, o UDP é sua próxima melhor opção.
Espero que este repositório tenha ajudado você a entender melhor o que são os soquetes. Se algo não estivesse claro, me acerte no Twitter, e tentarei corrigir quaisquer pontos no projeto que não sejam claros.
Quero agradecer a todas as pessoas boas que me ajudaram com este projeto, incluindo:
Se você gostou deste projeto, considere dar um? E confira minha conta do Github, onde você encontrará recursos adicionais que poderá achar úteis ou interessantes.
Este projeto é trazido a você pela 0x4447 LLC, uma empresa de software especializada na criação de soluções personalizadas sobre a AWS. Siga este link para saber mais: https://0x4447.com. Como alternativa, envie um e -mail para [email protected].