구글글래스 개발기를 발표할 정진태입니다.
현재 위플래닛이라는 회사에서 서버개발과 기획에 관련된 일을 하고 있습니다.
글래스는 미국에서 초대권을 얻게되서 작년12월에 구매했는데, 아무래도 국내에선 활용도가 낮다보니, 서랍안에 짱박혀있었습니다.
워낙 난이도가 낮은 개발이어서 망설여지긴 했는데, 막상 아직 국내에선 글래서 개발 자료가 별로 없다보니, 이렇게 공유하게 되었습니다.
글래스웨어를 개발하기전에 가장 큰 문제는 어떤것을 개발할가였습니다.
아마 많은 분들이 스카우터를 생각하셨을 것 같은데요, 스카우터를 생각하시분이 정상인 것 같습니다.
개발을 하기전에 구글 글래스 개발문서를 열심히 찾아보니,
글래스는 간단하고, 뭔가 관계있고, 현재에 관련된 정보와 함께 일하는게 제일 좋다고 합니다.
흔히들 기존의 스마트폰, 타블렛, 랩탑에 있는 서비스를 옮기는 것에 대해 고민하셨을텐데,
구글에선 기존과는 다른 경험을 제공 해줄 서비스에 집중하라고 합니다.
그래서인지 구글의 많은 서비스중에서 google maps, hangout, now 정도만 글래스에서 도드라지게 사용되는 것 같습니다.
구글글래스에서 뭔가 개발한다는 건 서비스 컨셉잡는거조차 쉬운 것 같진 않습니다.
그래도~~~~
UI엘레멘트중에서도 가장 중요한 타임라인 부터 살펴보겠습니다.
---화면 내용 기본설명
글래스를 키면 나오는 화면은 시계가 있는 home화면입니다.
홈화면을 기준으로 왼편으로 present/future에 대한게 나오며, 반대편인 오른쪽 화면은 과거의 영역입니다.
조작은 터치패드로 하게되는 (터치패드로스크롤시 앞에서 뒤로하면 현재,미래로 뒤에서 앞으로 하면 과거로 가게됩니다.
과거의 영역은 히스토리와 같은 기능으로 오직 static card들만 포함하게 됩니다.
과거의 카드는 최대 7일 혹은 200개까지만 타임라인에서 노출되며, 그 이상은 자동으로 지워집니다.
왼편의 가장 끝은 셋팅화면이며, 그 바로 전은 구글나우의 카드입니다.
Google Now!!! 왼쪽편인 이유는 말그대로 now 현재를 나타내는 정보이기 때문입니다.
스태틱 카드는 간단한 정보의 덩어리를 html, 텍스트, 이미지와 비디오로 만들 수 있습니다.
쉽게는 정적인 웹페이지를 생각하시면 좋구여.
업데이트가 빈번히 일어나지 않는 정보로, 빠른 노티피케이션을 위한 활용성에 좋다고 합니다.
생성된 스태틱카드는 이제 시간이 지날수록 점점더 타임라인에서 과거의 영역으로 쌓여가는거구요.
홈스크린의 오른쪽편은 현재와 미래에 대한 섹션이기 때문에
미래의 타임스탬프값을 값는 스태틱카드나 “pinned”라는 속성이 활성화된static card가 자리잡을수 있습니다.
아까보신 google now의 화면이 전형적으로 pinned card의 예입니다.
live card도 현재/미래의 영역에 담겨지게 되는데요,
라이브카드는 글래스의 타임라인에서 현재 user와 관련된 상황을 보여주기 위해 사용됩니다.
화면에서 예를 들면 실시간의 방향을 보여주는 나침반이나 혹은 현재 운동에 대한 정보를 나타내는 strava 글래스 웨어 같은 것들이
라이브카드를 활용해서 지속적으로 정보를 갱신하는 글래스 웨어입니다.
즉 라이브카드는 업데이트가 빈번히 일어나면서 커스텀 그래픽으로 우저에게 실시간 정보를 던져주기 위한 카드입니다.
또 gps나 가속도계와 같은 low-level sensor data에 접근 할 수 있어서, static 카드에서 제공할 수 없는 새로운 형태의 user interaction이나 기능을 구현할 수 있게해줍니다.
참고로 라이브카드는 백그라운도로 돌기때문에 user가 타임라인을 스크롤하고 있어도 실행엔 상관이 없다고 합니다.
그외로 한가지 더, immersion이라는게 있는데,
이것은 카드가 아닌 타임라인을 벗어나 화면 전체를 덮는 UI이 입니다.
이머젼은 UI에 대한 렌더링을 가능하게 하고, 모든 유저인풋의 프로세싱을 가능하게 합니다.
카드방식이 주는 제약을 극복하기 위해 사용하시면 좋습니다.
이제 입력방법에 대해서 보겠습니다.
입력은 크게 보이스코맨드는와 터치패드을 통해서 하게됩니다.
보이스코맨드는 글래스의 주요한 유저인터액션 요소로서, 유저가 두손의 제약 없이 빠르고 자연스럽게 글래스를 콘트롤 할 수 있게 도와주게 됩니다.
글래스의 가장 큰 장점인것 같구요. 최근에 보면 의료쪽이나 스포츠쪽에서 글래스의 활용예가 많이 나오는 이유가 아닐가 싶기도합니다.
보이스 코맨드는 유저가 직접 만들수도 있구요.
구글에서 코맨드에 대한 가이드라인을 제공하구 있구요. 예를 들면 play game 스파트라 라고 하기보다는 play 스파르타와 같은 방법으로 간결하고 명확하게 해서 인식율이 좋게 하라고 합니다.
보이스 코맨드뿐만 아니라 우측에 위치한 터치패드를 좌우로 스와이프 함으로서 메뉴아이템에 대한 선택이 가능합니다.
글래스웨어 서비스패턴으로는 대략 4가지를 말할 수 있습니다.
첫번째로는 스태틱카드를 이용해서 정기적으로 노티피케이션을 주는 방법이 있구여. 우마노같은 뉴스가 그런서비스를 활용하고 있습니다.
두번째로는 앞에서 보신 스트라바나 컴파스가 사용하는 온고잉 타스크 방식으로 라이브카드를 활용해서 지속적인 정보를 주는 방식입니다.
그외 게임들이 사용하는 이머젼이나 위에 방법을 섞어서 사용하는 하이브리드 방식이 있습니다.
그중에 제가 개발한 방식은 가장 간단한 미러api만 이용해서 개발 가능한 첫번째 방식입니다. (정기적인 노티피케이션을 이용해서 스태틱카드를 내려주는 방식입니다.)
google mirror api는 글라스와 상호작용하는 웹베이스드 서비스를 개발할 수 있게 해주구요.
글래스에서 네이티브코딩을 하지 않게 해주는게 최고의 장점입니다.
하지만, 이제 그런 방식때문에 때문에 유저한테 리케쉐트를 리얼타임 혹은 low latency로 받아서 응답하기 위해 사용하지 말라고 합니다.
그런 경우는 GDK를 이용하라고 하네요.
즉, 미러api는 유저에 의해 셋팅 되는 periodic notifications 이나 컨텐츠를 컨텍트(연락처 혹은 대상)과 공유하는 서비스를 위해 적합하다고합니다.
참고로 제가 주말을 반납해서 만들었던 step journal for google glass 의 경우는 후자인 share content with contacts의 방식을 사용한 것으로, 사진을 공유함으로서 저희쪽 엔진을 통해 만들어진 정보를 static card로 내려주는 방식을 취했습니다. 물론 사진은 저희 서버에 저장이 되는 방식입니다. 참고로 저는 개발을 위해서, 파이썬 보단 저에게 좀더 친숙한 php를 사용하였습니다.
미러 api가 갖고있는 리소스들입니다.
타임라인은 카드리소스로 보시면 될것 같구요.
어테치먼트는 각 카드의 첨부파일이구요.
섭스크리션은 타임라인의 액션을 구독하기 위한 리소스 이구요.
그외에 로케이션, 컨택트, 어카운트, 셋팅에 관한 리소스가 있습니다.
미러 api를 사용하기 위해서는
Google apis 프로젝트에서 미러 api에 관한 설정을 켜주셔야합니다.
개발을 위해서 google apis client 라이브러리를 사용하시면 한결 편하시구요.
Java, php, python에 익숙하신 분들은 quick start project를 다운받아서 개발을 하시면 훨씬 더 쉽게 미러api에 친해질수 있을 것 같습니다.
Start project를 사용하실거면 sqlite를 활용하시는게 기본이구요, 다른 db로 튜닝하실수도 있겠지만, 아무래도 quick start의 효과는 잊게 되실것 같습니다.
Subscription이 필요하신 경우는 mirror api를 통해 callback url셋팅을 위해서 웹서버가 필요하십니다.
준비가 끝났으니 스텝저널을 잠시 소개하겠습니다.
스텝저널은 자동일기 서비스입니다. 캘린더, GPS, 사진 같은 핸드폰 센싱정보와 페북,인스타그램,포스퀘어, 트위터 같은 소셜,
그리고 핏빗 조본 같은 웨어러블 디바이스를 통해서 자동으로 일기를 만들어주는 프라이벳 저널 서비스입니다.
구글글래스와 스텝저널의 연결포인트로 저는 사진을 활용했습니다. 글래스에서 사진을 찍어서 공유하는 순간에 자동일기를 만들게했습니다..
아무래도 이틀만에 미러api만을 통해서 만들다보니깐, 어설픈 부분은 있습니다.
사실 사진을 찍자마자 step저널이랑 연동되는게 더 자동스럽긴 할텐데요.
그런 부분은 카메라 앱을 돌려야하기때문에 gdk를 통해서 개발해야할 것 같구요.
전 mirror api를 통해 개발하다보니 share를 하는 방법을 선택했습니다.
사진을 찍어서
스텝저널에 공유하면
우선 스텝저널에 사진을 기반으로 하나의 자동일기가 저장이되구요. 가공된 정보와 함께 글래스의 타임라인에도 새로운 카드가 생성이 됩니다.
카드의 정보들은 글래스에서 만들어진 건 아니고 저희 엔진에서 유저의 과거기록을 기반으로 만들어 낸 데이타입니다.
우선 미러api는 oauth2.0방식을 사용합니다.
위의 경로로 request를 보냄으로서 섭스크립션등록이 가능하합니다.
참고로 토큰은 https://www.googleapis.com/auth/glass.timeline 의 스코프를 갖고있어야합니다.
구독할때 반드시 보내야 하는 프로퍼티는 callbackUrl 과 collection 입니다.
참고로 callbackUrl은 반드시 https로 시작해야하고,
collection은 timeline과 locations 두 가지를 지원합니다
timeline으로 선택을 하는 경우 insert, update, delete에 대한 notification을 받을수 있는데 operation에서 설정함으로서 가능하고, 여러개를 선택할수도 있습니다.
Collection 을 locations를 선택하면 글래스의 정기적인 location updates를 받게됩니다.
또한 userToken 파라미터를 통해 subscription의 유저역시 확인이 가능합니다. (verifyToken이란걸 통해 확인절차를 만들수도 있지만 생략하겠습니다)
저같은경우는 저희 엔진에 연결된 url을 callbackUrl을 셋팅하고, collection엔 timeline으로 operation은 insert로 설정후에 요청하였습니다.
설정을 해놓고 나면, 사진을 찍어서 공유했을때, 구글이 친절하게 노티피케이션을 보내줍니다. 대략 10~30초의 시간이 걸리는 것 같습니다.
php의 경우에선 @file_get_contents('php://input'); 를 통해 request body에서 raw data를 읽고, json type으로 decoding 후
userToken 프로퍼티를 통해 어떤 유저의 것인지 확인 (저흰 한명이라서 대충 스킵)
collection 프로퍼티를 통해 액션내용을 다시 확인
userActions 프로퍼티를 통해 유저가 트리거를 일으키게 만든 액션에 대한 목록을 받습니다.
type을 통해 어떤 액션을 했는지 (share,reply, reply_all,custom, delete, pin, unpin, launch)
payload를 통해서 custom 데이터를 획득합니다.
itemId 를 통해서 timeline에 어떤 카드를 통해서 notification이 일어났는지를 확인합니다.
GET https://www.googleapis.com/mirror/v1/timeline/id
GET /mirror/v1/timeline HTTP/1.1Host: www.googleapis.comAuthorization: Bearer auth token
이제부터는 timeline리소스로 접근하여서
그 itemid를 통해서 사진과 위치정보,시간에 대한 정보값과 가져오게되는데
저희는 사진과 위치정보, 시간을 필요로 하기에
attachments 프로퍼티에서 리소스를 획득해오게 되는데.
created 프로퍼티를 통해 생성 시간 (rFC 3339)
location 프로퍼티를 통해 location에 다시 접근하여 위경도값을 획득해 옵니다.
GET https://www.googleapis.com/mirror/v1/locations/id
GET /mirror/v1/locations/latest HTTP/1.1Authorization: Bearer auth token
이는 timeline.attachments 라는 리소스롤 또 나누어져 있습니다.
GET https://www.googleapis.com/mirror/v1/timeline/itemId/attachments/attachmentId
GET /mirror/v1/timeline/timeline item id/attachments/attachment id HTTP/1.1Host:www.googleapis.comAuthorization: Bearer auth token
Timeline에서 중요한값만 추려보았다.
sourceItemId는 타임라인을 보낸 소스의 유니크아이디를 담을수 있고,
Bundle은 타임라인에서 유사한 아이들을 묶을수 있는 기능으로 cover에 대한 설정과 bundleId에 대한 셋팅이 가능하다.
isPinned를 통해 카드를 present/future영역에 둘수 있고, pin에대한 score역시 설정이 가능하다. 높은 스코어일수록 시간(home)에가까이 위치하지만, 현재 제공안함.
Title, text, html은 카드를 구성하기 위해 쓰이는데 뒤에서 살표보겟슴돠.
speakableType은 read_aloud를 위해 쓰이며, type은 text앞에서 무엇인지를 먼저 알려주게된다.
SpeakableText는 read_aloud에 type뒤에 읽히는 내용이다.
Attachments는 첨부에 관련된 내용으로 뒤에서 살표보겠다.
location역시
Menuitems는 카드에서 일어난수 있는 action의 종류를 갖는 것으로. 저런 종류들이있다.
Location,
Latitude,
Longitude 가 나오고여
Accuracy엔 m로 오차범위같은게 나오고,
displayName엔 home과 같은 user가 설정해놓은 이름이 나온다.
contentType은 마임타입이 사용되며, url에 완전히 업로드 안되있는 경우는 isprocesssing이 true로 설정되어있다.
노티피케이션으로 획득된 정보를 스텝엔진에서 가공하여, static 카드로 만들어줄 정보와, 스텝 앱에서 사용할 정보를 생성해냅니다.
스텝앱에서의 정보는 알아서 생성을하구요 *-_-* 카드로 내려갈 정보는 쿨하게 html으로 만들어줍니다.
아래의 링크를 통해서 카드를 쉽게 디자인 해볼 수 있습니다.
insert 혹은 patch를 이용해서 가능합니다. 이미지의 경우는 저희 서버와의 연동을 통해서 보여지도록 했습니다.
insert 혹은 patch를 이용해서 가능합니다. 이미지의 경우는 저희 서버와의 연동을 통해서 보여지도록 했습니다.
insert 혹은 patch를 이용해서 가능합니다. 이미지의 경우는 저희 서버와의 연동을 통해서 보여지도록 했습니다.
insert 혹은 patch를 이용해서 가능합니다. 이미지의 경우는 저희 서버와의 연동을 통해서 보여지도록 했는데
attachment리소스를 사용하시는 경우는 확실하지는 않지만 quick start project 내애서도 proxy 관련 로직을 통해서 보여주게 되는 것 같습니다.다.