2008년 6월 23일 월요일

Serial Proxy - 네트웍을 통해서 시리얼 포트를 사용하기

Serproxy (Serial Proxy)는 시리얼 포트의 입출력을 TCP/IP 네트웍을 통해 리다이렉션 시켜주는 멀티쓰레드 프락시 소프트웨어이다. 작은 임베디드 보드의 경우 시리얼 포트만 가지고 있고 tcp/ip 스택을 가지고 있지 않아서 네트웍을 통해 연결을 할 수 없는 경우가 많다. 이런 경우 serproxy를 사용하면 원격지에 있는 디바이스를 네트웍을 통해 제어할 수 있게 된다.

그 이외에도 플래쉬나 다른 프로그래밍 언어로 사용자 인터페이스를 만드는 경우 해당 언어에서 시리얼 포트를 제어하는 라이브러리를 제공해주지 않으면 시리얼 포트를 사용할 수가 없지만 serproxy를 사용하면 소켓 프로그래밍 인터페이스를 사용해서 시리얼 포트로 데이터를 주고 받을 수 있다.


200806222356.jpg

(a) 시리얼 포트를 직접 억세스하는 경우


200806222356.jpg

(b) Serial proxy를 사용하는 경우

위의 그림 (b)에서는 serproxy를 실행하는 컴퓨터와 그 시리얼 포트를 사용하는 컴퓨터를 따로 그려 놨지만 한 컴퓨터에서 serproxy를 실행하고 같은 컴퓨터에서 소켓 프로그램으로 시리얼 포트를 억세스 할 수도 있다. (제어 프로그램을 플래시로 만드는 경우 경우 플래시에서 시리얼 포트를 직접 억세스 할 수 없기 때문에 이런 방법을 사용해야 한다. 이 경우 destination ip: localhost, port: cfg파일에 설정한 포트번호로 억세스 하면 된다.)

여기서 소스 및 윈도우용 바이너리 파일을 다운받을 수 있다.

맥용 바이너리 파일은 아래에서 다운받으면 된다.


압축을 열어보면 serproxy와 serproxy.cfg 가 있는데 serproxy.cfg는 /usr/local/etc에 serproxy는 /usr/local/bin에 복사해주고 자신의 환경에 맞게 serproxy.cfg를 바꿔주면 된다.


# 시리얼 포트에서 오는 뉴라인('\n')을 nils('\00') 으로 변환

# 플래시의 경우 끝에 nils가 오지 않으면 앞부분을 해석하지 않기 때문에 이 기능이 필요하다. true (e.g. 플래시를 사용하는 경우 or false

newlines_to_nils=true

# 사용할 시리얼 포트, 여기서는 2개를 사용하는 경우, 각각 1, 2가 된다.

comm_ports=1,2

# 디폴트 설정

comm_baud=19200

comm_databits=8

comm_stopbits=1

comm_parity=none

# 아이들 타임아웃

timeout=300

# 포트 맵핑 설정, 즉 시리얼 포트 1은 TCP포트 5531을 통해, 시리얼 포트 2는 TCP포트 5532를 통해 사용할 수 있음

net_port1=5331

net_port2=5332

# 각 시리얼 포트 디바이스 이름

serial_device1=/dev/tty.usbserial

serial_device2=/dev/tty.usbserial-3B1

2008년 6월 21일 토요일

Pandora...내 취향을 알아주는 인터넷 라디오

음악을 직접 연주하는건 전혀 할 줄 몰라도 듣는걸 좋아해서 항상 음악을 틀어놓게 되는데 이게 생각보다 귀찮은 일이다. CD를 틀어놓아봐야 한장에 3~40분정도면 끝나 버리기 때문에 반복적으로 듣는것도 한두번이라 매번 음반을 바꿔주려고 해도 다음에는 뭘 들어야 하나 하는 고민도 꽤 힘든 일 중에 하나가 되어 버린다.

용량이 큰 아이팟같으면 음악을 잔뜩 넣어놓고 셔플 플레이를 시켜주면 해결되긴 하지만 그 경우도 내가 가지고 있는 음악들 중에 하나가 나오는거지 모르는 아티스트나 가지고 있지 않은 음악이 나오는건 아니게 된다.

이 문제를 해결해주는 인터넷 라디오 프로그램이 Pandora다.


