'Bluetooth'에 해당되는 글 1건

  1. 2007.12.14 [무선을 하자!!] 윈도우 임베디드 CE 6.0 블루투스 포팅
무선 데이터 통신을 위한 선택..
블루투스로 해볼까???
공부해봅시다~

[WindowsCE 6.0 특집 ⑤] 윈도우 임베디드 CE 6.0 블루투스 포팅

오익성(디오텔 기술연구소 대리)   2007/10/22
WindowsCE 6.0
embeddedce
Microsoft
DST
필자는 윈도우 CE 플랫폼 전문 개발업체인 디오텔 기술 연구소에서 근무하고 있으며, OS포팅과 디바이스 드라이버 및 블루투스 개발을 담당하고 있다.

시작에 앞서
우리는 선(wire)이 사라지고 있는 시대에 살고 있다. 장치와 장치를 연결하는 매개체였던 선은 이미 무선 네트워크로 대체되고 있다. 또한, 한 개인을 중심으로 하는 퍼스널 네트워크는 이제 옛 SF영화에서 보던 신기한 것이 아니다. 무선 이어셋을 귀에 꽂고 통화를 하며, 친구들과 케이블 없이 핸드폰으로 친구들과 사진전송 또는 게임을 하기도 한다.

집에서는 무선 마우스와 프린터를 사용하고, 포터블 디바이스를 사용해 간단한 접속만으로 무선 인터넷을 사용하고 있다. 어느덧 무선통신은 편리함을 넘어 필수품으로 점점 자리 잡아가고 있다. 그리고 그 중심에는 "블루투스"라는 기술이 존재하고 있다.

Bluetooth란?
블루투스 기술은 작고, 저렴한 가격, 100mW 이하의 저전력 소모로 근거리 송신기를 모바일 디바이스에 탑재하여 무선환경을 제공해 주는 하나의 기술이다. 1994년 에릭슨 모바일 커뮤니케이션의 사내 프로젝트로 시작되었으며, 2.4GHz ISM(Industrial Scientific Medicine) 밴드를 사용한다.

1998년 2월에 에릭슨, 노키아, IBM, 도시바, 인텔로 구성된 표준화 단체인 SIG(Special Interest Group)가 발족되었다. 간섭방지와 보안을 위해 1600 hops/sec 주파수 호핑을 사용한다. 3개의 voice 채널과 1개의 data 채널을 갖고, 1Mbps까지 데이터를 전송할 수 있다.

WinCE 6.0 모듈러 블루투스 아키텍처
스택의 특징을 살펴보면 다음과 같다.
- CE에서 플랫폼이 빌드될 때 레이어(Layer)들을 교체할 수 있다.
- 부가적인 레이어를 추가하는 것도 가능하다.
- WinSock을 통하여, SDP, RFCOMM과 L2CAP를 접속할 수 있다.
- 시리얼 포트 프로파일(Serial Port Profile)을 액세스하여 COM 포트 에뮬레이션(Emulation)을 단순하게 구현할 수 있다.
- 다양한 Vendor Specific Module에 대한 HCI 전송(Transport) 레이어를 갖추고 있다.

OBEX (Object Exchange) : 블루투스와 IrDA통신을 통해서 winsock 상위에 구현된 Object 교환 프로토콜이다.
TDI (Transport Driver Interface) : Winsock 기반으로 하는 유저 API를 제공하는 인터페이스 레이어이다.
COM Port Emulation : RFCOMM 채널을 통하여 만들어지는 virtual COM port를 사용할 수 있도록 만들어준다. dial-up과 LAN access profile들은 이것을 사용한다.
SDP (Service Discovery Protocol) : 블루투스 스택 상위에서 서비스들의 설정/발견을 다루는 프로토콜이다.
RFCOMM(Serial Cable Emulation Protocol) : TS07.10 프로토콜의 블루투스 adaptation이다. 버추얼 COM 에뮬레이션 설립과 점대점 프로토콜을 제공한다.
PAN (Personal Area Network) profile : 블루투스 전송 레이어를 통하여 진행되는 표준 IP-based 네트워크 서비스를 지원하기 위한 절차를 정의한다.
HID (Human Interface Device) profile : 키보드, 마우스와 같은 장비를 지원하기 위한 기능을 정의한다.
L2CAP (Logical Link Control and Adaptation Protocol) : multiplexing, 패킷을 segmentation과 reassemble을 하고, quality of Service(QoS)를 구현한 connection-based 프로토콜이다.
Third Party Extensions : 새로운 프로파일을 생성하여 하위 스택만을 사용하여 새로운 개발이 가능하다. 그러나 개발하는 데 있어서 블루투스에 대한 많은 지식이 필요하다.
HCI (Host Controller Interface) : 컨트롤러 관리, 링크 설립과 유지를 책임지는, 블루투스 하드웨어와의 기본적인 인터페이스이다.
Bluetooth Universal Transport Manager (BthUniv) : 전송 레이어와 HCI layer 사이에서 중간 transport driver이다. PnP 디바이스를 발견하고, 적절한 transport driver를 로드한다.
HCI Transport Layer : 블루투스 하드웨어로 HCI 명령어를 전달해주는 레이어이다.
LMP (Link Manager Protocol) : 블루투스 장치들 사이에서 링크 설립을 다루는 프로토콜이다.
BB (Baseband) : piconet을 형성하는 블루투스 유닛(unit) 사이에서 물리적인 RF 링크를 가능하게 한다.

