ArduinoとのイーサネットTCP接続

ArduinoとのイーサネットTCP接続

ArduinoとのイーサネットTCP接続

ソフトウェアの観点から見ると、接続の確立 イーサネット とともに Arduinoの とてもシンプルです。 これを行うには、 イーサネットライブラリ。 このライブラリは、 イーサネットシールド 統合されたものに基づいています W5100、ただし、他の異なるボードやモジュールが存在する、および/または他の統合されたボードやモジュールを使用するものもあります。 ENC28J60。 使用を簡素化し、互換性を高めるために、他のライブラリは(ほぼ)同じものを使用します。 API その イーサネットライブラリ、コード内で同じ (または非常によく似た) 関数が使用されている場合でも、代替ライブラリを元のライブラリと置き換えるか、(名前が異なる場合は) その代わりに代替ライブラリを含めるだけで済みます。 私の場合は、 UIPEイーサネットライブラリ de ノーバート・トゥルーセス このテキストで説明するのと同じプロセスに従います。

UIPEthernet ライブラリで使用する ENC28J60 モジュール

1. イーサネット接続を定義する

の役割を引き受けるかどうか 顧客 のように サーバ、まず最初に関数との接続を定義する必要があります ベギン () パラメータとして渡すことができるのは MACアドレス そしてサーバーを待ちます DHCP ネットワーク上で IPアドレス 構成の残りの部分を指定することも、完全な構成が定義されるまで (オプションで) さらに多くのパラメーターを指定することもできます。

  1. DirecciónMAC (これについてはすでに述べました)
  2. IPアドレス シールドまたはモジュールの
  3. サーバーのIPアドレス DNS (サーバーは XNUMX つだけ)
  4. のIPアドレス ゲートウェイ
  5. ネットマスク

構成が正しくないこと (たとえば、ゲートウェイがネットワークの最初のアドレスではないこと) を避けるために、推定が通常のものでない限り、すべてのパラメーターを指定することをお勧めします。

上記のことから、IP アドレスを表すデータは頻繁に使用する必要があることが明らかなようです。そのため、ライブラリに次のクラスが含まれています。 IPアドレス そこから IP アドレス オブジェクトをインスタンス化します。 それを定義するパラメータはアドレスの XNUMX バイトです IPV4

La MACアドレス このライブラリでは 6 バイトの配列として定義されています。 MAC アドレスは、最初のバイトが製造元とモデルを示し、最後のバイトが特定のデバイスを示す一意の識別子 (であると想定されています) です。 統合された ENC28J60 も購入することを選択しない限り、MAC アドレスは含まれません。 Microchip 社の統合 MAC アドレス (またはブロック全体 はい 宛先のアドレスのうち IEEE デバイスの実行が価値があるほど大きい場合)。 MAC アドレスがない場合は、デバイスが配置されているネットワーク上の他のアドレスと競合しないように注意しながら、MAC アドレスを作成できます。

構成が「手動」ではなく DHCP サーバーを使用して行われた場合、この機能は ローカルIP() サーバーがモジュールに割り当てたアドレスを参照すると便利です。 割り当てられたアドレスを更新するには(対応する時間が経過した場合)、 イーサネットライブラリ 機能を提供します 維持する() また、更新のステータスに対応するコードを返すことによって通知します。

  1. 手術は何の効果もありませんでした
  2. IPアドレス更新エラー
    同じサーバー上で割り当てられた IP アドレスの使用を延長できませんでした
  3. IPアドレスが正常に更新されました
  4. IPアドレスの再バインドに失敗しました
    割り当てられた IP アドレスの使用をどのサーバーでも拡張できませんでした
  5. IPアドレスの再割り当てが正常に完了しました

これまでに説明した情報を使用して、ネットワーク上の DHCP サーバーを介して IP アドレスを構成することによってイーサネット接続を開始する方法の例を作成できます。 次のコード例では、一定期間ごとに IP アドレスの更新を試行し、結果を報告します。

以下の例では、オブジェクトを使用して IP アドレスと残りの構成を手動で割り当てます。 IPアドレス 読みやすくするため、および (より複雑なコードの場合は) アドレスが使用されるたびに (誤って) 書き込まれた場合に発生する可能性のあるエラーを回避するためです。

2. クライアントまたはサーバーモードで接続を開始します。

サーバー モードで接続を開始する場合、他のシステムからの要求をリッスンするのは、開発中のマイクロ制御システムです。 サーバーとして接続を開始するには、次を使用します。 イーサネットサーバー() サーバーがリッスンするポートはパラメーターとして示されます。 イーサネットサーバー() クラスのコンストラクターです サーバー、サーバーとしてすべてのイーサネット操作をサポートします。 最もオーソドックスなのはコンストラクターを呼び出すことですが、 イーサネットサーバー()、クラスを直接使用する例がいくつか見つかることは珍しくありません。 サーバー または、そのインスタンス化システムの使用を選択するイーサネット接続用の代替ライブラリ。

クライアントとしての接続は、サーバー システムにリクエストを送信し、リクエストを待機してそれに応じて応答します。 クライアントとして接続を開始するには、次を使用します。 イーサネットクライアント() クラスのコンストラクターは何ですか クライアント クライアントとしてのすべてのイーサネット操作の起点。

クラスがインスタンス化された瞬間から機能すると想定されるサーバー モードの場合とは異なり (ただし、クライアントに応答するのは実際にインスタンス化された場合のみ)、使用する前にクライアント接続の準備ができていることを確認する必要があります。 接続の開始時に作成されるクライアント オブジェクトをクエリして、それが使用可能かどうかを確認できます。 たとえば、クエリ操作を構造体に含めることができます。 if(イーサネットクライアント) クライアント接続が利用可能な場合にのみ実行します。