Picture 2.png

'Radio from the Music Genome Project'라는 말 답게 특정 방송국을 선택해서 음악을 듣는게 아니고 내가 직접 좋아하는 채널을 만든다.


Picture 3.png

자기가 좋아하는 가수, 작곡가 이름이나 노래제목을 넣어주면 새로운 스테이션이 만들어진다.


Picture 4.png

위의 화면에 3개의 스테이션이 만들어 져 있는데 제일 위쪽의 The Manhattan Transfer라는 이름의 스테이션을 들으면 Manhattan Transfer의 노래만 나오는게 아니고 Manhattan Transfer의 노래들과 비슷한 분위기의 곡들과 그들의 노래를 좋아하는 사람들이라면 좋아할만한 곡들까지 자동으로 나오게 된다. 사람의 유전자같이 음악의 유전자가 비슷한 곡들을 자동으로 찾아주는 것이다. 왼쪽에 현재 플레이되고 있는 곡에 대한 설명이 나오고 자기가 생각하기에 현재 나오는 곡이 내가 선택한 스테이션과 어울린다고 생각하면 위로 올린 엄지를, 어울리지 않는다고 생각하면 아래로 내린 엄지를 선택해 줄 수 있다. 그러면 그 정보를 가지고 서로간의 '유전자 동등성(?)' 값을 조정하게 된다.

음악을 좋아하는 사람들은 이 프로그램을 이용하면 판을 갈아주는 수고를 하지 않아도 자신이 좋아하는 류의 곡들을 계속 즐길 수 있을 것이다.

Pandora desktop은 무료로 http://www.pandora.com/desktop 에서 다운받을 수 있다. Adobe Air를 사용한 프로그램이라 먼저 Adobe Air를 설치해줘야 하는데 저 링크에서 'Install now'를 선택하면 Adobe Air까지 한꺼번에 설치해 준다.


Picture 5.png

맥과 윈도우에서 모두 사용할 수 있다. 설치한 다음에 실행하면 윈도우는 태크스바에, 맥은 독에 아이콘이 만들어지고 여기에 마우스 오른쪽 버튼을 누르면 아래같은 메뉴가 나타난다.


Picture 6.png


* 최근의 Copyright Royalty Board rulings에 의해서 Pandora서비스는 미국에서만 사용할 수 있다.

2008년 6월 19일 목요일

3G iPhone에 사용된 Assisted GPS (Assisted GPS used in 3G iPhone)

3G iPhone에 추가되었다는 A-GPS에 대해 사람들이 착각을 하는 경우가 많다.


main_maps20080609.jpg

Assisted라는 단어 때문에 그 동안 2G iPhone에서 wifi access point를 통하거나 현재 한국에서 위치찾기에 사용하는 식으로 휴대폰 기지국 신호를 가지고 대강의 현재 위치를 파악하는 pseudo GPS같은 방식이라고 생각하는 사람들이 많이 있다.

하지만 실제로 A-GPS는 정확한 위치를 파악하는데 정지궤도상에 떠 있는 GPS위성의 신호를 사용한다. Assisted라는 단어가 앞에 붙은 이유는 GPS의 성능을 향상시키기 위해 추가적으로 wifi나 기지국의 도움을 받기 때문이다. 실제 A-GPS는 미국 FCC가 휴대폰에서 걸려오는 911(응급전화)의 경우 경찰이나 소방서같은 기관에서 휴대폰의 위치를 자동으로 파악할 수 있도록 하는 E911을 의무화 시킴으로서 개발이 가속화 되었다.


사용자 삽입 이미지

GPS시스템은 약 20,200km 상공의 MEO(Medium Earth Orbit)에 24개의 GPS위성이 운용되고 있다. (참고로 원래 GPS는 군용으로 만들어져서 초기에는 군용으로만 사용되었는데 1983년 KAL007편 격추 사건 이후 레이건이 민간에 사용을 허가하도록 했다. 다만 군용에 비해 민간용 코드는 오차범위가 크다)

사용자 삽입 이미지

