한국을 빛낸 100인의 위인들 m/v

Posted 2011. 3. 10. 01:58, Filed under: 정보수집

'정보수집' 카테고리의 다른 글

컴퓨터 OS부팅도 이젠 초고속 전쟁이다.  (0) 2010.03.03
구글 크롬 os 소스와 빌드환경  (1) 2010.02.28
meet 우분투 9.04 길라잡이  (0) 2010.02.25
부트로더에 대해  (1) 2010.02.25
OS프로젝트  (0) 2010.02.24
Response : ,

블루투스 정리 합니다.(in Android)

Posted 2010. 9. 15. 09:26, Filed under: 카테고리 없음


여기에 블루투스 관련글 참조

http://docs.androidside.com/docs/guide/topics/wireless/bluetooth.html

출처한글 : http://techblog.textcube.com/153

안드로이드는 블루투스 프로토콜 스택을 포함하고 있기 때문에 블루투스 디바이스들과 무선으로 데이터를 교환할 수 있다. 어플리케이션 프레임웍은 안드로이드 블루투스 API를 사용해 블루투스에 억세스 할 수 있다. 블루투스 API를 사용하면 다음과 같은 작업을 할 수 있다.

  • 다른 블루투스 디바이스 검색
  • 페어링 된 블루투스 디바이스를 위한 로컬 블루투스 아답터 퀘리
  • RFCOMM 채널 설정
  • SDP(Service Discovery Protocol)을 통한 다른 디바이스와의 커넥션
  • 양방향 데이터 전송
  • 복수 커넥션 관리

- 기초

이 문서는 블루투스를 사용해 통신하는데 필요한 4가지 주요 태스크(블루투스 셋업, 페어링 되어 있거나 주변에 있는 기기 검색, 디바이스와 연결, 디바이스간 데이터 전송)를 수행하기 위해 안드로이드 블루투스 API를 어떻게 사용하는가를 설명한다.
모든 블루투스 API는 android.bluetooth 패키지에 들어있다.  다음은 블루투스 연결을 만드는데 필요한 클래스들의 요약이다.

  • BluetoothAdapter - 로컬 블루투스 아답터 하드웨어를 나타낸다. BluetoothAdapter는 모든 블루투스를 통한 상호작용의 엔트리포인트이다. 이 객체를 사용해서 다른 블루투스 디바이스 찾기, 페어링 된 디바이스 퀘리, 알려진 MAC address를 사용해 BluetoothDevice 인스턴스 얻기, 다른 디바이스에서 부터의 통신 요구를 기다리기 위한 BluetoothServerSocket 만들기를 할 수 있다.
  • BluetoothDevice - 상대방의 블루투스 디바이스를 나타낸다. 이 객체를 사용하면 BluetoothSocket을 통해 상대방 디바이스와 커넥션을 요구하거나 이름, 주소, 클래스, 페어링 상태등의 정보를 퀘리할 수 있다.
  • BluetoothSocket - 블루투스 소켓을 위한 인터페이스를 나타낸다. 어플리케이션이 InputStream과 OutputStream을 사용해서 다른 블루투스 디바이스와 데이터 교환을 할 수 있는 연결 포인트이다.
  • BluetoothServerSocket – Incoming 리퀘스트를 위해 listen하고 있는 오픈된 서버소켓(TCP ServerSocket과 유사)을 나타낸다. 두대의 안드로이드 디바이스를 연결하기 위해 한쪽의 디바이스는 이 클래스를 사용해서 서버소켓을 오픈해야만 한다. 원격 블루투스 디바이스가 디바이스에 커넥션 리퀘스트를 때 BluetoothServerSocket은 커넥션이 연결되면 연결된 BluetoothSocket을 리턴해준다.
  • BluetoothClass - 블루투스 디바이스의 일반적 특성과 기능을 나타낸다. 이 클래스는 디바이스의 디바이스 클래스와 서비스를 정의하는 읽기 전용 속성의 집합이다.

- 블루투스 퍼미션

어플리케이션에서 블루투스 기능을 사용하려면 최소한 BLUETOOTH와 BLUETOOTH_ADMIN 둘중에 하나의 블루투스 퍼미션을 선언해줘야 한다. 커넥션 요구, 커넥션 accept, 데이터 전송등의 블루투스 통신을 하기 위해서는 BLUETOOTH 퍼미션이 필요하다.
디바이스 discovery를 시작하거나 블루투스 설정을 조작하려면 BLUETOOTH_ADMIN 퍼미션이 필요하다.
BLUETOOTH_ADMIN 퍼미션을 사용하려면 BLUETOOTH 퍼미션도 꼭 있어야만 한다. 매니페스트 파일에 블루투스 퍼미션을 선언해준다.

<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />




- 블루투스 셋업

어플리케이션이 블루투스로 통신을 하기 전에 디바이스가 블루투스를 지원하는지 확인할 필요가 있다. 그리고 블루투스를 지원한다면 활성화 되었는지도 확인해줘야 한다. 만일 블루투스를 지원하지 않으면 블루투스 기능을 비활성화 시켜야 한다. 블루투스를 지원하지만 활성화 되어 있지 않으면 사용자가 어플리케이션을 떠나지 않고 블루투스를 활성화하도록 요구할 수 있다. 이 작업은 BluetoothAdapter를 사용해서 단계로 수행할 수 있다.

1.BluetoothAdapter 를 얻는다.
모든 블루투스 액티비티를 위해 BluetoothAdapter가 요구된다. BluetoothAdapter를 얻기 위해서는 스태틱 메소드인 getDefaultAdapter()를 호출하면 된다. 그러면 디바이스의 블루투스 아답터를 나타내는 BluetoothAdapter 인스턴스를 리턴한다.

BluetoothAdapter mBTAdapter = BluetoothAdapter.getDefaultAdapter();
if (mBTAdapter == null) {
    // device does not support Bluetooth
}


2.블루투스 활성화
블루투스가 활성화 되어있는지 확인해야 한다. isEnabled()를 호출해서 블루투스가 현재 활성화되어 있는지 확인한다. 메소드가 false를 리턴하면 블루투스가 비활성화되어 있는 것이다. 블루투스를 활성화 시키려면 ACTION_REQUEST_ENABLE 인텐트로 startActivityForResult()를 호출하면 된다.

If (!mBTAdapter.isEnabled()) {
    Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
    startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT) ;
}


그림 1과 같이 블루투스를 활성화하기 위한 퍼미션을 요구하는 대화창이 나타난다. 사용자가 “Yes”를 선택하면 시스템은 블루투스를 활성화시키고 그 과정이 끝나면 어플리케이션으로 포커스가 돌아오게 된다.
블루투스 활성화가 성공하면 액티비티는 onActivityResult() 콜백에서 RESULT_OK를 리턴받게 된다. 블루투스가 에러로 인해 (또는 사용자가 “No”를 선택해서) 활성화되지 못하면 RESULT_CANCELED가 리턴된다. 옵션으로 블루투스 상태가 변경될 마다 시스템이 브로드캐스하는 ACTION_STATE_CHANGED 인텐트를 listen하도록 할 수도 있다.

- 디바이스 검색

