Download presentation
Presentation is loading. Please wait.
1
Chapter 12. 직렬 통신과 무선 프로토콜
2
윈도우 API를 이용한 직렬 통신 기법을 익힌다. 소켓(IrSock)을 이용한 IrDA 프로그래밍 기법을 익힌다.
학습 목표 윈도우 API를 이용한 직렬 통신 기법을 익힌다. 소켓(IrSock)을 이용한 IrDA 프로그래밍 기법을 익힌다. 다양한 블루투스 프로그래밍 기법을 개관한다.
3
직렬 통신의 중요성 학교(전자/컴퓨터 분야) 실험이나 산업 현장에서 각종 장비를 제어하는 목적으로 많이 사용
직렬 통신 기초 (1/4) 직렬 통신의 중요성 학교(전자/컴퓨터 분야) 실험이나 산업 현장에서 각종 장비를 제어하는 목적으로 많이 사용 무선 프로토콜(IrDA, 블루투스)을 이용한 통신에도 직렬 통신 프로그래밍 모델을 그대로 사용 가능
4
RS-232C 표준 9핀 직렬 포트(male) 직렬 통신 기초 (2/4) 7 8 9 6 2 3 4 5 1
DCD (Data Carrier Detect) RX (Received Data) TX (Transmitted Data) DTR (Data Terminal Ready) GND (Signal Ground) DSR (Data Set Ready) RTS (Request To Send) CTS (Clear To Send) RI (Ring Indicator)
5
PC-모뎀 vs. PC-PC 직렬 통신 직렬 통신 기초 (3/4) DCD ① ① DCD DCD ① ① DCD RX ② ② RX
TX ③ ③ TX TX ③ ③ TX DTR ④ ④ DTR DTR ④ ④ DTR GND ⑤ ⑤ GND GND ⑤ ⑤ GND DSR ⑥ ⑥ DSR DSR ⑥ ⑥ DSR RTS ⑦ ⑦ RTS RTS ⑦ ⑦ RTS CTS ⑧ ⑧ CTS CTS ⑧ ⑧ CTS RI ⑨ ⑨ RI RI ⑨ ⑨ RI PC 모뎀 PC PC
6
용어 시작 비트(start bit), 데이터 비트(data bits), 정지 비트(stop bits) 패리티(parity)
직렬 통신 기초 (4/4) 용어 시작 비트(start bit), 데이터 비트(data bits), 정지 비트(stop bits) 패리티(parity) 흐름 제어(flow control) XON/XOFF (소프트웨어) RTS/CTS (하드웨어) DTR/DSR (하드웨어)
7
직렬 통신 절차 ① 직렬 포트를 연다(open). ② 직렬 포트의 각종 설정값을 변경한다.
직렬 통신 함수 (1/9) 직렬 통신 절차 ① 직렬 포트를 연다(open). ② 직렬 포트의 각종 설정값을 변경한다. ③ 읽기와 쓰기 타임아웃을 설정한다. ④ 직렬 포트로부터 데이터를 읽거나(read) 쓴다(write). ⑤ 직렬 포트를 닫는다(close).
8
열기와 닫기 직렬 통신 함수 (2/9) // 포트 열기
HANDLE hComm = CreateFile("COM1", GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); if(hComm == INVALID_HANDLE_VALUE) err_quit("CreateFile()"); ... // 포트 닫기 CloseHandle(hComm);
9
각종 설정값 변경하기 직렬 통신 함수 (3/9) BOOL GetCommState ( HANDLE hFile,
LPDCB lpDCB ) ; 성공: 0이 아닌 값, 실패: 0 BOOL SetCommState ( HANDLE hFile, LPDCB lpDCB ) ; 성공: 0이 아닌 값, 실패: 0
10
각종 설정값 변경하기 – 예제 코드 직렬 통신 함수 (4/9) // 포트 설정값 얻기 DCB dcb;
if(!GetCommState(hComm, &dcb)) err_quit("GetCommState()"); // 포트 설정값 변경 dcb.BaudRate = CBR_57600; dcb.fParity = FALSE; dcb.fNull = FALSE; dcb.ByteSize = 8; dcb.Parity = NOPARITY; dcb.StopBits = ONESTOPBIT; if(!SetCommState(hComm, &dcb)) err_quit("SetCommState()");
11
읽기와 쓰기 타임아웃 설정하기 직렬 통신 함수 (5/9) BOOL GetCommTimeouts ( HANDLE hFile,
LPCOMMTIMEOUTS lpCommTimeouts ) ; 성공: 0이 아닌 값, 실패: 0 BOOL SetCommTimeouts ( HANDLE hFile, LPCOMMTIMEOUTS lpCommTimeouts ) ; 성공: 0이 아닌 값, 실패: 0
12
읽기와 쓰기 타임아웃 설정하기 – 관련 구조체 직렬 통신 함수 (6/9)
typedef struct _COMMTIMEOUTS { DWORD ReadIntervalTimeout; /* Maximum time between read chars. */ DWORD ReadTotalTimeoutMultiplier; /* Multiplier of characters. */ DWORD ReadTotalTimeoutConstant; /* Constant in milliseconds. */ DWORD WriteTotalTimeoutMultiplier; /* Multiplier of characters. */ DWORD WriteTotalTimeoutConstant; /* Constant in milliseconds. */ } COMMTIMEOUTS, *LPCOMMTIMEOUTS;
13
읽기와 쓰기 타임아웃 설정하기 – 예제 코드 직렬 통신 함수 (7/9) // 읽기와 쓰기 타임아웃 설정
COMMTIMEOUTS timeouts; timeouts.ReadIntervalTimeout = 0; timeouts.ReadTotalTimeoutMultiplier = 0; timeouts.ReadTotalTimeoutConstant = 0; timeouts.WriteTotalTimeoutMultiplier = 0; timeouts.WriteTotalTimeoutConstant = 0; if(!SetCommTimeouts(hComm, &timeouts)) err_quit("SetCommTimeouts()");
14
데이터 읽기와 쓰기 직렬 통신 함수 (8/9) BOOL ReadFile ( HANDLE hFile,
LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped ) ; 성공: 0이 아닌 값, 실패: 0
15
데이터 읽기와 쓰기 (cont’d) 직렬 통신 함수 (9/9) BOOL WriteFile ( HANDLE hFile,
LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten, LPOVERLAPPED lpOverlapped ) ; 성공: 0이 아닌 값, 실패: 0
16
IrDA 노트북, PDA, 휴대폰 등에 장착된 적외선 통신 하드웨어 적외선을 이용한 무선 통신 프로토콜 집합
17
IrDA (2/3) 특징 ① 지향성(30°이내 각도)을 가지며, 단거리(~1m)에서, 점대점(point-to-point) 방식으로 동작하는 무선 통신 프로토콜이다. ② IrDA 하드웨어에 따라 다양한 전송 속도(115kps ~ 16Mbps)를 지원하며, 통신 에러율이 매우 낮다. ③ 통신을 위한 다양한 파라미터가 자동으로 설정되므로(no configuration), 편리하게 사용할 수 있다. ④ 하드웨어의 소형화, 저전력화, 저가격화가 가능하다.
18
윈도우 운영체제별 IrDA 프로그래밍 지원 사항
CE IrCOMM, IrSock 95, NT 4.0 없음 98, Me 2000 IrSock XP/2003
19
IrDA 소켓 프로그래밍 ① IrDA를 위한 헤더 파일을 추가한다. ② IrDA를 위한 소켓을 생성한다.
③ 소켓 주소 구조체로 SOCKADDR_IN 대신 SOCKADDR_IRDA를 사용한다. ④ 통신 대상이 고정되어 있지 않으므로, 연결하기 전에 IrDA 장치를 탐색한다.
20
헤더 파일과 매크로 소켓 생성 IrDA 소켓 프로그래밍 (2/7)
#define _WIN32_WINDOWS 0x0410 // 윈도우 98 이상 #define _WIN32_WINNT 0x // 윈도우 2000 이상 #include <winsock2.h> #include <af_irda.h> ... // socket() SOCKET sock = socket(AF_IRDA, SOCK_STREAM, 0); if(sock == INVALID_SOCKET) err_quit("socket()");
21
소켓 주소 구조체 IrDA 소켓 프로그래밍 (3/7) typedef struct _SOCKADDR_IRDA {
u_short irdaAddressFamily; u_char irdaDeviceID[4]; char irdaServiceName[25]; } SOCKADDR_IRDA;
22
소켓 주소 구조체 사용 예 – 서버 코드 IrDA 소켓 프로그래밍 (4/7) // bind()
SOCKADDR_IRDA serveraddr; ZeroMemory(&serveraddr, sizeof(serveraddr)); serveraddr.irdaAddressFamily = AF_IRDA; strcpy(serveraddr.irdaServiceName, "IrServer"); retval = bind(listen_sock, (SOCKADDR *)&serveraddr, sizeof(serveraddr)); if(retval == SOCKET_ERROR) err_quit("bind()");
23
소켓 주소 구조체 사용 예 – 클라이언트 코드 IrDA 소켓 프로그래밍 (5/7) // 장치 탐색 ...
// connect() SOCKADDR_IRDA serveraddr; ZeroMemory(&serveraddr, sizeof(serveraddr)); serveraddr.irdaAddressFamily = AF_IRDA; serveraddr.irdaDeviceID[] 채우기; strcpy(serveraddr.irdaServiceName, "IrServer"); retval = connect(sock, (SOCKADDR *)&serveraddr, sizeof(serveraddr)); if(retval == SOCKET_ERROR) err_quit("connect()");
24
IrDA 장치 탐색 IrDA 소켓 프로그래밍 (6/7) // 최대 10개의 IrDA 장치 탐색 struct MyDevList{
ULONG numDevice; // IrDA 장치 개수 IRDA_DEVICE_INFO Device[10]; // IrDA 장치 정보 } optval; optval.numDevice = 0; // IrDA 장치 개수를 0으로 초기화 int optlen = sizeof(optval); retval = getsockopt(sock, SOL_IRLMP, IRLMP_ENUMDEVICES, (char *)&optval, &optlen); if(retval == SOCKET_ERROR) err_quit("getsockopt"); // 장치 탐색 결과 출력 printf("[IrDA 클라이언트] %d개의 적외선 장치 발견!\n", optval.numDevice); if(optval.numDevice == 0){ closesocket(sock); WSACleanup(); return 0; }
25
IrDA 장치 탐색 (cont’d) IrDA 소켓 프로그래밍 (7/7)
// 사용자가 선택하도록 할 수 있다. // 여기서는 무조건 첫 번째 IrDA 장치에 접속하도록 하였다. SOCKADDR_IRDA serveraddr; ZeroMemory(&serveraddr, sizeof(serveraddr)); serveraddr.irdaAddressFamily = AF_IRDA; memcpy(&serveraddr.irdaDeviceID[0], &optval.Device[0].irdaDeviceID[0], 4); strcpy(serveraddr.irdaServiceName, "IrServer"); retval = connect(sock, (SOCKADDR *)&serveraddr, sizeof(serveraddr)); if(retval == SOCKET_ERROR) err_quit("connect()");
26
블루투스 (1/5) 특징 ① 전 지구상에서 사용 가능한 2.4GHz 주파수 대를 사용한다(지역에 따라 사용할 수 있는 주파수 영역에는 약간 차이가 있다.). ② IrDA와 달리 무지향성이며, 단거리(10m~100m)에서, 점대점(point-to-point) 또는 점대다점(multi-point) 방식으로 동작하는 무선 통신 프로토콜이다. ③ 데이터와 세 개의 음성 채널을 지원한다. 데이터 전송률은 1Mbps다. ④ 하드웨어의 소형화, 저전력화, 저가격화가 가능하다.
27
블루투스 기술 스펙 코어(core) 스펙 프로파일(profile) 스펙 블루투스 (2/5)
블루투스 기술이 어떻게 작동하는지를 보여주기 위한 부분으로 물리적인 부분과 그에 필요한 펌웨어(firmware) 등 하드웨어적인 설계 사양에 대해 기술 프로파일(profile) 스펙 기기 상호간의 호환성(interoperability)을 위해 마련된 것으로 각각의 응용에 대한 프로토콜 배열에 대한 정의
28
주요 프로파일 모든 블루투스 기기가 탑재할 프로파일 전화 기능을 위한 프로파일 블루투스 (3/5)
Generic access: 블루투스 장치 탐색과 연결 관리를 위한 일반적인 절차 Service discovery: 블루투스 애플리케이션이 다른 블루투스 장치의 서비스를 탐색하기 위한 절차 전화 기능을 위한 프로파일 Cordless telephone: 무선 전화기(3-in-1 phone) Intercom: 무선 전화기(3-in-1 phone) Synchronization: 동기화
29
주요 프로파일 (cont’d) 직렬 포트를 장착한 기기 접속에 필요한 프로파일
블루투스 (4/5) 주요 프로파일 (cont’d) 직렬 포트를 장착한 기기 접속에 필요한 프로파일 Serial port: 직렬 포트를 사용한 애플리케이션을 위한 직렬 케이블 에뮬레이션 Headset: 무선 헤드셋 Dial-up networking: 모뎀 등 FAX: FAX LAN access: 라우터 객체(object) 교환이나 파일 전송을 위한 프로파일 Generic object exchange: 객체 교환을 위한 요구 사항 Object push: 명함 교환 등 File transfer: 파일 전송
30
블루투스 (5/5) 주요 프로파일 - 예
31
구성 요소 개발 방법 블루투스 하드웨어 + 장치 드라이버 블루투스 프로토콜 스택 블루투스 개발 소프트웨어 상용 개발 소프트웨어
블루투스 프로그래밍 구성 요소 블루투스 하드웨어 + 장치 드라이버 블루투스 프로토콜 스택 블루투스 개발 소프트웨어 개발 방법 상용 개발 소프트웨어 소켓 프로그래밍 마이크로소프트 블루투스 프로토콜 스택 마이크로소프트 블루투스 프로토콜 스택과 호환되는 블루투스 하드웨어 + 장치 드라이버 헤더 파일과 라이브러리 직렬 통신 프로그래밍
Similar presentations