MLAのFrameworkでTCP/IPを試して見るその6
(単純なTCPクライアント実装:URLでアクセスする)
〔PICの動かせ方入門に戻る〕
〔その1〕
〔PING〕
〔TELNET〕
〔SMTP〕
〔XC16編〕
〔TCPserver〕
〔HTTPserver〕
前ページの"その1"では、FrameworkのTCP/IPスタックファイルの話と、tcpipプロジェクト作成方法の
話を書きましたので先ずはそちらからご覧下さい。
このページでは、URL(www.google.com)
でアクセスするTCP(HTTP)クライアントの実験を行います、
使用するPICは24EP256MC202(16ビット)となります。
これが今回のTCPクライアント構成でのモデルです。
ア
プリケーション層
|
DNS |
TCPClient
|
ト
ランスポー
ト層
|
UDP |
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を参照下さい。
UDP
送信完了等の確認を行わない比較的単純なプロトコル(こち
らも見ておこう)。
通信中のデータ異常への対応などは上位のプロトコル(アプリケーション層)で行います。
信頼性を重視する必要が無く、速度を重視するアプリケーション
で使用されます。
信頼性を重視する場合は"TCPプロトコル"を使用します
TCP
通信異常や送信完了等の確認を行わない比較的単純な通信を行うUDPに対して
TCPは1対1
の通信を確立し、送信確認やパケット順のチェックに欠損パケットの再送といった
事を行うので信頼性の必要な通信で使用されます。
TCPヘッダについてはこちらも参照しましょう。
DNS
今回追加するのは、"DNSクライアント"部分のみで
す、"DNSサーバー"側は含まれません。
DNSは名前解決機能が有り、ホスト名からIPアドレスに変換する為にDNSサーバーへ
問い合わせパケット(正引き)
の発行処理を行います。
※ 今回は"TCPクライアント"の名前解決に用いる為に"DNS"が追加されます。
(ここの実験では、Google:"www.google.com"の名前解決で使用されます)
※ DNSの実験は、"その2(PING)"の実験3を参照下さい。
TCPClient
”C:\microchip\mla\v2016_11_07\apps\tcpip\wifi_demo_app\firmware\src\generic_tcp_client.c”
のファイルに有る"GenericTCPClient(
)"関数を"tcp_client.c"メインファイルに組み込んでいます。
この関数は、TCP上で動作する単純なHTTPクライアントを実装します。
この例は、多くのTCPおよびHTTPクライアントアプリケーションの雛型として使用できます。
《ファイル構成》
"tcpip_config.h"の変更
#define STACK_USE_ICMP_SERVER // ICMP(PING)はサーバ(Ping query応答)機能を実装する
#define STACK_USE_GENERIC_TCP_CLIENT_EXAMPLE // HTTP クライアントのサンプル
上記の2モジュールのみ実装しましょう。
"STACK_USE_ICMP_SERVER"のみなのでPING応答のみ可能です。
これにより"DNS(dns_client)/UDP/TCP"モジュールが追加されます。
追加されるファイル構成
dns_client.c |
DNS
クライアントプロトコルのモジュールファイル(RFC 1035)
Domain Name System
ホスト名からIPアドレスへの変換を提供します。
|
udp.c |
UDP
プ
ロトコルのモジュールファイル(RFC 768)
User Datagram Protocol
アプリケーション・データグラム(パケット)指向のデータの信頼性が低く、
最小遅延のトランスポートを提供します。 |
tcp.c
|
TCPプ
ロトコルのモジュールファイル(RFC 793)
Transmission Control Protocol
信頼性の高い、フ
ロー制御によるアプリケーションストリーム指向データのハンドシェイク転送を
提供します。
|
※ ”その2”の最小ファイル構成にC:\microchip\mla\v2016_11_07\framework\tcpip\srcフォルダー
のtcp.c/udp.c/dns_client.cを加えたものになります。
※ この構成でコンパイルすると、使用メモリは「Program=11132word
Data=1084byte」です。
《実験回路》
ENC28J60モジュールの
ピン構成
|
VCC
|
電源3.3V パケット転送中動作電流180mA
十分に流せる電源を準備しましょう。
|
GND
|
グランド
|
RESET
|
LOWでリセットなので通常はHIGH
|
CS
|
SPIのチップセレクト入力ピン
|
SCK
|
SPIのクロック入力ピン
|
SI
|
SPIのデータ入力ピン
|
SO
|
SPIのデータ出力ピン
|
WOL
|
ウェイク
アップ用割り込み出力
新チップはNCになっている。
|
INT
|
割り込み
出力ピン
|
CLKOUT
|
クロック
出力ピン
|
※ 灰色背景色のピンは今回利用しません。
前回までは
LCD表示
器を使っていましたが、今回は文字表示の情報量が多い為UART通信にて
PCのシリアル端末ソフト(Tera Term)に表示をさせます。
これには、秋月電子通商の超小型
USBシリアル変換モジュールを使います。
このモジュールは、3.3V電圧で5Vトレラントとなっています、ピンは左側から[5V][GND][TXD][RXD]の
順です、又、[5V]端子はUSBからの電源出力となりますが、今回は配線をしません。
詳しくは付属する説明書を読みましょう。
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と
結構電気食いで変動も激しいです。十分に流せる安定化された電源を準備しましょう。
《ダウンロードファイルにつ
いて》
↓ここからプログラムソースをダウンロードして下さい。
TCPClient_ENC28J60.zip
ファイルの説明とプロジェクトの作成方法は”その1”を参照下さい。
MPLAB X IDE v3.60 とMPLAB(R)
XC16 C Compiler Version 1.30コンパイラを使用しています。
"tcp_client.c"
:実験1と実験2で使用する、単純なHTTPクライアントサンプルプログラムです。
又、この実験ではLCDを使いませんので、"skI2CLCDlib.c/skI2CLCDlib.h/skI2Clib.c/skI2Clib.h"
のI2C通信LCDに表示を行う為のライブラリは使用しません。
その代わりにUART通信を行うので、”skUARTlib.c/skUARTlib.h"を使います、
このファイルについてはこちらを参照下さい。
《実験1》
このサンプルでは、www.google.comに
接続して”microchip.com”を検索し
その結果をPCの
シリアル通信ソフト[Tera Term]に表示させる事とします。
@ "tcpip_config.h"のMACアドレス・IPアドレ
ス・サブネットマスクは”その1”を見て自分ちの
ネット環境に合わせて設定は完了していますね。
A プログラムをコンパイルしPICに書き込みましょう。
tcp_client.c: In function 'main':
tcp_client.c:101:6: warning: 'TICK' is deprecated
とワーニングが出るかもですがぁ、気にしなくても良いでしょう、たぶん。
B 超小型USBシリアル変換モジュールとPCをUSBで接続して、
[TearTerm]を起動させます、通信速度は9600bpsです。
C ENC28J60をネットワークに接続し、回路電源を入れましょう。
(私はYAHOO!プロバイダーのトリオモデムのAPに繋いでの
実験です)
D でぇ、3秒後に処理開始です、[TearTerm]に”Start
HTTP Client ”が表示され、
LED(赤)が1秒毎に点滅します。
E ボタンを押しましょう、www.google.comに
接続されれば
”Connecting using Microchip TCP
API...”を表示します。
F HTTPサーバーに接続しているので、HTTP GETリクエストを送信します。
(GETリクエストは"HTTP/1.0"or"HTTP/1.1"共に結果は変わりませんでした)
HTTPサーバーからこんな感じに送信されます。
www.google.comのHTTP
サーバーから送られて来たデータ(上図)を
ブラウザーで表示させて見たのが左図です。
"here"をクリックするとぉ、
下画面の様な感じで表示されます。
《実験2》
"tcp_client.c"のファイル記述を下記の様に書き換えて実行すれば、MYサイトの"test6.html"の
ファイルにアクセスできます。
HTML内容は”[Test microchip\mla\framework\tcpip\GenericTCPClient( ) function]”の文字が表示
されるだけの物ですがぁ。
// このアプリケーションにアクセスするサーバーを定義します。
static uint8_t ServerName[] = "www.geocities.jp";
//static uint8_t ServerName[] = "www.google.com";
// このHTTPクライアントによって要求されるURLを定義します。
static ROM uint8_t RemoteURL[] = "/zattouka/GarageHouse/micon/MPLABX/MLA/tcpip/test6.html";
//static ROM uint8_t RemoteURL[] = "/search?as_q=Microchip&as_sitesearch=microchip.com";
実験1では、[HTTP/1.0 302 Found]だったがぁ
実験2では、[HTTP/1.0 200 OK]で正常終了していますね。
PS. "www.geocities.jp"サーバーは終了したので
"zattouka.net/GarageHouse/micon/MPLABX/MLA/tcpip/test6.html"に引っ越しを行っています。
《その他》
ここでも"SSL"機能を動作させて見たのだがぁ....
やっぱり上手く行かなかったぁ、このままでは”HTTPS:”が出来ない!
次回はTCPサーバーを行う予定です。
【きむ茶工房ガ
レージハウス】
Copyright (C) 2006-2017 Shigehiro Kimura All Rights Reserved.