블루투스 스택은 크게 세 부분으로 나누어 볼 수 있다.

그림에서 블루투스 모듈 부분은 LMP와 BB 레이어를 갖고 있다. 이 부분은 RF radio를 담당하고, 물리적인 링크를 관리하는 부분이다. 블루투스의 콘셉트에 맞게 다양한 하드웨어 인터페이스를 지원할 수 있도록 설계되어 있다. USB, UART, PCMCIA, SDIO 등과 같이 빌트인, 플러그앤플레이 형태의 디바이스를 사용할 수 있다.

그 위로, HCI Layer부분은 HCI, BthUniv 그리고 HCI 전송 레이어를 포함한다. 다양한 블루투스 모듈 인터페이스를 지원하기 위한 드라이버들의 집합이다. 또 각 모듈 제조사들이 제공하는 프로토콜에 대하여 통신을 가능케 하고 있다.

나머지 부분은 다소 복잡해 보이는 구조처럼 보인다. 그러나 그만큼 다양한 형태로 스택 레이어를 조합하여 필요에 맞게 사용할 수 있다는 장점을 갖고 있다. 스택을 용도에 맞게 최소화함으로써 장치의 리소스나 사용을 간소화해 더 많은 효율성으로 얻을 수 있을 것이다.

WinCE 6.0에서 블루투스 프로파일
프로파일은 블루투스를 최상위 애플리케이션에서 어떻게 사용할지를 정의한 규격이다.

하위 스택(HCI 전송 레이어 이하)은 지극히 물리적인 통신을 위한 설정들을 정의하였지만, 상위 스택에서는 애플리케이션 간의 피어투피어 통신을 위해 서비스에 대한 약속을 하여야 한다.

블루투스 장치들은 이 프로파일에 정의되어 있는 방식에 따라 통신하게 된다. 가장 중요한 이유는 다른 제조사의 다른 장치와의 상호 접속성 및 호환성을 확보하기 위해 정의된 것이다.

다음은 프로파일의 목적이다.

- 엔드유저 기능을 구현하기 위한 표준시스템의 Specification이 어떻게 되어야 하는지를 설명한다.
- 동일한 표준에 의한 구현으로 호환성을 높인다.
- 각각 선택사항의 구현은 애플리케이션들이 동일한 기능을 갖도록 한다.
- 파라미터들은 애플리케이션이 동일하게 작동하도록 한다.
- 서로 다른 표준들을 조합하기 위한 방식이 정의된다.
- 유저 인터페이스 가이드라인이 정의된다.

WinCE 6.0에서는 모든 프로파일을 구현되어 있지 않기 때문에 개발하려는 장비에 필요한 프로파일이 존재하지 않는다면 써드파티 업체를 통해 프로파일을 구현하여야 한다. CE 6.0에서는 <그림 1>에서 표시한 것과 같이 존재하고 있다.