위의 그림이 GPS의 동작 원리이다. 현 위치에서 최소 3개 이상의 위성에서부터 신호를 수신해서 자신과 각 위성과의 거리를 계산하고 그 거리를 이용해서 삼각측량 방식으로 자신의 위치를 계산해 낼 수 있다. 위 그림에서처럼 3개 위성과의 정확한 거리를 알 수 있으면 3개의 위성만으로도 자신의 정확한 위치를 계산할 수 있지만 실제로는 여러가지 오차들 때문에 위성과의 거리가 100% 정확하지 않기 때문에 3개의 위성만으로는 위치계산이 힘들고 더 많은 위성이 필요하고 그래도 어느 정도의 오차는 피할 수 없다.

현재 사용되고 있는 GPS의 경우 위성에서 신호를 받아오기 위해서는 수신기와 위성간에 LoS (line-of-sight)가 확보되어야 하는데 커다란 나무나 도심의 빌딩들 사이에 있는 경우, 또는 실내에서는 위성의 신호를 제대로 받아올 수 가 없다. 그리고 꺼져있던 수신기가 이런 상황에서 처음으로 켜지면 위성에서 almanac과 ephemeris정보를 다운받을 수가 없기 때문에 나중에 깨끗한 위성신호를 받을 수 있는 곳으로 나가도 위치를 파악하는데 1분 이상이 걸릴 수 있다.

A-GPS는 이런 문제점들을 해결하기 위해 GPS위성신호에 추가적으로 assistance server를 사용한다.


agps.jpg

* Assistance server는 자신의 정확한 위치를 GPS신호를 수신해서 알고 있고 충분한 컴퓨팅 파워가 있기 때문에 휴대폰 신호를 분석해서 휴대폰의 대강의 위치를 계산할 수 있다. 그러므로 E911같은 경우 휴대폰이 GPS신호를 받지 못해 정확한 위치를 제공해주지 않아도 E911에 대강의 위치를 알려줄 수 있다.

* Assistance server는 휴대폰에게 위성의 궤도정보를 제공해 줄 수 있기 때문에 휴대폰이 그 정보를 이용해 빠르고 정확하게 GPS 위성신호를 잡을 수 있게 해 준다.

* Assistance server에서는 GPS신호의 오차에 영향을 미치는 ionospheric condition등에 대해 정확하게 측정할 수 있기 때문에 그 정보를 휴대폰에 전송해 줘서 휴대폰이 위성에서 수신한 신호를 사용해서 훨씬 정확한 위치를 계산할 수 있게 해 줄 수 있다.

일부 A-GPS는 위치를 파악하기 위해 기지국과의 연결이 필수적인 경우도 있고, 다른 경우는 기지국과 연결되면 좀 더 빠르고 정확하게 위치를 파악할 수 있지만 기지국과 연결이 필수적이지 않은 경우도 있다.

--

