310 likes | 498 Views
Chapter 12. 직렬 통신과 무선 프로토콜. 학습 목표. 윈도우 API 를 이용한 직렬 통신 기법을 익힌다 . 소켓 (IrSock) 을 이용한 IrDA 프로그래밍 기법을 익힌다 . 다양한 블루투스 프로그래밍 기법을 개관한다. 직렬 통신 기초 (1/4). 직렬 통신의 중요성 학교 ( 전자 / 컴퓨터 분야 ) 실험이나 산업 현장에서 각종 장비를 제어하는 목적으로 많이 사용 무선 프로토콜 (IrDA, 블루투스 ) 을 이용한 통신에도 직렬 통신 프로그래밍 모델을 그대로 사용 가능. 1.
E N D
Chapter 12. 직렬 통신과 무선 프로토콜
학습 목표 • 윈도우 API를 이용한 직렬 통신 기법을 익힌다. • 소켓(IrSock)을 이용한 IrDA 프로그래밍 기법을 익힌다. • 다양한 블루투스 프로그래밍 기법을 개관한다.
직렬 통신 기초 (1/4) • 직렬 통신의 중요성 • 학교(전자/컴퓨터 분야) 실험이나 산업 현장에서 각종 장비를 제어하는 목적으로 많이 사용 • 무선 프로토콜(IrDA, 블루투스)을 이용한 통신에도 직렬 통신 프로그래밍 모델을 그대로 사용 가능
1 DCD (Data Carrier Detect) DSR (Data Set Ready) 6 2 RX (Received Data) RTS (Request To Send) 7 3 TX (Transmitted Data) CTS (Clear To Send) 8 4 DTR (Data Terminal Ready) RI (Ring Indicator) 9 5 GND (Signal Ground) 직렬 통신 기초 (2/4) • RS-232C 표준 9핀 직렬 포트(male)
직렬 통신 기초 (3/4) • PC-모뎀 vs. PC-PC 직렬 통신 DCD ① ① DCD DCD ① ① DCD RX ② ② RX 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
직렬 통신 기초 (4/4) • 용어 • 시작 비트(start bit), 데이터 비트(data bits), 정지 비트(stop bits) • 패리티(parity) • 흐름 제어(flow control) • XON/XOFF (소프트웨어) • RTS/CTS (하드웨어) • DTR/DSR (하드웨어)
직렬 통신 함수 (1/9) • 직렬 통신 절차 ① 직렬 포트를 연다(open). ② 직렬 포트의 각종 설정값을 변경한다. ③ 읽기와 쓰기 타임아웃을 설정한다. ④ 직렬 포트로부터 데이터를 읽거나(read) 쓴다(write). ⑤ 직렬 포트를 닫는다(close).
직렬 통신 함수 (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);
직렬 통신 함수 (3/9) • 각종 설정값 변경하기 BOOL GetCommState ( HANDLE hFile, LPDCB lpDCB ) ; 성공: 0이 아닌 값, 실패: 0 BOOL SetCommState ( HANDLE hFile, LPDCB lpDCB ) ; 성공: 0이 아닌 값, 실패: 0
직렬 통신 함수 (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()");
직렬 통신 함수 (5/9) • 읽기와 쓰기 타임아웃 설정하기 BOOL GetCommTimeouts ( HANDLE hFile, LPCOMMTIMEOUTS lpCommTimeouts ) ; 성공: 0이 아닌 값, 실패: 0 BOOL SetCommTimeouts ( HANDLE hFile, LPCOMMTIMEOUTS lpCommTimeouts ) ; 성공: 0이 아닌 값, 실패: 0
직렬 통신 함수 (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;
직렬 통신 함수 (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()");
직렬 통신 함수 (8/9) • 데이터 읽기와 쓰기 BOOL ReadFile ( HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped ) ; 성공: 0이 아닌 값, 실패: 0
직렬 통신 함수 (9/9) • 데이터 읽기와 쓰기 (cont’d) BOOL WriteFile ( HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten, LPOVERLAPPED lpOverlapped ) ; 성공: 0이 아닌 값, 실패: 0
IrDA (1/3) • IrDA • 노트북, PDA, 휴대폰 등에 장착된 적외선 통신 하드웨어 • 적외선을 이용한 무선 통신 프로토콜 집합 • IrDA 기술 개발과 표준화를 담당하는 기관(http://www.irda.org)
IrDA (2/3) • 특징 ① 지향성(30°이내 각도)을 가지며, 단거리(~1m)에서, 점대점(point-to-point) 방식으로 동작하는 무선 통신 프로토콜이다. ② IrDA 하드웨어에 따라 다양한 전송 속도(115kps ~ 16Mbps)를 지원하며, 통신 에러율이 매우 낮다. ③ 통신을 위한 다양한 파라미터가 자동으로 설정되므로(no configuration), 편리하게 사용할 수 있다. ④ 하드웨어의 소형화, 저전력화, 저가격화가 가능하다.
IrDA (3/3) • 윈도우 운영체제별 IrDA 프로그래밍 지원 사항
IrDA 소켓 프로그래밍 (1/7) • IrDA 소켓 프로그래밍 ① IrDA를 위한 헤더 파일을 추가한다. ② IrDA를 위한 소켓을 생성한다. ③ 소켓 주소 구조체로 SOCKADDR_IN 대신 SOCKADDR_IRDA를 사용한다. ④ 통신 대상이 고정되어 있지 않으므로, 연결하기 전에 IrDA 장치를 탐색한다.
IrDA 소켓 프로그래밍 (2/7) • 헤더 파일과 매크로 • 소켓 생성 #define _WIN32_WINDOWS 0x0410 // 윈도우 98 이상 #define _WIN32_WINNT 0x0500 // 윈도우 2000 이상 #include <winsock2.h> #include <af_irda.h> ... // socket() SOCKET sock = socket(AF_IRDA, SOCK_STREAM, 0); if(sock == INVALID_SOCKET) err_quit("socket()");
IrDA 소켓 프로그래밍 (3/7) • 소켓 주소 구조체 typedef struct _SOCKADDR_IRDA { u_short irdaAddressFamily; u_char irdaDeviceID[4]; char irdaServiceName[25]; } SOCKADDR_IRDA;
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()");
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()");
IrDA 소켓 프로그래밍 (6/7) • IrDA 장치 탐색 // 최대 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; }
IrDA 소켓 프로그래밍 (7/7) • IrDA 장치 탐색 (cont’d) // 발견한 IrDA 장치 목록을 화면에 표시하고 이 중 하나를 // 사용자가 선택하도록 할 수 있다. // 여기서는 무조건 첫 번째 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()");
블루투스 (1/5) • 특징 ① 전 지구상에서 사용 가능한 2.4GHz 주파수 대를 사용한다(지역에 따라 사용할 수 있는 주파수 영역에는 약간 차이가 있다.). ② IrDA와 달리 무지향성이며, 단거리(10m~100m)에서, 점대점(point-to-point) 또는 점대다점(multi-point) 방식으로 동작하는 무선 통신 프로토콜이다. ③ 데이터와 세 개의 음성 채널을 지원한다. 데이터 전송률은 1Mbps다. ④ 하드웨어의 소형화, 저전력화, 저가격화가 가능하다.
블루투스 (2/5) • 블루투스 기술 스펙 • 코어(core) 스펙 • 블루투스 기술이 어떻게 작동하는지를 보여주기 위한 부분으로 물리적인 부분과 그에 필요한 펌웨어(firmware) 등 하드웨어적인 설계 사양에 대해 기술 • 프로파일(profile) 스펙 • 기기 상호간의 호환성(interoperability)을 위해 마련된 것으로 각각의 응용에 대한 프로토콜 배열에 대한 정의
블루투스 (3/5) • 주요 프로파일 • 모든 블루투스 기기가 탑재할 프로파일 • Generic access: 블루투스 장치 탐색과 연결 관리를 위한 일반적인 절차 • Service discovery: 블루투스 애플리케이션이 다른 블루투스 장치의 서비스를 탐색하기 위한 절차 • 전화 기능을 위한 프로파일 • Cordless telephone: 무선 전화기(3-in-1 phone) • Intercom: 무선 전화기(3-in-1 phone) • Synchronization: 동기화
블루투스 (4/5) • 주요 프로파일 (cont’d) • 직렬 포트를 장착한 기기 접속에 필요한 프로파일 • Serial port: 직렬 포트를 사용한 애플리케이션을 위한 직렬 케이블 에뮬레이션 • Headset: 무선 헤드셋 • Dial-up networking: 모뎀 등 • FAX: FAX • LAN access: 라우터 • 객체(object) 교환이나 파일 전송을 위한 프로파일 • Generic object exchange: 객체 교환을 위한 요구 사항 • Object push: 명함 교환 등 • File transfer: 파일 전송
블루투스 (5/5) • 주요 프로파일 - 예
블루투스 프로그래밍 • 구성 요소 • 블루투스 하드웨어 + 장치 드라이버 • 블루투스 프로토콜 스택 • 블루투스 개발 소프트웨어 • 개발 방법 • 상용 개발 소프트웨어 • 소켓 프로그래밍 • 마이크로소프트 블루투스 프로토콜 스택 • 마이크로소프트 블루투스 프로토콜 스택과 호환되는 블루투스 하드웨어 + 장치 드라이버 • 헤더 파일과 라이브러리 • 직렬 통신 프로그래밍