BluetoothAdapter를 사용하면 디바이스 discovery 또는 페어링 된 디바이스 목록을 퀘리해서 원격 블루투스 디바이스를 찾을 수 있다.
디바이스 discovery는 주변의 활성화 된 블루투스 디바이스를 찾고 각각에 대한 정보를 요구하는 검색 단계이다. 하지만 통신가능 범위에 들어있는 블루투스 디바이스라 해도 현재 discoverable 하도록 활성화 되어 있어야만 discovery 요구에 응답한다. 디바이스가 discoverable 상태인 경우 discovery 요구에 디바이스 이름, 클래스, MAC 주소같은 정보를 공유함으로서 응답한다. 이 정보를 사용해서 discovery를 수행한 디바이스는 발견된 디바이스에 커넥션을 시작하도록 선택할 수 있다.
일단 원격 디바이스와 처음으로 연결이 이루어지면 자동으로 사용자에게 페어링을 할 것인가 물어보게 된다.  디바이스 페어링이 이루어지면 상대 디바이스에 대한 기본 정보(디아비스 이름, 클래스, MAC 주소 등)가 저장되고 그 내용은 블루투스 API를 통해 읽을 수 있게 된다. 이미 알고 있는 원격디바이스의 MAC 주소를 사용하면 아무때나 (물론 해당 디바이스가 통신 가능범위에 있다는 가정 하에) discovery를 수행할 필요 없이 바로 커넥션 과정을 시작할 수 있다.
페어링과 연결된것의 차이점은 잘 알고 있어야 한다. 페어링은 두 디바이스가 각자 상대방의 존재를 알고 있고 인증과정에 사용할 link-key를 공유하고 있어 서로간에 암호화 된 연결을 설정할 수 있다는걸 의미한다. 연결된것은 디바이스가 현재 RFCOMM 채널을 공유하고 있어 서로 데이터를 전송할 수 있는 상태를 의미한다.
현재 안드로이드 블루투스 API는 RFCOMM 커넥션을 설정하기 전에 디바이스가 페어링 되어야만 한다. (블루투스 API에서 암호화된 커넥션을 시작하려고 할 때 페어링이 자동을 이루어진다.)
다음의 섹션은 페어링 된 디바이스를 찾거나, 디바이스 discovery를 사용해 새 디바이스를 찾는 방법을 설명한다.
주: 안드로이드 디바이스는 기본적으로 not discoverable 상태이다. 시스템 설정을 통해 짧은 시간동안 디바이스를 discoverable 상태로 만들거나 어플리케이션에서 직접 discoverable 상태로 만들어 줄 수 있다.

- 페어링 된 디바이스 퀘리

디바이스 discovery를 수행하기 전에 원하는 디바이스가 이미 페어링 되어 있는가 확인해 볼 필요가 있다.  확인하기 위해서 getBondedDevices()를 호출하면 된다. 그러면 페어링 된 디바이스들의 집합인 BluetoothDevices 를 돌려준다. 예를 들어 페어링 된 모든 디바이스를 퀘리한 다음 ArrayAdapter를 사용해 페어링 된 디바이스의 이름을 보여줄 수 있다.

Set<BluetoothDevice> pairedDevices = mBluetoothAdapter.getBondedDevices();
if (pairedDevices.size() <> 0) {
    for (BluetoothDevice device : pairedDevices) {
        mArrayAdapter.add(device.getName() + “\n” + device.getAddress());
    }
}


BluetoothDevice 객체에서 연결을 시작하기 위해 필요한 정보는 MAC address만 있으면 된다. 위의 예제에서 이 정보는 사용자에게 보여지는 ArrayAdapter의 일부분에 저장되어 있다. MAC 주소는 나중에 연결을 시작하기 위해 추출할수도 있다.

- 디바이스 discovery

디바이스 discovery를 시작하려면 startDiscovery()를 호출하면 된다. 이 과정은 비동기식이라 메소드를 호출하면 discovery가 성공적으로 시작되었나 결과를 알려주는 boolean값을 곧바로 돌려준다. Discovery과정은 보통 12초간의 inquiry scan후 발견된 각 디바이스에 대해 이름을 가져오기 위한 page scan으로 이루어진다.
어플리케이션은 각 발견된 디바이스에 대한 정보를 받기 위해  ACTION_FOUND 인텐트를 위한 BroadcastReceiver를 등록해야만 한다. 각 디바이스마다 시스템이 ACTION_FOUND 인텐트를 브로드캐스트 한다. 이 인텐트는 각각 BluetoothDevice와  BluetoothClass가 들어있는 EXTRA_DEVICE와 EXTRA_CLASS 필드를 전달한다. 예제로 디바이스가 발견되었을 때 브로드캐스트를 처리하는 핸들러를 등록하는 방법이다.

Final BroadcastReceiver mReceiver = new BroadcastReceiver() {
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (BluetoothDevice.ACTION_FOUND.equals(action)) {
            BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
            mArrayAdapter.add(device.getName() + “\n” + device.getAddress());
        }
    }
};

BroadcastReceiverIntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND;
registerReceiver(mReceiver, filter);


커넥션을 시작하기 위해 BluetoothDevice 객체에서 필요한 정보는 MAC 주소뿐이다. 이 예에서는 사용자에게 보여지는 ArrayAdapter의 일부분에 저장되어 있다.

주의: 디바이스  discovery를 수행하는건 블루투스 아답터에게 매우 부담이 큰 작업으로 매우 많은 리소스를 요구한다. 커넥션 할 디바이스를 찾았다면 커넥션을 시작하려고 시도하기 전에  cancelDiscovery()를 호출해서 discovery를 멈춰야 한다. 또한 이미 다른 디바이스와 커넥션 되어 있으면   discovery과정동안  대역폭이 활 떨어질수도 있기 때문에 커넥션 된  상태에서는 discovery를 하지 않아야 한다.                                                          
- Discoverable 활성화

다른 디바이스가 자신의 디바이스를 검색할 수 있도록 해 주려면 startActivityForResult(Intent, int)에 ACTION_REQUEST_DISCOVERABLE 액션 인텐트를 넣어 호출해주면 된다. 이 메소드를 호출하면 어플리케이션을 멈추지 않고 시스템 설정을 통해 discoverable 모드를 활성화 하도록 요청한다. 기본적으로 디바이스는 120초동안 discoverable 모드로 있게 된다. EXTRA_DISCOVERABLE_DURATION 인텐트 extra를 추가해서 시간을 바꿔줄 수 있다. (최대 300초)

Intent discoverableIntent = new Intent(BluetoothAdpater.ACTION_REQUEST_DISCOVERABLE);
discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);
startActivity(discoverableIntent);




그림 2와 같은 다이얼로그가 떠서 사용자에게 디바이스를 discoverable 상태로 만들도록 허가할 것인지 묻는다. “Yes”를 선택하면 디바이스는 정해진 시간동안 discoverable상태가 된다. 액티비티는 result code에 디바이스가 discoverable되는 시간값이 들어가서 onActivityResult() 콜백을 호출받게 된다. 사용자가 “No”를 선택하거나 에러가 발생하면 result code는 Activity.RESULT_CANCELLED가 된다.
디바이스는 discoverable 시간동안 아무 반응이 없이 조용히 있는다. 만일 discoverable모드가 변경될 때 통보를 받고 싶으면 ACTION_SCAN_MODE_CHANGED 인텐트에 대한 BroadcastReceiver를 등록할 수 있다. 이 인텐트에는 각각 이전 스캔모드와 변경된 새 스캔모드가 들어있는 EXTRA_PREVIOUS_SCAN_MODE와 EXTRA_SCAN_MODE라는 extra 필드를 가지고 있다. 각 필드에 들어갈 있는 값은 SCAN_MODE_CONNECTABLE_DISCOVERABLE,  SCAN_MODE_CONNECTABLE,  SCAN_MODE_NONE으로 각각 discoverable 모드, discoverable은 아니지만 커넥션을 받아들일 수는 있는 모드, discoverable도 아니고 커넥션도 받아들일 수 없는 모드를 나타낸다.
원격 디바이스와 커넥션을 시작하고 싶은 경우는 자신의 디바이스를 discoverable모드로 만들 필요는 없다. 원격 디바이스가 커넥션을 시작하기 전에 디바이스를 발견해야만 하기 때문에 내 디바이스의 discoverable 모드를 활성화 시키는건 어플리케이션이 서버소켓을 사용해서 incoming 연결을 accept할 때만 필요하다.

- 디바이스 커넥션