GAP (Generic Access Profile) 블루투스 장치간의 접속을 발견 또는 설정하기 위한 기본적인 요소를 정의하고 있다.
GOEP (Generic Object Exchange Profile) OBEX를 사용하는 모델을 지원하기 위한 절차를 포함한다.
SPP (Serial Port Profile) : RFCOMM을 사용하는 블루투스 장치의 피어(peer)간 시리얼 케이블 연결을 하기 위한 절차를 정의한다.
SPP (Serial Port Profile) RFCOMM을 사용하는 블루투스 장비 간의 시리얼 케이블 접속설정을 위해 필요한 처리를 정의한다.
FTP (File Transfer Profile) 블루투스 장비 간의 데이터 전송 또는object를 처리를 지원
HFP (Hands-Free Profile) 블루투스 장비와 셀폰 간의 핸즈프리 기능을 지원
HSP (Headset Profile) 블루투스 장비와 셀폰 간의 헤드셋 기능을 사용하기 위한 절차를 정의한다.
HID (Human Interface Device Profile) 키보드, 마우스와 같은 장비를 지원하기 위한 기능을 정의한다.
LAP (LAN Access Profile) PPP(Point-to-Point Protocol)을 사용하는 LAN 접속을 지원
OPP (Object Push Profile) vCard과 같은 적은 데이터양의 오브젝트 교환을 지원
PAN (Personal Area Networking Profile) 블루투스 전송 레이어를 통하여 진행되는 네트워크 서비스를 기본으로 하는 표준 IP를 지원한다.
-point-to-point 연결을 사용하는 두개의 블루투스 장치사이에서 데이터를 전송
-좁은 지역에서 임의의 멤버간의 데이터 공유 또는게임하기 위한 목적으로 멤버를 추가하거나 삭제한다.

Vendor Specific Module
개발을 하면서, 처음 부딪히는 문제는 어떤 인터페이스를 사용하는 블루투스 모듈을 사용하여 장치와 통신을 할 것인가일 것이다. CE에서는 USB, UART, BCSP, Socket, AmbiCom 프로토콜을 사용하는 모듈에 대한 인터페이스를 제공하고 있다.

다음의 드라이버들은 %_WINCEROOT%\Public\Common\Oak\Drivers\Bluetooth\Transports에서 볼 수 있다.

- BthAmb.dll : AmbiCom사의 uart protocol
- BthCsr.dll : CSR(Cambridge Sillicon Radio)사의 BCSP(BlueCore Serial Protocol)를 지원
- BthSc.dll : SocketCom/Nokia사의 protocol을 지원
- BthUart.dll : UART protocol interface
- BthUsb.dll : USB interface
- BthSdio.dll : SDIO interface
(%_WINCEROOT%\public\common\oak\drivers\sdcard\SDClientDrivers\bluetooth)


사용하려는 블루투스 모듈이 어떤 프로토콜을 사용하는지를 확인 하고 컴포넌트를 추가하면 된다. 위 그림은 Bluetooth stack with Universal Loadable Driver(BthUniv)를 추가하였을 때의 그림이다. BthUniv에 관한 내용은 아래에서 자세히 다루도록 한다.

Bluetooth Universal Transport Manager
WinCE 6.0에서는 HCI 전송 레이어와 스택에서의 transport driver 사이에 intermediate transport driver인 BthUniv를 제공하고 있다. 그 이유는 Built-in and PnP transport driver를 지원하고, 적절한 transport driver를 로드한다(BthUniv는 항상 빌드인 드라이버보다 PnP 드라이버를 먼저 확인한다).

BthUniv 는 다음과 같은 일을 한다.
- PnP 블루투스 카드의 삽입/제거를 감지한다.
- HCI transport interface call을 변환하여, stack의 transport driver로 전달한다.
- 하위 transport driver를 로드한다.

Bluetooth Universal Transport Manager Registry Settings
Bluetooth Universal Transport Manager (BthUniv) PCMCIA 또는 USB와 같은 PnP 장치를 찾는다. 만약에, PnP 장치가 찾아지지 않는다면, BthUniv는 레지스트리에 나열되어 있는 순서대로 빌드인 장치를 찾는다.

PnP장치가 시스템에 연결되었을 때, 이것과 연관된 transport driver와 세팅 값을 구분하는 IClass 값을 사용할 수 있다.
BthUniv의 레지스트리 설정은 다음과 같다.

[HKEY_LOCAL_MACHINE\Software\Microsoft\Bluetooth\Transports\BuiltIn\1]
"driver"="bthcsr.dll" ;; 로드될 드라이버 이름
"name"="COM7:" ;; 상위 stack과 통신할 channel명
"baud"=dword:1c200 ;; baud-rate

빌트인 transport driver를 위한 설정 값을 나타낸다. Key에서 "1"값은 우선순위를 나타낸다.

개발하는 환경에 맞게 driver name과 port를 변경해주어야 한다.

[HKEY_LOCAL_MACHINE\Software\Microsoft\Bluetooth\Transports\PnP\]

