자바 ME 에서 블 루 투 스 를 통 해 장 치 를 발견 하고 파일 을 전송 합 니 다.


자바 ME 장치 에서 블 루 투 스 프로그램 을 실행 하 는 첫 번 째 단계 중 하 나 는 발견 과정 (discovery process) 이다.한 마디 로 블 루 투 스 가 있 는 장치 가 서로 서 로 를 찾 는 과정 을 발견 하고 지원 할 수 있 는 서 비 스 를 함께 찾 는 것 이다.다음 단 계 는 이 두 장치 사이 에서 데 이 터 를 어떻게 전송 하 는 지 배 워 야 한다.
이 기술 의 작은 글 에서 저 는 서로 장 치 를 찾 을 수 있 는 MIDlet 을 만 드 는 방법 을 보 여 드 리 고 찾 은 장치 에 간단 한 메 시 지 를 보 낼 것 입 니 다.나 는 Nokia N95 의 기계 에서 이 MIDlet 의 작업 을 테스트 하고 확인 했다. 블 루 투 스 지원 을 사용 하면 윈도 비 스타 를 실행 하 는 컴퓨터 에 연결 할 수 있다.
나 는 전체 과정 을 다음 과 같은 몇 가지 절차 로 나 누 었 다.
1. 발견 과정 을 시작한다.
2. 발견 과정 에서 찾 은 장치 가 지원 하 는 서 비 스 를 조회 합 니 다.
3. 서 비 스 를 지원 하 는 URL 로 OBEX 데이터 교환 을 시작 하고 처리 합 니 다.
아래 각 단락 은 이 절차 들 을 상세 하 게 설명 할 것 이다.이 단계 에서 코드 세 션 을 따 르 면 이 MIDlet 의 전체 소스 코드 를 찾 아 볼 수 있 습 니 다.원본 코드 는 마지막 Resources 의 압축 파일 에서 얻 을 수 있 습 니 다.
STEP 1: 발견 과정 시작
발견 과정 은 로 컬 블 루 투 스 스 택 이 근처에 있 는 모든 블 루 투 스 장치 와 짝 을 이 룰 수 있다 는 것 을 알려 주 는 데 사용 된다.이 MIDlet 에서 이 스 택 은 장치 공급 자가 제공 하 는 JSR 82 를 통 해 완성 할 수 있 습 니 다.이 발견 과정 은 로 컬 장치 에 있 는 에이 전 트 를 발견 함으로써 시 작 됩 니 다. 다음 코드 와 같 습 니 다.
        // get the local discovery agent 
  agent = LocalDevice.getLocalDevice().getDiscoveryAgent();

  // start the inquiry for general unlimited inquiry

  agent.startInquiry(DiscoveryAgent.GIAC, this);

프 록 시 시작 발견 과정 이 발견 되면 Discovery Listener 인 터 페 이 스 를 실행 하 는 클래스 에서 여러 가지 호출 방법 을 사용 합 니 다.우리 로 서 는 우리 의 MIDlet 류 다.
구체 적 으로 말 하면 이 인터페이스의 네 가지 방법 을 실행 해 야 한다. 그 중에서 두 가 지 는 발견 단계 에서 우리 가 관심 을 가 지 는 것 이다. device Discovered (RemoteDevice btDevice, DeviceClass cod) 와 inquiry Complete (int discType) 이다.이 두 가지 방법 은 한 설비 의 발견 을 처리 하고 발견 과정 을 완성 한다.아래 에 보 여 주 는 MIDlet 코드 에서 발견 되 거나 프로그램 이 끝 날 때 이 방법 을 사용 하여 장치 의 UI 를 추가 합 니 다.      public void deviceDiscovered(RemoteDevice btDevice, DeviceClass cod) { 
  try {

  // add the devices using the friendly names

  listofDevices.append(btDevice.getFriendlyName(false), null);

  // add to the devices hashtable

  devices.put(new Long(listofDevices.size()), btDevice);

  } catch(Exception ex) { handleError(ex); }

  }

  public void inquiryCompleted(int discType) {

  // once the inquiry is completed, show the list of devices to the user

  if(listofDevices.size() == 0) {

  display.setCurrent(nothing, noteBox);

  } else {

  display.setCurrent(listofDevices);

  }
      }

