Skip to content

TCPサ?バ?を??したソケット通信

TCPサ?バ?を??したソケット通信

teddy

Published March 02, 2022

96 UCC

8 WCC

35 VAR

Project description

マイコンをイ?サネット??にしてpingが通った?態でネットワ?クに?加しただけでは何の意味もありませんが、上位のトランスポ?ト層にTCPやUDPといったプロトコルを搭載することによってサ?バ?とクライアント間で通信ができるようになります。 ソケット通信は前回解?したOSI?照モデルのトランスポ?ト層に?するTCPプロトコルにしたがった通信手段です。W5500コントロ?ラを搭載したマイコンでTCPソケット通信を?現するためには??したTCP/IPプロトコルスタックをレジスタで操作します。操作自?はメ?カ?がドライバを提供しているので容易に行われます。 TCPサ?バ?を構築してソケット通信の??が整えば、任意のタイミングでシリアル通信のようなデ?タのやりとりができるようになります。

TCPソケット通信とは

めかのとろ
めかのとろ

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

めかのとろ
めかのとろ

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

めかのとろ
めかのとろ

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

めかのとろ
めかのとろ

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

TCPソケット通信
TCPソケット通信

TCPサ?バ?の??

めかのとろ
めかのとろ

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

めかのとろ
めかのとろ

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

めかのとろ
めかのとろ

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

ソケットレジスタブロックの設定

TCPサ?バ?タスクサンプル
TCPサ?バ?タスクサンプル
① ソケット?態のモニタ? state = getSn_SR(SN);
めかのとろ
めかのとろ

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

② ソケット生成 srcSocket = socket(SN,Sn_MR_TCP, PORT, SF_IO_NONBLOCK);
めかのとろ
めかのとろ

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

めかのとろ
めかのとろ

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

めかのとろ
めかのとろ

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

③ STABE_LISTENに遷移 LISTEN(SN);
めかのとろ
めかのとろ

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

めかのとろ
めかのとろ

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

④ デ?タ送受信 len=recv(SN, (uint8_t*)rcvbuffer, sizeof(rcvbuffer));
めかのとろ
めかのとろ

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

send(SN, (uint8_t*)sendbuffer, sizeof(sendvbuffer));
めかのとろ
めかのとろ

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

めかのとろ
めかのとろ

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

⑤ ソケット制御?? setSn_CR(SN,Sn_CR_CLOSE);
めかのとろ
めかのとろ

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

めかのとろ
めかのとろ

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

TCPサ?バ?の動作フロ?
TCPサ?バ?の動作フロ?
めかのとろ
めかのとろ

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

ソケット通信のイメ?ジ

めかのとろ
めかのとろ

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

ソケット通信における接?イメ?ジ
ソケット通信における接?イメ?ジ

?際のソケット通信

めかのとろ
めかのとろ

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

めかのとろ
めかのとろ

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

① 接?要求
TCPサ?バ?を??したソケット通信, ?際のソケット通信
めかのとろ
めかのとろ

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

② ソケット接?確立中
TCPサ?バ?を??したソケット通信, ?際のソケット通信
めかのとろ
めかのとろ

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

コマンド?理(通信テスト用)
コマンド?理(通信テスト用)
めかのとろ
めかのとろ

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

TCPサ?バ?を??したソケット通信, ?際のソケット通信
めかのとろ
めかのとろ

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

TCPサ?バ?を??したソケット通信, ?際のソケット通信
めかのとろ
めかのとろ

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

TCPサ?バ?を??したソケット通信, ?際のソケット通信
めかのとろ
めかのとろ

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

TCPサ?バ?を??したソケット通信, ?際のソケット通信
③ ソケットclose
めかのとろ
めかのとろ

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

TCPサ?バ?を??したソケット通信, ?際のソケット通信
④ 接?要求+ソケット接?確立
めかのとろ
めかのとろ

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

めかのとろ
めかのとろ

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

TCPサ?バ?を??したソケット通信, ?際のソケット通信
⑤ 接?切?
めかのとろ
めかのとろ

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

TCPサ?バ?を??したソケット通信, ?際のソケット通信
めかのとろ
めかのとろ

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

めかのとろ
めかのとろ

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

Comments

Comments