운동을 녹화하는 방법

이 문서에서는 피트니스 REST API를 사용하여 운동을 기록하는 방법을 설명합니다.

1단계: 프로젝트 설정

시작하기의 설명처럼 Google API 콘솔에서 프로젝트를 설정하고 피트니스 REST API에 대한 액세스를 활성화해야 합니다.

2단계: 앱 인증

앱은 액세스 토큰을 사용하여 피트니스 API에 대한 요청을 인증해야 합니다. 액세스 토큰을 얻으려면 요청 승인에 설명된 대로 앱에 클라이언트별 사용자 인증 정보와 액세스 범위를 포함합니다.

3단계: 데이터 소스 만들기

데이터 소스는 특정 유형의 센서 데이터 소스를 나타냅니다. 피트니스 저장소에 삽입된 모든 데이터는 데이터 소스와 연결되어야 합니다. 데이터 소스를 한 번 만들면 향후 세션에 재사용할 수 있습니다.

데이터 소스를 만들려면 다음 매개변수를 사용하여 인증된 HTTP 요청을 제출합니다.

HTTP 메서드
게시
리소스

https://www.googleapis.com/fitness/v1/users/me/dataSources

me 사용자 ID는 액세스 토큰이 요청을 승인하는 사용자를 나타냅니다.

요청 본문
{
"name": "example-fit-heart-rate",
"dataStreamId":
    "raw:com.google.heart_rate.bpm:1234567890:Example Fit:example-fit-hrm-1:123456",
"dataType": {
    "field": [{
        "name": "bpm",
        "format": "floatPoint"
    }],
    "name": "com.google.heart_rate.bpm"
},
"application": {
    "packageName": "com.example.fit.someapp",
    "version": "1.0"
},
"device": {
    "model": "example-fit-hrm-1",
    "version": "1",
    "type": "watch",
    "uid": "123456",
    "manufacturer":"Example Fit"
},
"type": "raw"
}

이 요청은 com.google.heart_rate.bpm 유형의 피트니스 데이터를 제공하는 심박수 모니터를 나타내는 데이터 소스를 만듭니다. 데이터 소스의 ID를 지정해야 하며, 모든 값을 사용할 수 있습니다. 이 예시의 데이터 소스 ID는 채택 가능한 합리적인 명명 규칙을 따릅니다. 앱에서만 데이터가 생성되는 경우 기기 구성요소는 선택사항입니다.

요청이 성공하면 응답은 200 OK 상태 코드입니다.

데이터 소스에 대한 자세한 내용은 Users.dataSources 리소스의 API 참조를 확인하세요.

4단계: 데이터 포인트 추가

데이터 세트를 사용하여 피트니스 저장소에 데이터 포인트를 삽입합니다. 데이터 세트는 시간별로 제한된 단일 데이터 소스의 데이터 포인트 모음입니다.

데이터 세트를 만들고 여기에 점을 추가하려면 다음 매개변수를 사용하여 인증된 HTTP 요청을 제출합니다.

HTTP 메서드
캐치
리소스

https://www.googleapis.com/fitness/v1/users/me/dataSources/
raw:com.google.heart_rate.bpm:1234567890:Example%20Fit:example-fit-hrm-1:123456/datasets/1411053997000000000-1411057556000000000

URL에는 데이터 소스 ID와 데이터 세트의 시작 시간 및 종료 시간이 나노초 단위로 포함됩니다.

요청 본문
{
"minStartTimeNs": 1411053997000000000,
"maxEndTimeNs": 1411057556000000000,
"dataSourceId":
  "raw:com.google.heart_rate.bpm:1234567890:Example Fit:example-fit-hrm-1:123456",
"point": [
{
  "startTimeNanos": 1411053997000000000,
  "endTimeNanos": 1411053997000000000,
  "dataTypeName": "com.google.heart_rate.bpm",
  "value": [
    {
      "fpVal": 78.8
    }
  ]
},
{
  "startTimeNanos": 1411055000000000000,
  "endTimeNanos": 1411055000000000000,
  "dataTypeName": "com.google.heart_rate.bpm",
  "value": [
    {
      "fpVal": 89.1
    }
  ]
},
{
  "startTimeNanos": 1411057556000000000,
  "endTimeNanos": 1411057556000000000,
  "dataTypeName": "com.google.heart_rate.bpm",
  "value": [
    {
      "fpVal": 62.45
    }
  ]
}
]
}

이 요청은 이전 단계의 데이터 소스에 대해 1시간 이내에 심박수 데이터 포인트가 3개인 데이터 세트를 만듭니다.

요청이 성공하면 응답은 200 OK 상태 코드입니다.

데이터 세트에 대한 자세한 내용은 Users.dataSources.datasets 리소스의 API 참조를 확인하세요.

유효한 타임스탬프 생성

위 예시의 타임스탬프는 나노초 단위입니다. 유효한 타임스탬프를 생성하려면 다음 Python 스크립트를 사용하면 됩니다.

from datetime import datetime, timedelta
import calendar

def date_to_nano(ts):
    """
    Takes a datetime object and returns POSIX UTC in nanoseconds
    """
    return calendar.timegm(ts.utctimetuple()) * int(1e9)

if __name__ == '__main__':
    print 'Current time is %d' % date_to_nano(datetime.now())
    print 'Time 1 hour ago was %d' % date_to_nano(datetime.now() +
       timedelta(hours=-1))

5단계: 세션 만들기

이제 피트니스 저장소에 데이터를 삽입했으므로 세션을 삽입하여 이 운동에 관한 추가 메타데이터를 제공할 수 있습니다. 세션은 사용자가 피트니스 활동을 하는 동안의 시간 간격을 나타냅니다.