두 디바이스에서 실행되는 어플리케이션간에 커넥션을 만들기 위해서는 서버쪽과 클라이언트쪽 메카니즘을 모두 구현해 줘야만 한다. 한 디바이스는 서버소켓을 열어줘야 하고 다른 디바이스가 서버 디바이스의 MAC 주소를 사용해서 커넥션을 시작해야만 하기 때문이다. 서버와 클라이언트는 같은 RFCOMM 채널에 각각 커넥션 된 BluetoothSocket을 가지고 있을 때 서로 커넥트 된 것으로 간주된다. 이 지점에서 각 디바이스는 입, 출력 스트림을 얻어 데이터 전송을 시작할 수 있다. 이 섹션에서는 두 디바이스간에 커넥션을 시작하는 방법에 대해서 설명한다.
서버 디바이스와 클라이언트 디바이스는 서로 다른 방법으로 필요한 BluetoothSocket을 얻는다. 서버는 incoming 연결이 accept될 때 소켓을 받게 된다. 클라이언트는 서버로의 RFCOMM 채널을 열 때 소켓을 받게 된다.



한가지 구현 테크닉은 두 디바이스를 모두 서버로 동작하도록 하기 위해 서버소켓을 열고 커넥션을 기다리는 것이다. 그러면 어느 디바이스건 클라이언트로서 상대 디바이스로 커넥션을 시작할 수 있다. 다른 방법으로는 한 디바이스는 명시적으로 서버로 지정해 서버소켓을 열고 커넥션을 기다리고 다른 디바이스는 단순히 클라이언트로 커넥션을 시작할 수 있다.
주) 두 디바이스가 미리 페어링 되어 있지 않으면 안드로이드 프레임웍은 그림 3과 같이 자동으로 페어링을 요구하는 다이얼로그를 띄워준다. 그러므로 디바이스를 커넥트 하려고 할 때 어플리케이션은 디바이스가 미리 페어링 되어 있는지 여부를 걱정할 필요가 없다. RFCOMM 커넥션 시도는 사용자가 성공적으로 페어링을 마치거나 페어링을 거부하거나 또는 어떤 이유로건 페어링이 실패할 때 까지 블럭된다.

서버로 동작
두 디바이스를 커넥트하려고 할 때 하나의 디바이스는 BluetoothServerSocket을 열어 서버로 동작해야만 한다. 서버소켓의 목적은 incoming 커넥션 요구를 기다리다 accept되면 커넥션 된 BluetoothSocket을 제공해 주는 것이다. BluetoothServerSocket에서 BluetoothSocket이 얻어지고 더 이상의 커넥션을 accept할 필요가 없으면  BluetoothServerSocket은 제거해도 된다.

UUID란...
Universally Unique IDentifier(UUID)는 유일하게 정보를 식별하는데 사용하기 위한 128비트 포맷의 표준화 된 문자열 ID이다. UUID의 포인트는 이 숫자가 충분히 크기 때문에 랜덤하게 아무 숫자나 골라도 다른 UUID들과 겹치지 않는다는 것이다. 여기서는 어플리케이션의 블루투스 서비스를 식별하는데 사용된다. 어플리케이션에 사용할 UUID를 얻기 위해서 인터넷상의 여러가지 랜덤 UUID 생성기중에 하나를 사용할 수 있고 fromString(String)으로 UUID를 초기화 하면 된다.
서버소켓을 셋업하고 연결을 accept하는 기본적인 절차이다.

1.listenUsingRfcommWithServiceRecord(String, UUID)를 호출해서 BluetoothServerSocket을 얻어온다.
스트링은 서비스에 대한 식별할 수 있는 이름으로 시스템이 디바이스의 새 SDP 데이터베이스 엔트리에 자동으로 그 이름을 기록한다. UUID 또한 SDP엔트리에 포함되어 클라이언트와 커넥션 agreement를 위한 기초가 된다. 즉 클라이언트가 디바이스와 커넥션하려고 시도할 때 커넥션하길 원하는 서비스를 유일하게 식별하는 UUID를 제공한다. 커넥션이 이뤄지기 위해서는 이 UUID가 일치해야만 한다.
 
2.accept()를 호출해서 커넥션 요구를 listen하기 시작한다.
이 메소드는 블럭킹 호출이다. 커넥션이 accept되거나 익셉션이 발생해야만 리턴된다. 리모트 디바이스가 listen하고 있는 서버소켓에 등록한 UUID와 일치하는 커넥션 요구에만 연결이 만들어진다. 성공하면 accept()는 커넥션 된 BluetoothSocket을 리턴한다.
 

3.더 이상의 추가 커넥션이 필요하지 않으면 close()를 호출한다.
이 메소드를 호출하면 서버소켓과 관련된 리소스를 release한다. 하지만 accept()가 리턴한 커넥션 된 BluetoothSocket은 닫지 않는다. TCP/IP와 달리 RFCOMM은 클라이언트에서 한번에 하나의 커넥션만 허용하기 때문에 대부분의 경우에 커넥션이 만들어지면 곧바로 BluetoothServerSocket을 close()하는게 합리적이다.

accept()는 블럭킹 메소드라 어플리케이션의 다른 동작을 막기 때문에 메인 액티비티 UI 스레드에서 호출하면 안된다. 일반적으로 새로운 스레드에서 BluetoothSocket이나 BluetoothServerSocket에 관련된 모든 작업을 처리하는게 합리적이다. 다른 스레드에서 BluetoothServerSocket의 accept() 같이 블럭킹 것을 취소하고 바로 리턴하도록 하려면 close()를 호출하면 된다. 그리고 BluetoothServerSocket 또는 BluetoothSocket의 모든 메소드는 스레드-세이프하다.

예제) incoming 연결을 accept하는 서버 컴포넌트를 위한 간단한 스레드
private class AcceptThread extends Thread {
    private final BluetoothServerSocket mmServerSocket;
    
    public AcceptThread() {
        // Use a temporary object that is later assigned to mmServerSocket,
        // because mmServerSocket is final
        BluetoothServerSocket tmp = null;
        try {
            // MY_UUID is the app's UUID string, also used by the client code
            tmp = mAdapter.listenUsingRfcommWithServiceRecord(NAME, MY_UUID);
        } catch (IOException e) { }
        mmServerSocket = tmp;
    }
    public void run() {
        BluetoothSocket socket = null;
        // Keep listening until exception occurs or a socket is returned
        while (true) {
            try {
                socket = mmServerSocket.accept();
            } catch (IOException e) {
                break;
            }
            // If a connection was accepted
            if (socket != null) {
                // Do work to manage the connection (in a separate thread)
                manageConnectedSocket(socket);
                mmServerSocket.close();
                break;
            }
        }
    }
    /** Will cancel the listening socket, and cause the thread to finish */
    public void cancel() {
        try {
            mmServerSocket.close();
        } catch (IOException e) { }
    }
}

이 예제에서 한개의 incoming 커넥션만 필요하기 때문에 커넥션이 accept되고 BluetoothSocket이 얻어지자 마자 어플리케이션은 얻은 BluetoothSocket을 별도의 스레드로 보낸 다음 BluetoothServerSocket을 닫고 루프를 빠져나온다.
accept()가 BluetoothSocket을 리턴할 때 소켓은 이미 커넥션 되어 있기 때문에 따로 connect()를 호출할 필요는 없다. manageConnectedSocket()은 어플리케이션에서 데이터 전송을 위한 스레드를 시작하는 fictional 메소드이다.
일반적으로 incoming 커넥션을 listen하는게 끝나면 곧바로 BluetoothServerSocket을 닫아준다. 이 예제에서도 BluetoothSocket이 얻어지자 마자 close()를 호출했다. 또한 listen하고 있는 서버소켓을 멈출 필요가 있을 때 private BluetoothSocket을 닫을 있는 public 메소드를 스레드에서 제공하기도 한다.

클라이언트로 동작
원격 디바이스와 커넥션을 시작하려면 우선 원격 디바이스를 나타내는 BluetoothDevice 객체를 얻어야만 한다. 그리고 나면 BluetoothDevice를 사용해서 BluetoothSocket을 얻어 커넥션을 시작한다.

기본적인 절차이다.

