MLAのFrameworkでTCP/IPを試して見るその7
(単純なTCPサーバーアプリケーションの実装)

〔PICの動かせ方入門に戻る〕
〔その1〕 〔PING〕 〔TELNET〕 〔SMTP〕 〔XC16編〕 〔TCPclient〕   〔HTTPserver〕


前ページの"その1"では、FrameworkのTCP/IPスタックファイルの話と、tcpip プ ロ ジェクト作成方法の
話を書きましたので先ずはそちらからご覧下さい。
このページでは、単純なTCPサーバーを実装して実験を行います、
(TELNET編と似た様な記事ですがぁ、こちらが更に単純な実装となります)
使用するPICは24EP256MC202(16ビット)です。

これが今回のTCPサーバー構成でのモデルです。
ア プリケーション層
TCPServer
ト ランスポー ト層 
TCP
インターネット 層
IP (ICMP)
ARP
Stack Task
物理層
     ENC28J60

Stack Task
 着信パケットのチェックを行い、上層のスタックモジュールにルーティングします。
 このタスクが"ENC28J60.c"のドライバーを呼び出す事になります。
 タイムリーな応答を確保するために、この関数を定期的に呼び出さなければなりません。
 なのでぇ、アプリケーションを作成する場合は必要最小限のDelayを使い、ステートマシン的な
 小刻みな処理を施す必要が有ります。

ARP
 インターネットの世界ではIPアドレスで送受信を行っていますが、インターネットは
 イーサネットプロトコルを利用しているので相手先のMACアドレスを知らないと送る事が出来ません。
 でぇ、このIPアドレスからMACアドレスの交換を行ってくれるのがARPです。
 交換の仕方はこちら「ア ドレス解決とARP」を参照下さい。
 通知されたMACアドレスは通常キャッシュに記憶されるのですが、このARPにはキャッシュ無りません

IP
 TCP/IPのデバイス間でIPアドレスによるデータの送受信を行います。
 単純にパケットの交換のみが役割で、データの分割も 行う。
 IPプロトコルのフレームフォーマットやヘッダ内容はこちらこちらを 参照しましょう。

ICMP
 IPは通信異常が発生しても報告する機能が無いのでこれを補う為にICMPで通信エラーや
 ネットワークの状況を通知してくれるらしい。
 ICMPには色々な要求メッセージが有る様だが、TCP/IPスタックのICMPは”エコー要求”と
 ”エコー応答”のみっぽいです。
 ICMPのフレームフォーマットは「ICMPとPINGコマンド」を参照しましょう、
 ICMPヘッダについてはこちらも参照しましょう。

 ※ ICMPの実験は、"その2(PING)"の実験1を参照下さい。


TCP
 通信異常や送信完了等の確認を行わない比較的単純な通信を行うUDPに対して
 TCPは1対1 の通信を確立し、送信確認やパケット順のチェックに欠損パケットの再送といった
 事を行うので信頼性の必要な通信で使用されます。
 TCPヘッダについてはこちらも参照しましょう。

TCPServer
 ”C:\microchip\mla\v2016_11_07\apps\tcpip\wifi_demo_app\firmware\src\generic_tcp_server.c”
 のファイルに有る"GenericTCPServer( )"関数を"tcp_server.c"メインファイルに組み込んでいます
 この関数は、TCP上で動作する単純なTCPサーバーを実装します。
 この例は、多くのTCPおよびHTTPサーバーアプリケーションの雛型として使用できます。

《ファイル構成》

"tcpip_config.h"の変更
#define STACK_USE_ICMP_SERVER                // ICMP(PING)はサーバー(Ping query応答)機能を実装する
#define STACK_USE_GENERIC_TCP_SERVER_EXAMPLE // HTTPサーバーのサンプル
上記の2モジュールのみ実装しましょう。
"STACK_USE_ICMP_SERVER"のみなのでPING応答のみ可能です。

追加されるファイル構成

tcp.c
TCPプ ロトコルのモジュールファイル(RFC 793)
Transmission Control Protocol
信頼性の高い、フ ロー制御によるアプリケーションストリーム指向データのハンドシェイク転送を 提供します。

※ ”その2”の最小ファイル構成にC:\microchip\mla\v2016_11_07\framework\tcpip\srcフォルダー
  のtcp.cを加えたものになります。