이 운동에 대한 세션을 만들려면 다음 매개변수를 사용하여 인증된 HTTP 요청을 제출합니다.

HTTP 메서드
처리
리소스

https://www.googleapis.com/fitness/v1/users/me/sessions/sessionId

sessionId는 임의적이며 인증된 사용자와 관련된 모든 세션에서 고유해야 합니다.

요청 본문
{
"id": "example-fit-1411053997",
"name": "Example Fit Run on Sunday Afternoon",
"description": "Example Fit Running Session",
"startTimeMillis": 1411053997000,
"endTimeMillis": 1411057556000,
"application": {
"name": "Foo Example App",
"version": "1.0"
},
"activityType": 8
}

다른 앱에서 세션을 요약하는 데 사용할 수 있으므로 사람이 읽을 수 있고 설명하는 세션 이름을 선택합니다. 세션의 시작 및 종료 시간은 나노초가 아닌 밀리초 단위입니다. 세션과 데이터 소스에 동일한 패키지 이름을 사용하세요. 이렇게 하면 데이터의 일관성이 높아지고 데이터 기여 분석이 앱으로 다시 연결됩니다.

이 세션에서 지정된 시간 간격은 앞서 삽입된 심박수 데이터에 적용되므로 Google 피트니스는 이러한 데이터 포인트를 이 세션과 연결합니다.

세션에 대한 자세한 내용은 Users.sessions 리소스의 API 참조를 확인하세요.

6단계: 활동 세그먼트 만들기

활동 세그먼트는 세션 내에서 다양한 활동을 나타내는 데 도움이 됩니다. 활동 세그먼트는 단일 활동을 다루는 시간 세그먼트입니다. 예를 들어 사용자가 1시간 동안 달리는 경우 전체 시간 동안 running (8) 유형의 활동 세그먼트를 만들 수 있습니다. 사용자가 25분 동안 실행되고 5분 동안 휴식을 취하고 30분 더 실행되는 경우 각각 running, unknown, running 유형의 연속 활동 세그먼트를 3개 만들 수 있습니다.

활동 세그먼트를 생성하는 것은 다른 데이터 포인트를 추가하는 것과 같습니다. 활동 세그먼트를 만들려면 먼저 활동 세그먼트 데이터 소스를 만든 다음 데이터 세트를 만들고 여기에 활동 세그먼트 데이터 포인트를 추가합니다.

다음 예에서는 활동 세그먼트 데이터 소스를 이미 만들었고 데이터 소스 ID가 "raw:com.google.activity.Segment:1234567890:Example Fit:example-fit-hrm-1:123456"라고 가정할 때 심박수 측정과 동일한 기간에 세 개의 세그먼트 (실행, 휴식, 실행)를 만듭니다.

HTTP 메서드
캐치
리소스
https://www.googleapis.com/fitness/v1/users/me/dataSources/
raw:com.google.activity.segment:1234567890/datasets/1411053997000000000-1411057556000000000
요청 본문
{
"minStartTimeNs": 1411053997000000000,
"maxEndTimeNs": 1411057556000000000,
"dataSourceId":
  "raw:com.google.activity.segment:1234567890",
"point": [
{
  "startTimeNanos": 1411053997000000000,
  "endTimeNanos": 1411053997000000000,
  "dataTypeName": "com.google.activity.segment",
  "value": [
    {
      "intVal": 8
    }
  ]
},
{
  "startTimeNanos": 1411055000000000000,
  "endTimeNanos": 1411055000000000000,
  "dataTypeName": "com.google.activity.segment",
  "value": [
    {
      "intVal": 4
    }
  ]
},
{
  "startTimeNanos": 1411057556000000000,
  "endTimeNanos": 1411057556000000000,
  "dataTypeName": "com.google.activity.segment",
  "value": [
    {
      "intVal": 8
    }
  ]
}
]
}

이러한 활동 세그먼트 데이터 포인트는 활동 세그먼트를 처리하기 위해 특별히 만들어진 데이터 소스에 추가됩니다. 각 세그먼트 집합마다 새 데이터 소스를 만들 수 있지만 실행과 같은 특정 유형의 세션 전용 소스를 재사용해야 합니다.

세션은 활동 유형을 지정하며, 이는 사용자가 참여하는 전체 활동과 일치해야 합니다. 사용자가 달리는 동안 휴식을 취하더라도 전체 운동은 여전히 달리기입니다. 일반적으로 세션의 활동 유형은 주요 활동 세그먼트 유형과 일치합니다.

활동 유형 알 수 없음 (4)을 사용하면 사용자가 무엇을 하는지 알 수 없으므로 사용자가 쉬고 있음을 나타낼 수 있습니다. 사용자가 가만히 있거나 스트레칭하거나 물을 마시는 등의 활동을 할 수 있습니다. 사용자가 이동하지 않는 것을 안다면 여전히 (3)을 사용할 수 있습니다.

활동 유형의 자세한 목록은 활동 유형을 참고하세요.

요약

이 튜토리얼에서는 데이터 유형 및 활동 세그먼트에 대한 데이터 소스를 만들고, 피트니스 저장소에 데이터 포인트를 삽입하고, 운동 중에 발생하는 다양한 활동을 나타내는 활동 세그먼트를 만들었고, 전체 운동을 다루는 세션을 삽입했습니다.

Google 피트니스는 삽입된 데이터와 이 시간 간격 동안 사용 가능한 다른 데이터를 사용자의 운동을 나타내는 세션과 연결합니다.