1.BluetoothDevice를 사용해서 createRfcommSocketToServiceRecord(UUID)를 호출해서 BluetoothSocket을 얻는다.
이 호출은 BluetoothDevice에 연결하는 BluetoothSocket을 초기화한다. 여기서 건네지는 UUID는 서버 디바이스가 자신의 BluetoothServerSocket(listenUsingRfcommWithServiceRecord(String, UUID)를 사용해서)을 열었을 때 사용한 UUID와 일치해야만 한다. 동일한 UUID를 사용하는건 UUID스트링을 어플리케이션 코드에 하드코딩하고 서버와 클라이언트 양쪽 코드에서 그걸 참조하면 되는 간단한 문제이다.

2.connect()를 호출해서 연결을 시작한다.
시스템은 UUID를 매치하기 위해 원격 디바이스 SDP lookup을 수행한다. Lookup이 성공하고 원격 디바이스가 커넥션을 accept하면 연결동안 사용할 RFCOMM채널을 공유하고 connect()가 리턴한다. 메소드는 블럭킹 호출이다. 어떤 이유로건 커넥션이 실패하거나 connect() 메소드가 time out (약 12초)이 되면 exception을 발생한다.
connect()는 블럭킹 호출이기 때문에 이 커넥션 절차는 언제나 메인 액티비티 스레드와 독립된 별개의 스레드에서 수행되어야만 한다.
주: connect()를 호출할 때 디바이스는 언제나 디바이스 discovery를 수행하고 있지 않는지 확인해야만 한다. Discovery가 진행중이면 커넥션 시도는 확연히 느려져서 실패할 가능성이 커진다.

예제) Bluetooth 커넥션을 시작하는 스레드

private class ConnectThread extends Thread {
    private final BluetoothSocket mmSocket;
    private final BluetoothDevice mmDevice;
    public ConnectThread(BluetoothDevice device) {
        // Use a temporary object that is later assigned to mmSocket,
        // because mmSocket is final
        BluetoothSocket tmp = null;
        mmDevice = device;
        // Get a BluetoothSocket to connect with the given BluetoothDevice
        try {
            // MY_UUID is the app's UUID string, also used by the server code
            tmp = device.createRfcommSocketToServiceRecord(MY_UUID);
        } catch (IOException e) { }
        mmSocket = tmp;
    }

    public void run() {
        // Cancel discovery because it will slow down the connection
        mAdapter.cancelDiscovery();
        try {
            // Connect the device through the socket. This will block
            // until it succeeds or throws an exception
            mmSocket.connect();
        } catch (IOException connectException) {
            // Unable to connect; close the socket and get out
            try {
                mmSocket.close();
            } catch (IOException closeException) { }
            return;
        }
        // Do work to manage the connection (in a separate thread)
        manageConnectedSocket(mmSocket);
    }
    /** Will cancel an in-progress connection, and close the socket */
    public void cancel() {
        try {
            mmSocket.close();
        } catch (IOException e) { }
    }
}

cancelDiscovery()는 커넥션이 만들어지기 전에 호출되는걸 볼 수 있다. 커넥션이 되기 전에라도 언제나 호출할 수 있고 실제적으로 실행 여부를 확인하지 않고 호출해도 안전하다. (하지만 그래도 상태를 확인하고 싶으면 isDiscovering()을 사용하면 된다.) manageConnectedSocket()은 데이터 전송을 위한 스레드를 시작하는 어플리케이션에 있는 fictional 메소드이다.
BluetoothSocket이 끝나면 clean up을 위해 언제나 close()를 호출해줘야 한다. 이 메소드를 호출해 줌으로서 곧바로 커넥션 된 소켓을 닫고 내부 리소스를 clean up 하게 된다.

- 연결 관리

두 디바이스를 성공적으로 커넥션하게 되면 각 디바이스는 커넥션 된 BluetoothSocket을 가지게 된다. 이 소켓을 통해 디바이스간에 데이터를 교환할 수 있게 된다. BluetoothSocket을 사용해서 임의의 데이터를 전송하기 위한 일반적 절차는 매우 간단하다.

1.각각 getInputStream()과 getOutputStream()을 사용해 소켓을 통한 전송을 처리할 InputStream과 OutputStream을 얻는다.
2.read(byte[])와 write(byte[])를 사용해서 데이터를 읽고 쓴다.

물론 implementation을 위해 고려해야 세부사항들이 있다. 먼저 무엇보다 모든 읽고 쓰기를 위한 별도의 스레드를 사용해야 한다. 이건 read(byte[])와 write(byte[])는 모두 블럭킹 호출이기 때문에 매우 중요하다. read(byte[])는 스트림에서 무언가 읽을게 있을때까지 블럭되어 있는다. write(byte[])는 일반적으로는 블럭되지 않지만 원격 디바이스가 충분히 빠르게 read(byte[])를 호출하지 않아 버퍼가 꽉 차는 경우 플로우 컨트롤을 위해 블럭될수도 있다. 그러므로 스레드의 메인 루프는 InputStream으로부터 읽기 전용으로 사용되어야 한다. 스레드의 분리된 public 메소드가 OutputStream으로 쓰기를 시작하도록 사용될 있다.

예제)
private class ConnectedThread extends Thread {
    private final BluetoothSocket mmSocket;
    private final InputStream mmInStream;
    private final OutputStream mmOutStream;

    public ConnectedThread(BluetoothSocket socket) {
        mmSocket = socket;
        InputStream tmpIn = null;
        OutputStream tmpOut = null;
        // Get the input and output streams, using temp objects because
        // member streams are final
        try {
            tmpIn = socket.getInputStream();
            tmpOut = socket.getOutputStream();
        } catch (IOException e) { }
        mmInStream = tmpIn;
        mmOutStream = tmpOut;
    }

    public void run() {
        byte[] buffer = new byte[1024];    // buffer store for the stream
        int bytes; // bytes returned from read()
        // Keep listening to the InputStream until an exception occurs
        while (true) {
            try {
                // Read from the InputStream
                bytes = mmInStream.read(buffer);
                // Send the obtained bytes to the UI Activity
                mHandler.obtainMessage(MESSAGE_READ, bytes, -1, buffer)
                        .sendToTarget();
            } catch (IOException e) {
                break;
            }
        }
    }
    /* Call this from the main Activity to send data to the remote device */
    public void write(byte[] bytes) {
        try {
            mmOutStream.write(bytes);
        } catch (IOException e) { }
    }

    /* Call this from the main Activity to shutdown the connection */
    public void cancel() {
        try {
            mmSocket.close();
        } catch (IOException e) { }
    }
}

컨스트럭터가 필요한 스트림을 얻고 한번 실행되면 스레드는 InputStream을 통해 들어오는 데이터를 기다린다. read(byte[])가 스트림에서의 데이터를 리턴하면 그 데이터는 부모 클래스의 Handler 멤버를 사용해 메인 액티비티로 보내진다. 그리고 다시 스트림에서 데이터를 읽기 위해 기다리기 위해 돌아간다. Outgoing 데이터를 보내는건 단순히 메인 액티비티에서 스레드의 write() 메소드를 호출해 전송할 데이터를 전달해주면 된다.

스레드의 cancel() 메소드는 아무때나 BluetoothSocket을 닫아 connection을 멈출 수 있기 때문에 중요하다. 메소드는 블루투스 connection 사용이 끝나면 언제나 호출되어야 한다.

-------------------------------------------------------------------------------------

핸트폰과 PC 블루투스 연결

핸드폰과 PC 사이에 파일을 전송하기 위해서는 먼저 PC에 핸드폰을 블루투스 장치로 추가 해 주어야 합니다. 이를 위해,

  • 알림 영역에 있는 블루투스 아이콘을 클릭한 후 장치 추가를 클릭,

  • 아래와 같은 장치 추가 창이 열리고 자동으로 핸드폰 장치를 찾아 줍니다. (핸드폰에서 블루투스 전원 설정을 ON 으로 해 두어야 PC에서 자동으로 찾음) 핸드폰 아이콘을 클릭한 후 다음 버튼 클릭,

  • 아래와 같은 번호가 표시 되면, 핸드폰에 연결할 것인지를 묻는 메시지가 뜹니다. 핸드폰에서 확인에 해당하는 버튼을 클릭하면 번호를 입력하는 상자가 뜹니다. 번호를 입력한 후 핸드폰에서 확인에 해당하는 버튼을 클릭해 줍니다.

  • 잠시 기다리면 아래와 같은 메시지가 뜨면서 핸드폰 장치 추가가 마무리 됩니다.