위 레지스트리는 PnP transport driver를 위한 설정 값을 나타낸다.
GUID Key({}안의 표시되는)는 PnP transport driver의 IClass 레지스트리 키 값을 나타낸다.

위 값들은 BthUniv에게 사용하려고 하는 transport registry settings를 알려준다. 이 세팅값은 HCI_OpenConnection하기 전에 [HKEY_LOCAL_MACHINE\Software\Microsoft\Bluetooth\HCI] 로 복사된다.

만약에, SYSGEN_BTH_CSR_ONLY(SDIO_ONLY, USB_ONLY, UART_ONLY)와 값이 특별한 Sysgen 값의 설정으로 transport driver를 사용하면, BthUniv는 사용되지 않는다. 이러한 경우에, transport driver를 위한 레지스트리 값은 [HKEY_LOCAL_MACHINE\Software\Microsoft\Bluetooth\HCI] 에서 바로 불러 쓴다. transport driver를 설정하기 위해서는, 이 레지스트리 key를 변경해주어야 한다.

예를 들면, CSR 칩셋을 사용하는 빌트인 칩셋이고, COM7:을 통해 연결되어 있고, baud rate가 115200 bps라고 한다면, 다음과 같이 레지스트리를 추가해주어야 한다.

; @CESYSGEN IF BTD_CSR
[HKEY_LOCAL_MACHINE\Software\Microsoft\Bluetooth\HCI]
"flags"=dword:1
"name"="COM7:"
"baud"=dword:1c200
; @CESYSGEN ENDIF

NOTE . CSR 칩셋을 사용하는 빌트인 카드를 쓰는 경우에는 chipset이 BCSP link establishment를 지원하고 있는지를 확인하여, 지원하지 않는 경우에는 %_WINCEROOT%\Public\Common\Oak\Drivers\Bluetooth\Transports\bcsp\csr\hcibcsp.cpp에서 다음의 define의 주석을 풀어주어야 정상적으로 동작한다.
#define BCSP_NO_LINK_ESTABLISHMENT

다음은 빌트인, PnP 모듈을 사용했을 때, transport driver가 불려지는 구조를 간단히 표현하였다.



WinCE 6.0에서 블루투스 컴포넌트
- CE에서 컴포넌트가 어떻게 구성이 되어 있고, 어떤 것을 올려야 하는지에 대해서 알아보자.

컴포넌트 구성은 크게 두 부분이다. 프로파일과 stack with transport driver이다. 4.2에서는 구성이 다소 복잡했었는데, 5.0과 6.0에서는 잘 분류되어 있다.

먼저 위에 설명한 transport driver에 대한 것은 Bluetooth Stack with Universal Loadable Driver를 추가한 것이다. 이것은 말 그대로, 블루투스 스택, BthUniv와 각각의 transport driver들을 모두 올린 것이다.

그 외에 Integrated CSR (or SDIO, UART, USB) 드라이버 컴포넌트를 추가하게 되면, 블루투스 스택과 각각의 transport driver들만 추가되게 된다. 그 이유는 한 가지 모듈만 사용하는 데에 있어 다른 모듈에 대한 transport driver는 필요하지 않기 때문이다. 그렇기 때문에 블루투스 스택(Btd.dll)에서 직접 드라이버 로드를 책임지고 있다.

- Bluetooth Stack with Universal Loadable Driver

- Bluetooth Stack with Integrated CSR chipset (or SDIO,UART,USB) Driver

가장 중요한 부분인 Btd.dll은 Transport와 같이 OS에 올라가게 된다.

가장 중요한 btd.dll부분은 %_WINCEROOT%\private\winceos\comm\bluetooth에 존재하니, private코드가 있는 개발자는 참고하면 된다.

이제 나머지들은 모두 프로파일에 대한 컴포넌트들이다. 이후에 설명할 스택을 사용한 애플리케이션 제작을 할 때, 필요한 프로파일들을 추가하여 컴포넌트를 사용하면 된다.

추가적인 사용 예는 Sample Application을 참고하면 된다.

그러면, 컴포넌트들을 다음과 같이 다양한 형태의 레이어를 조합하여 사용할 수 있다. 스택인 Btd.dll을 구동시키고, 필요에 맞게 포트를 열어주고, 필요한 프로파일 및 컴포넌트들을 구성할 할 수 있다. 다음은 구성하는 예를 볼 수 있다.


