‘MIV-미러링’을 통해 스마트폰 서비스를 차에서 이용하기 – Part 3.

MIV-미러링 3번째 시간입니다.

이번 포스트에서는 어플리케이션 미러링(app mirroring) 기술과 AppThrough 라는 스마트폰과 차량 디바이스간의 연결기술에 대한 소개를 해 보겠습니다.

미러링은 지난 연재에서 언급한 바와 같이 스마트폰의 화면과 소리를 다른 디스플레이 디바이스에서 공유하는 기술입니다. 또한 스마트폰과 연동되는 외부 디스플레이 디바이스와 터치 이벤트를 주고 받으며 스마트폰의 제어를 가능하게 하기도 합니다.

이 때, 스마트폰의 화면과 소리를 어떻게 가져오는지가 중요한데요, 미러링에서는 스마트폰의 화면 데이터를 얻기 위해서 프레임버퍼(Frame Buffer)에 접근을 합니다. 저희가 주로 작업하는 안드로이드를 기준으로 설명을 드리면, 스마트폰 상에서 구동중인 앱들이 Surface를 생성하고 무엇인가를 그리게 되면, 이런 Surface 데이터들을 Surface Flinger가 받아서 프레임 버퍼에 쓰게 됩니다. 그래서 이 버퍼에 접근하여 데이터를 읽어낼 수 있다면 외부의 디바이스에서 화면을 그대로 복사하여 서비스 하는 것이 가능해 집니다. 안드로이드의 프레임버퍼는 실제 더블버퍼링(Double Buffering)을 이용하기 때문에 실제 화면에 보여지는 이미지의 2배 크기의 버퍼가 할당되어 있습니다. 그래서 하나의 버퍼가 LCD에 값을 보여주는 동안 다른 하나의 버퍼는 Surface Flinger가 데이터를 채우게 되지요. 아래 그림 1에서 더블버퍼링의 간단한 예를 보여주고 있습니다. (ptr는 address pointer입니다)

그림 1. 더블버퍼링(Double Buffering)의 예 <출처: TheCodeArtist.blogspot.com>

잠시 이야기를 건너 뛰어, 프레임버퍼에서 디스플레이 할 화면을 가져온다는 것은 바꿔 말하면, 스마트폰의 화면과 100% 동기화 된다는 뜻이기도 합니다. 이 때, 100% 동기화가 됨으로써 서비스의 연속성을 보장하지 못하는 경우가 발생할 수 있습니다. 대표적으로 네비게이션 앱이 실행되는 중에 전화가 걸려오는 상황이 있습니다. 전화가 걸려오는 이벤트는 네비앱을 실행시킨 유저가 의도치 않게 발생하게 되는데요. 이 때 스마트폰이 네비게이션 화면에서 전화화면으로 넘어가 버리는 의도치 않는 화면 전환이 발생하게 됩니다.

이와 같은 문제점을 개선하기 위해서 저희는 앱 미러링 이라는 방식을 도입하였습니다. 앱 미러링은 폰 미러링과 구분되는 방식으로 애플리케이션이 직접 미러링을 하겠다는 뜻입니다. 이 경우 폰의 화면과 100% 동기화가 되지 않고, 애플리케이션의 화면을 마음대로 전송할 수 있으므로 서비스의 연속성을 유지하는데 아주 효과적입니다.

아래 영상을 보시면 앱 미러링이 프레임버퍼를 읽는 미러링과 어떻게 다른지 금방 이해하실 수 있습니다.

영상으로 보는 바와 같이 애플리케이션 레벨의 미러링을 구현하기 위해서는 스마트폰의 애플리케이션의 구동 화면과 애플리케이션이 내보내는 오디오데이터 그리고 제어를 위해 외부 디바이스에서의 터치 이벤트 전달이 필요합니다. 이를 위해서 MIV-미러링(AppThrough)에서는 AppThrough Protocol 을 디자인 했습니다. 여기에 디바이스 검색을 위한 uPnP도 같이 포함하고 있습니다.  그림으로 보면 아래와 같은 구조를 가집니다.

그림 2. AppThrough 인터페이스 구조