※ この構成でコンパイルすると、使用メモリは「Program=8735word Data=750byte」です。

《実験回路》

ENC28J60モジュールの ピン構成
ENC28J60モジュール VCC
電源3.3V パケット転送中動作電流180mA
十分に流せる電源を準備しましょう。
GND
グランド
RESET
LOWでリセットなので通常はHIGH
CS
SPIのチップセレクト入力ピン
SCK
SPIのクロック入力ピン
SI
SPIのデータ入力ピン
SO
SPIのデータ出力ピン
WOL
ウェイク アップ用割り込み出力
新チップはNCになっている。
INT
割り込み 出力ピン
CLKOUT
クロック 出力ピン
灰色背景色のピンは今回利用しません。


実態配線図

ここの実験では表示器は使用しません、動作の確認はLED()の点滅にて行います。

ENC28J60 のRESETピンについて
RESETピンはPICのRC1ピンに接続されていますが、これは"ENC28J60,c"の初期化関数(MACInit)でHIGHを出力しているだけ なので、直接VDDに配線すればPICピンが1本利用可となります。
その際は、"system_config.h"の"#define ENC_RST_IO"をコメントにします。

回路電源について
ENC28J60モジュールが3.3Vなので回路電源は3.3Vで統一していますが、
ENC28J60自体の消費電流がパケット転送中で最大 180mA、転送していない時で120mAと
結構電気食いで変動も激しいです。十分に流せる安定化された電源を準備しましょう

《ダウンロードファイルにつ いて》

↓ここからプログラムソースをダウンロードして下さい。
TCPServer_ENC28J60.zip
ファイルの説明とプロジェクトの作成方法は”その1”を参照下さい。
MPLAB X IDE v3.60MPLAB(R) XC16 C Compiler Version 1.30コンパイラを使用しています。

"tcp_server.c" :実験で使用する、単純なTCP(HTTP)サーバアプリケーションサンプルプログラムです。

《実験》

このサンプルでは、起動させると着信接続を待機します。
接続が確立されると、サーバーは全ての着信データを読取り、大文字に変換してエコーバックします。
クライアント側は、
PCのシリアル通信ソフト[Tera Term]の"Telnet"で文字を送信します、
デモを終了するには、Escキーを押します。

@ "tcpip_config.h"のMACアドレス・IPアドレ ス・サブネットマスクは”その1”を見て自分ちの
  ネット環境に合わせて設定は完了していますね。

A プログラムをコンパイルしPICに書き込みましょう。
  tcp_client.c: In function 'main':
  tcp_client.c:101:6: warning: 'TICK' is deprecated
  とワーニングが出るかもですがぁ、気にしなくても良いでしょう、たぶん。

B ENC28J60をネットワークに接続し、回路電源を入れましょう。
  (私はYAHOO!プロバイダーのトリオモデムのAPに繋いでの 実験です)

C でぇ、3秒後に処理開始です、LED()が1秒毎に点滅します
  この後はクライアントからの接続待ちを行っている事でしょう。

D "Tera Term" を起動させます。
TeraTerm接続画面
"tcpip_config.h"のIPアドレスを"ホスト(T):"に設定します。
TCPポート番号が9760番に設定します。
サービスを"Telnet"にチェックを入れ
[OK]ボタンをクリックします。

E ”端末の設定” を行います。
  メニューバーの[設定(S)]→[端末(T)...]を順番にクリックします。
TeraTermの端末設定画面
"ローカルエコー(L)"にチェックを入れます。
"改行コード"の"受信(R):"を”CR+LF”に設定して
[OK]ボタンをクリックします。

F 文字を送ってみましょう。
実行結果画面例えば、"abc"と入力して[ENTER]キーを押せば、
"ABC"と大文字に変換されエコーバックされます。
左図の様なあんばいですね。

終了は[ESC][ENTER]キーを押しましょう。








《その他》

この実験で、簡単なHTTPサーバーアプリケーションの実装は実現出来たと思います、
次回はいよいよブラウザーからHTMLを要求して、スイッチやLEDの状態やアナログ値の表示に、
LEDのON/OFF操作等を行って見たいと思いますがぁ...上手く行くかちょいとぉ心配。



【きむ茶工房ガ レージハウス】
Copyright (C) 2006-2017 Shigehiro Kimura All Rights Reserved.