무엇을 사용하여 애플리케이션을 개발할 것인가?
애플리케이션을 개발하는 방식으로는 Btdrt, Winsock, COM port emulation을 사용할 수 있다. 다음의 방식들을 사용하여, 장치 검색, 인증과 서비스 검색 등의 작업을 할 수 있다.

- Btdrt Helper Library (Btdrt.dll)
유저 프로그램에 management API를 제공하는 runtime thunk dll이다.
Power mode, Security, inquiry, SDP (Service Discovery Protocol) 등등을Bluetooth Management 기능을 심플한 interface로 제공한다.
이 함수의 대부분은 동등한 Winsock 함수를 갖는다.

- Winsock Programming
Winsock interface는 다음의 함수들을 통하여 블루투스 접속을 지원한다.
socket - 특정 서비스에 소켓 바운드를 생성한다.
bind - socket을 가지고 local address를 associate한다.
getsockname - local socket 이름을 가져온다.
getpeername - socket peer의 이름을 가져온다.
connect - 특정 소켓으로 접속을 만든다.
accept - 들어오는 접속을 허용한다.
getsockopt - 소켓 옵션 정보를 가져온다.
setsockopt - 소켓 옵션 정보를 설정한다.

서버는 소켓을 생성하고, 주어진 RFCOMM 채널을 소켓을 bind하고, 이 채널로 SDP record를 보낸다. 그리고 나서, 들어오는 접속을 listen한다.

SOCKET s = socket(...);
bind(s, ...);
listen(s, ...);
for(; ;)
{
SOCKET s2= accept(s, ...);
SpinThreadsForConnection(s2);
}


클라이언트는 소켓을 생성하고, SDP 쿼리 또는 타켓 서비스의 UUID가 포함된 알려진 서버 채널을 사용하는 서버에 소켓을 접속한다. 그리고, 요청에 대해 send와 receive를 시작한다.

SOCKET s = socket(...);
connect(s, ...);
send(s, ...); // send request
recv(s, ...); // get response
closesocket(s); // done


- COM Port Emulation
● COM Port emulator는 RFCOMM에게 가상의 COM port를 기반으로 하는 접속을 제공한다.
● COM Port emulation 레이어가 블루투스 스택에 존재할 때, 가상서버 또는 COM port 클라이언트는 Outgoing 접속을 생성할 수 있고, incoming RFCOMM 접속을 받아들일 수 있다.
● 가상 COM port를 생성하기 위해서는, 다음과 같이 RegisterDevice를 하면 된다.
RegisterDevice (L"COM", index, L"btd.dll", (DWORD)&pp);
● 가상 COM Port를 제거하려면, DeregisterDevice함수를 부르면 된다.
● 한번 생성되면, COM port는 serial port와 똑같이 동작하고, serial API과 같은 API들을 사용하여 port에 접근이 가능하다.
● 클라이언트 Port들에서는, 물리적 접속은 장치가 CreateFile API를 사용하여 read / write 접근일 때만 생성된다. 물리적인 접속은 read 또는 write 접근의 첫 번째 handle이 끝났을 때만 서버와 클라이언트가 종료한다.
● 다음과 같은 함수들을 지원한다.
- ClearCommError
- EscapeCommFunction
- GetCommMask
- GetCommModemStatus
- GetCommProperties
- GetCommState
- GetCommTimeouts
- SetCommMask
- SetCommState
- SetCommTimeouts
- WaitCommEvent

블루투스 스택 서비스
블루투스 스택인 BTD.dll은 어떻게 RegisterDevice되는지를 알아보겠다. 또한, 스택을 서비스를 Start/Stop/Refresh는 어떻게 되는지 알아보자.

Btd.dll은 device.exe와 TDI provider인 AFD에 의해 로드된다. AFD는 BuiltIn 드라이버로 등록되어 있기 때문에, startup시에 btd.dll을 RegisterDevice (L"BTD", 0, L"btd.dll",….) 가 된다.

그렇기 때문에, 서비스를 관리하기 위한 접근은 다음과 같이 시도하면 된다.

WCHAR *strCard = L"card";
HANDLE hDev = CreateFile (L"BTD0:", ...);
// 스택 서비스를 시작할 때
DeviceIoControl (hDev, IOCTL_SERVICE_START, strCard, ...);
// 스택 서비스를 중지할 때
DeviceIoControl (hDev, IOCTL_SERVICE_STOP, strCard, ...);
// 서비스를 재초기화할 때
DeviceIoControl (hDev, IOCTL_SERVICE_REFRESH, NULL, 0, NULL, NULL, NULL, NULL);

