狠狠撸

狠狠撸Share a Scribd company logo
SUGAR SWEET ROBOTICS CO., LTD. 
ネットワークを用いた通信 
株式会社SUGAR SWEET 
ROBOTICS 
菅 佑樹 
1
SUGAR SWEET ROBOTICS CO., LTD. 
自己紹介 
2
SUGAR SWEET ROBOTICS CO., LTD. 
自己紹介 
? 菅 佑樹 (Yuki Suga) 
? 2012?~ 株式会社SUGAR SWEET ROBOTICS代表取締役 
? 2010?~2012 株式会社リバスト 
? 2007?~2010 早稲?田?大学総合機械?工学科助?手 (菅野研) 
3 
http://ysuga.net 
http://sugarsweetrobotics.com
! 
? 2007?~2010 早稲?田?大学総合機械?工学科助?手 
SUGAR SWEET ROBOTICS CO., LTD. 
林業機械支援システム 
学習適応する 
コミュニケーション 
ロボット 
4 
http://www.sugano.mech.waseda.ac.jp 
正面ステレオ 
カメラ 
収穫マニピュレータ 
下方カメラ走行台車 
車いす搭載型 
ロボットアーム 
いちご収穫ロボット 
岐阜県?早稲田大学WABOT-?‐HOUSE 
研究所による 
前川製作所との共同研究
SUGAR SWEET ROBOTICS CO., LTD. 
? 2010?~2012 株式会社リバスト 
5 
アメリカMobile 
スイス 
Robot社 
移動台車 
Pioneerシリーズ 
Neuronics社 
Katana 
ロボットアーム 
カナダ 
Inuktun社 
探索ロボット 
フランス 
Aldebaran 
Robotics社 
NAO 
http://revast.co.jp
SUGAR SWEET ROBOTICS CO., LTD. 
? 2012?~ 株式会社SUGAR SWEET ROBOTICS 
? http://sugarsweetrobotics.com 
– ロボットの受託開発?コンサルティング 
– RTミドルウエアに関する開発 
– ロボット?用ミドルウエアに関する講演 
6
SUGAR SWEET ROBOTICS CO., LTD. 
コンテンツ 
? 通信とは何か? 
? プロトコルとは何か? 
? TCP/IPとは何か? 
? TCP通信の実際 
? ソケット通信ライブラリ 
? Winsock2 
? 実習 
7
SUGAR SWEET ROBOTICS CO., LTD. 
通信とは何か 
8
SUGAR SWEET ROBOTICS CO., LTD. 
通信とは何か 
? 通信(=Communication) 
? 2者(もしくはそれ以上)の間で情報を共有すること 
? 日常会話も通信 
? 壁画も通信 
? どうやって,何を媒介として通信するか,が問題 
9
SUGAR SWEET ROBOTICS CO., LTD. 
プロトコル(通信規約) 
? どのようなルール(フォーマット)で情報を伝達するか,の約束 
? 会話に用いられる言語もプロトコル 
? 通信速度や,データのアライメントもプロトコル 
? 電線を使った通信なら,電圧やケーブルの太さ,コネクタ形 
状もプロトコル 
10
SUGAR SWEET ROBOTICS CO., LTD. 
たとえば 
? RS232C 
? D Sub 9pin, 25pinコネクタ 
? PCとターゲットの1対1を想定 
? 調歩同期式通信なら3線で通信(入力と出力とコモン端子) 
? +3Vから+15Vで0(スペース) 
? -3Vから-15Vで1(マーク) 
? 通信速度は9600bps, 19200bps, 38400bps, 115200bpsなどから選択 
? スタートビット幅,ストップビット幅,データ長,パリティチェック,通 
信制御線の有無 
11
SUGAR SWEET ROBOTICS CO., LTD. 
たとえば 
? CAN (Controller Area Network) 
? 2線式通信.2線間の電位差で”0”, “1”を決める 
? 最大1Mbps 
? バス型通信(複数台接続) 
? ID(アドレス)で機材の判別 
? 同時にバスにアクセスしようとするとハードウエアで自動的に判別可能 
12 
120Ω 
120Ω 
デバイスA 
! 
CANコントローラ 
デバイスB 
! 
CANコントローラ 
デバイスC 
! 
CANコントローラ
SUGAR SWEET ROBOTICS CO., LTD. 
データをどう解釈するか? 
? RS232Cならば,単純に8ビットのデータが一つ送られてくるのみ. 
連続してデータを送り続ければ良い 
? CANならば最大8バイトのデータに,送り手のアドレス情報も加わる 
? いずれにせよ,このデータをどう解釈するかは自由 
? その解釈のルールもプロトコル 
13
SUGAR SWEET ROBOTICS CO., LTD. 
? 文字列でデータを送受信 
? 改行コードが送られるまで受信 
? 1行の文字列によって動作をする 
? メリット 
? Tera Termなどのターミナルソフトウエアで確認できる 
? 注意点 
? データが長くなる 
? (125はデータで1バイトだが,文字列では3文字3バイト) 
? 文字列を数値に変換するコストがかかる 
? 文字コードの問題 (ASCII以外の場合) 
? 改行コードの問題 (CRかLFか,CRLFか) 
14 
キャラクタベースプロトコル
SUGAR SWEET ROBOTICS CO., LTD. 
バイナリプロトコル 
? サーボモータのコントローラのプロトコル 
? CAN想定 
? 1バイト目:ロボットへの指令の種類 
? 2バイト目以降:指令に必要なデータ 
? メリット 
? データが短く,効率的 
? 注意点 
? デバッグがしづらい(ツールを作れば問題無し) 
? エンディアン(バイトオーダー) 
15 
D0 
(命令) D1以降のデータ 
1 
(サーボON/OFF) D1が1ならON,D1が0ならOFF 
2 
(目標速度指令) D1, 
D2で2バイト(16bit)の指令値.ビッグエンディアン.1023で最大 
速度.最上位ビットが回転方向 
3 
(目標位置指令) 
D1, 
D2, 
D3, 
D4で4バイト(32bit)の指令値.ビッグエンディアン. 
4 
(トルク指令) D1, 
D2で2バイトの指令値.ビッグエンディアン.1023で最大トル 
ク.最上位ビットが回転方向
SUGAR SWEET ROBOTICS CO., LTD. 
プロトコルの階層性 
? RS232CやCANで送ったデータを,上位のプロトコルでどう解釈するか 
? プロトコルには階層性がある 
? ちょうど封筒のようなモノ.封筒の中身がデータで,解釈は上位のプロトコル 
に任せる 
? たとえば??? 
16 
プロトコル1 
プロトコル2 
プロトコル2 
物理的プロトコル 
ネットワーク的 
アプリケーション的 
電圧 
通信速度 
どこから? 
何の命令か? 
どこへ?
SUGAR SWEET ROBOTICS CO., LTD. 
TCP/IPとは何か 
17
SUGAR SWEET ROBOTICS CO., LTD. 
OSI参照モデル 
アプリケーション層 
プレゼンテーション層 
セッション層 
トランスポート層 
? コンピュータの通信 
機能を階層構造に分 
割したモデル (ISO) 
ネットワーク層 
18 
データリンク層 
物理層
SUGAR SWEET ROBOTICS CO., LTD. 
Ethernet 
? イーサーネット 
? Ether = エーテル???ど 
こにでもある 
? 普段,有線LANと称している 
のはこれ 
? 物理層+データリンク層の通 
信 
? MACアドレス 
19 
アプリケーション層 
プレゼンテーション層 
セッション層 
トランスポート層 
ネットワーク層 
データリンク層 
物理層
SUGAR SWEET ROBOTICS CO., LTD. 
IPとは何か 
? IP (インターネットプロトコル) 
ルータ0.1.1 
? IPアドレス 
? パケットのルーティング 
ルータ0.0.1 
20 
アプリケーション層 
プレゼンテーション層 
セッション層 
トランスポート層 
ネットワーク層 
データリンク層 
物理層 
ホスト1 
0.0.1.1 
ホスト2 
0.0.1.2 
ホスト3 
0.0.1.3 
0.0.1.4 
0.1.1.2 
ホスト5 
0.1.1.4 
0.1.1.1
SUGAR SWEET ROBOTICS CO., LTD. 
TCPとは何か 
? TCP (Transmission Control Protocol) 
? 到達確認と誤り訂正,順序訂正 
? ポート番号 
! 
! 
! 
! 
! 
! 
! 
? TCP/IPを使えば高信頼かつ柔軟な 
ホスト間の通信が可能になる 
21 
アプリケーション層 
プレゼンテーション層 
セッション層 
トランスポート層 
ネットワーク層 
データリンク層 
物理層 
ホスト1 
0.0.1.4 
ホスト2 
0.0.1.2 
ホスト5 
0.1.1.1 
80 
3306 
ウェブサーバ 
データベース
SUGAR SWEET ROBOTICS CO., LTD. 
TCP/IP通信を使うRT機器 
RT = Robotics Technologies 
(ロボット技術) 
22
SUGAR SWEET ROBOTICS CO., LTD. 
Ethernetとマイコン 
? マイクロコントローラの高性能化 
? EthernetとTCP/IPをサポートするコントロー 
ラが増えた 
? ドライバ不要 
? プラットフォーム依存性(言語?OS)が低い 
? IPアドレス等の設定が必要 
? サポートする技術がある (Bonjourなど) 
23
SUGAR SWEET ROBOTICS CO., LTD. 
市販の汎用マイコン等 
? arduinoやmbedなどのホビー向けマイコン 
製品 
? arduino, mbed, netduino, GR-SAKURA… 
? Raspberry-PiやBeagle Boardなどの小型組 
み込みLinuxボード 
? Raspberry-Pi, Armadillo, Beagle Bone 
Black 
24
SUGAR SWEET ROBOTICS CO., LTD. 
センサ,コントローラ等 
? レーザースキャナ 
? 北陽電機 
? UST-10LX, USB-20LX等 
? SICK株式会社 
? LMS500等 
? モータコントローラ 
? イクシスリサーチ 
? iMCs06等 
25
SUGAR SWEET ROBOTICS CO., LTD. 
PC 
ロボット機器 
? Mobile Robot Pioneerシリーズ 
? RS232CでPCと通信 
? クライアント用ライブラリが充実 
26 
RS232C クライアント 
コントローラ 
(マイコン) 
センサ等モータ
SUGAR SWEET ROBOTICS CO., LTD. 
ロボット機器 
27 
コントローラ 
(マイコン) 
PC 
センサ等モータ 
RS232C 
PC 
サーバ 
クライアント 
? Mobile Robot Pioneerシリーズ 
? 付属のサーバープログラムを実行するとTCP/IPを使った遠隔操 
作が可能 
? クライアントプログラムは変更不要
SUGAR SWEET ROBOTICS CO., LTD. 
ロボット機器 
28 
頭部 
RS485等サーバPC 
コントローラ 
(マイコン) 
センサ等モータ 
クライアント 
? Aldebaran Robotics NAO 
? 頭部でLinuxサーバープログラムが自動実行される 
? ロボットのIPアドレスの設定等は,ブラウザで可能 
ウェブサーバ 
IE等ブラウザ
SUGAR SWEET ROBOTICS CO., LTD. 
TCP通信の実際 
29
SUGAR SWEET ROBOTICS CO., LTD. 
ソケット通信 
? TCP/IP通信のエンドポイントを「ソケッ 
ト」と呼ぶ 
? OSごとに実装が違うが大きな流れは一緒 
? UNIX, Linux (POSIXライブラリ) 
? Windows (Winsockライブラリ) 
? 様々な言語でソケット通信が可能 
? C++, Python, Java, C#, VB, MATLAB… 30
SUGAR SWEET ROBOTICS CO., LTD. 
サーバ側 
1.ソケット生成(socket) 
2.ソケット登録(bind) 
3.ソケット接続準備(listen) 
4.ソケット接続待機(accept) 
5.受信?送信(recv / send) 
6.ソケット切断(close) 
31
SUGAR SWEET ROBOTICS CO., LTD. 
クライアント側 
32 
1.ソケット生成(socket) 
2.ソケット接続要求(connect) 
3.受信?送信(recv / send) 
4.ソケット切断(close)
SUGAR SWEET ROBOTICS CO., LTD. 
TCP 
? TCPソケットに必要な情報 
? サーバー側 
? ポート番号 
? クライアント側 
? ポート番号 
? サーバーのIPアドレス 
33 
サーバー 
0.1.1.1 
3306 ! 
アプリ 
クライアント 
0.0.1.2
SUGAR SWEET ROBOTICS CO., LTD. 
34 
サーバー側クライアント側 
ソケット作成 
socket 
ソケット登録 
bind 
ソケット接続準備 
listen 
ソケット接続待機 
accept ソケット作成 
socket 
ソケット接続要求 
connect 
通信用ソケット 
送受信 
(send 
/ 
recv) 
ソケット切断 
close 
切断
SUGAR SWEET ROBOTICS CO., LTD. 
Winsock2 
35
SUGAR SWEET ROBOTICS CO., LTD. 
サーバ側 
36
SUGAR SWEET ROBOTICS CO., LTD. 
ヘッダーファイル 
? winsock2.hやws2tcpip.hをインクルードする 
? ws2_32.libをリンクする 
37 
// 
ソケットライブラリを使うためのヘッダー 
#include 
<winsock2.h> 
#include 
<ws2tcpip.h> 
#include 
<tchar.h> 
// 
ソケットライブラリを使うためのライブラリのリンク 
#pragma 
comment 
(lib, 
"Ws2_32.lib") 
! 
// 
標準的なC言語のヘッダー 
#include 
<stdio.h> 
#include 
<stdlib.h>
SUGAR SWEET ROBOTICS CO., LTD. 
WSAStartup 
38 
? WSAStartupを実行する必要がある. 
? 終了時はWSACleanupを実行する 
// 
#1. 
WSAStartup関数を呼び出し、ソケット通信を開始する 
// 
この関数を読んだ場合、プログラムはWSACleanup関数を 
// 
呼んで終了する必要がある。 
WSADATA 
wsaData; 
result 
= 
WSAStartup(MAKEWORD(2, 
2), 
&wsaData); 
if 
(result 
!= 
0) 
{ 
// 
失敗するとゼロ以外の値が返る 
printf(" 
# 
WSAStartup 
failed 
with 
error: 
%dn", 
result); 
return 
INVALID_SOCKET; 
}
SUGAR SWEET ROBOTICS CO., LTD. 
// 
#2.3 
ソケットの作成 
listenSocket 
= 
socket(AF_INET, 
SOCK_STREAM, 
0); 
if 
(listenSocket 
== 
INVALID_SOCKET) 
{ 
printf("socket 
failed 
with 
error: 
%ldn", 
WSAGetLastError()); 
WSACleanup(); 
return 
INVALID_SOCKET; 
} 
39 
? socket関数でソケットを作成する
SUGAR SWEET ROBOTICS CO., LTD. 
40 
? サーバーが待機するソケットの設定を初期化する 
? 重要なのはTCPのポート番号 
! 
struct 
sockaddr_in 
addr; 
! 
addr.sin_family 
= 
AF_INET; 
addr.sin_port 
= 
htons(27015); 
addr.sin_addr.S_un.S_addr 
= 
INADDR_ANY; 
! 
// 
#2.4 
Bind 
result 
= 
bind(listenSocket, 
(struct 
sockaddr 
*)&addr, 
sizeof(addr)); 
if 
(result 
== 
SOCKET_ERROR) 
{ 
printf("bind 
failed 
with 
error: 
%dn", 
WSAGetLastError()); 
closesocket(listenSocket); 
WSACleanup(); 
return 
INVALID_SOCKET; 
}
SUGAR SWEET ROBOTICS CO., LTD. 
? listen関数で接続の準備 
? accept関数で接続待機 
41 
// 
#2.5 
Listen 
result 
= 
listen(listenSocket, 
SOMAXCONN); 
if 
(result 
== 
SOCKET_ERROR) 
{ 
printf("listen 
failed 
with 
error: 
%dn", 
WSAGetLastError()); 
closesocket(listenSocket); 
WSACleanup(); 
return 
INVALID_SOCKET; 
} 
! 
// 
#2.6 
Accept 
clientSocket 
= 
accept(listenSocket, 
NULL, 
NULL); 
if 
(clientSocket 
== 
INVALID_SOCKET) 
{ 
printf("accept 
failed 
with 
error: 
%dn", 
WSAGetLastError()); 
closesocket(listenSocket); 
WSACleanup(); 
return 
INVALID_SOCKET; 
}
SUGAR SWEET ROBOTICS CO., LTD. 
? recv関数でデータを受信する 
42 
int 
numReceived; 
char 
receiveBuffer[DEFAULT_BUFFER_LEN]; 
int 
receiveBufferLength 
= 
DEFAULT_BUFFER_LEN; 
! 
// 
データを受信する。numReceivedには受信したデータのバイト数が入る。 
receiveBufferには受信データが入る。 
numReceived 
= 
recv(clientSocket, 
receiveBuffer, 
receiveBufferLength, 
0); 
if 
(numReceived 
> 
0) 
{ 
// 
正常に受信したなら表示する。 
printf(" 
# 
Bytes 
received: 
%dn", 
numReceived); 
}
SUGAR SWEET ROBOTICS CO., LTD. 
? send関数でデータの送信 
43 
int 
numReceived; 
char 
receiveBuffer[DEFAULT_BUFFER_LEN]; 
int 
receiveBufferLength 
= 
DEFAULT_BUFFER_LEN; 
! 
sendResult 
= 
send(clientSocket, 
receiveBuffer, 
numReceived, 
0); 
if 
(sendResult 
== 
SOCKET_ERROR) 
{ 
// 
送信失敗なら終了する。 
printf(" 
# 
Send 
failed 
with 
error: 
%dn", 
WSAGetLastError()); 
closesocket(clientSocket); 
WSACleanup(); 
return 
1; 
} 
printf(" 
# 
Bytes 
sent: 
%dn", 
sendResult); 
// 
送信成功なら表示する。
SUGAR SWEET ROBOTICS CO., LTD. 
クライアント側 
44
SUGAR SWEET ROBOTICS CO., LTD. 
ヘッダーファイル 
? winsock2.hやws2tcpip.hをインクルードする 
? ws2_32.libをリンクする 
45 
// 
ソケットライブラリを使うためのヘッダー 
#include 
<winsock2.h> 
#include 
<ws2tcpip.h> 
#include 
<tchar.h> 
// 
ソケットライブラリを使うためのライブラリのリンク 
#pragma 
comment 
(lib, 
"Ws2_32.lib") 
! 
// 
標準的なC言語のヘッダー 
#include 
<stdio.h>
SUGAR SWEET ROBOTICS CO., LTD. 
WSAStartup 
46 
? WSAStartupを実行する必要がある. 
? 終了時はWSACleanupを実行する 
// 
#1. 
WSAStartup関数を呼び出し、ソケット通信を開始する 
// 
この関数を読んだ場合、プログラムはWSACleanup関数を 
// 
呼んで終了する必要がある。 
WSADATA 
wsaData; 
result 
= 
WSAStartup(MAKEWORD(2, 
2), 
&wsaData); 
if 
(result 
!= 
0) 
{ 
// 
失敗するとゼロ以外の値が返る 
printf(" 
# 
WSAStartup 
failed 
with 
error: 
%dn", 
result); 
return 
INVALID_SOCKET; 
}
SUGAR SWEET ROBOTICS CO., LTD. 
struct 
sockaddr_in 
addr; 
! 
server.sin_family 
= 
AF_INET; 
server.sin_port 
= 
htons(27015); 
server.sin_addr.S_un.S_addr 
= 
inet_addr(“127.0.0.1”); 
! 
// 
#2 
ソケットの作成 
clientSocket 
= 
socket(AF_INET, 
SOCK_STREAM, 
0); 
if 
(clientSocket 
== 
INVALID_SOCKET) 
{ 
printf("socket 
failed 
with 
error: 
%ldn", 
WSAGetLastError()); 
WSACleanup(); 
return 
INVALID_SOCKET; 
} 
47 
? ソケットの設定を初期化する 
? 接続先のアドレスとTCPのポート番号
SUGAR SWEET ROBOTICS CO., LTD. 
? サーバーが待機するソケットの設定を初期化する 
? 重要なのはTCPのポート番号 
// 
#3 
ソケットの接続 
result 
= 
connect(clientSocket, 
(struct 
sockaddr 
*)&server, 
sizeof(server)); 
if 
(result 
!= 
0) 
{ 
printf("socket 
failed 
with 
error: 
%ldn", 
WSAGetLastError()); 
WSACleanup(); 
return 
INVALID_SOCKET; 
} 
48
SUGAR SWEET ROBOTICS CO., LTD. 
TCP/IP通信設定 
? サーバ側のIPアドレス?ポート番号を知る 
? サーバ側でのipconfig / ifconfigコマンド 
? 説明書をよく読む 
? そもそも相手のPCや機器と通信が可能か? 
? pingコマンドで確認する 
? ファイアーウォールの設定を確認する 
49
SUGAR SWEET ROBOTICS CO., LTD. 
実習 
50
SUGAR SWEET ROBOTICS CO., LTD. 
実習内容 
? サーバー&クライアントのプログラム 
? サーバー側 
? 27015番のTCPポートで待機 
? 命令によって異なる音声をならす 
? クライアント側 
? サーバーに接続する 
? サーバは自マシンで動く (IPアドレスは127.0.0.1固定) 
? キーボード入力によって異なる命令を送信 
51
SUGAR SWEET ROBOTICS CO., LTD. 
これをインストールして下さい 
? Visual Studio 2013 Express Edition for 
Windows Desktop 
? http://www.visualstudio.com/ 
downloads/download-visual-studio-vs# 
d-express-windows-desktop 
? Tera Term (ターミナルソフト) 
52
SUGAR SWEET ROBOTICS CO., LTD. 
キーボード入力 
数値1~9 
受信確認 
プロトコル 
? テキストベースのプロトコル 
? SND*の4バイト「*」には数値が入る 
53 
S N D 1.... 
S N D 9 C:WindowsMedia 
o 
再生 
.... 
Ring01.wav 
C:WindowsMedia 
Ring09.wav 
k .
SUGAR SWEET ROBOTICS CO., LTD. 
実習手順 
1.データを受信し表示するプログラムを作る 
? 一般的なターミナルソフトからデータを送信する 
2.受け取ったデータによって処理を変える 
? これもターミナルソフトでテスト 
3.データを送信するプログラムを作る 
? 2つのプログラムを統合する 
54
SUGAR SWEET ROBOTICS CO., LTD. 
Visual Studioの基本的操作 
55
SUGAR SWEET ROBOTICS CO., LTD. 
Visual Studio 2013 
? Visual Studio 2013 for Windows 
Desktopを開く 
? 初めて起動する人は登録が必要 
? ファイル>新しいプロジェクトを 
選択 
? テンプレート>Visual C++を選択 
? Win32 コンソール アプリケー 
ションを選択 
? 名前を「TelnetServer」とする 
56
SUGAR SWEET ROBOTICS CO., LTD. 
アプリケーションの設定 
? 左のメニューからアプリ 
ケーションの設定を選ぶ 
? 追加のオプション>空の 
プロジェクトをチェック 
? SDLチェックを外す 
? 「完了」を押す 
57
SUGAR SWEET ROBOTICS CO., LTD. 
ファイルの追加 
? 画面右の「ソリューショ 
ンエクスプローラ」の 
「ソースファイル」を 
右クリック 
? 追加>新しい項目 
? C++ファイルを選択 
? 名前を「main.cpp」と 
する 
58
SUGAR SWEET ROBOTICS CO., LTD. 
main.cppを書く 
? 追加資料を元にmain.cppを編集する. 
59
SUGAR SWEET ROBOTICS CO., LTD. 
ビルド 
? メニュー>ソリューションのビルド 
60
SUGAR SWEET ROBOTICS CO., LTD. 
実行 
? メニュー>デバッグ>デバッグ開始 
61
SUGAR SWEET ROBOTICS CO., LTD. 
サーバー側のプログラム 
62
SUGAR SWEET ROBOTICS CO., LTD. 
テスト方法 
? kadai1プログラムをビルドして実行 
? Tera TermでIPアドレス「127.0.0.1」の27015番ポー 
トに接続する 
? キーボードでabcと打ってリターン 
? 実行中のプログラムに3バイト受信と表示される 
63
SUGAR SWEET ROBOTICS CO., LTD. 
Tera Termの使い方 
? ホストを127.0.0.1 
(サーバーのアドレスに) 
? TCPポートを27015に 
? サービスをTelnetに 
64
SUGAR SWEET ROBOTICS CO., LTD. 
どうしてもうまくいかない 
? ファイアーウォールをOFFにして試してみ 
ましょう(インターネットに繋いだままだ 
とやや危険です.自己責任でお願いします) 
? http://windows.microsoft.com/ja-jp/ 
windows/turn-windows-firewall-on- 
off#turn-windows-firewall-on-off= 
windows-7 
65
SUGAR SWEET ROBOTICS CO., LTD. 
サーバー側 
受信したデータによって分岐する 
66
SUGAR SWEET ROBOTICS CO., LTD. 
テスト方法 
? kadai2プログラムをビルドして実行 
? Tera TermでIPアドレス「127.0.0.1」の27015番ポートに 
接続する 
? キーボードでsnd1と打ってリターン 
? C:Windowsmediaring01.wavが再生される 
? キーボードでsnd2と打ってリターン 
? C:Windowsmediaring02.wavが再生される 
? キーボードでsnd3と打ってリターン 
? C:Windowsmediaring03.wavが再生される 
67
SUGAR SWEET ROBOTICS CO., LTD. 
サーバー側 
snd*に対応させる 
68
SUGAR SWEET ROBOTICS CO., LTD. 
「snd*」に対応させる 
? もしsndから始まらないならエラー 
? 数字は1ケタと仮定 
? 4文字目のデータは数字 
? 数字の文字コードから48を引くと数値に 
なる 
69
SUGAR SWEET ROBOTICS CO., LTD. 
テスト方法 
? kadai3プログラムをビルドして実行 
? Tera TermでIPアドレス「127.0.0.1」の27015番ポートに接続す 
る 
? キーボードでsnd1と打ってリターン 
? C:Windowsmediaring01.wavが再生される 
? キーボードでsnd2と打ってリターン 
? C:Windowsmediaring02.wavが再生される 
? キーボードでsnd3と打ってリターン 
? C:Windowsmediaring03.wavが再生される 
? ???snd9まで試す 
70
SUGAR SWEET ROBOTICS CO., LTD. 
クライアント側 
71
SUGAR SWEET ROBOTICS CO., LTD. 
テスト方法 
? kadai3プログラムをビルドして実行(サーバーが起動) 
? kadai4プログラムをビルドして実行(自作クライアントが起動) 
? IPアドレス「127.0.0.1」の27015番ポートに接続する 
? プログラムは自動的にsnd1と送信する. 
? ok.の3文字が返ってくれば成功 
72
SUGAR SWEET ROBOTICS CO., LTD. 
クライアント側 
キーボード入力で分岐 
73
SUGAR SWEET ROBOTICS CO., LTD. 
課題 
? キーボード入力の数値を判別 
? 0から9ならばsnd*として送信 
? qならば終了 
74
SUGAR SWEET ROBOTICS CO., LTD. 
テスト方法 
? kadai3プログラムをビルドして実行(サーバーが起動) 
? kadai5プログラムをビルドして実行(自作クライアントが起動) 
? IPアドレス「127.0.0.1」の27015番ポートに接続する 
? クライアント側の黒いウィンドウをアクティブにし,「1」と打ってEnter 
すると,クライアント側はsnd1と送信するので,音声がなる. 
? 同様に1から9まで試す. 
75
SUGAR SWEET ROBOTICS CO., LTD. 
発展編 
76
SUGAR SWEET ROBOTICS CO., LTD. 
発展編 
? ソフトウエアのメンテナンス性を良くする 
? サーバー側 
? フレームワーク化する 
? クライアント側 
? ライブラリ化する 
? ヘッダーとDLLを配布すれば誰でも使えるように 
? 複数の言語に対応させる 
? GUI作成,ウェブやDBとの連携,数値計算など,言語ごと 
に向き不向きがある 
? 複数の開発者に使ってもらうなら複数の言語対応を 
? C++, Python, Java, C#, MATLAB, LabVIEW 
77
SUGAR SWEET ROBOTICS CO., LTD. 
発展編 
? 複数のプラットフォームに対応させる 
? Windows 
? Linux (OSX) 
! 
? 移植性の高いコードにする 
? ソケット通信用ミドルウエアを使う 
? boost, ACEなど 
? OS依存性の低い言語を使う 
? .NET Framework, Java, Pythonなど 
78
SUGAR SWEET ROBOTICS CO., LTD. 発展編 
? オープンなプロトコルに対応させる 
? 独自プロトコル開発は車輪の再発明 
? プロトコルの慎重な設計は難しく,問題が発覚した後の変更が困難 
? オープンな規格への対応で複数の言語?OS対応になる 
? ロボット系で一般的に使われるインターネット上での分散制御用プロトコル 
? XML-RPC, JSON-RPC 
? CORBA, DDS 
? ロボット用ミドルウエア 
? OpenRTM-aist 
? Win, Linux, OSX 
? C++, Python, Java, C# 
? ROS 
? Linux, OSX 
? C++, Python, Java, C#, Haskell 
? ORiN 
? Win, Linux 
? .NET framework対応 (C++, C#, VB, Python, Java,…) 
79
SUGAR SWEET ROBOTICS CO., LTD. 
おわりに 
? 質問等?サポートページ 
? http://sugarsweetrobotics.com/ネットワーク通信の基礎/ 
80

More Related Content

ネットワーク通信入门

  • 1. SUGAR SWEET ROBOTICS CO., LTD. ネットワークを用いた通信 株式会社SUGAR SWEET ROBOTICS 菅 佑樹 1
  • 2. SUGAR SWEET ROBOTICS CO., LTD. 自己紹介 2
  • 3. SUGAR SWEET ROBOTICS CO., LTD. 自己紹介 ? 菅 佑樹 (Yuki Suga) ? 2012?~ 株式会社SUGAR SWEET ROBOTICS代表取締役 ? 2010?~2012 株式会社リバスト ? 2007?~2010 早稲?田?大学総合機械?工学科助?手 (菅野研) 3 http://ysuga.net http://sugarsweetrobotics.com
  • 4. ! ? 2007?~2010 早稲?田?大学総合機械?工学科助?手 SUGAR SWEET ROBOTICS CO., LTD. 林業機械支援システム 学習適応する コミュニケーション ロボット 4 http://www.sugano.mech.waseda.ac.jp 正面ステレオ カメラ 収穫マニピュレータ 下方カメラ走行台車 車いす搭載型 ロボットアーム いちご収穫ロボット 岐阜県?早稲田大学WABOT-?‐HOUSE 研究所による 前川製作所との共同研究
  • 5. SUGAR SWEET ROBOTICS CO., LTD. ? 2010?~2012 株式会社リバスト 5 アメリカMobile スイス Robot社 移動台車 Pioneerシリーズ Neuronics社 Katana ロボットアーム カナダ Inuktun社 探索ロボット フランス Aldebaran Robotics社 NAO http://revast.co.jp
  • 6. SUGAR SWEET ROBOTICS CO., LTD. ? 2012?~ 株式会社SUGAR SWEET ROBOTICS ? http://sugarsweetrobotics.com – ロボットの受託開発?コンサルティング – RTミドルウエアに関する開発 – ロボット?用ミドルウエアに関する講演 6
  • 7. SUGAR SWEET ROBOTICS CO., LTD. コンテンツ ? 通信とは何か? ? プロトコルとは何か? ? TCP/IPとは何か? ? TCP通信の実際 ? ソケット通信ライブラリ ? Winsock2 ? 実習 7
  • 8. SUGAR SWEET ROBOTICS CO., LTD. 通信とは何か 8
  • 9. SUGAR SWEET ROBOTICS CO., LTD. 通信とは何か ? 通信(=Communication) ? 2者(もしくはそれ以上)の間で情報を共有すること ? 日常会話も通信 ? 壁画も通信 ? どうやって,何を媒介として通信するか,が問題 9
  • 10. SUGAR SWEET ROBOTICS CO., LTD. プロトコル(通信規約) ? どのようなルール(フォーマット)で情報を伝達するか,の約束 ? 会話に用いられる言語もプロトコル ? 通信速度や,データのアライメントもプロトコル ? 電線を使った通信なら,電圧やケーブルの太さ,コネクタ形 状もプロトコル 10
  • 11. SUGAR SWEET ROBOTICS CO., LTD. たとえば ? RS232C ? D Sub 9pin, 25pinコネクタ ? PCとターゲットの1対1を想定 ? 調歩同期式通信なら3線で通信(入力と出力とコモン端子) ? +3Vから+15Vで0(スペース) ? -3Vから-15Vで1(マーク) ? 通信速度は9600bps, 19200bps, 38400bps, 115200bpsなどから選択 ? スタートビット幅,ストップビット幅,データ長,パリティチェック,通 信制御線の有無 11
  • 12. SUGAR SWEET ROBOTICS CO., LTD. たとえば ? CAN (Controller Area Network) ? 2線式通信.2線間の電位差で”0”, “1”を決める ? 最大1Mbps ? バス型通信(複数台接続) ? ID(アドレス)で機材の判別 ? 同時にバスにアクセスしようとするとハードウエアで自動的に判別可能 12 120Ω 120Ω デバイスA ! CANコントローラ デバイスB ! CANコントローラ デバイスC ! CANコントローラ
  • 13. SUGAR SWEET ROBOTICS CO., LTD. データをどう解釈するか? ? RS232Cならば,単純に8ビットのデータが一つ送られてくるのみ. 連続してデータを送り続ければ良い ? CANならば最大8バイトのデータに,送り手のアドレス情報も加わる ? いずれにせよ,このデータをどう解釈するかは自由 ? その解釈のルールもプロトコル 13
  • 14. SUGAR SWEET ROBOTICS CO., LTD. ? 文字列でデータを送受信 ? 改行コードが送られるまで受信 ? 1行の文字列によって動作をする ? メリット ? Tera Termなどのターミナルソフトウエアで確認できる ? 注意点 ? データが長くなる ? (125はデータで1バイトだが,文字列では3文字3バイト) ? 文字列を数値に変換するコストがかかる ? 文字コードの問題 (ASCII以外の場合) ? 改行コードの問題 (CRかLFか,CRLFか) 14 キャラクタベースプロトコル
  • 15. SUGAR SWEET ROBOTICS CO., LTD. バイナリプロトコル ? サーボモータのコントローラのプロトコル ? CAN想定 ? 1バイト目:ロボットへの指令の種類 ? 2バイト目以降:指令に必要なデータ ? メリット ? データが短く,効率的 ? 注意点 ? デバッグがしづらい(ツールを作れば問題無し) ? エンディアン(バイトオーダー) 15 D0 (命令) D1以降のデータ 1 (サーボON/OFF) D1が1ならON,D1が0ならOFF 2 (目標速度指令) D1, D2で2バイト(16bit)の指令値.ビッグエンディアン.1023で最大 速度.最上位ビットが回転方向 3 (目標位置指令) D1, D2, D3, D4で4バイト(32bit)の指令値.ビッグエンディアン. 4 (トルク指令) D1, D2で2バイトの指令値.ビッグエンディアン.1023で最大トル ク.最上位ビットが回転方向
  • 16. SUGAR SWEET ROBOTICS CO., LTD. プロトコルの階層性 ? RS232CやCANで送ったデータを,上位のプロトコルでどう解釈するか ? プロトコルには階層性がある ? ちょうど封筒のようなモノ.封筒の中身がデータで,解釈は上位のプロトコル に任せる ? たとえば??? 16 プロトコル1 プロトコル2 プロトコル2 物理的プロトコル ネットワーク的 アプリケーション的 電圧 通信速度 どこから? 何の命令か? どこへ?
  • 17. SUGAR SWEET ROBOTICS CO., LTD. TCP/IPとは何か 17
  • 18. SUGAR SWEET ROBOTICS CO., LTD. OSI参照モデル アプリケーション層 プレゼンテーション層 セッション層 トランスポート層 ? コンピュータの通信 機能を階層構造に分 割したモデル (ISO) ネットワーク層 18 データリンク層 物理層
  • 19. SUGAR SWEET ROBOTICS CO., LTD. Ethernet ? イーサーネット ? Ether = エーテル???ど こにでもある ? 普段,有線LANと称している のはこれ ? 物理層+データリンク層の通 信 ? MACアドレス 19 アプリケーション層 プレゼンテーション層 セッション層 トランスポート層 ネットワーク層 データリンク層 物理層
  • 20. SUGAR SWEET ROBOTICS CO., LTD. IPとは何か ? IP (インターネットプロトコル) ルータ0.1.1 ? IPアドレス ? パケットのルーティング ルータ0.0.1 20 アプリケーション層 プレゼンテーション層 セッション層 トランスポート層 ネットワーク層 データリンク層 物理層 ホスト1 0.0.1.1 ホスト2 0.0.1.2 ホスト3 0.0.1.3 0.0.1.4 0.1.1.2 ホスト5 0.1.1.4 0.1.1.1
  • 21. SUGAR SWEET ROBOTICS CO., LTD. TCPとは何か ? TCP (Transmission Control Protocol) ? 到達確認と誤り訂正,順序訂正 ? ポート番号 ! ! ! ! ! ! ! ? TCP/IPを使えば高信頼かつ柔軟な ホスト間の通信が可能になる 21 アプリケーション層 プレゼンテーション層 セッション層 トランスポート層 ネットワーク層 データリンク層 物理層 ホスト1 0.0.1.4 ホスト2 0.0.1.2 ホスト5 0.1.1.1 80 3306 ウェブサーバ データベース
  • 22. SUGAR SWEET ROBOTICS CO., LTD. TCP/IP通信を使うRT機器 RT = Robotics Technologies (ロボット技術) 22
  • 23. SUGAR SWEET ROBOTICS CO., LTD. Ethernetとマイコン ? マイクロコントローラの高性能化 ? EthernetとTCP/IPをサポートするコントロー ラが増えた ? ドライバ不要 ? プラットフォーム依存性(言語?OS)が低い ? IPアドレス等の設定が必要 ? サポートする技術がある (Bonjourなど) 23
  • 24. SUGAR SWEET ROBOTICS CO., LTD. 市販の汎用マイコン等 ? arduinoやmbedなどのホビー向けマイコン 製品 ? arduino, mbed, netduino, GR-SAKURA… ? Raspberry-PiやBeagle Boardなどの小型組 み込みLinuxボード ? Raspberry-Pi, Armadillo, Beagle Bone Black 24
  • 25. SUGAR SWEET ROBOTICS CO., LTD. センサ,コントローラ等 ? レーザースキャナ ? 北陽電機 ? UST-10LX, USB-20LX等 ? SICK株式会社 ? LMS500等 ? モータコントローラ ? イクシスリサーチ ? iMCs06等 25
  • 26. SUGAR SWEET ROBOTICS CO., LTD. PC ロボット機器 ? Mobile Robot Pioneerシリーズ ? RS232CでPCと通信 ? クライアント用ライブラリが充実 26 RS232C クライアント コントローラ (マイコン) センサ等モータ
  • 27. SUGAR SWEET ROBOTICS CO., LTD. ロボット機器 27 コントローラ (マイコン) PC センサ等モータ RS232C PC サーバ クライアント ? Mobile Robot Pioneerシリーズ ? 付属のサーバープログラムを実行するとTCP/IPを使った遠隔操 作が可能 ? クライアントプログラムは変更不要
  • 28. SUGAR SWEET ROBOTICS CO., LTD. ロボット機器 28 頭部 RS485等サーバPC コントローラ (マイコン) センサ等モータ クライアント ? Aldebaran Robotics NAO ? 頭部でLinuxサーバープログラムが自動実行される ? ロボットのIPアドレスの設定等は,ブラウザで可能 ウェブサーバ IE等ブラウザ
  • 29. SUGAR SWEET ROBOTICS CO., LTD. TCP通信の実際 29
  • 30. SUGAR SWEET ROBOTICS CO., LTD. ソケット通信 ? TCP/IP通信のエンドポイントを「ソケッ ト」と呼ぶ ? OSごとに実装が違うが大きな流れは一緒 ? UNIX, Linux (POSIXライブラリ) ? Windows (Winsockライブラリ) ? 様々な言語でソケット通信が可能 ? C++, Python, Java, C#, VB, MATLAB… 30
  • 31. SUGAR SWEET ROBOTICS CO., LTD. サーバ側 1.ソケット生成(socket) 2.ソケット登録(bind) 3.ソケット接続準備(listen) 4.ソケット接続待機(accept) 5.受信?送信(recv / send) 6.ソケット切断(close) 31
  • 32. SUGAR SWEET ROBOTICS CO., LTD. クライアント側 32 1.ソケット生成(socket) 2.ソケット接続要求(connect) 3.受信?送信(recv / send) 4.ソケット切断(close)
  • 33. SUGAR SWEET ROBOTICS CO., LTD. TCP ? TCPソケットに必要な情報 ? サーバー側 ? ポート番号 ? クライアント側 ? ポート番号 ? サーバーのIPアドレス 33 サーバー 0.1.1.1 3306 ! アプリ クライアント 0.0.1.2
  • 34. SUGAR SWEET ROBOTICS CO., LTD. 34 サーバー側クライアント側 ソケット作成 socket ソケット登録 bind ソケット接続準備 listen ソケット接続待機 accept ソケット作成 socket ソケット接続要求 connect 通信用ソケット 送受信 (send / recv) ソケット切断 close 切断
  • 35. SUGAR SWEET ROBOTICS CO., LTD. Winsock2 35
  • 36. SUGAR SWEET ROBOTICS CO., LTD. サーバ側 36
  • 37. SUGAR SWEET ROBOTICS CO., LTD. ヘッダーファイル ? winsock2.hやws2tcpip.hをインクルードする ? ws2_32.libをリンクする 37 // ソケットライブラリを使うためのヘッダー #include <winsock2.h> #include <ws2tcpip.h> #include <tchar.h> // ソケットライブラリを使うためのライブラリのリンク #pragma comment (lib, "Ws2_32.lib") ! // 標準的なC言語のヘッダー #include <stdio.h> #include <stdlib.h>
  • 38. SUGAR SWEET ROBOTICS CO., LTD. WSAStartup 38 ? WSAStartupを実行する必要がある. ? 終了時はWSACleanupを実行する // #1. WSAStartup関数を呼び出し、ソケット通信を開始する // この関数を読んだ場合、プログラムはWSACleanup関数を // 呼んで終了する必要がある。 WSADATA wsaData; result = WSAStartup(MAKEWORD(2, 2), &wsaData); if (result != 0) { // 失敗するとゼロ以外の値が返る printf(" # WSAStartup failed with error: %dn", result); return INVALID_SOCKET; }
  • 39. SUGAR SWEET ROBOTICS CO., LTD. // #2.3 ソケットの作成 listenSocket = socket(AF_INET, SOCK_STREAM, 0); if (listenSocket == INVALID_SOCKET) { printf("socket failed with error: %ldn", WSAGetLastError()); WSACleanup(); return INVALID_SOCKET; } 39 ? socket関数でソケットを作成する
  • 40. SUGAR SWEET ROBOTICS CO., LTD. 40 ? サーバーが待機するソケットの設定を初期化する ? 重要なのはTCPのポート番号 ! struct sockaddr_in addr; ! addr.sin_family = AF_INET; addr.sin_port = htons(27015); addr.sin_addr.S_un.S_addr = INADDR_ANY; ! // #2.4 Bind result = bind(listenSocket, (struct sockaddr *)&addr, sizeof(addr)); if (result == SOCKET_ERROR) { printf("bind failed with error: %dn", WSAGetLastError()); closesocket(listenSocket); WSACleanup(); return INVALID_SOCKET; }
  • 41. SUGAR SWEET ROBOTICS CO., LTD. ? listen関数で接続の準備 ? accept関数で接続待機 41 // #2.5 Listen result = listen(listenSocket, SOMAXCONN); if (result == SOCKET_ERROR) { printf("listen failed with error: %dn", WSAGetLastError()); closesocket(listenSocket); WSACleanup(); return INVALID_SOCKET; } ! // #2.6 Accept clientSocket = accept(listenSocket, NULL, NULL); if (clientSocket == INVALID_SOCKET) { printf("accept failed with error: %dn", WSAGetLastError()); closesocket(listenSocket); WSACleanup(); return INVALID_SOCKET; }
  • 42. SUGAR SWEET ROBOTICS CO., LTD. ? recv関数でデータを受信する 42 int numReceived; char receiveBuffer[DEFAULT_BUFFER_LEN]; int receiveBufferLength = DEFAULT_BUFFER_LEN; ! // データを受信する。numReceivedには受信したデータのバイト数が入る。 receiveBufferには受信データが入る。 numReceived = recv(clientSocket, receiveBuffer, receiveBufferLength, 0); if (numReceived > 0) { // 正常に受信したなら表示する。 printf(" # Bytes received: %dn", numReceived); }
  • 43. SUGAR SWEET ROBOTICS CO., LTD. ? send関数でデータの送信 43 int numReceived; char receiveBuffer[DEFAULT_BUFFER_LEN]; int receiveBufferLength = DEFAULT_BUFFER_LEN; ! sendResult = send(clientSocket, receiveBuffer, numReceived, 0); if (sendResult == SOCKET_ERROR) { // 送信失敗なら終了する。 printf(" # Send failed with error: %dn", WSAGetLastError()); closesocket(clientSocket); WSACleanup(); return 1; } printf(" # Bytes sent: %dn", sendResult); // 送信成功なら表示する。
  • 44. SUGAR SWEET ROBOTICS CO., LTD. クライアント側 44
  • 45. SUGAR SWEET ROBOTICS CO., LTD. ヘッダーファイル ? winsock2.hやws2tcpip.hをインクルードする ? ws2_32.libをリンクする 45 // ソケットライブラリを使うためのヘッダー #include <winsock2.h> #include <ws2tcpip.h> #include <tchar.h> // ソケットライブラリを使うためのライブラリのリンク #pragma comment (lib, "Ws2_32.lib") ! // 標準的なC言語のヘッダー #include <stdio.h>
  • 46. SUGAR SWEET ROBOTICS CO., LTD. WSAStartup 46 ? WSAStartupを実行する必要がある. ? 終了時はWSACleanupを実行する // #1. WSAStartup関数を呼び出し、ソケット通信を開始する // この関数を読んだ場合、プログラムはWSACleanup関数を // 呼んで終了する必要がある。 WSADATA wsaData; result = WSAStartup(MAKEWORD(2, 2), &wsaData); if (result != 0) { // 失敗するとゼロ以外の値が返る printf(" # WSAStartup failed with error: %dn", result); return INVALID_SOCKET; }
  • 47. SUGAR SWEET ROBOTICS CO., LTD. struct sockaddr_in addr; ! server.sin_family = AF_INET; server.sin_port = htons(27015); server.sin_addr.S_un.S_addr = inet_addr(“127.0.0.1”); ! // #2 ソケットの作成 clientSocket = socket(AF_INET, SOCK_STREAM, 0); if (clientSocket == INVALID_SOCKET) { printf("socket failed with error: %ldn", WSAGetLastError()); WSACleanup(); return INVALID_SOCKET; } 47 ? ソケットの設定を初期化する ? 接続先のアドレスとTCPのポート番号
  • 48. SUGAR SWEET ROBOTICS CO., LTD. ? サーバーが待機するソケットの設定を初期化する ? 重要なのはTCPのポート番号 // #3 ソケットの接続 result = connect(clientSocket, (struct sockaddr *)&server, sizeof(server)); if (result != 0) { printf("socket failed with error: %ldn", WSAGetLastError()); WSACleanup(); return INVALID_SOCKET; } 48
  • 49. SUGAR SWEET ROBOTICS CO., LTD. TCP/IP通信設定 ? サーバ側のIPアドレス?ポート番号を知る ? サーバ側でのipconfig / ifconfigコマンド ? 説明書をよく読む ? そもそも相手のPCや機器と通信が可能か? ? pingコマンドで確認する ? ファイアーウォールの設定を確認する 49
  • 50. SUGAR SWEET ROBOTICS CO., LTD. 実習 50
  • 51. SUGAR SWEET ROBOTICS CO., LTD. 実習内容 ? サーバー&クライアントのプログラム ? サーバー側 ? 27015番のTCPポートで待機 ? 命令によって異なる音声をならす ? クライアント側 ? サーバーに接続する ? サーバは自マシンで動く (IPアドレスは127.0.0.1固定) ? キーボード入力によって異なる命令を送信 51
  • 52. SUGAR SWEET ROBOTICS CO., LTD. これをインストールして下さい ? Visual Studio 2013 Express Edition for Windows Desktop ? http://www.visualstudio.com/ downloads/download-visual-studio-vs# d-express-windows-desktop ? Tera Term (ターミナルソフト) 52
  • 53. SUGAR SWEET ROBOTICS CO., LTD. キーボード入力 数値1~9 受信確認 プロトコル ? テキストベースのプロトコル ? SND*の4バイト「*」には数値が入る 53 S N D 1.... S N D 9 C:WindowsMedia o 再生 .... Ring01.wav C:WindowsMedia Ring09.wav k .
  • 54. SUGAR SWEET ROBOTICS CO., LTD. 実習手順 1.データを受信し表示するプログラムを作る ? 一般的なターミナルソフトからデータを送信する 2.受け取ったデータによって処理を変える ? これもターミナルソフトでテスト 3.データを送信するプログラムを作る ? 2つのプログラムを統合する 54
  • 55. SUGAR SWEET ROBOTICS CO., LTD. Visual Studioの基本的操作 55
  • 56. SUGAR SWEET ROBOTICS CO., LTD. Visual Studio 2013 ? Visual Studio 2013 for Windows Desktopを開く ? 初めて起動する人は登録が必要 ? ファイル>新しいプロジェクトを 選択 ? テンプレート>Visual C++を選択 ? Win32 コンソール アプリケー ションを選択 ? 名前を「TelnetServer」とする 56
  • 57. SUGAR SWEET ROBOTICS CO., LTD. アプリケーションの設定 ? 左のメニューからアプリ ケーションの設定を選ぶ ? 追加のオプション>空の プロジェクトをチェック ? SDLチェックを外す ? 「完了」を押す 57
  • 58. SUGAR SWEET ROBOTICS CO., LTD. ファイルの追加 ? 画面右の「ソリューショ ンエクスプローラ」の 「ソースファイル」を 右クリック ? 追加>新しい項目 ? C++ファイルを選択 ? 名前を「main.cpp」と する 58
  • 59. SUGAR SWEET ROBOTICS CO., LTD. main.cppを書く ? 追加資料を元にmain.cppを編集する. 59
  • 60. SUGAR SWEET ROBOTICS CO., LTD. ビルド ? メニュー>ソリューションのビルド 60
  • 61. SUGAR SWEET ROBOTICS CO., LTD. 実行 ? メニュー>デバッグ>デバッグ開始 61
  • 62. SUGAR SWEET ROBOTICS CO., LTD. サーバー側のプログラム 62
  • 63. SUGAR SWEET ROBOTICS CO., LTD. テスト方法 ? kadai1プログラムをビルドして実行 ? Tera TermでIPアドレス「127.0.0.1」の27015番ポー トに接続する ? キーボードでabcと打ってリターン ? 実行中のプログラムに3バイト受信と表示される 63
  • 64. SUGAR SWEET ROBOTICS CO., LTD. Tera Termの使い方 ? ホストを127.0.0.1 (サーバーのアドレスに) ? TCPポートを27015に ? サービスをTelnetに 64
  • 65. SUGAR SWEET ROBOTICS CO., LTD. どうしてもうまくいかない ? ファイアーウォールをOFFにして試してみ ましょう(インターネットに繋いだままだ とやや危険です.自己責任でお願いします) ? http://windows.microsoft.com/ja-jp/ windows/turn-windows-firewall-on- off#turn-windows-firewall-on-off= windows-7 65
  • 66. SUGAR SWEET ROBOTICS CO., LTD. サーバー側 受信したデータによって分岐する 66
  • 67. SUGAR SWEET ROBOTICS CO., LTD. テスト方法 ? kadai2プログラムをビルドして実行 ? Tera TermでIPアドレス「127.0.0.1」の27015番ポートに 接続する ? キーボードでsnd1と打ってリターン ? C:Windowsmediaring01.wavが再生される ? キーボードでsnd2と打ってリターン ? C:Windowsmediaring02.wavが再生される ? キーボードでsnd3と打ってリターン ? C:Windowsmediaring03.wavが再生される 67
  • 68. SUGAR SWEET ROBOTICS CO., LTD. サーバー側 snd*に対応させる 68
  • 69. SUGAR SWEET ROBOTICS CO., LTD. 「snd*」に対応させる ? もしsndから始まらないならエラー ? 数字は1ケタと仮定 ? 4文字目のデータは数字 ? 数字の文字コードから48を引くと数値に なる 69
  • 70. SUGAR SWEET ROBOTICS CO., LTD. テスト方法 ? kadai3プログラムをビルドして実行 ? Tera TermでIPアドレス「127.0.0.1」の27015番ポートに接続す る ? キーボードでsnd1と打ってリターン ? C:Windowsmediaring01.wavが再生される ? キーボードでsnd2と打ってリターン ? C:Windowsmediaring02.wavが再生される ? キーボードでsnd3と打ってリターン ? C:Windowsmediaring03.wavが再生される ? ???snd9まで試す 70
  • 71. SUGAR SWEET ROBOTICS CO., LTD. クライアント側 71
  • 72. SUGAR SWEET ROBOTICS CO., LTD. テスト方法 ? kadai3プログラムをビルドして実行(サーバーが起動) ? kadai4プログラムをビルドして実行(自作クライアントが起動) ? IPアドレス「127.0.0.1」の27015番ポートに接続する ? プログラムは自動的にsnd1と送信する. ? ok.の3文字が返ってくれば成功 72
  • 73. SUGAR SWEET ROBOTICS CO., LTD. クライアント側 キーボード入力で分岐 73
  • 74. SUGAR SWEET ROBOTICS CO., LTD. 課題 ? キーボード入力の数値を判別 ? 0から9ならばsnd*として送信 ? qならば終了 74
  • 75. SUGAR SWEET ROBOTICS CO., LTD. テスト方法 ? kadai3プログラムをビルドして実行(サーバーが起動) ? kadai5プログラムをビルドして実行(自作クライアントが起動) ? IPアドレス「127.0.0.1」の27015番ポートに接続する ? クライアント側の黒いウィンドウをアクティブにし,「1」と打ってEnter すると,クライアント側はsnd1と送信するので,音声がなる. ? 同様に1から9まで試す. 75
  • 76. SUGAR SWEET ROBOTICS CO., LTD. 発展編 76
  • 77. SUGAR SWEET ROBOTICS CO., LTD. 発展編 ? ソフトウエアのメンテナンス性を良くする ? サーバー側 ? フレームワーク化する ? クライアント側 ? ライブラリ化する ? ヘッダーとDLLを配布すれば誰でも使えるように ? 複数の言語に対応させる ? GUI作成,ウェブやDBとの連携,数値計算など,言語ごと に向き不向きがある ? 複数の開発者に使ってもらうなら複数の言語対応を ? C++, Python, Java, C#, MATLAB, LabVIEW 77
  • 78. SUGAR SWEET ROBOTICS CO., LTD. 発展編 ? 複数のプラットフォームに対応させる ? Windows ? Linux (OSX) ! ? 移植性の高いコードにする ? ソケット通信用ミドルウエアを使う ? boost, ACEなど ? OS依存性の低い言語を使う ? .NET Framework, Java, Pythonなど 78
  • 79. SUGAR SWEET ROBOTICS CO., LTD. 発展編 ? オープンなプロトコルに対応させる ? 独自プロトコル開発は車輪の再発明 ? プロトコルの慎重な設計は難しく,問題が発覚した後の変更が困難 ? オープンな規格への対応で複数の言語?OS対応になる ? ロボット系で一般的に使われるインターネット上での分散制御用プロトコル ? XML-RPC, JSON-RPC ? CORBA, DDS ? ロボット用ミドルウエア ? OpenRTM-aist ? Win, Linux, OSX ? C++, Python, Java, C# ? ROS ? Linux, OSX ? C++, Python, Java, C#, Haskell ? ORiN ? Win, Linux ? .NET framework対応 (C++, C#, VB, Python, Java,…) 79
  • 80. SUGAR SWEET ROBOTICS CO., LTD. おわりに ? 質問等?サポートページ ? http://sugarsweetrobotics.com/ネットワーク通信の基礎/ 80