외부 디스플레이 디바이스에는 AppThrough Viewer 라는 프로그램이 탑재가 되고, uPnP를 통해 연결된 스마트폰에서 지원가능한 서비스를 검색하게 되는데, 이 때 검색된 MIV-미러링을 지원하는 서비스가 있다면 AppThrough Service에서 외부 디스플레이 디바이스에게 알려주게 됩니다. 스마트폰에 설치되는 AppThrough Service는 외부 디스플레이 디바이스와의 uPnP통신 및 각종 서비스 관리업무를 수행합니다. 폰에 설치된 AppThrough 지원앱을 검색하여 서비스에 등록하고, AppThrough Viewer와 관련 프로파일 정보들을 교환합니다. 더불어 스마트폰에서 발생하는 각종 알림(Notification) 이벤트를 전달하는 역할도 함께 수행할 수 있습니다. 알림에는 문자 메세지의 수신, 콜 수신, 배터리관련 알림 등이 포함될 수 있도록 설계되어 있습니다.

AppThrough Service 와 AppThrough Viewer 는 SK플래닛에서 100% 개발을 진행하고, 서비스 애플리케이션(위의 예를 들면, T map)의 경우에는 라이브러리 형태로 제작된 AppThrough Server 를 포함하여 빌드만 하게 되면 바로 서비스가 가능하도록 구성되어 있습니다. 이 라이브러리에서는 화면과 음성의 캡쳐 및 터치 이벤트의 공유와 하드키(Hard Key)의 이벤트 공유를 포함하고 있으며, 다양한 종류의 API를 지원하고 있습니다. 서비스애플리케이션은 라이브러리에 포함된 다양한 API를 활용하여 화면과 음성 전송을 가능하게 해 줍니다.

현재까지 아래와 같은 API들을 지원하고 있습니다.

1. Application API: 미러링 서비스의 Start/Stop

2. Activity API: onCreate, onResume, onPause, onDestroy, startActivity, startActivityForResult

3. Dialog API: showDialog, dismissDialog

4. EditText API: addEditText, hideKeypad,

5. Toast API: showToast

6. SurfaceView API: prepareSurfaceView, finishSurfaceView

7. OpenGL View API: openGLDraw

8. Audio API: playSound

현재까지 개발된 각 API들은 안드로이드 O/S에 최적화 되어 있는데, 각 API함수들은 앱미러링 기능을 지원하기를 원하는 어플리케이션에서 불편함 없이 사용할 수 있게 하기 위해서 안드로이드에서 제공하는 함수를 1:1 대응하도록 디자인 했습니다.  따라서 앱 개발자들이 안드로이드 함수가 들어갈 자리를 AppThrough SDK에 포함된 API를 대신 사용하기만 하면 되고, 각 AppThrough API들은 내부에서 미러링을 위한 데이터 전송을 수행하고, 본래의 Android 함수를 내부에서 호출하도록 개발되었습니다. 이를 통해 아래와 같은 형태로 코딩 하게끔 설계가 되었습니다. 아래 예제는 Dialog API를 적용하는 방법입니다.

AlertDialog.Builder alertDialog = new AlertDialog.Builder(MainActivity.this);
alertDialog.setTitle("DIALOG");
alertDialog.setMessage("TEST");
alertDialog.setPositiveButton("OK", new DialogInterface.OnClickListener() {
  @Override
  public void onClick(DialogInterface dialog, int which) {
  }
};
final Dialog dlg = AppThroughService.getInstance().showDialog(alertDialog.show());
dlg.setOnDismissListener(new OnDismissListener() {
  @Override
  public void onDismiss(final DialogInterface arg0) {
    AppThroughService.getInstance().dismissDialog(dlg);
  }
};

코드 1. AppThrough Dialog API 적용 코딩 예

실제 이런 방식으로 기존 앱들에 미러링 기능을 추가하는 작업이 대략 1~2주안에 가능하였습니다.

이상으로 애플리케이션 미러링에 대해서 살펴봤는데요, 지금까지의 3회 연재는 MIV-미러링에 집중하여 소개를 드렸고, 다음 시간에는 마지막으로 미러링 솔루션 이외의 다양한 SK플래닛의 MIV솔루션에 대해서 소개를 하고 연재를 마치겠습니다.

————————————————————————————————————————–

연재방향

Part1: 스마트폰과 외부 디바이스의 연동 서비스 구성방식에 대한 소개

Part2: full mirroring 기술과 RUI, CCC

Part3: app mirroring 기술과 AppThrough

Part4: 사례 소개 – SK플래닛 MIV솔루션

————————————————————————————————————————–

이상율 LBS기술개발팀

전자회사에서 텔레메틱스 서비스 개발과 차량네트워크 프로그래머로 8년을 보내고, 현재는 SK플래닛 LBS기술개발팀에서 스마트폰과 외부 디바이스의 Connectivity Solutions 개발 관련한 일을 하고 있습니다.

관심분야: MirrorLink, P2C(Phone2Car), MIV(Mobile In-Vehicle), 차량네트워크, CAN, OBD 진단제어

공유하기