핸드폰에서 PC로 전화 번호부 보내기

  • 컴퓨터 알림 영역에 있는 블루투스 아이콘을 클릭한 후 '파일 받기'를 클릭하면 아래와 같이 파일을 받을 수 있도록 연결 대기 화면이 뜹니다.

  • 핸드폰에서 블루투스-데이터전송-전화번호부 전송을 차례로 클릭한 후 전화번호부 전체 선택 (또는 필요한 전화번호만 선택)을 하고 나면 전송 장치 선택 화면에 PC 이름이 뜹니다. 연결에 해당하는 버튼을 클릭하면, 컴퓨터 화면에 아래처럼 파일 수신 화면이 자동으로 표시됩니다.

  • 파일을 다 받고 나면 아래 화면처럼 파일을 저장할 곳을 지정하는 화면이 뜹니다. 적당한 위치를 지정한 후 마침 버튼을 클릭하면 지정한 위치에 전화번호부가 저장됩니다.
     

만약, 휴대폰과 PC 연결이 잘 되지 않는다면, 제어판에서 블루투스 설정을 확인해 보시기 바랍니다.

제어판을 연후 제어판의 검색상자에 bluetooth 를 입력한 후 'Bluetooth 설정변경' 을 클릭하여 Bluetootht 설정 창을 연 후, 옵션탭에서  'Bluetooth 장치가 이 컴퓨터에 연결하도록 허용'에 체크가 되어 있는 지 확인해 보시기 바랍니다. 이를 체크 했음에도 연결이 잘 되지 않는다면, 'Bluetooth 장치가 이 컴퓨터를 찾을 수 있도록 허용'에도 체크를 한 후 연결해 보시기 바랍니다. 단,  'Bluetooth 장치가 이 컴퓨터를 찾을 수 있도록 허용'에 체크가 된 경우 보안에 문제가 생길 수도 있기 때문에 필요한 파일 전송을 마친 후 에는 체크를 해제하는 것이 안전합니다.

블루투스 설정변경

Note:

  • 블루투스 기능을 이용하여 전화번호부를 전송한 경우 그룹 설정등은 제대로 전송되지 않는 경향이 있습니다.
  • 사진 크기가 큰 경우 제대로 전송이 안 되는 경우도 있습니다.
  • 여러 핸드폰을 이용해 보았지만, 블루투스를 이용한 파일 전송이 품질이 아주 만족 스럽지는 않았습니다. 핸드폰 제조사에서 제공하는 매니저 프로그램을 다운 받아 이용하는 것이 가장 확실하긴 합니다.
  • 맥이나 리눅스용 드라이버나 매니저 프로그램을 제공해 주지 않는 국내 핸드폰 제조사의 특성상, 블루투스가 설치된 맥이나 리눅스 이용자는 블루투스 기능을 이용하여 기본적인 전화번호부, 파일 전송을 할 수 있습니다.

-------------------------------------------------------------------------------------

블루투스 장비와 연동해 데이터를 받아와야 한다.

통신 시간이 중요하다. 느리면 쓸 이유가 없다.

시리얼 통신 처럼 사용하고 싶다.

 

정보

지원가능 프로파일

시리얼

실제 블루투스 사용이 잘 안되는 경우가 많이 있단다. (블루투스 키보드를 이용하면..., 2010.04.17)

블루트스 에뮬에서는 안된다. (출처 : 안드로이드 블루투스 관련, 2010.03.02)

블루투스를 이용한 테더링 잘 된다 VS 안된다. (출처 : PDANet 휴대폰을 모뎀으로 2탄 Bluetooth 연결편, 2010.04.04, 안드로이드 모토로이 USB 테더링 후기, 2010.02.24)

 

개념 탑제 필요

  • 블루투스 버전간 차이
  • 각종 프로파일 지원 여부에 따른 영향
  • 페어링

---------------------------------------------------------------------------------------

안드로이드의 BlueTooth는 1.5, 1.6버젼에서는 A2DP, AVRCP(AV Remote Control), HSP(Headset), HFP(Hands Free) 정도만 지원했다. 안드로이드 2.0 버젼부터 OOP(Push Profile), PBAP(Phone Book Access Profile) 등을 지원한다고 한다.

 

안드로이드에서 BlueTooth를 사용하려면 Vendor에서 정의하는 BoardConfig.mk에서 BOARD_HAVE_BLUETOOTH를 true로 설정해야 한다.

 

기본 구조에 대하여 참고할만한 곳은 다음과 같다.

 

http://sites.google.com/a/android.com/opensource/projects/bluetooth-faq

 

기본 구조

 

 

 

system server 와  BlueZ 와의 인터페이스를 담당하는 D-Bus는 다음을 참고한다.

 

http://www.freedesktop.org/wiki/Software/dbus

http://daeji.tistory.com/entry/D-BUS

http://bebop.emstone.com/research/tech/dbus/dbus_overview

 

아직 확실하지는 않지만

BT Power on/off 를 담당하는 소스는 다음 파일 같다.

system/bluetooth/bluedroid/bluetooth.c

 

실제 하드웨어를 컨트롤하는 부분은 보이지 않으며 함수 Call에 따라 내부 설정 등을 변경해 놓는다.

하드웨어 컨트롤 관련된 부부은 2.01에서는 별도로 추가된 것으로 보이며 이는 1.6 버젼까지는 이 쪽에 대충 떄려 넣어야 할 것 같다.

 

Make파일을 보면 공유 라이브러리 libbluedroid.so 파일로 만든다.

이 라이브러리는 Java에서 사용 가능하도록 다음에서 라이브러리를 정의한다.

frameworks/base/core/jni/Android.mk

 

이를 보면 결론적으로 BlueTooth와 관련된 JNI 관련 파일은 다음 세 파일이다.

android_server_BlueToothA2dpService.cpp

android_server_BlueToothDeviceService.cpp

android_server_BlueToothEventLoop.cpp

 

그 외 파일들은

 android_bluetooth_Database.cpp
 android_bluetooth_HeadsetBase.cpp
 android_bluetooth_common.cpp

dbus 관련 함수


 android_bluetooth_BluetoothAudioGateway.cpp
 * android_bluetooth_RfcommSocket.cpp

 * android_bluetooth_BluetoothSocket.cpp 

socket 통신 관련 (write, read, ...)


 android_bluetooth_ScoSocket.cpp

Sco socket 통신 관련 (init, connect, accept, close ...)

 

당연한 얘기지만 BlueTooth의 A2DP, HSP, HFP 등을 사용하면 오디오 출력에 영향을 미치므로

framework/base/libs/audioflinger 쪽도 영향을 받는다.

 

BlueZ에 대한 소스는 external/bluez 에 있다. 

 

참고할만한 기사

http://ko.broadcom.com/press/release.php?id=s363853


출처: http://blog.daum.net/_blog/BlogTypeView.do?logid=0CNH3&articleno=16011028#ajax_history_home

http://docs.androidside.com








Response : ,

2008에서 컴파일 하기

Posted 2010. 9. 9. 12:00, Filed under: 카테고리 없음

트랙백이 뭔가요?
관련글 참조
Response : ,

버닝합니다.

Posted 2010. 7. 19. 01:39, Filed under: 카테고리 없음
그동안의 굴욕
치욕 
낙오 
방황 모두 정리합니다.


Response : ,

삽질하라는 경쾌한 문구..

Posted 2010. 3. 14. 13:21, Filed under: 카테고리 없음
한 3일간 푹 아무것도 하지 않고 놀아 버렷네요

