MLAのFrameworkでTCP/IPを試して見るその3
(TELNETサーバー)

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


前ページの"その1"では、FrameworkのTCP/IPスタックファイルの話と、tcpipプ ロ ジェクト作成方法の
話を書きましたので先ずはそちらからご覧下さい。
このページでは、TCPモジュールを 使ってTELNETサーバーの動作を実験してみます。
尚、PING動作の実験と”データのカプセル化”の話は"その2(PING)"を参照下さい。


これが今回のTELNETサーバー構成でのモデルです。
ア プリケーション層
TELNET
ト ランスポー ト層 
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ヘッダについてはこちらも参照しましょう。

TELNET
 インターネット通信を行う端末間やプロセス間で遠隔操作等の汎用的な通信を行う
 プロトコル(こち らも)でTCPモジュールで通信を行います。

《ファイル構成》


"tcpip_config.h"の変更
#define STACK_USE_ICMP_SERVER     // ICMP(PING)はサーバ(Ping query応答)機能を実装する
#define STACK_USE_TELNET_SERVER  // Telnet サーバの実装
上記の2モジュールのみ実装しましょう。
"STACK_USE_ICMP_SERVER"のみなのでPING応答のみ可能です。
これにより"TCP"モジュールも追加されます。

追加されるファイル構成

telnet.c TELNET サーバープロトコルのモジュールファイル(RFC 854)
Teletype network
TelnetサービスのTCPポートは23番で提供します。
このモジュールは、Microchipのデモボード用だったので改造しています。
tcp.c
TCPプ ロトコルのモジュールファイル(RFC 793)
Transmission Control Protocol
信頼性の高い、フ ロー制御によるアプリケーションストリーム指向データのハンドシェイク転送を 提供します。

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

※ この構成でコンパイルすると、使用メモリは「Program=29128byte Data=542byte」です。
  PIC18F26K22では、44%もプログラムメモリを消費しました。

※ "STACK_USE_SSL_SERVER"のコメントを外せばSSLモジュールが追加されてTELNETで使用出来る
  仕掛けが有るのでやってみたがぁ...下記の様なエラー出現じゃ〜ぁ。

コンパイルエラー画面
メモリの関係か?PIC18ではサポートしないと来たもんじゃやき。

《実験回路》

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


実態配線図

LCD表示 器についての配線等の詳細はこ ちらのページを参照下さい。
尚、LCDは無くてもOKです。
又、半固定抵抗は10kΩか20kΩ辺りで良いでしょう。

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と
結構電気食いで変動も激しいです。十分に流せる安定化された電源を準備しましょう

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

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

《実験》

PIC側が"TELNETサーバー"です、PC側は"Tera Term"をTELNETのクライアントで 接続します。
"Tera Term"からPICのスイッチ状態と半 固定抵抗のアナログ値を要求する"STATE"コマンド
LEDの点灯・消灯を要求する"LED ON/OFF"コマンドを 発行する事が出来ます。

尚、この実験ではNBNSモジュールを実装していないのでホスト名 (NetBIOS名)での指定は出来ません
固定のIPアドレスを使います、ホスト名で行いたい人は"STACK_USE_NBNS"を有効にして下さい、
但し、プログラム容量は49%になりますよ。

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

A プログラムをコンパイルしPICに書き込みましょう。
  ”framework/tcpip/src/tcp.c:1943: warning: (343) implicit return at end of non-void function”
  ”framework/tcpip/src/tcp.c:2107: warning: (343) implicit return at end of non-void function”
  ”framework/tcpip/src/common/helpers.c:1370: warning: (1496) arithmetic on pointer to void
   yields Undefined Behavior”
  とワーニングが出るかもですがぁ、気にしなくても良いでしょう、たぶん。

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

C LCDの1行目に[  Test to TELNET  ]が表示されます。

D でぇ、3秒後に処理開始です、LED()が1秒毎に点滅します
  LCDの2行目に"tcpip_config.h"で設定した IPアドレスが表示されます。
  [ My IP Address  ]
  [192.168.3.105    ]  ←は自分が設定したIPアドレスが表示されます がぁ以下はこれで説明

E PCのコマ ンドプロンプト画面を起動させ”ping 192.168.3.105”と実行させて下さい。
PING実行画面
 とぉ、こんな感じにPICが応答を返し表示されるでしょう。
これでネットに接続できている事が確認取れましたね。

F "Tera Term" を起動させます。
TeraTerm接続画面
LCDに表示されているIPアドレスを"ホスト(T):"に設定します。
TCPポート番号が23番である事を確認します。
サービスを"Telnet"にチェックを入れ
[OK]ボタンをクリックします。

LOGIN画面1
とぉ、こんな感じで表示されるでしょう。

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

H ログインし ます。
LOGIN画面2
こんな感じぃみたいなぁ。
パスワード表示で"\xff\xfd\x2d"のコードを送信しているのですがぁ、
これはロケールコードの様でエコーを抑制して文字を見えなくする様な感じぃ
みたいなぁ、でも上手く機能していなさそう??

I LEDを点灯さ せます。
  "LED ON"と"LED OFF"とコマンドを入力すればLED()の点灯と消灯が出来ます。
LEDコマンド画面
こんな感じぃ

J PICの状態を 表示させましょう。
  "STATE"コマンドを使えば、スイッチの状態 と半固定抵抗のアナログ値を得る事が出来ます。
状態表示コマンド画面
"STATE"を実行する際にスイッチを押して行うとぉ
"Button: ON"と表示されちゃいます。

K 'q'かぁ'Q'を入力すると"Goodbye!"を表示 し1秒後に終了します。

《その他》

PICにコマンドを与えて何か動作させる様な使い方なら今回の方法が良さげぇな気がしなくもない。
プログラム容量もそこそこだしぃみたいなぁ。

次回以降は、HTTP/SMTP/POP3辺りを行いたいがぁ...
HTTPサーバーは”MPFS”モジュールが面倒そうだしぃ、
POP3はモジュールがないので1から作らないとだしぃ、
SMTPにしようかなぁ、あ、HTTPクライアントなら....どうしようかな?




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