반응형

이번 포스팅은 다음의 링크를 참조 하였다.

(http://android-wear-docs.readthedocs.org/en/latest/sync.html, https://developer.android.com/training/wearables/data-layer/index.html)


1. Data Layer 

wearable device는 직접 internet에 access하지 못한다. host device와 연동하여 데이터를 송,수신해야 하며 이를 지원하는 것이 Wearable Data Layer API이다. Wearable Data Layer API는 데이터를 동기화하는 것과 message를 전달하는 것으로 구성된다.

  • Data Items : DataItem 객체는 handheld와 wearable간에 자동적으로 동기화해주는 데이터 저장소이다.
  • Messages : MessageApi 객체는 fire-and-forget 형태의 메시지를 보낼수 있다. handheld와 wearable 이 연결되어 있으면 데이터를 전달하고, 연결되어 있지 않으면 에러를 리턴한다. one-way request 또는 request/response 모델에 적합함
  • Asset : Asset는 이미지와 같은 binary 데이터를 전송하게 해준다. data itmes 에 asset을 붙여 놓으면 자동적으로  Caching 하여 bluetooth bandwidth를 절약해 주고 re-transmission 을 피하게 해준다.
  • WearableListenerService (for services) : WearableListenerService 객체를 Extending 하면 중요한 data layer 이벤트를 listen 하게 해준다. data item 이나 message를 전송할 필요가 있을때 자동적으로 binding 하거나 필요 없을때 unbinding을 해주는 등의 WearableListenerService의 라이프사이클을 자동적으로 관리해준다.
  • DataListener (for foreground activities) : DataListener 객체를 Implementing 하게 되면 foreground activity에서 중요한 data layer 이벤트를 listen하게 해준다. WearableListenerService 대신 이 객체를 이용하는 것은 사용자가 actively 하게 변화 상태를 listen 하도록 해주는 것이다.

(google에서는 low-level socket을 이용해서 통신하는 것에 대해서 경고하고 있으며 상기의 API를 이용하기를 권장하고 있다.)


2. GoogleApiClient Build

메시지를 보내기 위해서는 GoogleApiClient 를 선언하고 Build 해야 한다. (handheld app, wearable app 둘다)

  • addConnectionCallbacks 을 위해서 ConnectionCallbacks 객체를 implementation 해야 한다.
  • addOnConnectionFailedListener 를 위해서 OnConnectionFailedListener 객체를 implementation 해야 한다.
  • data layer API를 이용하기 위해서는 connect() 메소드를 호출해야 하고 onConnected 콜백이 호출되면 data layer API를 이용 가능하다.


3. DataItem 을 이용한 동기화

DataItem은 handheld와 wearable 간에 데이터를 동기화 하는 인터페이스를 정의한다. DataItem은 Payload 와 Path로 구성되는데, Payload는 byte array로 object serialization/deserialization 을 하게 하며 100KB로 제한된다. Path는 Unique 한 경로이다.


DataItem은 일반적으로 직접 구현하여 사용하지 않고 대신 다음과 같이 사용한다.

1) PutDataRequest 객체를 생성하고 Path를 지정한다.

2) setData() 로 payload를 설정하고

3) DataApi.putDataItem() 으로 data item을 시스템에서 생성하도록 한다.

4) DataItem을 요구하면 시스템은 DataItem이 구현된 객체를 리턴한다.

하지만 setData를 이용하지 않고 data map을 이용하기를 권장한다. 다음은 Data Map을 이용한 DataItem생성 방법이다.

1) PutDataMapRequest 객체를 생성한다. (이때 path를 설정한다.)

2) PutDataMapRequest.getDataMap() 으로 data map 객체를 가져온다.

3) putXXX() 메소드로 data map에 필요한 값을 설정한다. (예를 들어 putString())

4) PutDataMapRequest.asPutDataRequest() 로 PutDataRequest 객체를 획득한다.

5) DataApi.putDataItem() 을 호출하여 시스템이 data item을 생성하도록 요청한다.

다음은 예제 코드이다.


DataItem이 변경되면 다른 쪽에서 이 변경한 이벤트를 알아야 한다. 이벤트는 data item events 에 대한 listener를 구현하면 수신 가능하다. 다음은 Data Item Events 의 onDataChange 의 코드사례이다.

이 이벤트 리스너는 Wearable.DataApi.addListener 메소드로 리스터를 등록 가능하며 리스터는 DataApi.DataListener를 implement 해야 한다. (onDataChanged 메소드 Override)


4. 코드 예제

4.1 DataItem 수신

New Project 에서 Host용 App 과 Wearable App을 같이 선택해서 Project를 생성한다. 기본적으로 Wearable 의 데이터 동기화, 교환은 같은 패키지의 Host App하고만 가능하다. DataItem의 변경을 수신하고자 하는 Activity에서 다음의 객체를 선언해 준다. (Wearable, Host App)

private GoogleApiClient mGoogleApiClient;

private PutDataMapRequest mDataMap;

onCreate 함수에서 다음과 같이 GoogleApiClient 를 생성하고 DataItem을 생성한다.

mGoogleApiClient=new GoogleApiClient.Builder(this).addApi(Wearable.API).

addConnectionCallbacks(this).

addOnConnectionFailedListener(this).build();

Activity가 다음의 인터페이스를 Implement 하도록 선언한다.

public class XXXXXXX extends Activity implements 

GoogleApiClient.ConnectionCallbacks,

GoogleApiClient.OnConnectionFailedListener, 

DataApi.DataListener

mGoogleApiClient를 App이 시작할때 connection 명령을 내리도록 onStart() 함수를 Override 한다.

 @Override

protected void onStart(){

super.onStart();

mGoogleApiClient.connect();

}

App이 중지할때 mGoogleApiClient를 disconnect하도록 onStop() 함수를 Override 한다. 이때 등록한 DataApi의 Listener도 제거한다.

 @Override

protected void onStop() {

Wearable.DataApi.removeListener(mGoogleApiClient, this);

mGoogleApiClient.disconnect();

super.onStop();

}

onDataChanged(DataEventBuffer dataEvents) 메소드를 구현하면 특정 DataItem 에 대한 변경이 있으면 이 함수가 호출된다. 다음은 코드 사례이다.

Wearable App 에서 해당 DataItem을 변경하면 변경 즉시 Wearable App의 onDataChanged 가 호출되고 또한 Host App에서 DataApi Listener를 등록하면 Host App에서도 onDataChanged 가 호출된다. Host App에서의 변경 또한 동일하다.


4.1 DataItem 송신

DataItem 의 값을 변경 시키기 위해서는 상기 3의 설명처럼 PutDataMapRequest 를 이용한다. 값을 변경하고자 하는 Activity에 다음의 변수를 선언한다.

 private PutDataMapRequest mDataMap;

그리고 onCreate 함수에서 DataItem URI를 설정한다.

 mDataMap=PutDataMapRequest.create("/w_sensors");

다음과 같이 값을 설정하고 전송한다.

 mDataMap.getDataMap().putInt("test",123);

PutDataRequest request = mDataMap.asPutDataRequest();

PendingResult<DataApi.DataItemResult> pendingResult = Wearable.DataApi.putDataItem(mGoogleApiClient, request);



반응형
Posted by alias
,