애플 사이트의 3G iPhone 페이지에 보면 iPhone 3G에 사용한 위치파악 방법에 대해 설명(http://www.apple.com/iphone/features/gps.html)하고 있다.

빠른 시간내에 가장 정확한 위치를 찾아내기 위해 GPS위성, Wi-fi 핫스팟, 셀타워에서의 신호를 사용한다. GPS 신호를 수신할 수 있으면 아이폰은 파란색의 GPS 인디케이터를 표시한다. 하지만 실내인 경우 (GPS위성과의 LoS가 유지되지 않는 경우) 아이폰은 wifi를 사용해서 위치를 파악한다. Wifi 핫스팟의 범위에도 들어있지 않은 경우는 셀타워를 사용해서 위치를 파악한다. 위치를 알려주는 원의 크기를 통해 아이폰이 계산한 위치가 얼마나 정확한가를 알려준다. 즉 원이 작을수록 더 정확한 위치라는 말이다.

--

즉 3G iPhone에서 위치파악하는 기능이 GPS 위성을 사용하는게 아니라거나 셀타워와 연결되어야만 한다는 말은 모두 잘못된 정보이다.

Firefox v3.0 정식 발표

Moz_ffx_openStandards_640x480.jpg

6/17(화)에 드디어 Firefox 3.0이 정식 발표되었다.

가장 큰 변화로는 엄청난 속도 향상과 메모리 사용량이 크게 줄어들은 것이다.

http://www.mozilla.com 에서 무료로 다운받을 수 있고 윈도우/맥/리눅스를 모두 지원한다.

강력한 탭 브라우징, 다양한 테마와 애드온들로 외형이나 기능을 원하는대로 추가할 수 있다.

그 동안 꾸준히 점유율이 증가해와서 20%를 넘겼는데 이번 3.0 발표를 계기로 좀 더 점유율을 올려서 4.0을 발표할때가 되면 저 귀여운 불여우의 눈물이 사라지게 되기를 바란다.

2008년 6월 14일 토요일

USB 무선랜 감도 올리기

무선랜을 사용하는데 거리가 멀어지면 수신감도가 급격하게 떨어져 버린다. 그래서 신호강도가 어느 이하로 떨어지면 연결 자체가 유지되지 못하고 붙었다 끊어졌다를 반복하게 된다.

현재 위치에서의 무선 상태는 D-link DWL-G122를 사용하면 공유기가 아예 안보이고 macbook pro의 에어포트를 사용하는 경우 안테나 방향(즉 액정화면이 어느쪽을 보고 있는가), 기온, 외부의 전파 잡음등에 따라 연결이 되다 말다 하는 정도라 안정적으로 인터넷에 연결할수가 없었다.

예전부터 가지고 있던 외부 안테나와 외부안테나 커넥터가 있는 Orinoco PCMCIA 무선랜카드는 맥에는 expresscard 34슬롯밖에 없어서 사용할 방법이 없었다. 2.4GHz 외부안테나를 몇개 가지고 있지만 다들 RP-SMA female 타입의 커넥터를 가지고 있고 RP-SMA male to MMCX male cable로 Orinoco에 연결을 하게 되어 있다.

그래서 일단 USB무선랜(DWL-G122)에 외장 안테나를 붙여보기로 마음을 먹었다. 인터넷을 뒤져본 다음 케이스를 열어보니 안테나 부분은 다음과 같았다.

사용자 삽입 이미지

사진의 가운데가 외부 안테나를 연결할 수 있는 커넥터이고 오른쪽의 가운데에 파란색 선이 그어져 있는 부품이 칩 안테나이다. 다만 문제는 U.FL female타입의 커넥터라 현재 가지고 있는 MMCX 커넥터를 사용할 수 없었다. 다른 방법으로는 패턴의 녹색부분을 긁어내고 직접 케이블을 납땜하면 되는데 그것 보다는 그냥 ebay에서 U.FL male to RP-SMA male cable을 주문하기로 했다. 이 케이블이 배달되면 위의 회로에서 칩 안테나만 뗘 내고 케이블을 커넥터에 꼽아주기만 하면 된다.

사용자 삽입 이미지

일단 주문한 케이블이 오려면 약 2주정도 기다려야 할 거 같아 집에서 구할 수 있는 재료만으로 간단하게 무선신호 감도를 높일 수 있는 반사판을 만들었다.



재료는 적당한 크기의 골판지 박스, USB확장 케이블, 테입, 알미늄 호일만 있으면 된다.
먼저 골판지를 적당히 자르고 가운데 USB 확장케이블을 꼽아 줄 수 있는 구멍을 내고 그 구멍 뒤쪽을 타원형으로 잘라준다. 그 타원형 부분에 종이를 둘러주고 종이의 뒷면에 알미늄 호일을 붙여주면 된다.
말로 설명하는 것 보다 만들어 놓은 사진을 보면 쉽게 이해가 될 것이다.

사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지

순전히 집에 있는 재료만으로 만들어서 별도의 재료비는 하나도 들지 않았다.
컴퓨터에 연결해서 확인해 본 결과는 놀랄만큼 좋았다. 무선 신호 계측기가 없어서 수치적으로 비교할수는 없었지만 Macbook pro에서 잡히지 않던 무선랜이 안정적으로 연결되었고 연결이 끊어지는 현상도 나타나지 않고 있다.
원래 omni-directional(특별히 방향성 없는) antenna의 뒤쪽에 일종의 반사판을 붙여 directionl antenna로 바꿔준 것이기 때문에 상자의 방향을 돌려가며 가장 신호 감도가 좋게 나오는쪽으로 놓고 사용하면 된다.

지금 현재만으로도 꽤 만족할만한 결과가 나와서 주문한 커넥터 케이블이 도착한 다음 외부 신호증폭 안테나를 사용하고 뒤쪽에 반사판을 붙였을 경우의 성능향상이 크게 기대된다.
추후 그 결과에 대해서도 여기에 업데이트 할 예정이다.

* Mac 사용자의 경우 D-link는 DWL-G122용 맥 디바이스 드라이버를 지원하지 않는다. 대신 Ralink에서 2500시리즈용 mac os x 드라이버를 설치하면 된다. 다운 받아보면 10.3/10.4용 드라이버만 있는데 10.4를 설치해도 10.5에서도 잘 동작한다. 현재 os x 10.5.3을 사용하고 있는데 별다른 문제는 없었다.

2008년 6월 12일 목요일

Wake on LAN (WoL)

최근에 나오는 컴퓨터는 대부분 wake-on LAN(WoL) 기능을 지원한다. 이 기능을 사용하면 관리자가 꺼져있는 컴퓨터를 원격으로 켤 수 있다. 물론 이 기능을 사용하려고 하면 BIOS 또는 설정에서 이 기능을 사용하도록 활성화 시켜줘야 한다. (이 기능을 활성화 시키면 컴퓨터가 꺼져있는 동안에도 네트웍 카드는 켜져 있어야 하기 때문에 약간의 전력을 소모하게 된다. 이 기능이 필요하지 않으면 꺼 놓는것이 좋다.)

맥에서는 이 기능을 사용하려면 System Preferences의 Energy Saver에서 켜 주면 된다.

사용자 삽입 이미지


동작방법은 네트웍으로 켜 주려고 하는 컴퓨터에 매직 패킷(magic packet)을 보내주면 된다. 매직 패킷의 포맷은 아주 단순하다. 패킷 내 어느곳에건 0xFF가 연속으로 6번 오고 그 바로 뒤에 켜주려는 컴퓨터의 mac address가 연속으로 16번 오면 된다. 즉 해당 컴퓨터의 mac address가 01:23:45:67:89:0a라고 하면 패킷 내에 아래의 내용이 들어 있으면 된다.

ff ff ff ff ff ff 01 23 45 67 89 0a 01 23 45 67 89 0a 01 23 45 67 89 0a 01 23 45 67 89 0a 01 23 45 67 89 0a 01 23 45 67 89 0a 01 23 45 67 89 0a 01 23 45 67 89 0a 01 23 45 67 89 0a 01 23 45 67 89 0a 01 23 45 67 89 0a 01 23 45 67 89 0a 01 23 45 67 89 0a 01 23 45 67 89 0a 01 23 45 67 89 0a 01 23 45 67 89 0a

다음은 파이선으로 작성한 매직패킷을 보내주는 프로그램의 예이다. (컴퓨터의 mac address는 01:23:45:67:89:0a 이고 이 프로그램을 실행할 컴퓨터(A)/켜 줄 컴퓨터(C) 모두 192.168.1 네트웍에 있는 경우...이 부분을 각자의 컴퓨터에 맞게 고쳐주면 된다.)

#!/usr/bin/env python
import socket
s=socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.sendto('\xff'*6+'\x01\x23\x45\x67\x89\x0a'*16, ('192.168.1.255', 80))
같은 서브넷에 있는 컴퓨터에 매직 패킷을 보내는 가장 쉬운 방법은 broadcast를 사용하는 것이다. 포트 번호는 아무거나 사용해도 관계 없다. 다른 네트웍에 있는 컴퓨터도 매직패킷을 보내면 원격으로 켜 줄 수 있지만 요새는 대부분의 라우터/파이어월이 "subnet directed broadcast"를 막아놓고 있기 때문에 이 기능을 사용하려면 라우터/파이어월의 "subnet directed broadcast" 기능을 활성화 시키고 WoL에 사용할 포트를 열어줘야 한다. (이 경우도 아무 포트나 사용해도 관계 없다. 다만 외부에서 매직패킷을 보낼 때 열어준 포트를 사용하면 된다.)

맥 OS X에서 사용할 수 있는 GUI 소프트웨어는 여기서 다운받을 수 있다. (어플리케이션 뿐 아니고 Dashboard widget까지 포함되어 있다.)

사용자 삽입 이미지


윈도우에서 사용할 수 있는 GUI 소프트웨어는 여기서 다운받을 수 있다.

사용자 삽입 이미지

2008년 6월 9일 월요일

Mac OS X에서 시리얼 터미널 프로그램 (Serial Terminal Emulator in Mac OS X)

사용자 삽입 이미지


Embedded환경에 익숙한 사람이라면 가장 중요한 툴중에 하나가 시리얼 포트이다. Mac OS X에는 telnet, ssh 프로토콜을 지원하는 좋은 네트웍 터미널 프로그램이 많은데 비해 시리얼 터미널 프로그램을 찾아보기가 쉽지 않다. 시리얼 포트를 자유롭게 사용할 수 없다면 아무리 맥에서 크로스 컴파일러로 hex파일을 만들어도 다운할 수도 없고 embedded board의 콘솔 출력을 보기 힘들게 된다. 그래서 맥에서 시리얼 포트를 사용하는 방법을 여기에 정리해 보려고 한다.

* 잘 알다시피 OS X가 발표된 이후에 나온 하드웨어들에는 시리얼 포트가 장착되어 있지 않다. 시리얼 포트를 사용하려면 USB to RS-232 컨버터를 구입해야 한다. 구입시 따라오는 디바이스 드라이버를 설치한 다음에 컨버터를 연결해주면 /dev 디렉토리에 /dev/tty.usbserial, /dev/cu.usbserial 같은디바이스 파일이 생성된다.

1. 터미널 프로그램으로 'screen' 을 사용
Mac OS X에 기본으로 포함되어 있는 screen을 시리얼 터미널 프로그램으로 사용할 수 있다. 원래는 가상 터미널을 만들어주는 프로그램이지만 시리얼 디바이스에 연결된 가상 터미널도 만들 수 있다. 먼저 mac os x 의 terminal이나 iTerm같은 프로그램을 실행해서 커맨드 프롬프트에서

$ screen <디바이스 이름> <전송속도>

의 형태로 사용하면 된다. 자세한 옵션이나 사용방법은 man page을 참조하면 된다. ($ man screen)
시리얼 터미널에서 빠져나오려면 'ctrl-a, ctrl-\'를 순서대로 눌러주면 된다.

2. kermit을 사용

ftp://kermit.columbia.edu/kermit/public_html/ckermit.html

위의 링크에서 소스를 받아 컴파일을 하려고 하면 맥은 UUCP lockfile (/var/spool/lock)을 지원하지 않기 때문에 빌드에서 에러가 발생한다. 이 경우 KFLAGS=-DNOUUCP 옵션을 붙여서 컴파일 해 주면 된다.

$ make macosx10.4 KFLAGS=-DNOUUCP

이렇게 빌드해 준 바이너리를 현재 OS X 10.5.3에서도 문제없이 사용하고 있다. 단 UUCP lockfile을 사용하지 않기 때문에 시리얼 포트를 한번에 한 인스턴스의 kermit만 open하도록 강제하지 못하지만 맥을 동시에 여러명이 사용하지 않는 이상 큰 문제는 없다.
빌드 및 설치가 끝난 다음에 시리얼 포트에 연결하려면 kermit을 실행시킨 다음 아래의 명령을 사용하면 된다.

c-kermit> set modem type none     ; 널모뎀인 경우 모뎀 타입을 'none'으로 해 준다.
c-kermit> set carrier-watch off   ; 널모뎀이기 때문에 별도의 캐리어가 없으므로 off
c-kermit> port /dev/tty.USBSERIAL ; 자신이 사용하는 usb to rs-232 converter 디바이스
c-kermit> flow none               ; flow control, default는 rts/cts이다.
c-kermit> speed 57600             ; 통신 속도(bps)
c-kermit> connect                 ; 연결

일단 연결된 상태에서 명령어 프롬프트(c-kermit>) 으로 빠져 나오려면 'CTRL-\ 다음에 c'를 누르면 된다. 연결을 끊으려면 close 명령어를 사용한다.
사용하기에는 c-kermit이 조금 더 복잡하지만 그 이상으로 막강한 기능을 가지고 있기 때문에 훨씬 더 유용하다.

* Mac OS X용 GUI 시리얼 터미널 프로그램에 대해 추가된 글
맥 OS X용 시리얼 터미널 CoolTerm (CoolTerm - Serial Terminal Software for Mac OS X)