그놈의 xd카드때문에 이진코드를 판다고 파고 파고 덕분에 mbr 에 대해선 조금이나마 알게되었지만....
결국엔 xd카드 하나 새로 구입햇습니다.
이번엔 후지것이 아니라 올림푸스것입니다.
Response : ,

출처 : http://urin79.com/148164

컴퓨터 OS부팅도 이젠 초고속 전쟁이다.



PC사용자들은 부팅과정이 너무나 지루하게 느껴질 것이다.
이런점을 보완하기 램디스크나 더 작은 OS를 생각하게 되고 넷북이 활성화 되기 시작하면서 이러한 해결점을 찾으려는 노력을 하는 사람들이 늘고 있다.

[ 하드웨어 업체에서 제공하는 mini - OS ]

물론 빠른부팅을 활용하는 기술에는 다양한 방법들이 있지만, 최근 메인보드 제조사들이 메인보드 칩안에 간단한 프로그램들을 이용하여 빠른부팅을 도와주는 기능(?)들이 내장되어 있다.


ASUS는 Express Gate
ASROCK은 instant boot라는 기술을, 
MSI는 WINKI라는 디바이스를 내놓았다. 

빠르게 켜지며 간단한 작업만을 할 수 있게 해주는 OS를 Instant OS라고 한다.
이 OS들은 속도가 빠르지만 용량이 작은 RAM에 넣기가 쉬워 메인보드사들이
윈도우 접근이전에 미리 작은 OS를 작동시켜 간단한 작업을 할 수 있게 도와준다.


                <ASUS의 Express Gate>
0.095822001234167723.jpg

ASUS의 Express Gate는 정상적인 부팅을 하는것이 아니라, 하드의 특정공간에
자사의 OS(리눅스계열)을 불러와 인터넷이나 간단한 기능을 사용할 수 있다.


             <ASROCK의 instant boot>   

instant_thumb.jpg

ASROCK의 instant boot라는 기술은
기존의 S3 대기모드와 유사하지만 WINDOWS 환경에 맞게 업그레이드되어 
더욱 빠른 부팅을 실현시켜 주었다. 
단 PC의 전원 부분을 완전히 차단하면 RAM에게도 최소의 
전력이 전달되지 않기 때문에 Instant Boot는 불가하다.

S1~S4 까지는 ACPI라는 Standard Spec입니다.
정확히 말하면 S0 부터 S5 까지 있습니다.
이중 Suspend Mode 는 S1 부터 S4 까지 입니다.
<정리>
S0 -> 시스템 정상 상태(Full Speed CPU Clock)
S1 -> Half Speed CPU Clock 
S2 -> Stop CPU Clock
S3 -> Stop CPU Clock + Stop Devices + 현재설정 메모리에 저장 
S4 -> 현재 환경 HDD 저장 후 모든 장치 전원공급 차단
S5 -> Soft Power off (시스템 종료)
절전모드의 종류 - http://urin79.com/148097


                     <MSI의 WINKI>
winki_thumb.jpg

MSI의 WINKI라는 디바이스는 리눅스 기반의 OS를 담고 있는 디바이스이다. 
Express Gate와 차별되는 점은 직접적으로 HDD를 읽지 않고 내장 USB형 디바이스인 WINKI로 부팅된다는 점에서 더 빠르게 부팅 할 수 있다. 지금은 WINKI를 따로 구매할 수도 없고 어느 장치에서 완벽히 호환되는지도 알 수 없다. 현재는 일부 MSI 제품에만 결합 상품으로 판매하고 있다.





[ 사용자가 직접 구성할 수 있는 mini - OS ]

메인보드에서 자체적으로 윈도우 이외의 작고 가벼운 OS를 탑재하여 빠른작업을 도와주는 기능이 있는가 하면 별도의 파티션을 설정하여 OS를 설치하면 굳이 메인보드를 교체하지 않고도 저런 기능을 사용할 수 있다.

Express Gate의 기능처럼 파티션을 분할하여 사용할 수 있을 것이다.
공개용 OS인 리눅스를 기반으로 불필요한 기능들을 제거하여 독자적인 OS개발이 열풍이다. 


                          <presto라는 OS>
presto_thumb.jpg

최근에 베타 서비스를 마치고 판매가 시작된 Xandros(www.prestomypc.com)사의 presto라는 OS가 있다. 리눅스 기반으로 제작되었으며 기본 적으로 Fire Fox 브라우저, 메신저, MP3와 동영상 재생, 이미지 보기, Skype를 지원하며 홈페이지에서 다양한 어플리케이션을 내려 받아 더 많은 기능을 활용할 수 있다. 무료 7일 이용이 가능하며 약 20달러를 지불하면 구매가 가능하다.


                            <Cloud>
cloud_thumb.jpg

아직은 클로즈 베타 서비스를 하고 있는 Good OS(www.thinkgos.com)사의 Cloud가 존재한다. 
Cloud 역시도 리눅스 기반으로 제작되었고 크롬 브라우저 기반의 OS이다. 
아직 정식 출시가 되지 않아 좀 더 기다려봐야 할 것이다.


                         <HyperSpace>
ces-laptop.jpg

현재의 기능은 빨리 부팅해서 웹서핑하는 정도의 기능이 전부다. 
그리고 공식적으로 지원하는 노트북도 많지 않으며 core duo 이상의
사용자들은 하이브리드 버전을 사용하는 것이 좋을 것이다.

Media Center Package : 동영상, 사진, 음악 보기
Message Center : 이메일, 메신저, VoIP

다운받는 곳 : http://hyperspace.com 
21일간 사용이 가능하다. 


                        <Microsoft Windows FLP>
winflp.jpg

MS사에서 제공하는 Microsoft Windows FLP 또한 가벼운 OS이지만 한정된 사용자(엔터프라이즈 고객용)들만이 사용이 가능하다. 그리고 영문버전밖에 없다는 단점이...
Microsoft Windows FLP를 설치해보자. - http://hosii.info/bbs/view.php?id=psn_ka_frtlk1&no=341





                           <크롬OS>
a0015808_4a754f31b4d81.jpg
크롬에 대한 여러가지 시각들

구글의 넷북용 크롬OS에 대해 부정적인 시각도 긍정적인 시각도 많지만 필자의 생각은 매우 긍정적이라 여겨진다.

OS의 점유는 엄청난 매출의 기회를 가질 수 있다.
어떤 회사들은 툴바하나로 먹고 살고 포털사이트들도 사용자들이 접속하여 단 몇시간의 메뉴활용에 따라 이익이 결정되는 바, OS로 온종일 원하는 정보를 노출시켜 줄 수 있다면 이는 획기적이라 말할 수 있다.

