私はデイビッドです。このリポジトリ/記事での私の目標は、可能な限り単純な方法でそれらを説明しようとすることでソケットを分かりやすくすることです。
これらの例では、nodejsと粒子(どのバージョンも実行します)を使用して、ハードウェアがnodejsと通信する方法を示します。しかし、間違いなく、これは私が選択したツールがこれを進める唯一の方法であるという意味ではありません。これは私が個人的に知っていることです。
ネットワーク接続を備えた埋め込みデバイスも同様に機能し、ソケットサポートを備えた言語も実行されます。
レポ構造
ソケットの周りには大きな尺度があると思います。多くの人々が長年にわたってそれらを怖がらせています。私の目標は、彼らがそれほど神秘的でも複雑でもないことを証明することです。最終的には、ソケットについて特定の問題に対するより単純な解決策として考えることを願っています。
特に、すべてのバイトがカウントされる埋め込みシステムで。
ソケットは、すべてのネットワーク接続の基盤です。すべての接続されたデバイスはソケットを使用します。ソケットの上には、プロトコルがあります。これは、データを受信した後に送信または処理する方法を指定するルールに他なりません。人気のあるHTTPプロトコルは、この例です。これを知っていると、ソケットサポートがある言語であらゆるデバイスを模倣できます。どうやって?特定のプロトコル(ルール)に付着するバイトを送信します。これらのルールは、オンラインで自由に利用できます。
次のようなふりをするアプリを作成できます。
なぜ人々はソケットが複雑であると信じているのですか?
おそらく、人々は次のような複雑さを伝える言葉を使う傾向があるからです。
あなたが思うかもしれないこれらのいくつかのポイントを読むだけで、これは私のためではありません。しかし、ソケットは実際には非常に簡単です。たとえば、Webサーバーから応答を取得するには、次のテキストを送信するだけです。
GET / HTTP/1.1
これはそれです。サーバーはこのテキストを取得し、解析し、次を作成していることを理解します。
/contactです。それ以上はありません。プリンターは別のヘッダーを理解します。同様に、DNSサーバーにはそのプロトコルに固有のものが必要です(ルール)。
信じるのは難しいですか? Telnetアプリを使用して、このコマンドを使用してお気に入りのサイトに接続します(ポート80を通じて安全でない接続のみがサポートされます)。
SITE 80GET / HTTP/1.1安全な接続の場合、次のようにOpenSSLを使用できます。
Openssl s_client -connect google.com:443GET / HTTP/1.1別の例は、SMTPサーバーに直接接続して電子メールを送信することです。現在のSMTPサーバーのほとんどは、パスワードで保護され、暗号化を使用するため、これをすばやくテストすることが困難になります。ただし、プレーンSMTPサーバーにアクセスできる場合は、次のように入力できます。
telnet example.com smtpHELO client.example.comMAIL from: <[email protected]>RCPT to: <[email protected]>DATAFrom: [email protected]To: [email protected]Subject: Test messageQUITご覧のとおり、これはそうではありませんか?
プロトコルをよりよく理解できるようになったので、コミュニケーションのための共通の構造を設計する必要があります。家の温度をnodejsサーバーに送りたいとしましょう。あなたのバイトの流れは次のようになる可能性があります:
45,40.1,50,90,100,102.5
コンマは、各測定のセパレーターとして機能します。任意の文字を選択できますが、ご存知のように、コンマがCSV(コンマ分離値)形式とデータを互換性のあるものにします。一方、セパレーターをチェックするコードが必要です。それが起こったとき、あなたはあなたの価値を持っています。
この例からわかるように、ヘッダーまたはオプションのデータはありません。あなたはあなたのプロトコルに何が起こるかを決めます。
上記の例に基づいて、次のようにプロトコルに湿度を追加できます。
45:80,40:85,32.1:82,50:89
繰り返しますが、コンマはデータを分離し、コロンはデータセットを区別します。また:覚えておいてください...プロトコルには良いドキュメントが必要なので、他の開発者が管理しなければならないデータを理解できるようにすることができます。
別の重要なことは、彼の例がASCIIプロトコールについて語っていることです。バイナリのものがどのように機能するかを学ぶために、私が書いた次の記事を読むことができます。
コンピューターは1と0で動作しますが、これは事実です。この例では、コンパイルされたアプリケーションを通常のデータと区別する方法はありません。すべてが一連のビットとして保存されます。つまり、インターネットを介して送信されるデータでさえ1秒と0秒であることを意味します。
あなたはおそらく尋ねているので、なぜ私はタイプを気にする必要があるのです。タイプによっては、バイナリデータが異なるためです。たとえば、 1の整数は00000001で、 31の整数は00011111になります。
これは、接続のもう一方の端で、あなたが何を得ているかを知る必要があることを意味します。簡単な比較をしたいとしましょう。
if ( data == 1 ) {
true
}データを整数であるかのように変換したが、それをcharとして送信した場合、int 31とint 1を比較します。ただし、キャラクターを送信していることがわかっている場合は、適切なタイプと比較できます。
if ( data == '1' ) {
true
}現在、Char 1実際には31あり、比較は機能します。 Hardware2NodeJSサンプルフォルダーには、実際の違いを説明するサンプルコードがあります。
インターネットでは、データを送信するための2つの最も一般的なプロトコルはTCPとUDPです。あなたは、人々が名前の最後に /IPを追加 /IPであることがわかります。 IPは(インターネットプロトコル)の略であり、要するに、インターネットのアドレスシステムと考えることができます。これは、TCPとUDPがデータのパッケージ化の方法であるため、インターネットだけでなくTCPまたはUDPを使用できることを意味します。
TCPとUDPはプロトコルです。今では、この単語がルールを意味することを知っておく必要があります。これらの2つのプロトコルは、データのパッケージ化方法を説明するルールにすぎません。もう一方の端は同じルールを理解しており、受信した情報を解き放つことができ、その逆も同様です。
ほとんどのインターネットはTCPを使用しています。なぜなら、送信したものがもう一方の端で完全に受信されるという保証が必要だからです。たとえば、ドキュメントを送信する場合、文字や単語を欠いている必要はありません。多くの形式では、システムがファイルを理解する方法をシステムに伝えるヘッダーから部品が欠落している場合、システムはファイルが破損しており、読み取れないことを通知します。
もちろん、より回復力があり、データの100%を必要としない形式があります。たとえば、一部の映画、画像、音楽形式には、コンテンツが不足している可能性があり、私たちはそれと一緒に暮らしています。画像や映画には奇妙なアーティファクトがある場合があります。音楽にはいくつかのブリップとノイズがあるかもしれません。
このプロトコルは、ハードウェア製品からデータを送信するときに非常に便利です。セルラーモデムを使用して、多くのデバイスからセンサーデータを収集しているとし、送信する各バイトに対して支払う必要があります。この場合、以下を考慮する必要があります。TCPで持っているより高い忠実度にもっとお金を払う価値はありますか?または、いくつかの測定値の損失を受け入れる方が良いのですが、データ転送の支払いは少なくなりますか?
通常、私はデフォルトでTCPに向かっていますが、それを使用することに対して良いケースがある場合、UDPが次の最良のオプションです。
このリポジトリが、ソケットが何であるかをよりよく理解するのに役立つことを願っています。何かが不明な場合は、Twitterで私を襲ってください。プロジェクトのポイントを修正しようとします。
次のことを含め、このプロジェクトを手伝ってくれたすべての善良な人々に感謝したいと思います。
このプロジェクトを楽しんだ場合は、それを与えることを検討してください。そして、私のgithubアカウントをチェックしてください。ここでは、便利または興味深いものが見つかる可能性のある追加のリソースを見つけることができます。
このプロジェクトは、AWSの上にカスタムソリューションを構築することを専門とするソフトウェア会社である0x4447 LLCによってもたらされます。このリンクをフォローして、詳細をご覧ください:https://0x4447.com。または、[email protected]にメールを送信します。