TCPサ?バ?を??したソケット通信
TCPサ?バ?を??したソケット通信
0
Project description
TCPソケット通信とは

インタ?ネット情報には無?の解?記事が存在するためにここでは詳細の解?は割愛しますが、簡潔にまとめますとソケット通信はサ?バ?とクライアントが互いに確認しながら通信を行うTCPプロトコルに基づいた方式です。互いにやりとりすることからハンドシェイク方式とも呼ばれます。

ソケット通信は電話による?話に似ていて?話の出入り口である受話器、耳、口に相?するものをソケットと呼びます。相手が?答して初めて?話(通信)が成立し、途中で相手やこちらで切?すると?話も終了します。また、相手が接?中(受話器を上げたままの?態)のときは、こちらからの接?要求に?答しません。

トランスポ?ト層に?するプロトコルには他にUDPがありますが、これはサ?バ?がクライアントに確認せずに一方的に情報を?える方式です。動?などのストリ?ミングで?容に多少の不備があっても問題がない多量の情報を送るのに適しています。

下?はソケット通信で標準的なバ?クレ?ソケット(BSD unixに??されたネットワ?ク用API)に基づいた通信のフロ?チャ?トです。サ?バ?、クライアントともにあらかじめソケットを作成しておき、クライアント側から必要時に接?要求をだして、サ?バ?が?答して通信を確立します。一度確立すると、どちら側から切?しないかぎり、任意のタイミングで送受信できるのがソケット通信の特?です。

TCPサ?バ?の??

ドライバsoket.cでは標準インタ?フェ?スのBSDソケットに準じた??をまとめていますがここではドライバ?に定義された??の一部のみを使用したソケット通信のサンプルを紹介しています。

サンプルプログラムではTCPサ?バ?をサンプリングタイム5msで?行する?用タスクprvTask_Tcpに構成しています。

ドライバのソケット標準??を使用して一般的なTCPサ?バ?を作成することもできますが、ここではサンプリングタイム?にモニタ?したソケット?態に?じた?理をドライバのレジスタ操作??を使って?行します。
ソケットレジスタブロックの設定


ソケットの?態は主に 「SOCK_CLOSED」ソケット閉鎖 「SOCK_LISTEN」ソケット待機 「SOCK_ESTABLISHED」ソケット確立 「SOCK_CLOSING」ソケット閉鎖中 の4種類があり、これらの?態をソケット番?SNに?じてgetSn_SR(SN)??でソケットのレジスタ値を?み?みます。

プログラム起動直後のソケットは「SOCK_CLOSED」ですのでまずソケットをsocket()??で生成します。

??の第1引?はソケット番?SNで、SNは自作??をまとめたヘッダファイルnet_conf.hで1に定義しています。

第2引?はプロトコルは設定でTCPプロトコルを指定しています。第3引?はPORT番?を指定し、第4引?ではnon-blockを指定し、ノンブロッキングソケットとしています。

ソケットが作成されるとlisten(SN)??を?行し、SOCK_LISTEN?態に遷移してクライアントからの接?待ち?態で待機します。

ソケットの?態がSOCK_LISTENの待機時にクライアントのタ?ミナルからIPアドレスおよびポ?トを指定して接?の要求をし、接?が確立するとSOCK_ESTABLISHEDになります。接?が確立しクライアントのタ?ミナルにサ?バ?のIPアドレスが表示されると任意のタイミングで送受信ができるようになります。

デ?タ受信にはrecv??を使用します。第1引?はソケット番?、第2引?は受信バッファのポインタ、第3引?はデ?タ長を指定します。デ?タを受信するとデ?タ長を返します。

デ?タ送信にはsend??を使用します。第1引?はソケット番?、第2引?は送信バッファのポインタ、第3引?はデ?タ長を指定します。

通信用バッファメモリである送信TXおよび受信RXバッファはそれぞれ16Kバイトのブロックで構成されています。

setSn_CR??はsocket.c?に定義されている??でソケットを制御するものです。第1引?はソケット番?、第2引?はソケットの?態を指定します。Sn_CR_CLOSEを指定するとソケットを閉鎖(close)します。

その他ソケットの”OPEN”, ”LISTEN”, “CONNECT”, “DISCON”, “SEND”, “SEND_MAC”, “SEND_KEEP”, “RECV”等があります。詳細はドライバのソケット定義ファイルsocket.cを確認してください。


TCPサ?バ?のソケット?態遷移をまとめると上?のようになります。W5500ではソケット?態は他にもありますが、とりあえず主な4つの?態をコントロ?ルしておけば機能します。
ソケット通信のイメ?ジ

ソケット通信の?態を電話による?話に例えると下?のようなイメ?ジなります。この通信?態を想定しながら?際にソケット通信を?施して動作を確認してみます。

?際のソケット通信

クライアントではタ?ミナルソフトを使用します。ここでもTera Termを使用しています。これに限らず慣れたツ?ルを使用してください。

起動後、TCPソケット通信ですのでサ?バ?に登?したIPアドレスおよびポ?ト番?を入力し”OK”を押します。


?面左上にサ?バ?のIPアドレスが表示されると設定ポ?トが開いてクライアントとサ?バ?が接?したことになります。


TCPサ?バ?に?してコマンドを?えて通信できるかを確認します。通信テスト用の?答メッセ?ジを返す?理、ソケットの閉鎖(close)および接?切?(disconnect)するコマンドをまとめたファイルを作成して?行しています。


まず文字列”ABC”を入力します。受信バッファに格納された文字列が”ABC”で一致すると”Matched”と?答します。?答はsend??を使用しています。


文字列”abc”を入力すると”ABC”と一致しませんので”Error”と?答します。


ソケットが接?確立しているところで新たに別の接?を試みます。


すでにポ?トが開いているために接?が拒否されました。電話では相手の受話器が上がっていて話し中の?態です。


ソケットを閉じるためにコマンド”scls”を入力すると”socket close”メ?セ?ジを返してCRレジスタにSn_CR_CLOSEを送信してからソケットを閉鎖(close)します。結果、未接?となります。


また新たに接?を試みると今度はソケットが閉じているため再びポ?トが開き接?できます。

最後に接?自?を遮?するため、コマンド”srst”を入力します。CRレジスタにSn_CR_DISCONを送信し、切??理(disconnect)を?行します。


?面左上が未接?となり接?が遮?されたことが確認できます。


以上、テスト用コマンドを入力してソケット通信の?子を確認しました。?際のソケット通信ではプログラミング次第でコマンドをさらに多?化してコマンドにより??な?理を?施させることになります。

TCPソケット通信はサ?バ?とクライアント間でリアルタイムでデ?タをやりとりできることが特?ですので組み?み機器にTCPサ?バ?を搭載しておけばIoTとしてリアルタイムでインタ?ネットを介してデ?タのリモ?ト管理ができるようになります。