어떤이들은 내가 광고를 노출시킨다 했을 때(http://urin79.com/108017) 이미지 또는 플래시 광고를 말하는 줄로 착각하던데 이젠 이미 광고같아 보이는 광고시대는 지났다고 본다. 광고가 아닌 정말 유용한 정보를 제공해주는 툴바와 갖가지 유틸리티 서비스 프로그램들로 사용자들을 더욱 끌어들일 수 있는 그런 시스템 환경을 만들어 주는 것이다.

아직 와이브로 상용화가 활성화되지 않은 상황에서 넷북을 말하기는 이르지만 시간이 지나면 결국 커피를 마시고 식사를 하고 공부를 하는 시간에도 우리는 넷북에서 손을 뗄수가 없을것이고 그동안 돈의 노예가 되지 말자라는 이야기에서 넷북의 노예가 되지 말자라는 이야기 나올 것 같다.

그 넷북으로 고성능 게임을 한다거나 전문적인 그래픽 프로그램을 쓰는것이 아니라 단순 작업을 하기 위함이라는 것을 인식한다면 빠르고 접근하기가 쉬우며 안정적인 데다가 기왕이면 무료인 OS를 선택하지 않겠나?

개인적인 생각이지만 결국 MS사도 무료화로 OS를 제공하게 될 것이다.

'정보수집' 카테고리의 다른 글

한국을 빛낸 100인의 위인들 m/v  (1) 2011.03.10
구글 크롬 os 소스와 빌드환경  (1) 2010.02.28
meet 우분투 9.04 길라잡이  (0) 2010.02.25
부트로더에 대해  (1) 2010.02.25
OS프로젝트  (0) 2010.02.24
Response : ,

구글 크롬 os 소스와 빌드환경

Posted 2010. 2. 28. 00:10, Filed under: 정보수집

http://sites.google.com/a/chromium.org/dev/chromium-os/building-chromium-os/getting-the-chromium-os-source-code
크롬 OS 받아서(chromiumos-0.4.22.8.tar : 237MB) 소스 살짝 까보았는데, 조금 실망이네요.
기대가 컸던 모양입니다.  넷북더미단말용이네요.

구조를 살펴봐야겠지만, third_party 활용이 너무 심하네요.

Linux kernel은 2.6.30부터 시작할 모양이네요.
[ README.chromium]
https://launchpad.net/ubuntu/karmic/+source/linux/2.6.30-10.12
살짝본 느낌으로는 Ubuntu 압축 + Chrome Browser 를 보는듯 하네요.

벌써 빌드해서 올려보신분이 계시네요.
http://openoffice.or.kr/gomme/?p=315
http://ubuntu.or.kr/viewtopic.php?f=4&p=44291

개발 참여는 git 를 그대로 활용할 모양인듯, kernel.org 진행방식과 비슷한것 같고,
소스 오픈한다는게, 리눅스 개발자들에게 무상 도와달라는 얘기인지, 조금 아이러니 하네요. 
진정 Google OS가 맞는지 모르겠네요. 낚인건지...
좀더 시간을 가지고 구조를 더 살펴봐야겠네요.

'정보수집' 카테고리의 다른 글

한국을 빛낸 100인의 위인들 m/v  (1) 2011.03.10
컴퓨터 OS부팅도 이젠 초고속 전쟁이다.  (0) 2010.03.03
meet 우분투 9.04 길라잡이  (0) 2010.02.25
부트로더에 대해  (1) 2010.02.25
OS프로젝트  (0) 2010.02.24
Response : ,

meet 우분투 9.04 길라잡이

Posted 2010. 2. 25. 20:55, Filed under: 정보수집

http://myubuntu.tistory.com/311

* 우분투 길라잡이를 만들어봅니다. 이번에는 제작방식을 아래처럼 해볼까 합니다.

1)아래 목차를 보시고 목차와 관련 글을 작성한 분은 저에게 이메일(ubuntuda@gmail.com)로 쓰신 글을  보내주시거나 또는 댓글로 연락을 주십시오. (반드시 작성한 당사자가 연락 주셔야 합니다.)  설명에 대한 그림도 있으면 최고입니다.

혹시 목차에 없지만 관련 설명이 있으면 좋겠다 싶은 부분 또는 더하고 싶은 분도 연락을 주세요.

2)저는 보내주신 글, 또는 댓글로 주소를 전해 주신 글을 보고 전개 방식이나 표기 통일 등 수정/편집해 설명서 항목에 올리겠습니다.  그림도 잡아넣고... 그렇게 제가 편집자 역할을 하는 겁니다.  연락을 주셨지만 좀 냉정하게, 이건 좀 부족하다 싶으면... 쓱~ 안쓰겠습니다.

3)작성자가 결정되면 작성중이라는 사실이 이 블로그를 통해 공포하겠습니다.

4) 최종 완성되면 공동 저자로 이름, 블로그/웹 주소를 올리도록 하겠습니다. 또 현재 블로그로 제한 됐던 배포권도 당연히 해제하고 저작권은 공공소유로 하겠습니다. 즉, 저는 설명서로 이익을 취할 생각이 없고, 공동 저자 분들도 이 점에 동의해주셔야 합니다.  사용을 위해 기초가 되는 설명서는 우리말을 쓰는 모든 우분투 사용자의 소유여야 한다고 생각합니다. 단 타인의 자료에 대한 저작권과 저작권표기는 반드시 존중되야 합니다.

5)서류로 편집해줄 분을 공모해 PDF형식으로 만들어 문서배포판을 만들겠습니다. 이 배포판 역시 공공소유입니다.

서문

우분투는 무료로 배포되는 컴퓨터 운영체제(Operating System: OS)이며 훌륭한 철학을 가진 도구입니다. 훌륭한 도구를 무료로 받은 만큼 우리말 설명서도 무료로 여러분과 나누고자 합니다. 이 길라잡이는 초보자를 대상으로 우분투 9.04를 가정과 사무용으로 사용하는데 목표를 두고 있습니다.

그리고 기타 어쩌구 저쩌구...

1)사용에 앞서 알아둘 사항들:
  • 인터넷: 우분투는 인터넷과 연결된 상태여야 원할하게 설치할 수 있습니다. 유선연결 상태에서 설치를 강력히 권장합니다.
  • 게임: 오락용으로 PC를 사용한다면, MS윈도우를 사용하는 것이 더 낫습니다.
  • 버추얼머신: 우분투상에서 MS윈도우를 '버추얼머신' 프로그램을 이용해 설치/사용할 수 있습니다.

2) 설명서 활용하기:

  • [파란색 글씨]는 마우스로 메뉴를 찾아 누르라는 의미입니다. 예) [파일]-[내보내기]
  • 설정 내용을 바꿔야 할 내용은 하늘색 상자 안에 표시, 변경 내용은 붉은색으로 표시했습니다. 예)내용 => 바꿀 부분
  • 터미널 명령어는 녹색 상자 안에  표시했습니다. 예) sudo apt-get install 개념
저작권 표기와 안내
이 길라잡이는 Ubuntu documentation team이 관리하는 help.ubuntu.com의 일부 내용을 참고했으며 myubuntu.tistory.com 이용자와 지인들이 ubuntuda@gmail.com으로 보내준 내용을 포함하고 있습니다.

Ubuntu, kubuntu, Xubuntu, Edubuntu, Gobuntu는 Canonical사의 등록상표 입니다. 설명서는 the Creative Commons ShareAlike 2.5 License (CC-BY-SA)아래 배포될 예정이나 현재는 배포를 연기합니다. 작성자는 설명서의 내용이 사용자에게 유용하기를 희망하나 내용과 실행결과에 대해 어떠한 보장과 보증도 하지 않습니다.
이 설명서의 밑거름이 된 우분투 7.10 설명서 작성에 여러모로 기여해주신 분은 다음과 같습니다.
newbie님 - 우분투 CD 마련하기 중 오류지적, su님, 海바라기님, newbie님 – 반편이 한글 문제 해결법 제시, 김훈님-노틸러스 입력불가문제 해결/ 시냅틱에서 테마 더하기, 랜덤여신님- 압축파일 관리자 한글깨짐 문제 해결, Neither님-그놈룩 적용문제 발생시 대처방법, xa님 -'주분투' 표기 오류지적, galmaegu님-판과 별명 보충설명, 떠돌이님-우분투 판과 별명, Lonnie Best님-Firestarter아이콘표시  Ian Backer님-노틸러스활용, George Norman님-우분투 속도 높이기팁 일부. Narayan님-우분투 속도 높이기 팁일부, 초보리눅서님-템플릿폴더활용

제1장 우분투 리눅스 알아두기

1.1 우분투 리눅스는 이런 것이다.  Mike Sierra 가 정리중입니다.
1.2 우분투의 자매들과 친척들 Mike Sierra 가 정리중입니다.
1.3 우분투는 어떻게 구성돼 있나 Mike Sierra 가 정리중입니다.
1.4 우분투의 판과 별명 Mike Sierra 가 정리중입니다.
1.5 우분투의 장점과 단점 Mike Sierra 가 정리중입니다.

제2장 설치 전에 준비사항

2.1 우분투 부트 CD 또는 부트용 USB메모리 마련하기
2.2 설치할 때 주의할 것들
2.3 우분투 Live-CD 기능과 활용
2.4 OS와 함께 설치되는 프로그램들
2.5 다른 OS또는 우분투로 자료 옮기기