이렇게 서비스를 BTD의 IOControl을 사용하여, 서비스를 시작하고, Power down/up시에 서비스를 refresh하여 서비스를 유지하여 stack을 사용하면 된다.

좀 더 자세한 사항은 아래의 Sample Application들을 참고하면 된다.

Sample Applications
CE에서는 여러 가지 샘플들을 지원하고 있다. 사실 이 샘플만 가지고 어떤 제품을 만드는 데에는 턱없이 부족할 것이다. 그러나 이 샘플들로 각각의 기능별 테스트를 해 볼 수 있기 때문에 개발자가 필요한 부분을 잘 조합한다면, 애플리케이션 구현에 많은 도움을 얻을 수 있을 것이다. 각각의 샘플들이 어떤 기능을 구현하였는지 보도록 하겠다.

● Virtual COM Port Sample - sca.exe
텍스트 메시지와 파일을 교환하기 위해, Virtual COM Port Interface를 통하여 Stack을 사용하는 예제이다.
● Winsock Interface Sample - ssa.exe
텍스트 메시지와 파일을 교환하기 위해, Winsock Interface를 통하여 Stack을 사용하는 예제이다.
● Querying and Pairing Sample -btpair.exe
블루투스 스택과 Security subsystem의 사용을 설명하기 위해 querying, pairing과 사용자 인증을 구현하였다.
● Protocol Extension Sample - bthlink.exe
Windows CE에서 Bluetooth protocol extension을 생성하는 절차를 설명하였다.
● Device Driver Management Sample - btloader.exe
PCMCIA/CF 카드들 위한 블루투스 장치 드라이버를 관리하는 예제이다.
● SDP Search and Record Generator Sample -bthnscreate.exe
SDP record를 생성하고, SDP Service 또는 Attribute를 초기화한다.
● Virtual COM Port Creation Sample -comtest.exe
Virtual COM port를 생성하고, 테스트 한다.
● Flow Control Sample - fctest.exe
스택에서 flow control의 사용 예를 보여준다.
● Winsock Options Sample - opttest.exe
스택에서 Winsock getsockopt와 setsockopt programming interface를 사용하는 예제이다.
● Phone Management Sample - phoneui.exe
클라이언트 측 모뎀을 위한 Bluetooth port emulator, 장치 발견과 SDP 요청을 하는 방법을 나타내었다.
● Printer Discovery Sample - printui.exe
클라이언트 측 프린터을 위한 Bluetooth port emulator, 장치 발견과 SDP 요청을 하는 방법을 나타내었다.
● SDP Search Sample - sdpsearch.exe
SDP 응답을 분석하기 위해 sdpuser.dll로부터 COM 과정을 사용 예를 설명한다.
● Bluetooth Control Panel - Bthpnl.cpl
장치 검색 및 Inquiry, Pairing을 모두 보여주고, Virtual COM port를 사용하고 있는 종합적인 예이다. %_WINCEROOT%\public\common\oak\drivers\netui\btmgmtui.cpp

마치며
WinCE 4.2, 5.0과 6.0을 보면, 구조적으로 많은 변화가 있지는 않다. 특히, 5.0과 6.0에서는 거의 변화가 없다는 것을 알 수 있다. 하지만, 4.2에서 미흡했던 프로파일의 추가는 개발하는 데 많은 도움이 될 것으로 생각된다.

가능한 많은 내용을 담기 위해 노력했으나, 여전히 부족하고 다루지 못한 내용이 많다는 생각이 든다. 여하튼, 기초적인 부분의 이해에 중점을 두었고, 다소 이해가 안되고 틀린 부분이 있더라도 많은 개발자들의 양해를 부탁한다. 또한, 필드에서 블루투스로 고생하는 개발자들께 가뭄에 단비가 되었으면 한다. @

참고자료
-Using The Bluetooth Stack In Windows CE, 2004, Randy W.Moore
-Bluetooth : Connect Without Cables, 2001, Jennifer Bray & Charles F Sturman
-Platform Builder 6.0 help
[원문링크]
http://www.zdnet.co.kr/builder/platform/windows/0,39031685,39162446,00.htm

'Research' 카테고리의 다른 글

넷상의 미디어 스트림을 저장하자!!  (0) 2007.12.21
방송통신 기술 동향 연구  (0) 2007.12.05
RMCP-2 에 대해 알아보자!  (0) 2007.12.05
Posted by 따봉맨
이전버튼 1 이전버튼