Je suis David, et mon objectif avec ce référentiel / article est de démystifier les prises en essayant de les expliquer de la manière la plus simple possible.
Dans ces exemples, je vais utiliser Nodejs et Particle (toute version fera l'affaire) pour montrer comment le matériel peut parler avec NodeJS, et vice versa. Mais ne vous y trompez pas, cela ne signifie pas que les outils que je choisis sont le seul moyen de procéder à ce sujet. C'est ce que je sais personnellement.
Tout périphérique intégré avec connectivité réseau fonctionnera de la même manière, et toute langue avec prise en charge des sockets fera également l'affaire.
La structure de réapprovisionnement
Je crois qu'il y a une large mesure de mystère autour des prises. Beaucoup de gens les ont fait sonner effrayants au fil des ans, et mon objectif est de prouver qu'ils ne sont pas aussi mystérieux ou compliqués. J'espère qu'en fin de compte, vous allez considérer les sockets comme une solution plus simple à un problème spécifique.
En particulier dans les systèmes intégrés, où chaque octet compte.
Les prises sont la base de toute la connectivité réseau. Chaque appareil connecté utilise des sockets. En plus des sockets, vous aurez des protocoles, qui ne sont rien d'autre que des règles qui spécifient comment les données doivent être envoyées ou traitées après sa réception. Le protocole HTTP populaire en est un exemple. Sachant cela, vous pouvez imiter n'importe quel appareil avec n'importe quelle langue qui a une prise en charge de socket. Comment? En envoyant des octets qui adhèrent à des protocoles spécifiques (règles). Ces règles sont disponibles gratuitement en ligne.
Vous pourriez créer une application qui prétend être A:
Pourquoi les gens croient-ils que les prises sont compliquées?
Probablement parce que les gens ont tendance à utiliser des mots qui transmettent la complexité, comme:
Juste en lisant ces quelques points que vous pourriez penser, ce n'est pas pour moi. Mais les prises sont en fait très simples. Par exemple, pour obtenir une réponse d'un serveur Web, il vous suffit d'envoyer le texte suivant:
GET / HTTP/1.1
C'est ça. Le serveur prendra ce texte, l'analysera et comprendra que vous faites un:
/contact pour obtenir la page de contact.Il n'y a pas grand-chose plus. Une imprimante comprendra un autre en-tête, de même qu'un serveur DNS aura besoin de quelque chose de spécifique à son protocole (règles).
Difficile à croire? Utilisez une application Telnet pour vous connecter à votre site préféré en utilisant cette commande (seule une connexion insécurité sera prise en charge via le port 80).
SITE 80GET / HTTP/1.1Pour une connexion sécurisée, vous pouvez utiliser OpenSSL comme suit:
Openssl s_client -connect google.com:443GET / HTTP/1.1Un autre exemple serait d'envoyer un e-mail en se connectant directement à un serveur SMTP. Les serveurs SMTP les plus récents sont sécurisés par les mots de passe et utilisent le chiffrement, ce qui rend difficile le test rapidement. Mais si vous aviez accès à un serveur SMTP ordinaire, vous pouvez simplement taper ce qui suit:
telnet example.com smtpHELO client.example.comMAIL from: <[email protected]>RCPT to: <[email protected]>DATAFrom: [email protected]To: [email protected]Subject: Test messageQUITComme vous pouvez le voir, ce n'est pas le cas ?.
Maintenant que nous avons une meilleure compréhension des protocoles, vous devrez concevoir une structure commune pour la communication. Disons que vous souhaitez envoyer la température de votre maison à votre serveur Nodejs. Votre flux d'octets pourrait ressembler à ceci:
45,40.1,50,90,100,102.5
La virgule agit comme séparateur pour chaque mesure. Vous pouvez choisir n'importe quel personnage que vous souhaitez, mais, juste pour que vous sachiez, la virgule rendra vos données compatibles avec le format CSV (valeurs séparées par virgule). À l'autre extrémité, vous avez besoin d'un code qui vérifiera le séparateur, et lorsque cela se produit - vous avez votre valeur.
Comme vous pouvez le voir à partir de cet exemple, il n'y a ni en-tête ni données facultatives. Vous décidez ce qui se passe dans votre protocole.
Sur la base de l'exemple ci-dessus, vous pouvez ajouter de l'humidité à votre protocole, comme ceci:
45:80,40:85,32.1:82,50:89
Encore une fois, la virgule sépare vos données, tandis que le côlon différencie votre ensemble de données. Aussi: N'oubliez pas ... les protocoles ont besoin d'une bonne documentation, afin que d'autres développeurs puissent donner un sens aux données qu'ils devront gérer.
Une autre chose importante est que son exemple parle d'un protocalle ASCII, pour savoir comment fonctionne un binaire, vous pouvez lire l'article suivant que j'ai écrit intitulé: Comment-Deconstrucd-ping avec-c-and-nodejs.
Les ordinateurs fonctionnent en 1 et 0, et c'est un fait. Il n'y a aucun moyen pour l'exemple de distinguer une application compilée des données régulières. Tout est stocké comme une série de bits. Ce qui signifie que même les données envoyées sur Internet sont en 1 et 0.
Vous demandez probablement, alors pourquoi devrais-je me soucier des types. Parce que selon votre type, vos données binaires seront différentes. Par exemple: un entier de 1 sera 00000001 , où un entier de 31 deviendra 00011111 .
Cela signifie que, à l'autre bout de la connexion, vous devez savoir ce que vous obtenez. Disons que vous voulez faire une comparaison simple.
if ( data == 1 ) {
true
} Si vous avez converti vos données comme s'il s'agissait d'un entier, mais que vous l'avez envoyé en tant que char, vous comparerez Int 31 à Int 1 . Mais si vous savez que vous envoyez un personnage, vous pouvez le comparer avec le bon type:
if ( data == '1' ) {
true
} Maintenant, Char 1 est en fait 31 , et la comparaison fonctionnera. Dans le dossier Hardware2NodeJS , vous trouverez un exemple de code qui explique la différence dans la pratique.
Sur Internet, les deux protocoles les plus populaires pour l'envoi de données sont TCP et UDP. Vous verrez que les gens ajoutent / ip à la fin du nom. IP signifie (Internet Protocol) et, en bref, vous pouvez le considérer comme le système d'adresse d'Internet. Cela signifie que vous pouvez utiliser TCP ou UDP non seulement sur Internet, car TCP et UDP sont la façon dont les données sont emballées, quel système d'adresse que vous utiliserez dépend de vous.
TCP et UDP sont des protocoles, et maintenant vous devez savoir que ce mot signifie des règles, et ces deux protocoles ne sont rien de plus que des règles expliquant comment emballer les données. L'autre extrémité comprend les mêmes règles et peut déballer les informations reçues, et vice versa.
La plupart d'Internet utilise TCP, car nous voulons l'assurance que ce que nous envoyons sera reçu dans son intégralité à l'autre bout. Par exemple, si vous envoyez un document, vous ne voulez pas que des lettres ou des mots soient manquants. Avec de nombreux formats, si des pièces manquent de l'en-tête, qui indique au système comment comprendre le fichier, le système vous informera que le fichier est corrompu et ne peut pas être lu.
Bien sûr, il existe des formats plus résilients et n'ont pas besoin de 100% des données. Certains films, images et formats musicaux, par exemple, peuvent manquer du contenu, et nous vivons avec cela. Une image ou un film peut avoir des artefacts étranges; La musique pourrait avoir des blips et des bruits.
Ce protocole est très utile lors de l'envoi de données à partir de produits matériels. Disons que nous collectons des données de capteurs à partir de nombreux appareils, en utilisant un modem cellulaire, et nous devons payer pour chaque octet que nous envoyons. Dans ce cas, nous devrions considérer ce qui suit: vaut-il la peine de payer plus pour la fidélité plus élevée que nous aurions avec TCP? Ou est-il préférable d'accepter la perte de certaines mesures, mais de payer moins pour notre transfert de données?
Normalement, je ferais défaut vers TCP, mais si vous avez un bon cas contre l'utiliser, UDP est votre prochaine meilleure option.
J'espère que ce référentiel vous a aidé à mieux comprendre ce que sont les prises. Si quelque chose n'était pas clair, frappez-moi sur Twitter et j'essaierai de corriger tous les points du projet qui ne sont pas clairs.
Je tiens à remercier toutes les bonnes personnes qui m'ont aidé avec ce projet, notamment:
Si vous avez apprécié ce projet, envisagez de lui donner un ?. Et consultez mon compte GitHub, où vous trouverez des ressources supplémentaires que vous pourriez trouver utiles ou intéressantes.
Ce projet vous est présenté par 0x4447 LLC, une société de logiciels spécialisée dans la construction de solutions personnalisées en plus d'AWS. Suivez ce lien pour en savoir plus: https://0x4447.com. Alternativement, envoyez un e-mail à [email protected].