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モジュールの
ピン構成
|
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.60 とMPLAB(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”と実行させて下さい。
とぉ、こんな感じにPICが応答を返し表示されるでしょう。
これでネットに接続できている事が確認取れましたね。
F "Tera Term"
を起動させます。
LCDに表示されている
IPアドレスを"
ホスト(T):"に設定します。
TCPポート番号が23番である事を確認します。
サービスを"
Telnet"に
チェックを入れて
[OK]ボタンをクリックします。
とぉ、こんな感じで表示されるでしょう。
G ”端末の設定”
を行います。
メニューバーの[設定(S)]→[端末(T)...]を順番にクリックします。
"
ローカルエコー(L)"に
チェックを入れます。
"改行コード"の"
送信(M):"を”
CR+LF”に設定して
[
OK]ボタンをクリックします。
H ログインし
ます。
こんな感じぃみたいなぁ。
パスワード表示で"\xff\xfd\x2d"のコードを送信しているのですがぁ、
これはロケールコードの様でエコーを抑制して文字を見えなくする様な感じぃ
みたいなぁ、でも上手く機能していなさそう??
I LEDを点灯さ
せます。
"LED ON"と"LED OFF"とコマンドを入力すれば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-2020 Shigehiro Kimura All Rights Reserved.