ソケット通信のデバックツールSocketDebugger
こんにちは、くろべこです。
今回の記事は、ソケット通信のデバック用のツール【SocketDebugger】紹介になります。
という事は、デバックを行う際には”サーバー役”もしくは”クライアント役”が欲しくなるわけですね。
SocketDebuggerでは仮想的にサーバー/クライアントを設定することが出来るので、お手軽にデバックをすることが出来ます。本記事ではArduino(ESP8266)を使用したデモも紹介したいと思います。
SocketDebuggerを導入する方法
まずは、以下のリンクにアクセスしてみましょう。
リンク:SocketDebugger
アクセスしましたら、【ダウンロード】タブをクリックして、”無料版”をクリックしてみてください。趣味的なデバックの範囲であれば”無料版”で十分です。
旧無料版と無料版があると思いますが、”無料版”の方で進めていくので”無料版の”DLをお願いします。
恐らく、Zipファイルがダウンロードされたと思います。
ぱぱっと解凍しましたら終わりです。インストールの必要はありません。
どうやってSocketDebuggerでデバックするのか?
今回は実際にソケット通信を行いつつ解説をしていきますね。
ESP8266をサーバー/SocketDebuggerはクライアントとしてデバックをしてみたいと思います。
今回のソケット通信のフローを簡単ですが書いてみました。
サーバーとなるESP8266 (Arduino)はPassiveOpentでクライアントからのアクセスを待ちます。そこにクライアントからのActiveOpen要求によりコネクションの開設が完了します。
その後、クライアントから”0x01″のデータがサーバー側に送られます。サーバー側は送られてきたデータに対してACK(確認)信号として”OK”を返してあげます。
コネクションのクローズはサーバー側がCloseしてクライアントがはサーバー側の切断信号を受信し自身もクローズ処理を行います。
<<サーバープログラム>>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
#include <ArduinoWebsockets.h> #include <ESP8266WiFi.h> const char* ssid = ""; //Enter SSID const char* password = ""; //Enter Password WiFiServer server(9600); //Port番号 void setup() { Serial.begin(115200); WiFi.begin(ssid, password); // Wait some time to connect to wifi for(int i = 0; i < 15 && WiFi.status() != WL_CONNECTED; i++) { Serial.print("."); delay(1000); } Serial.println(""); Serial.println("WiFi connected"); Serial.println("IP address: "); Serial.println(WiFi.localIP()); //You can get IP address assigned to ESP server.begin(); Serial.println("Server started"); } void loop() { byte buf[10]; WiFiClient client = server.available(); String rstr,lstr; long prsint; if (client.connected()) { Serial.println("Connected to client"); //コマンド文字列受信(文字列が来なければタイムアウトする) client.setTimeout(5000);//ストリームデータ読み取りタイムアウト rstr = client.readStringUntil('\r');//終端文字 Serial.println(rstr);//受信文字列表示 client.print("OK\r"); //接続をクローズ client.stop(); Serial.println("Closed"); } } |
SoketDebugger側(クライアント)側はどのように設定したらいいというと、、、
まずはサーバーのIPアドレスを知らない事には始まりませんね。という事で、ESP8266に上記のプログラムを書き込んでシリアルコンソールでIPアドレスを確認してみてください。私の環境下では100.64.1.29となっています。
このIPアドレスを、SocketDebuggerのPort1に反映してください。その他の設定は以下の通りです。
- 通信タイプ:TCPクライアント
- IPアドレス:100.64.1.29
- remoteポート番号:9600
- localポート番号:9700
ちなみに、remoteポート番号は接続先のポート番号で、localポート番号は自分のポート番号を意味しています。
という事で、設定は完了しました。
さきほどESP8266を起動していると思うのですが、この状態でPassive Openとなっていて、クライアントからのコネクション待ちの状態です。という事で、クライアント側からActive Openしてみましょう。再生ボタンに1が書いてあるアイコンをクリックしてみてください。うまくコネクションが開設されれば【接続完了】と出るはずです。
そして、おそらく自動的に【切断信号受信】となりコネクションが切れたと思います。
ESP8266のプログラムの中にclient.setTimeout(5000)と書かれているのですが、これはタイムアウト時間を表していまして、コネクション開設完了から5000ms何もサーバーにデータが来なかったらコネクションを閉じるようになっています。うっとおしい場合はこの時間を長めにとってみましょう。
サーバーにクライアントからデータを送ってみる
SocketDebuggerの右側に【送信データエディタ】というものが見えると思います。
このエディタをクリックしてみて、数値を打ち込むことでサーバーに送信するデータを設定することが出来ます。(送信データはバイト単位です。テキストコード入力を行えばASCIIコードに変換してくれたりもします)
今回は01(ASCIIコードで0x3031)と送ってみましょう。テキスト入力で打ち込みました。この場合は自動的にキャリッジリターン”\r”が付きます。
それでは、データを送信するときはコネクションが設立しているときに【ポート1データ送信】をクリックしてみてください。青文字で、Send:0001:3031となっているはずです。その後に、Recv:0003:4F4B 0Dが返ってきていますね、先ほどのフロー図で言うACKです。ASCII文字で”OK”を表しています。
そして、サーバー側から一方的にコネクション切断されてソケット通信が終了しています。
こんな感じで、SocketDebuggerを使えば、簡単にサーバーとクライアントの関係が作れます。
今回のソケット通信フロー動画
その他にも色々拡張機能があります
という事で、一通りはツールの使い方を紹介しました。
しかし、SocketDebuggerにはこのほかにも色々な拡張機能があります。
例えば、SocketDebugger内にスクリプト(Lua言語)を記述して、クライアントから送られてきたデータに対してACKを返してあげたりする事が出来ます。
その他の機能
- 様々な通信ポートに対応
- デバッカー内にスクリプトの記述が可能
- パケットキャプチャ機能
- 分割パケットの自動解析
拡張機能は次紹介するとして、今回はこの辺で失礼します~
コメント