두 번 째 단계: 발 견 된 장치 에서 서비스 발견 시작 (service discovery)
본 논문 의 목적 은 데 이 터 를 우리 의 MIDlet 에서 호 환 되 는 장치 로 전송 하 는 것 이기 때문에 우 리 는 이미 발 견 된 장치 에서 이 서 비 스 를 찾 아 이 목 표를 실현 해 야 한다.이 목적 을 달성 하기 위해 서 는 서비스 발견 과정 에서 정확 한 속성 과 UUIDs 를 정의 해 야 합 니 다.다음 코드 는 이것 을 어떻게 하 는 지 보 여 줍 니 다.
        agent.searchServices( 
  null,

  new UUID[] {new UUID(0x1105L)}, // we want the OBEX PUSH Profile

  device,

  this);

당신 이 예상 한 바 와 같이, 이 코드 들 은 우리 가 이전에 사 용 했 던 로 컬 에이 전 트 를 사용 하여 장 치 를 찾 습 니 다.우 리 는 특정한 속성 뒤에 있 지 않 기 때문에 null 을 첫 번 째 매개 변수 로 사용 해 야 합 니 다. 그러나 UUID 는 OBEX PUSH 설정 파일 이 어야 합 니 다. 이것 은 데 이 터 를 전송 하 는 가장 개방 적 인 방법 이기 때 문 입 니 다.
우 리 는 발견 한 서 비 스 를 이용 할 수 있 는 두 가지 다른 방법 이 있다 고 말 했다.이 두 가지 방법 은 services Discovered (int transID, ServiceRecord [] servRecord) 와 serviceSearchComplete (int transID, int respCode) 이다.이름 에서 보 듯 이 첫 번 째 방법 은 서비스 가 발 견 될 때마다 호출 되 고 두 번 째 방법 은 서비스 과정 이 끝 날 때 호출 되 는 것 입 니 다.
서비스 가 발 견 될 때마다 모든 장치 의 특정한 URL 서비스 연결 을 찾 아야 합 니 다.이 URL 연결 은 OBEX 연결 을 우리 의 데이터 전송 에 사용 하고 블 루 투 스 하드웨어, 장치 주소 로 구성 합 니 다.다음 코드 에서 이 URL 연결 은 services Discovered 방법 에서 추출 되 었 습 니 다.
        String connURL = servRecord[i].getConnectionURL(ServiceRecord.NOAUTHENTICATE_NOENCRYPT, false);
이 URL 을 통 해 연결 하면 이제 데 이 터 를 전송 하 는 프로그램 을 발 견 된 장치 로 이동 할 수 있 습 니 다.
STEP 3: PBEX PUT 로 데이터 전송
이 MIDlet 에 서 는 사용자 가 메시지 로 텍스트 를 입력 한 다음 발 견 된 장치 나 서비스 로 전송 할 것 입 니 다.이 를 위해 서 는 이전 단계 에서 얻 은 URL 연결 이 필요 합 니 다. (물론 메시지 데 이 터 는 String 입 니 다.)
         // open a client session 
  ClientSession clientSession =

  (ClientSession) Connector.open(connURL);

  // connect using no headers

  clientSession.connect(null);

  if(rHeaders.getResponseCode() != ResponseCodes.OBEX_HTTP_OK) {

  // the connection could not be established

  handleError(

  new Exception("Remote client returned invalid response code: " +

  rHeaders.getResponseCode()));

  return;

  }

  // if we are here, then response code was ok

  // create a new set of headers

  HeaderSet headers = clientSession.createHeaderSet();

  headers.setHeader(

  HeaderSet.LENGTH,

  new Long(noteBox.getString().length()));

  headers.setHeader(HeaderSet.NAME, "myNote.txt");

  headers.setHeader(HeaderSet.TYPE, "text/plain");

  // create an operation using the headers we have just created

  Operation op = clientSession.put(headers);

  // on this operation, create the output stream

  OutputStream out = op.openOutputStream();

  // and send the note

  out.write(noteBox.getString().getBytes());

이 데 이 터 를 보 내기 위해 client session 이 열 리 고 빈 제목 의 연결 을 만 듭 니 다.이 점 에서 목표 장 치 는 새로운 장치 의 데이터 수신 확인 을 요구 합 니 다.이전에 짝 짓 기 장치 가 없 었 다 면 키 를 요구 할 수도 있 습 니 다.
연결 이 구축 되면 데이터 목적 지 를 설명 하 는 제목 이 생 성 되 고 새로운 작업 이 이 제목 을 통 해 생 성 됩 니 다.이 조작 은 OutputStream 을 통 해 데 이 터 를 전송 하 는 것 이다.
받 은 메 시 지 는 대상 장치 의 기본 블 루 투 스 교환 폴 더 에 있 습 니 다.
 

좋은 웹페이지 즐겨찾기