3. クライアントとして接続を確立する

すでに述べたように、接続が作成されると、クエリを実行する主導権を握るのはクライアントです。 サーバーはそのイニシアチブを待機し、それに応じて応答します。 したがって、サーバーに接続するのはクライアントであり、これを行うには次のメソッドを使用します。 接続() パラメータとしてサーバーを示します (IP アドレスまたは URL)と ポート 聞く人の中で。

操作の結果に基づいて、関数は値を返します。

  1. (成功) 接続が正常に確立されました
  2. 接続の確立
  3. (タイムアウトしました) 接続が確立されないままタイムアウトが経過しました
  4. (無効なサーバー) サーバーが見つからないか、正しく応答していません
  5. (切り詰められた) 接続が完全に確立される前に切断されました
  6. (INVALID_RESPONSE) サーバーの応答が正しくありません

クエリを開始する前に、関数との接続が動作していることを確認する必要があります。 接続されています() それは戻ってきます true すでに利用可能な場合、または false そうでなければ。

以下の例は、クライアントとしての接続を示しており、サーバーとの接続があるかどうかを 10 秒ごとにチェックします (生産性をまったく意図したものではなく、関数の構文を示すだけです)。実稼働 Web サーバーはあまり好きではありません。

4. データの送信

他のよく知られたクラスと同様に、 シリアル、同様に使用すると、クラスは クライアント y サーバー 機能を持っている

  • 書きます(事実) o 書きます(バッファー、長さ)

    呼び出し元のクライアントまたはサーバー オブジェクトを使用して情報を送信します。 「data」パラメータは単一です バイト o チャリオット 「buffer」は次の配列です バイト o チャリオット 通常テキスト送信用に予約されている次の XNUMX つの関数と比較すると、この関数はバイナリ演算に使用される関数です。

  • 印刷(データ、ベース)

    (使用元のクラスに応じて) クライアントまたはサーバーとして、「データ」に対応する情報をテキストとして送信します。 情報がテキストとして表現されていない場合 (整数など)、オプションのパラメーター「base」を使用して変換を選択できます。これは、それぞれを示す定数 BIN、OCT、DEC、または HEX のいずれかになります。 . 2 進数 (基数 8)、10 進数 (基数 16)、XNUMX 進数 (基数 XNUMX)、および XNUMX 進数 (基数 XNUMX) に対応する基数

  • プリントイン(データ、ベース)

    この操作は、「data」パラメーターで明示的に示された情報の後に、復帰 (\r として表すことができるコード 13) と行末 (コード 10、または\n で表されます) これらのコードは、それぞれ頭字語でよく参照されます。 CR(キャリッジリターン)と LF(ラインフィード)

前の XNUMX つの関数は、クラスの同等の関数と同様に、送信されたバイト数を返します。 シリアル; 上で述べたように、操作は同等です。

5. データの受信

データ送信操作の場合と同様、受信操作も広く使用されているものと同等です。 シリアル。 受信プロトコルも同様です。利用可能な(十分な)データがあるかどうかを確認します(利用できます)そしてその場合はそれらを読んでください


  • 利用可能()

    読み取り可能なバイト数を返します。 この関数は両方のクラスに存在します クライアント として サーバー; 最初のケースでは、サーバーがリクエストに応じて送信し、クライアントが読み取ることができるバイト数を報告します (read)、XNUMX 番目の場合は、操作を実行したクライアント (オブジェクト)、または何もない場合は false。

  • 読んだ()

    受信した情報を読み取るために使用されます。 この機能はクラス内でのみ利用可能です クライアント。 開発中のアプリケーションがサーバーの役割を果たす場合、到着した情報を読み取るために、関数の応答でクライアント オブジェクトをインスタンス化する必要があります。 利用可能() 前のセクションで説明しました。

次の例は、ポート 2000 でリッスンし、送信された内容を可能な限りすべて大文字でリクエストに応答する「大文字サーバー」です。 たとえば、次のようにテストできます。 PUTTY または単に telnet 2000 これは確かにあまり実用的ではありません。その目的は、クライアントによって送信されたデータをサーバーから取得する方法を示すことだけです。

6. 接続を終了する

サーバー アプリケーションが無期限に機能するのは通常ですが、クライアント接続は確立され、接続が確立され、終了されるため、リソースが回復されて他の接続で使用されたり、プログラムの他の用途に使用されたりすることができます。 関数 停() クラスの クライアント これは、クライアント接続を終了し、使用しているリソースを解放するために使用されます。

サーバーの場合、クエリの情報オブジェクトが送受信されたときにクライアントが接続を終了するという事実により、リソースを解放して他の接続や別の目的に割り当てることができます。 つまり、些細なことのように見えますが、クライアントの操作が終了したら接続を終了することをお勧めします。

クライアント接続を終了するときのもう XNUMX つの良い習慣は、 クラスが使用するもの。 これを行うには、次の機能が利用可能です 流す() クライアント接続を終了した後に呼び出す必要があります 停()

HTTP GET クエリの例

上記すべてをより明確にするために、より完全なリクエストの例を以下に示します。 TCP GET リクエストを使用する HTTPプロトコル。 この例では、Arduino ボードに接続されたアナログ センサーによって取得された値が Web サーバーに送信され、データベースに保存されます。

コメントを投稿

見逃したかもしれません