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モジュールの ピン構成
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.60MPLAB(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サーバーからの受信内容1
HTTPサーバーからこんな感じに送信されます。

受信したHTMLの表示
 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";
HTTPサーバーからの受信内容2
実験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.