제3장 일곱 단계로 진행하는 설치과정

3.1 설치 1~3단계, 언어, 시간대/거주지, 키보드 선택하기
3.2 설치 4단계 설치장소 선택과 판나누기
3.3 설치 5~7단계, 가져올 정보설정, 사용자와 열쇠글 설정, 최종확인

제4장 우분투를 사용하기 위해 알아야할 것들

4.1 우분투에서 무른모 설치와 제거
4.2 파일관리자 '노틸러스' 활용하기
4.3 리눅스의 그 유명한 터미널 사용방법
4.4 무른모 받을 곳 (저장소) 설정하기

제5장 설치 후 다듬기

5.1 설치 후 사용환경을 다듬자
5.2 인터넷 연결: 무선 네트워크
5.3 한글 환경 설정: 한글 표시/ 입력문제 해결
5.4 글꼴 설정: 글꼴 추가와 글꼴 사용하기
5.5 모양새 꾸미기- '모양새'를 이용한 설정
5.6 모양새와 효과넣기- 컴피즈 퓨전
5.7 프린터/PDF프린터 설치와 활용
5.8 글쇠로 바로가기 설정과 활용
5.9 우분투 속도를 높이자

제6장 무른모 활용

6.1 네트워크 연결 저장고(NAS)와 넷북/ 미디어 PC
6.2 우리집 컴퓨터들로 네트워크 만들기! 삼바 설정
6.3 웹사이트를 돌아보자! 불여우 설정과 기능추가
6.4 동영상을 보자! MPlayer와 친척들
6.5 자료 내려받기 댈류지 비트토런트(Deluge BitTorrent Client)
6.6 채팅을 즐겨볼까요. XChat
6.6 내 컴퓨터에서 여러가지 OS를 사용해보자: VirtualBox

'정보수집' 카테고리의 다른 글

한국을 빛낸 100인의 위인들 m/v  (1) 2011.03.10
컴퓨터 OS부팅도 이젠 초고속 전쟁이다.  (0) 2010.03.03
구글 크롬 os 소스와 빌드환경  (1) 2010.02.28
부트로더에 대해  (1) 2010.02.25
OS프로젝트  (0) 2010.02.24
Response : ,

부트로더에 대해

Posted 2010. 2. 25. 01:47, Filed under: 정보수집

http://cafe.naver.com/allcyber/473

간단한부트로더제작
http://cafe.naver.com/allcyber/458

-OS 만들때에
OS 는 디스크로 부터 읽혀져 메모리로 올라 가야지만 실행이됩니다.
보통 디스크의 부트영역이라는 곳이 있는데 512KB 정도가 되는 공간이 있습니다.
OS가 올라 가기에는 너무 적은 용량이죠!

이 영역에는 보통 OS 로더라는 것이 올라갑니다.
물론 C로 작성해도 가능은 하지만 이 로더는 보통은 어셈블러로 작성을 많이 합니다.
이 로더는 단지 OS의 핵심을 메모릴로 올려 주는 단순한 역할을 하게 됩니다.

그후 OS의 핵심인 커널이 제어권을 인계받아 처리하게 됩니다.

지금 현재의 PC는 BIOS --> DISK(부트영역) -- OS(커널)
이렇게 그 제어권을 넘기게 되어 있답니다.

보다 자세한 것은 아래 사이트를 참조하시면 OS를 만드는데 아주 유용하리라 봅니다.

===============================================================================

OSRC(OS Resource Center) : Boot Process부터 파일포맷, 디바이스 드라이버등 OS제작에 필수적인 자원들과 자료들이 하드웨어, 소프트웨어 카테고리로 나누어 일목요연하게 정리된 리소스 센터입니다.


OS Developer site : OS제작자를 위한 디벨로퍼 사이트로 각종 포럼, 강좌, 소스코드등이 링크된 유용한 사이트입니다.


The Triple Fault Club : 보호모드 및 OS제작에 관련된 메뉴얼 및 가이드, 그리고 공개 커널소스등이 관련된 링크가 집대성된 사이트입니다.. 대부분의 공개 운영체제 커널 소스등은 이곳에서 모두 찾을 수 있습니다... 강추~!!


SIGOPS: 초보자들을 대상으로 OS를 제작하기 위한 단계적인 강좌와 예제들을 소개한 포럼입니다..저는 boot strap을 작성하는 루틴에 관해서 처음 이곳에서 배웠습니다. 처음시작하시는 분들과 초보자들에게 좋은 사이트입니다.


John Fine's home page : OS를 제작하기 위해선 막바로 하드드라이브에 설치하는 코드를 만들기 보다는 먼저 Floppy로 부팅할 수 있도록 부트코드를 작성하고 플로피에서 OS이미지가 제대로 동작하는지 테스트를 하는 것이 좋습니다. 이때 꼭 필요한 것이 플로피 디스크 섹터에 자신이 원하는 바이너리 이미지를 기록하는 툴이죠.. OS를 제작하는 사람들 대부분이 쓰는툴이 John Fine가 만든 partcopy라는 툴입니다. John Fine의 홈피에 들어가시면 partcopy뿐만 아니라 보호모드, 시스템 유틸리티, nasm등 시스템 관련 자료와 툴들을 얻을 수 있을 것입니다.


OS제작을 위한 FAQ사이트 : 역시 처음 OS를 제작하기 위해 어떠한 사항을 고려하고 무엇을 시작해야할지등을 FAQ형태로 설명해주는 사이트입니다.


MenuetOS : Menuet is a fully 32 bit assembly written, graphical RealTime OS for _assembly_ programming & distributed under General Public License.


Bona Fide OS Development


OpenBeOS Project


K-OS Developer Site : 한 3, 4년전인가요.. 하이텔 프로그래밍 동호회에 순수 어셈블리로만 작성된 K-OS라는 아주 작은 크기의 운영체제가 강좌와 함께 소스코드가 올라 온적이 있었습니다.. 솔직히 워낙 작은 크기의 프로그램이라 부팅하는 것 빼고는 별반 기능이 없는 dummy수준의 OS였지만 보호모드를 이용하여 태스크 스위칭을 하는등 당시로서는 자료 구하기조차 힘든 로우 레벨 프로그래밍의 기법등이 쓰여져 신선한 자극이 되었던 것이 생각나네요. 이 한국형(?) OS를 좀더 발전적으로 개발하고자 사람들이 모여 홈페이지를 만들었더군요.


http://www.bellona2.com : OS제작에 관해서는 거의 전무이다시피한 국내출판시장에 처음으로 32비트 보호모드를 이용한 OS제작에 관한 책이 나왔더랬습니다. 바로 "OS제작의 정석"이라는 책이지요. 공룡서적이라 불리는 Silberschatz의 "Operating System Concepts"가 이론서로서는 독보적인 서적이라면 Tananbaum의 "Operating Systems: Design and Implementation"은 실제 구현을 설명한 책으로서는 최고의 책이라고 생각합니다. 물런 그런 세계 최고의 양서들과는 비교할 수 없지만, 그나마 우리나라에 OS제작에 관한 서적이 나오기 시작했다는 것은 매우 고무적인 현상이죠. 위 홈페이지를 방문하시면 풀소스를 받을 수 있습니다.

'정보수집' 카테고리의 다른 글

한국을 빛낸 100인의 위인들 m/v  (1) 2011.03.10
컴퓨터 OS부팅도 이젠 초고속 전쟁이다.  (0) 2010.03.03
구글 크롬 os 소스와 빌드환경  (1) 2010.02.28
meet 우분투 9.04 길라잡이  (0) 2010.02.25
OS프로젝트  (0) 2010.02.24
Response : ,

OS프로젝트

Posted 2010. 2. 24. 21:25, Filed under: 정보수집

시작
Response : ,


Tag cloud

Recent Posts

Recent Comments

Recent Trackbacks

Calendar

«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

Bookmarks

Site Stats

TOTAL HIT
TODAY HIT
YESTERDAY HIT