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モジュールの
ピン構成
|
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.60 とMPLAB(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" を起動させます。
"
tcpip_config.h"の
IPアドレスを"
ホスト(T):"に設定します。
TCPポート番号が9760番に設定します。
サービスを"
Telnet"に
チェックを入れて
[OK]ボタンをクリックします。
E ”端末の設定” を行います。
メニューバーの[設定(S)]→[端末(T)...]を順番にクリックします。
"
ローカルエコー(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.