Fleet Engine 시작하기

Fleet Engine 주문형 차량 공유 및 배송 API를 사용하면 이동을 관리할 수 있습니다. 이동 및 주문 진행률 애플리케이션에 사용합니다. Driver SDK, Consumer SDK, SDK 간의 트랜잭션을 처리합니다. - 백엔드 서비스로서, GKE API를 통해 gRPC 또는 REST 호출을 사용하세요

기본 요건

개발의 경우 Cloud Build를 설치하고 SDK (gcloud)를 설치하고 살펴보겠습니다

shell

gcloud auth login

다음과 같은 성공 메시지가 표시됩니다.

You are now logged in as [my-user@example.com].
Your current project is [project-id].  You ...

주문형 차량 공유 및 배송 솔루션 Fleet Engine API가 적절하게 구성되었는지 확인합니다.

shell

gcloud --project=project-id services enable fleetengine.googleapis.com

이 명령어로 인해 오류가 발생하면 프로젝트 관리자에게 문의하세요. Google 지원 담당자에게 문의하세요.

로깅

Fleet Engine은 수신하는 API 호출에 대한 로그 메시지를 작성할 수 있습니다. Google Cloud Platform 로그에 기록될 수 있습니다. Cloud Logging 문서를 참조하세요. 로그를 읽고 분석하는 방법에 관한 개요

이전에 만든 프로젝트의 경우 로깅이 기본적으로 사용 설정되지 않을 수 있습니다. 2022년 2월 10일. 자세한 내용은 로깅 문서 를 참조하세요.

클라이언트 라이브러리

Google은 여러 가지 공통 프로그래밍 언어로 클라이언트 라이브러리를 게시합니다. 이러한 라이브러리는 원시 REST 또는 gRPC보다 더 나은 개발자 환경을 제공하는 데 도움이 됩니다. 서버 애플리케이션에 대한 클라이언트 라이브러리를 가져오는 방법에 대한 지침은 보기 클라이언트 라이브러리.

이 문서의 Java 예시에서는 gRPC를 잘 알고 있어야 합니다.

인증 및 승인

이동 및 주문 진행률에서 제공하는 기능은 다음을 통해 구성할 수 있습니다. Google Cloud 콘솔을 사용하여 수행할 수 있습니다 이러한 API 및 SDK에는 서비스 계정을 사용하여 서명된 서비스 계정을 만들 수 있습니다 Cloud 콘솔

Cloud 프로젝트 설정

클라우드 프로젝트를 설정하려면 먼저 프로젝트를 만든 후 서비스 계정을 만듭니다

Google Cloud 프로젝트를 만들려면 다음 안내를 따르세요.

  1. Google Cloud 콘솔을 사용하여 Google Cloud 프로젝트를 만듭니다.
  2. API 및 서비스 대시보드를 사용하여 Local Rides and Deliveries API.

서비스 계정은 하나 이상의 역할과 연결됩니다. Kubernetes는 다음에 따라 다양한 권한 집합을 부여하는 JSON 웹 토큰입니다. 역할을 수행합니다 일반적으로 악용 가능성을 줄이기 위해 각각 필요한 최소한의 역할 집합이 있는 서비스 계정

이동 및 주문 진행 상황은 다음 역할을 사용합니다.

역할설명
Fleet Engine Consumer SDK 사용자

roles/fleetengine.consumerSdkUser
차량을 검색하고 정보를 가져올 수 있는 권한을 부여합니다. 정보를 얻을 수 있습니다. 이 API를 사용하여 서비스 계정에서 생성한 역할은 일반적으로 차량 공유 또는 배달 소비자 앱 휴대기기에서 사용됩니다.
Fleet Engine Driver SDK 사용자

roles/fleetengine.driverSdkUser
차량 위치 및 경로를 업데이트할 권한을 부여합니다. 차량 및 이동에 대한 정보를 검색할 수 있습니다. 생성된 토큰 서비스 계정의 역할은 일반적으로 차량 공유 또는 배달 기사 앱 휴대기기입니다.
Fleet Engine 주문형 관리자

roles/fleetengine.ondemandAdmin
모든 차량 및 여행 리소스에 대한 읽기 및 쓰기 권한을 부여합니다. 이 역할이 있는 주 구성원은 JWT를 사용할 필요가 없으며 대신 애플리케이션 기본 사용자 인증 정보를 사용합니다 커스텀 JWT 클레임은 무시됩니다. 이 역할은 신뢰할 수 있는 환경 (고객 백엔드)으로 제한해야 합니다.
FleetEngine 서비스 수퍼유저 **(지원 중단됨)**

roles/fleetengine.serviceSuperUser
모든 차량 및 여정 API에 대한 권한을 부여합니다. 발급된 토큰 일반적으로 백엔드에서 사용됩니다 있습니다 이 역할은 지원 중단되었습니다. 선호 대신 roles/fleetengine.ondemandAdmin하세요.

예를 들어 세 가지 역할 각각에 대해 서비스 계정을 만들고 각자 역할을 합니다

gcloud --project=project-id iam service-accounts create fleet-engine-consumer-sdk
gcloud projects add-iam-policy-binding project-id \
       --member=serviceAccount:fleet-engine-consumer-sdk@project-id.iam.gserviceaccount.com \
       --role=roles/fleetengine.consumerSdkUser

gcloud --project=project-id iam service-accounts create fleet-engine-driver-sdk
gcloud projects add-iam-policy-binding project-id \
       --member=serviceAccount:fleet-engine-driver-sdk@project-id.iam.gserviceaccount.com \
       --role=roles/fleetengine.driverSdkUser

gcloud --project=project-id iam service-accounts create fleet-engine-su
gcloud projects add-iam-policy-binding project-id \
       --member=serviceAccount:fleet-engine-su@project-id.iam.gserviceaccount.com \
       --role=roles/fleetengine.serviceSuperUser

드라이버 및 소비자 SDK는 이러한 표준 역할을 중심으로 빌드됩니다.

또는 커스텀 역할을 만들 수도 있는데, 함께 번들로 묶을 임의 권한 집합을 만듭니다. 드라이버 및 소비자 SDK는 필수 권한이 없습니다. 따라서 모든 광고를 게재할 것을 적극 권장합니다. 맞춤 역할을 사용하지 않고 위에 표시된 표준 역할을 사용해야 합니다.

편의상 신뢰할 수 없는 클라이언트를 위한 JWT 토큰을 생성해야 하는 경우 서비스 계정 토큰 생성자 역할에 할당된 사용자는 gcloud 명령줄 도구 사용

gcloud projects add-iam-policy-binding project-id \
       --member=user:my-user@example.com \
       --role=roles/iam.serviceAccountTokenCreator

여기서 my-user@example.com은 다음 작업에 사용되는 이메일입니다. gcloud (gcloud auth list --format='value(account)')로 인증합니다.

Fleet Engine 인증 라이브러리

Fleet Engine은 JSON 웹 토큰 (JWT)을 사용하여 Fleet Engine API 새로운 Fleet Engine 인증 라이브러리, GitHub에서 확인 가능 Fleet Engine JWT의 구성을 간소화하고 안전하게 서명합니다.

라이브러리의 이점은 다음과 같습니다.

  • Fleet Engine 토큰을 만드는 프로세스를 간소화합니다.
  • 인증 파일 사용 이외의 토큰 서명 메커니즘 (예: 사용할 수 있습니다)
  • 서명된 토큰을 gRPC 스텁 또는 GAPIC 클라이언트

승인을 위한 JSON 웹 토큰 (JWT) 만들기

Fleet Engine 인증 라이브러리를 사용하지 않는 경우 JSON 웹 토큰 (JWT)이 코드베이스 내에서 직접 작성됩니다. 이를 위해서는 JWT 및 Fleet Engine과의 관계에 대한 이해 그래서 우리는 Fleet Engine 인증 라이브러리를 활용하는 것이 좋습니다.

Fleet Engine 내에서 JSON 웹 토큰 (JWT)이 단기 인증을 제공함 기기가 특정 목적에 맞게 차량, 여행 또는 작업만 확인할 수 있습니다 JWT는 헤더와 클레임 섹션을 포함합니다. header 섹션에는 사용할 비공개 키 (서비스 계정에서 가져옴)와 암호화 알고리즘입니다. 소유권 주장 섹션에는 토큰의 생성 시간, 토큰의 TTL(수명), 액세스 권한 요청 및 범위를 좁히기 위한 기타 승인 정보 액세스 차량 ID를 예로 들 수 있습니다.

JWT 헤더 섹션에는 다음 필드가 포함됩니다.

필드설명
alg 사용할 알고리즘입니다. `RS256`
유형 토큰 유형입니다. `JWT`입니다.
어린이 서비스 계정의 비공개 키 ID입니다. 이 값은 서비스 계정 JSON 파일의 `private_key_id` 필드에 입력합니다. 올바른 수준의 권한을 가진 서비스 계정의 키를 사용해야 합니다.

JWT 클레임 섹션에는 다음 필드가 포함됩니다.

필드설명
iss 서비스 계정의 이메일 주소입니다.
sub 서비스 계정의 이메일 주소입니다.
aud 서비스 계정의 SERVICE_NAME(이 경우 https://fleetengine.googleapis.com/)
iat 토큰이 생성된 타임스탬프로 경과 시간(초)으로 지정됩니다. 1970년 1월 1일 00:00:00 UTC 이후부터 적용됩니다. 편향은 10분 동안 허용합니다. 만약 타임스탬프가 너무 먼 과거이거나 미래의 경우 서버에서 오류를 보고할 수 있습니다.
exp 토큰이 만료될 때의 타임스탬프로, 경과 시간(초)으로 지정됩니다. 1970년 1월 1일 00:00:00 UTC 이후부터 적용됩니다. 타임스탬프가 다음과 같은 경우 요청은 실패합니다. 표시됩니다.
승인 사용 사례에 따라 `vehicleid` 또는 `tripid`를 포함할 수 있습니다.

JWT 토큰을 만드는 것은 토큰을 서명하는 것을 의미합니다. 안내 및 코드 샘플 JWT 생성 및 서명에 대한 자세한 내용은 다음을 참조하세요. OAuth를 사용하지 않는 서비스 계정 승인. 그런 다음 서명된 토큰을 gRPC 호출이나 Fleet Engine에 액세스할 수 있습니다

JWT 클레임

JWT 페이로드를 만들 때 승인에 클레임을 추가합니다. 섹션(vehicleid 또는 tripid 키가 호출 중인 차량 ID 또는 이동 ID입니다.

Driver SDK는 항상 vehicleid 클레임을 사용합니다. 여행이나 차량을 예로 들 수 있죠. Fleet Engine 백엔드는 차량이 요청된 이동과 연결되어 있는지 확인합니다.

소비자 SDK는 항상 tripid 클레임을 사용합니다.

차량 공유 또는 배달 제공업체는 vehicleid 또는 tripid를 '*'와 함께 사용해야 합니다. ~ 모든 차량 및 경로와 일치합니다. JWT는 두 토큰을 모두 포함할 수 있지만 이를 통해 토큰 서명 구현이 간소화될 수 있습니다.

JWT 사용 사례

다음은 제공업체 서버의 토큰 예를 보여줍니다.

{
  "alg": "RS256",
  "typ": "JWT",
  "kid": "private_key_id_of_provider_service_account"
}
.
{
  "iss": "provider@yourgcpproject.iam.gserviceaccount.com",
  "sub": "provider@yourgcpproject.iam.gserviceaccount.com",
  "aud": "https://fleetengine.googleapis.com/",
  "iat": 1511900000,
  "exp": 1511903600,
  "authorization": {
     "vehicleid": "*",
     "tripid": "*"
   }
}

다음은 소비자 앱의 토큰 예입니다.

{
  "alg": "RS256",
  "typ": "JWT",
  "kid": "private_key_id_of_consumer_service_account"
}
.
{
  "iss": "consumer@yourgcpproject.iam.gserviceaccount.com",
  "sub": "consumer@yourgcpproject.iam.gserviceaccount.com",
  "aud": "https://fleetengine.googleapis.com/",
  "iat": 1511900000,
  "exp": 1511903600,
  "authorization": {
     "tripid": "trip_54321"
   }
}

다음은 드라이버 앱의 토큰 예시입니다.

{
  "alg": "RS256",
  "typ": "JWT",
  "kid": "private_key_id_of_driver_service_account"
}
.
{
  "iss": "driver@yourgcpproject.iam.gserviceaccount.com",
  "sub": "driver@yourgcpproject.iam.gserviceaccount.com",
  "aud": "https://fleetengine.googleapis.com/",
  "iat": 1511900000,
  "exp": 1511903600,
  "authorization": {
     "vehicleid": "driver_12345"
   }
}
  • 헤더의 kid 필드에 서비스 계정의 비공개 키를 지정합니다. 있습니다. 서비스의 private_key_id 필드에서 이 값을 찾을 수 있습니다. 계정 JSON 파일로 이동하겠습니다.
  • isssub 필드에 서비스 계정의 이메일 주소를 지정합니다. 서비스 계정의 client_email 필드에서 이 값을 찾을 수 있습니다. JSON 파일입니다.
  • aud 필드에 https://SERVICE_NAME/을 지정합니다.
  • iat 필드에는 토큰이 생성된 타임스탬프를 사용합니다. 1970년 1월 1일 00:00:00 UTC 이후 경과된 초로 지정됩니다. 편향은 10분 동안 허용합니다. 타임스탬프가 너무 먼 과거인 경우 향후 서버에서 오류를 보고할 수 있습니다.
  • exp 필드에는 토큰이 만료되는 타임스탬프를 사용합니다. 1970년 1월 1일 00:00:00 UTC 이후의 초로 지정됩니다. 최대 허용되는 값은 iat + 3600입니다.

휴대기기로 전달할 JWT에 서명할 때는 드라이버 또는 소비자 SDK 역할의 서비스 계정 그렇지 않으면 모바일 기기는 상태가 있어서는 안 되는 상태를 변경할 수 있습니다.

마찬가지로 권한 있는 호출에 사용할 JWT에 서명할 때는 수퍼 유저 역할로 서비스 계정을 사용할 수 있습니다. 그렇지 않으면 작업이 실패합니다

테스트용 JWT 생성

터미널에서 토큰을 생성하면 테스트 시 도움이 될 수 있습니다.

이 단계를 따르기 위해 사용자는 계정에 서비스 계정 토큰 생성자 역할이 있어야 합니다.

gcloud projects add-iam-policy-binding project-id \
       --member=user:my-user@example.com \
       --role=roles/iam.serviceAccountTokenCreator

아래 콘텐츠로 unsigned_token.json라는 새 파일을 만듭니다. iat 속성은 에포크 이후의 현재 시간(초)이며, 터미널에서 date +%s를 실행하여 가져온 것입니다. exp 속성은 에포크 후의 만료 시간(초)으로, 다음과 같이 계산할 수 있습니다. iat에 3600을 추가합니다. 만료 시간은 있습니다.

{
  "aud": "https://fleetengine.googleapis.com/",
  "iss": "super-user-service-account@project-id.iam.gserviceaccount.com",
  "sub": "super-user-service-account@project-id.iam.gserviceaccount.com",
  "iat": iat,
  "exp": exp,
  "authorization": {
     "vehicleid": "*",
     "tripid": "*"
   }
}

그런 다음 다음 gcloud 명령어를 실행하여 Super를 대신하여 토큰에 서명합니다. 사용자 서비스 계정:

gcloud beta iam service-accounts sign-jwt --iam-account=super-user-service-account@project-id.iam.gserviceaccount.com unsigned_token.json signed_token.jwt

서명된 Base64로 인코딩된 JWT가 이제 파일 내에 저장됩니다. signed_token.jwt 토큰은 다음 1시간 동안 유효합니다.

이제 차량 나열을 대상으로 curl 명령어를 실행하여 토큰을 테스트할 수 있습니다. REST 엔드포인트:

curl -X GET "https://fleetengine.googleapis.com/v1/providers/project-id/vehicles" -H "Authorization: Bearer $(cat signed_token.jwt)"

차량 및 수명 주기

차량은 운전자와 차량 쌍을 나타내는 항목입니다. 현재 운전자와 차량은 별도로 추적할 수 없습니다. 차량 공유 또는 배달 서비스 제공업체 는 제공자 ID를 사용하여 차량을 만듭니다. 이 ID는 서비스 계정이 포함된 Google Cloud 프로젝트의 프로젝트 ID Fleet Engine API 호출에 사용) 및 차량 공유 또는 배송업체 소유 차량 ID를 포함해야 합니다.

7일이 지나도 UpdateVehicle을(를) 통해 업데이트되지 않은 차량은 자동으로 삭제되며 할당된 이동(있는 경우)이 지정되지 않았습니다. 차량을 계속 사용할 수 있도록 하기 위해 권장되는 접근 방식 정기적으로 위치를 업데이트하는 것입니다 대부분 Vehicle 항목의 다른 필드도 수명을 연장합니다. 새 필드 값이 기존 값과 다릅니다.

참고: device_settings와 같은 Vehicle 항목의 일부 필드는 순전히 디버그입니다. 영구 스토리지에 저장됩니다 이를 업데이트해도 Vehicle 항목의 수명을 연장합니다.

CreateVehicle를 이미 존재하는 제공업체 ID/차량 ID 쌍입니다. 운송 수단의 경우 자주 업데이트되지 않는 문제는 두 가지 방법으로 처리할 수 있습니다. 필요한 제공업체 ID/차량 ID 쌍이 있는 CreateVehicle 및 삭제 차량이 이미 존재하는 경우 오류입니다. 또는CreateVehicle UpdateVehicleNOT_FOUND 오류와 함께 반환됩니다.

차량 위치 업데이트

Fleet Engine으로 최고의 성능을 얻으려면 차량 스트림을 제공하세요. 위치 업데이트. 이러한 업데이트를 제공하려면 다음 방법 중 하나를 사용하세요.

  1. 드라이버 SDK 사용 - Android, iOS -- 가장 간단한 옵션입니다.
  2. 맞춤 코드 사용 -- 백엔드를 통해 릴레이되거나, Android 또는 iOS를 탭합니다.

차량 유형

차량 항목에는 VehicleType의 필수 필드가 포함되어 있으며, 여기에는 Category enum으로, AUTO, TAXI, TRUCK, TWO_WHEELER, BICYCLE 또는 PEDESTRIAN입니다. 이동 수단 유형은 SearchVehiclesListVehicles의 필터링 기준

차량의 모든 경로에서는 RouteTravelMode 카테고리는 AUTO, TWO_WHEELER, BICYCLE 또는 PEDESTRIAN로 설정됩니다. 카테고리가 TAXI 또는 TRUCK로 설정된 경우 라우팅은 AUTO 모드

차량 속성

차량 항목에 VehicleAttribute의 반복되는 필드가 포함되어 있습니다. 이러한 Fleet Engine에서 해석하지 않습니다. SearchVehicles API에 일치하는 Vehicles에 모든 항목이 포함되어야 하는 필드가 포함되어 있습니다. 포함된 속성을 지정된 값으로 설정합니다.

속성 필드는 지원되는 다른 여러 필드와 추가적으로 사용됩니다. Vehicle 메시지에서(예: vehicle_type, supported_trip_types)

차량 남은 경유지

차량 항목에 반복되는 TripWaypoint 필드 (RPC | REST)가 포함되어 있습니다. waypoints(RPC | REST) 이 필드에는 이동의 나머지 경유지가 차량이 그들에게 도달합니다. Fleet Engine은 이동이 기록될 때 이 필드를 계산합니다. 차량에 할당되고 이동의 상태가 변경되면 업데이트합니다. 이러한 경유지는 TripId 필드와 WaypointType 필드로 식별할 수 있습니다.

차량의 일치 자격요건 확장

일반적으로 차량 공유 또는 배송 업체의 서비스는 이동을 일치시킬 책임이 있습니다. 요청을 전송합니다. 서비스는 차량 속성을 사용하여 더 많이 사용합니다. 예를 들어, 제공자는 Google에서 제공하는 혜택 또는 기능 등급에 따라 차량을 예로 들 수 있습니다. 예를 들어 3개 수준은 부울 값을 갖는 속성 집합일 수 있습니다. 값: is_bronze_level, is_silver_level, is_gold_level입니다. 차량 세 가지 모두에 해당될 수 있습니다 Fleet Engine에서 여정이 필요한 경우 검색에는 해당 차량이 포함됩니다. 이 방식으로 속성을 사용하면 다양한 종류의 기능을 제공합니다

차량 속성을 업데이트하는 방법에는 두 가지가 있습니다. 하나는 UpdateVehicle입니다. API에 액세스할 수 있습니다. 이 API를 사용하면 전체 차량 속성 집합이 값으로 설정합니다. 하나의 속성만 업데이트할 수는 없습니다. 다른 메서드는 UpdateVehicleAttributes API입니다. 이 방법은 업데이트할 속성입니다. 요청에 포함된 속성은 새로운 값으로 설정되거나 추가된 값 지정되지 않은 속성은 변경되지 않습니다.

방법: 차량 만들기

Fleet에서 추적할 각 차량에 대해 Vehicle 항목을 만들어야 합니다.

CreateVehicle 엔드포인트를 CreateVehicleRequest와 함께 사용하여 다음을 만듭니다. 차량.

Vehicleprovider_id는 프로젝트 ID여야 합니다. (예: my-on-demand-project)를 정의합니다. Fleet Engine을 호출하는 데 사용할 서비스 계정입니다. 참고로 여러 서비스 계정에서 동일한 차량 공유를 위해 Fleet Engine에 액세스할 수 있습니다. 서비스를 제공하는 경우 Fleet Engine은 현재 동일한 Vehicles에 액세스하는 여러 Google Cloud 프로젝트

VehicleOFFLINE 또는 ONLINE 상태로 만들 수 있습니다. 만약 생성일: ONLINE, SearchVehicles에 대한 응답으로 즉시 반환될 수 있습니다. 쿼리합니다.

첫 번째 last_locationCreateVehicle 호출에 포함될 수 있습니다. Vehicle는 허용되지만 ONLINE 상태에서 생성되어서는 안 됩니다. last_location

차량에 대한 자세한 내용은 차량 유형을 참고하세요. 유형 필드에 입력됩니다.

자세한 내용은 차량 속성을 참고하세요. 을 입력합니다.

CreateVehicle에서 반환된 값은 생성된 Vehicle 항목입니다.

shell

curl -X POST \
  "https://fleetengine.googleapis.com/v1/providers/project-id/vehicles?vehicleId=vid-8241890" \
  -H "Authorization: Bearer $JWT" \
  -H "Content-Type: application/json" \
  --data-binary @- << EOM
{
    "vehicleState": "OFFLINE",
    "supportedTripTypes": ["EXCLUSIVE"],
    "maximumCapacity": 4,
    "vehicleType": {"category": "AUTO"},
    "attributes": [{"key": "on_trip", "value": "false"}]
}
EOM

자세한 내용은 providers.vehicles.create 참조

자바

static final String PROJECT_ID = "project-id";

VehicleServiceBlockingStub vehicleService =
    VehicleService.newBlockingStub(channel);

String parent = "providers/" + PROJECT_ID;
Vehicle vehicle = Vehicle.newBuilder()
    .setVehicleState(VehicleState.OFFLINE)  // Initial state
    .addSupportedTripTypes(TripType.EXCLUSIVE)
    .setMaximumCapacity(4)
    .setVehicleType(VehicleType.newBuilder().setCategory(VehicleType.Category.AUTO))
    .addAttributes(VehicleAttribute.newBuilder()
        .setKey("on_trip").setValue("false"))  // Opaque to the Fleet Engine
    // Add .setBackToBackEnabled(true) to make this vehicle eligible for trip
    // matching while even if it is on a trip.  By default this is disabled.
    .build();

CreateVehicleRequest createVehicleRequest =
    CreateVehicleRequest.newBuilder()  // no need for the header
        .setParent(parent)
        .setVehicleId("vid-8241890")  // Vehicle ID assigned by Rideshare or Delivery Provider
        .setVehicle(vehicle)  // Initial state
        .build();

// In this case, the Vehicle is being created in the OFFLINE state and
// no initial position is being provided.  When the Driver App checks
// in with the Rideshare or Delivery Provider, the state can be set to ONLINE and
// the Driver App will update the Vehicle Location.

try {
  Vehicle createdVehicle =
      vehicleService.createVehicle(createVehicleRequest);
} catch (StatusRuntimeException e) {
  Status s = e.getStatus();
  switch (s.getCode()) {
    case ALREADY_EXISTS:
      break;
    case PERMISSION_DENIED:
      break;
  }
  return;
}
// If no Exception, Vehicle created successfully.

차량 생성을 위한 Google Cloud Platform 로그

Fleet Engine API는 CreateVehicle 엔드포인트 호출이 수신됩니다. 로그 항목에는 다음이 포함됩니다. CreateVehicle 요청의 값에 대한 정보 통화 실패하면 이전에 실행된 Vehicle에 관한 정보도 포함됩니다. 반환합니다.

shell

gcloud --project=project-id logging read --freshness=1h '
  jsonPayload.request.vehicleId="vid-8241890"
  jsonPayload.@type="type.googleapis.com/maps.fleetengine.v1.CreateVehicleLog"
'

다음과 유사한 레코드가 출력되어야 합니다.

---
insertId: c2cf4d3a180251c1bdb892137c14f022
jsonPayload:
  '@type': type.googleapis.com/maps.fleetengine.v1.CreateVehicleLog
  request:
    vehicle:
      attributes:
      - key: on_trip
        value: 'false'
      maximumCapacity: 4
      state: VEHICLE_STATE_OFFLINE
      supportedTrips:
      - EXCLUSIVE_TRIP
      vehicleType:
        vehicleCategory: AUTO
    vehicleId: vid-8241890
  response:
    attributes:
    - key: on_trip
      value: 'false'
    availableCapacity: 4
    currentRouteSegmentHandle: AdSiwAwCO9gZ7Pw5UZZimOXOo41cJTjg/r3SuwVPQmuuaV0sU3+3UCY+z53Cl9i6mWHLoCKbBt9Vsj5PMRgOJ8zX
    maximumCapacity: 4
    name: providers/project-id/vehicles/vid-8241890
    state: VEHICLE_STATE_OFFLINE
    supportedTrips:
    - EXCLUSIVE_TRIP
    vehicleType:
      vehicleCategory: AUTO
labels:
  vehicle_id: vid-8241890
logName: projects/project-id/logs/fleetengine.googleapis.com%2Fcreate_vehicle
receiveTimestamp: '2021-09-22T03:25:16.361159871Z'
resource:
  labels:
    location: global
    resource_container: projects/project-id
  type: fleetengine.googleapis.com/Fleet
timestamp: '2021-09-22T03:25:15.724998Z'

차량 생성을 위한 Cloud Pub/Sub 알림

Fleet Engine API는 새로운 차량을 만듭니다. 이러한 알림을 받으려면 여기에서 안내를 따르세요.

방법: 차량 위치 업데이트

Driver SDK를 사용하여 차량 위치를 업데이트하지 않는 경우 차량 위치가 포함된 Fleet Engine에 직접 호출을 보냅니다. 활성 차량의 경우 Fleet Engine의 위치 업데이트는 최소 1분마다 한 번 이상 필요합니다. 5초에 한 번 반복됩니다 이 업데이트에는 Fleet Engine Driver SDK 사용자만 필요합니다. 액세스할 수 있습니다

shell

curl -X PUT \
  "https://fleetengine.googleapis.com/v1/providers/project-id/vehicles/vid-8241890?updateMask=last_location" \
  -H "Authorization: Bearer $JWT" \
  -H "Content-Type: application/json" \
  --data-binary @- << EOM
{
    "supplementalLocation": {"latitude": 12.1, "longitude": 14.5},
    "supplementalLocationTime": "$(date -u --iso-8601=seconds)",
    "supplementalLocationSensor": "CUSTOMER_SUPPLIED_LOCATION",
    "supplementalLocationAccuracy": 15
}
EOM

자세한 내용은 providers.vehicles.update 참조

자바

static final String PROJECT_ID = "project-id";
static final String VEHICLE_ID = "vid-8241890";

VehicleServiceBlockingStub vehicleService = VehicleService.newBlockingStub(channel);

String vehicleName = "providers/" + PROJECT_ID + "/vehicles/" + VEHICLE_ID;
Vehicle updatedVehicle = Vehicle.newBuilder()
    .setLastLocation(VehicleLocation.newBuilder()
        .setSupplementalLocation(LatLng.newBuilder()
            .setLatitude(37.3382)
            .setLongitude(121.8863))
        .setSupplementalLocationTime(now())
        .setSupplementalLocationSensor(LocationSensor.CUSTOMER_SUPPLIED_LOCATION)
        .setSupplementalLocationAccuracy(DoubleValue.of(15.0)))  // Optional)
    .build();

UpdateVehicleRequest updateVehicleRequest = UpdateVehicleRequest.newBuilder()
    .setName(vehicleName)
    .setVehicle(updatedVehicle)
    .setUpdateMask(FieldMask.newBuilder()
        .addPaths("last_location"))
    .build();

try {
  Vehicle updatedVehicle =
      vehicleService.updateVehicle(updateVehicleRequest);
} catch (StatusRuntimeException e) {
  Status s = e.getStatus();
  switch (s.getCode()) {
    case NOT_FOUND:
      // Most implementations will call CreateVehicle in this case
      break;
    case PERMISSION_DENIED:
      break;
  }
  return;
}
// If no Exception, Vehicle updated successfully.

방법: 다른 차량 필드 업데이트

차량 상태의 다른 속성 업데이트는 다음 클래스보다 낮은 빈도로 발생합니다. 위치 업데이트. last_location 이외의 속성을 업데이트하려면 Fleet Engine 수퍼유저 권한입니다.

UpdateVehicleRequest에는 다음을 수행할 필드를 나타내는 update_mask가 포함되어 있습니다. 업데이트. 필드의 동작은 필드 마스크를 사용할 수도 있습니다

차량 속성에서 설명했듯이, attributes 필드에 보존하려면 모든 속성을 작성해야 합니다. 그것은 한 번에 하나의 키-값 쌍의 값만 UpdateVehicle 호출 특정 속성의 값을 업데이트하려면 UpdateVehicleAttributes API를 사용할 수 있습니다.

이 예시에서는 back_to_back를 사용 설정합니다.

shell

curl -X PUT \
  "https://fleetengine.googleapis.com/v1/providers/project-id/vehicles/vid-8241890?updateMask=vehicle_state,attributes,back_to_back_enabled" \
  -H "Authorization: Bearer $JWT" \
  -H "Content-Type: application/json" \
  --data-binary @- << EOM
{
    "vehicleState": "ONLINE",
    "attributes": [
      {"key": "on_trip", "value": "true"},
      {"key": "cash_only", "value": "false"}
    ],
    "backToBackEnabled": true
}
EOM

자세한 내용은 providers.vehicles.update 참조

자바

static final String PROJECT_ID = "project-id";
static final String VEHICLE_ID = "vid-8241890";

VehicleServiceBlockingStub vehicleService = VehicleService.newBlockingStub(channel);

String vehicleName = "providers/" + PROJECT_ID + "/vehicles/" + VEHICLE_ID;
Vehicle updatedVehicle = Vehicle.newBuilder()
    .setVehicleState(VehicleState.ONLINE)
    .addAllAttributes(ImmutableList.of(
        VehicleAttribute.newBuilder().setKey("on_trip").setValue("true").build(),
        VehicleAttribute.newBuilder().setKey("cash_only").setValue("false").build()))
    .setBackToBackEnabled(true)
    .build();

UpdateVehicleRequest updateVehicleRequest = UpdateVehicleRequest.newBuilder()
    .setName(vehicleName)
    .setVehicle(updatedVehicle)
    .setUpdateMask(FieldMask.newBuilder()
        .addPaths("vehicle_state")
        .addPaths("attributes")
        .addPaths("back_to_back_enabled"))
    .build();

// Attributes and vehicle state are being updated, so both are
// included in the field mask.  Note that of on_trip were
// not being updated, but rather cash_only was being changed,
// the desired value of "on_trip" would still need to be written
// as the attributes are completely replaced in an update operation.

try {
  Vehicle updatedVehicle =
      vehicleService.updateVehicle(updateVehicleRequest);
} catch (StatusRuntimeException e) {
  Status s = e.getStatus();
  switch (s.getCode()) {
    case NOT_FOUND:
      // Most implementations will call CreateVehicle in this case
      break;
    case PERMISSION_DENIED:
      break;
  }
  return;
}
// If no Exception, Vehicle updated successfully.

차량 업데이트용 Google Cloud Platform 로그

Fleet Engine API는 UpdateVehicle 엔드포인트 호출이 수신됩니다. 로그 항목에는 다음이 포함됩니다. UpdateVehicle 요청의 값에 대한 정보 통화 실패하면 이전에 실행된 Vehicle에 관한 정보도 포함됩니다. 반환합니다.

shell

gcloud --project=project-id logging read --freshness=1h '
  jsonPayload.request.vehicleId="vid-8241890"
  jsonPayload.@type="type.googleapis.com/maps.fleetengine.v1.UpdateVehicleLog"
'

차량 업데이트용 Cloud Pub/Sub 알림

Fleet Engine API는 기존에 존재하는 차량이 업데이트됩니다. 이러한 알림을 받으려면 여기에서 안내를 따르세요.

방법: 차량 검색

Fleet Engine은 차량 검색을 지원합니다. SearchVehicles API를 사용하면 다음과 같은 작업에 가장 적합한 근처 운전자를 찾을 수 있습니다. 서비스를 제공하기로 결정했습니다 SearchVehicles API는 작업 속성과 에 있는 차량의 속성과 일치하는 운전자 순위 목록 구축합니다 자세한 내용은 주변 운전자 찾기

이용 가능한 차량을 검색할 때 Fleet Engine은 기본적으로 설정되어 있지 않습니다. 차량 공유 또는 배송 제공업체의 서비스가 검색 요청에 명시적으로 포함합니다. 다음 예는 다음을 실행하는 방법을 보여줍니다. 그랜드 여행과 일치하는 차량을 검색할 때 해당 차량을 포함 인도네시아 이스트 몰에서 발라이 시당 자카르타 컨벤션 센터까지 왔습니다.

shell

먼저 이전 단계에서 만든 차량의 위치를 업데이트하여 자격 요건을 충족합니다. 실제로는 Driver SDK를 실행하여 이 작업을 수행합니다. 자동차의 Android 또는 iOS 기기에서 실행됩니다.

curl -X PUT \
  "https://fleetengine.googleapis.com/v1/providers/project-id/vehicles/vid-8241890?updateMask=last_location,attributes" \
  -H "Authorization: Bearer $JWT" \
  -H "Content-Type: application/json" \
  --data-binary @- << EOM
{
  "lastLocation": {
    "updateTime": "$( date -u +"%Y-%m-%dT%H:%M:%SZ" )",
    "location": {
      "latitude": "-6.195139",
      "longitude": "106.820826"
    }
  },
  "attributes": [{"key": "on_trip", "value": "false"}]
}
EOM

검색을 실행하면 최소한 해당 차량이 생성됩니다.

curl -X POST \
  "https://fleetengine.googleapis.com/v1/providers/project-id/vehicles:search" \
  -H "Authorization: Bearer $JWT" \
  -H "Content-Type: application/json" \
  --data-binary @- << EOM
{
  "pickupPoint": {
    "point": {"latitude": "-6.195139", "longitude": "106.820826"}
  },
  "dropoffPoint": {
    "point": {"latitude": "-6.1275", "longitude": "106.6537"}
  },
  "pickupRadiusMeters": 2000,
  "count": 10,
  "minimumCapacity": 2,
  "tripTypes": ["EXCLUSIVE"],
  "vehicleTypes": [{"category": "AUTO"}],
  "filter": "attributes.on_trip=\"false\"",
  "orderBy": "PICKUP_POINT_ETA",
  "includeBackToBack": true
}
EOM

자세한 내용은 providers.vehicles.search 참조

자바

static final String PROJECT_ID = "project-id";

VehicleServiceBlockingStub vehicleService = VehicleService.newBlockingStub(channel);

String parent = "providers/" + PROJECT_ID;
SearchVehiclesRequest searchVehiclesRequest = SearchVehiclesRequest.newBuilder()
    .setParent(parent)
    .setPickupPoint( // Grand Indonesia East Mall
        TerminalLocation.newBuilder().setPoint(
            LatLng.newBuilder().setLatitude(-6.195139).setLongitude(106.820826)))
    .setDropoffPoint( // Balai Sidang Jakarta Convention Center
        TerminalLocation.newBuilder().setPoint(
            LatLng.newBuilder().setLatitude(-6.213796).setLongitude(106.807195)))
    .setPickupRadiusMeters(2000)
    .setCount(10)
    .setMinimumCapacity(2)
    .addTripTypes(TripType.EXCLUSIVE)
    .addVehicleTypes(VehicleType.newBuilder().setCategory(VehicleType.Category.AUTO))
    .setFilter("attributes.on_trip=\"false\"")
    .setOrderBy(VehicleMatchOrder.PICKUP_POINT_ETA)
    .setIncludeBackToBack(true) // Fleet Engine includes vehicles that are en route.
    .build();

// Error handling
// If matches are returned and the authentication passed, the request completed
// successfully

try {
  SearchVehiclesResponse searchVehiclesResponse =
      vehicleService.searchVehicles(searchVehiclesRequest);

  // Search results: Each vehicle match contains a vehicle entity and information
  // about the distance and ETA to the pickup point and dropoff point.
  List<VehicleMatch> vehicleMatches = searchVehiclesResponse.getMatchesList();
} catch (StatusRuntimeException e) {
  Status s = e.getStatus();
  switch (s.getCode()) {
    case NOT_FOUND:
      break;
    case PERMISSION_DENIED:
      break;
  }
  return;
}

차량 필터링 쿼리

SearchVehiclesListVehicles는 차량 속성 필터링을 지원합니다. 결과를 필터링할 수 있습니다 필터 쿼리 구문은 다음을 참고하세요. 예를 보려면 AIP-160을 참고하세요.

필터 쿼리는 차량 속성에 대한 필터링만 지원합니다. 다른 필드에 사용할 수 없습니다. 필터 쿼리는 AND 절로 기능합니다. minimum_capacity 또는 vehicle_types와 같은 다른 제약 조건이 있는 경우 SearchVehiclesRequest

방법: 차량 나열

SearchVehicles은(는) 순위에 있는 소수의 차량을 찾는 데 최적화되어 있습니다. 주문하기에 가장 적당한 주변 운전기사를 찾는 데 주로 사용됩니다. 추가할 수 있습니다. 그러나 경우에 따라 특정 기준을 충족하는 모든 차량을 검색 기준을 적용할 수 있습니다. ListVehicles: 설계할 수 있습니다

ListVehicles API를 사용하면 특정 기준을 충족하는 모든 차량을 찾을 수 있습니다. 요청 옵션을 제공합니다. ListVehicles API는 몇 가지 요구사항을 충족하는 프로젝트를 작성할 수 있습니다

차량 속성을 필터링하려면 다음을 참고하세요. 차량 필터링 쿼리.

이 예에서는 다음을 사용하여 vehicle_type 및 속성을 필터링합니다. filter 문자열입니다.

shell

curl -X POST \
  "https://fleetengine.googleapis.com/v1/providers/project-id/vehicles:list" \
  -H "Authorization: Bearer $JWT" \
  -H "Content-Type: application/json" \
  --data-binary @- << EOM
{
  "vehicleTypes": [{"category": "AUTO"}],
  "filter": "attributes.on_trip=\"false\"",
}
EOM

자세한 내용은 providers.vehicles.list 참조

자바

static final String PROJECT_ID = "project-id";

VehicleServiceBlockingStub vehicleService = VehicleService.newBlockingStub(channel);

String parent = "providers/" + PROJECT_ID;
ListVehiclesRequest listVehiclesRequest = ListVehiclesRequest.newBuilder()
    .setParent(parent)
    .addTripTypes(TripType.EXCLUSIVE)
    .addVehicleTypes(VehicleType.newBuilder().setCategory(VehicleType.Category.AUTO))
    .setFilter("attributes.on_trip=\"false\"")
    .setIncludeBackToBack(true) // Fleet Engine includes vehicles that are en route.
    .build();

// Error handling
// If matches are returned and the authentication passed, the request completed
// successfully

try {
  ListVehiclesResponse listVehiclesResponse =
      vehicleService.listVehicles(listVehiclesRequest);
} catch (StatusRuntimeException e) {
  Status s = e.getStatus();
  switch (s.getCode()) {
    case NOT_FOUND:
      break;
    case PERMISSION_DENIED:
      break;
  }
  return;
}

이동 및 경로의 수명 주기

Trip API와 수명 주기는 차량 API 및 수명 주기와 유사합니다. 차량 공유 제공업체는 Fleet Engine을 사용하여 이동을 만들어야 합니다. 인터페이스에 추가되었습니다. Fleet Engine은 RPC 서비스와 TripService REST 리소스 provider.trips . 이러한 인터페이스를 통해 여행 항목 생성, 정보 요청, 검색 업데이트 기능을 제공합니다

Trip에는 수명 주기 동안 진행 상황을 추적하는 상태 필드가 있습니다. 값이 NEW에서 COMPLETE, CANCELEDUNKNOWN_TRIP_STATUS로 이동합니다. . RPC의 경우 trip_status 참조 또는 REST의 TripStatus를 참고하세요.

  • NEW
  • ENROUTE_TO_PICKUP
  • ARRIVED_AT_PICKUP
  • ENROUTE_TO_INTERMEDIATE_DESTINATION
  • ARRIVED_AT_INTERMEDIATE_DESTINATION
  • ENROUTE_TO_DROPOFF
  • COMPLETE

서비스에서 CANCELED(으)로의 이동을 다음 상태 중 하나에서 업데이트할 수 있습니다. 서비스에서 이동을 만들면 엔진이 상태를 NEW로 설정합니다. 가 vehicle_id는 선택사항입니다. 차량과 마찬가지로 서비스에서 할당되지 않은 이동을 자동으로 삭제합니다. 7일이 지나도 업데이트되지 않을 수 있습니다. 서비스에서 이미 존재하는 ID인 경우 오류가 반환됩니다. 다음과 같은 경우 이동이 '활성' 상태로 간주됩니다. COMPLETE 또는 CANCELED 상태가 아닙니다. 이러한 차이점은 차량 항목의 active_trips 필드 및 SearchTripsRequest에서 중요합니다.

이동 시 서비스에서는 이동에 할당된 vehicle_id만 변경할 수 있습니다. 이(가) 활성화되었습니다. 예를 들어 운전자가 목적지에 도착하는 동안 여정을 취소하는 경우 이동이 다른 차량에 재할당됩니다.

연달아 재생되는 광고를 구현할 때는 도움이 될 수 있습니다. 이 지원을 통해 제공업체가 새 이동을 차량에 할당할 수 있습니다. 알림을 받을 수 있습니다. 코드 는 단일 이동과 동일하며 동일한 차량 ID입니다. Fleet Engine은 새 이동의 출발지와 목적지를 차량의 경유지를 설정합니다. 연달아 여행에 대한 자세한 내용은 다음을 참조하세요. 다목적 경유지 경로 만들기

남은 경유지 경로

이동 항목에 반복되는 TripWaypoint (RPC | REST) 필드가 포함되어 있습니다. remainingWaypoints(RPC | REST)를 호출합니다. 이 필드에는 차량이 순서대로 이동해야 하는 모든 경유지가 포함됩니다. 0번을 클릭하기만 하면 됩니다. 이 함수는 차량의 나머지 경유지. 연달아 이동 및 카풀 사용 사례에서 이 목록에는 이 이동 전에 통과할 다른 이동(경유지 제외) 확인할 수 있습니다. 목록의 경유지는 TripId로 식별할 수 있습니다. 및 WaypointType.

이동 상태와 차량 남은 경유지 사이의 관계

차량의 나머지 경유지 (RPC | REST)는 Fleet Engine이 이동 상태 변경 요청을 수신하면 업데이트됩니다. 이 차량의 나머지 경유지 목록에서 이전 경유지가 삭제됩니다. tripStatus(RPC | REST) 이(가) 다른 상태에서 ENROUTE_TO_XXX(으)로 변경됩니다. 즉, 이동 상태가 ENROUTE_TO_PICKUP에서 이동의 ARRIVED_AT_PICKUP으로 승차 지점이 차량의 나머지 경유지 목록에 남아 있지만 이동 시 상태가 ENROUTE_TO_INTERMEDIATE_DESTINATION 또는 ENROUTE_TO_DROPOFF로 변경되면 그러면 승차 지점이 차량의 나머지 경유지에서 제거됩니다.

ARRIVED_AT_INTERMEDIATE_DESTINATION 및 ENROUTE_TO_INTERMDEDIATE_DESTINATION. ARRIVED_AT_INTERMEDIATE_DESTINATION일 때, 현재의 중간 목적지는 차량의 나머지 경유지 목록이 있어야 합니다.

이동 상태가 COMPLETED(으)로 변경되면 이 이동의 경유지가 없어집니다. 차량의 나머지 경유지 목록에 있습니다.

방법: 여행 만들기

각 이동 요청을 추적하고 추적하려면 Trip 항목을 만들어야 합니다. 차량에 연결할 수 있습니다 CreateTripRequest와 함께 CreateTrip 엔드포인트 사용 을 클릭하여 여행을 만듭니다.

이동을 만들려면 다음 속성이 필요합니다.

  • parent - Google 검색 결과 생성 시 생성된 제공업체 ID를 포함하는 문자열입니다. Cloud 프로젝트를 만들었습니다.
  • trip_id - 차량 공유 제공업체에서 생성한 문자열입니다.
  • trip - 경로를 설명하는 기본 메타데이터가 포함된 컨테이너입니다.
    • trip_type - 경로에 다른 탑승자가 있는지 여부를 나타내는 열거형입니다. 동일한 차량 (SHARED)의 다른 출발지 및 목적지에서 출발 또는 단일 당사자만 (EXCLUSIVE)으로 설정할 수 있습니다.
    • pickup_point - 출발지를 나타내는 TerminalLocation입니다. 있습니다. RPC 참조를 확인하세요. 또는 REST 참조

경로를 만들 때 number_of_passengers, dropoff_point을 제공할 수 있습니다. 및 vehicle_id 이러한 입력란은 필수는 아니지만 제공할 경우 그대로 유지됩니다 다른 모든 이동 필드는 무시됩니다. 예를 들어 모든 이동은 다음과 같은 trip_status를 전달하더라도 NEWtrip_status로 시작합니다. CANCELED를 반환합니다.

다음 예에서는 Grand Indonesia 이스트 몰에 대한 여행을 만듭니다. 여행 탑승자 2명 기준이며 전용입니다. Tripprovider_id는 다음과 같아야 합니다. 프로젝트 ID와 동일합니다. 이 예에서 차량 공유 제공업체는 Google Cloud 프로젝트, project-id. 이 프로젝트에는 Fleet Engine을 호출하는 데 사용되는 서비스 계정입니다. 이동 상태는 NEW입니다.

나중에 서비스가 차량과 여정을 일치시키면 서비스가 UpdateTrip하고 이동이 차량에 할당될 때 vehicle_id를 변경합니다.

shell

curl -X POST \
  "https://fleetengine.googleapis.com/v1/providers/project-id/trips?tripId=tid-1f97" \
  -H "Authorization: Bearer $JWT" \
  -H "Content-Type: application/json" \
  --data-binary @- << EOM
{
  "tripType": "EXCLUSIVE",
  "numberOfPassengers": 2,
  "pickupPoint": {
    "point": {"latitude": "-6.195139", "longitude": "106.820826"}
  },
  "dropoffPoint": {
    "point": {"latitude": "-6.1275", "longitude": "106.6537"}
  }
}
EOM

자세한 내용은 providers.trips.create 참조

자바

static final String PROJECT_ID = "project-id";

TripServiceBlockingStub tripService = TripService.newBlockingStub(channel);

String parent = "providers/" + PROJECT_ID;
Trip trip = Trip.newBuilder()
    .setTripType(TripType.EXCLUSIVE) // Use TripType.SHARED for carpooling
    .setPickupPoint(                 // Grand Indonesia East Mall
        TerminalLocation.newBuilder().setPoint(
            LatLng.newBuilder().setLatitude(-6.195139).setLongitude(106.820826)))
    // Provide the number of passengers if available.
    .setNumberOfPassengers(2)
    // Provide the drop-off point if available.
    .setDropoffPoint(
        TerminalLocation.newBuilder().setPoint(
            LatLng.newBuilder().setLatitude(-6.1275).setLongitude(106.6537)))
    .build();

CreateTripRequest createTripRequest =
    CreateTripRequest.newBuilder()  // no need for the header
        .setParent(parent)
        .setTripId("tid-1f97")  // Trip ID assigned by the Provider
        .setTrip(trip)              // Initial state
        .build();

// Error handling
// If Fleet Engine does not have trip with that id and the credentials of the
// requestor pass, the service creates the trip successfully.

try {
  Trip createdTrip =
      tripService.createTrip(createTripRequest);
} catch (StatusRuntimeException e) {
  Status s = e.getStatus();
  switch (s.getCode()) {
    case ALREADY_EXISTS:
      break;
    case PERMISSION_DENIED:
      break;
  }
  return;
}

경로 생성을 위한 Google Cloud Platform 로그

Fleet Engine API는 CreateTrip 엔드포인트 호출이 수신됩니다. 로그 항목에는 다음이 포함됩니다. CreateTrip 요청의 값에 대한 정보 통화 성공하면 반환된 Trip에 관한 정보도 포함됩니다.

방법: 경로 업데이트하기

이동 항목에는 서비스에 의한 추적을 사용 설정하는 필드 및 그리고 Driver SDK에 의한 이동 진행 상황을 보고하기 위해 소비자 SDK 속성을 업데이트하려면 UpdateTripRequest를 사용합니다. 메시지가 표시됩니다. 이렇게 하면 요청의 field_mask에 따라 이동 필드가 업데이트됩니다. UpdateTripRequest를 참고하세요.

차량 공유 제공업체는 다음 속성을 업데이트해야 합니다.

  • 이동 상태
  • 차량 ID. 차량을 만들 때 또는 차량을 있습니다.
  • 승차, 하차 또는 경유지 변경

Fleet Engine은 Driver SDK 또는 Consumer SDK를 통한 여정 공유 기능:

  • 경로
  • 도착예정시간
  • 남은 거리
  • 차량 위치
  • 나머지 경유지

RPC에서 Trip 참조 또는 REST의 Resource.Trip.

이동 업데이트의 Google Cloud Platform 로그

Fleet Engine API는 UpdateTrip 엔드포인트 호출이 수신됩니다. 로그 항목에는 다음이 포함됩니다. UpdateTrip 요청의 값에 대한 정보 호출이 성공하면 반환된 Trip에 관한 정보도 포함됩니다.

방법: 경로 검색

Fleet Engine은 경로 검색을 지원합니다. 앞서 언급했듯이 이동은 7일 후 자동으로 삭제되므로 SearchTrips은(는) 삭제되지 않습니다. 모든 이동의 전체 기록을 노출합니다.

SearchTrips는 유연한 API이지만 아래 목록은 두 가지 사용 사례를 고려합니다.

  • 차량의 활성 이동 확인: 제공자는 차량의 현재 진행 중인 이동을 확인할 수 있습니다. SearchTripsRequest 내에서 vehicle_id이(가) 고려 중인 차량으로 설정되며 active_trips_only true로 설정해야 합니다.

  • 제공업체 및 Fleet Engine 상태 조정 -- 제공업체는 사용할 수 있는 SearchTrips하여 이동 상태와 Fleet Engine의 상태가 일치하도록 합니다. 이는 특히 TripStatus에 중요합니다. 할당된 이동의 상태가 COMPLETE 또는 CANCELED로 제대로 설정되지 않은 경우 SearchVehicles에 포함되어 있지 않습니다.

이러한 방식으로 SearchTrips를 사용하려면 vehicle_id를 비워두고 active_trips_only를 설정하세요. true로 설정하고 minimum_staleness을 대부분의 이동 기간보다 긴 시간으로 설정합니다. 예를 들어 1시간을 사용할 수 있습니다. 결과에는 COMPLETE 또는 CANCELED 상태가 되고, 1시간 넘게 업데이트되지 않았습니다. 제공업체 이동을 검토하여 Fleet Engine에서 상태가 제대로 업데이트되었습니다.

문제 해결

DEADLINE_EXCEEDED 오류가 발생하면 Fleet Engine의 상태가 다음과 같습니다. 알 수 없습니다. 제공자는 CreateTrip를 다시 호출해야 합니다. 이 메서드는 201 (생성됨) 또는 409 (충돌). 후자의 경우 이전 요청은 성공적으로 실행됨 DEADLINE_EXCEEDED 이전 자세한 내용은 Consumer API 가이드를 참고하세요. 경로 오류 처리에 대한 정보: Android 또는 iOS일 수 있습니다.

카풀 탑승 지원

TripType.SHARED를 지원하는 차량에 SHARED 이동을 여러 번 할당할 수 있습니다. 다음에 할당된 모든 이동에서 통과하지 못한 경유지의 순서를 지정해야 합니다. 다음을 할당할 때 Trip.vehicle_waypoints을(를) 통해 이 공유 차량에 있는 차량에 공유 여행의 경우 vehicle_id (CreateTrip 또는 UpdateTrip 요청) RPC의 경우 vehicle_waypoints 참조 또는 REST의 경우 vehicleWaypoints.

여러 대상 지원

중간 대상 식별

intermediateDestinations 필드 및 intermediateDestinationIndex 필드 이동 내 (RPC | REST) 도착지를 나타내는 데 사용됩니다.

중간 대상 업데이트

UpdateTrip를 통해 중간 대상을 업데이트할 수 있습니다. 업데이트 시 중간 대상의 경우 중간 대상의 전체 목록을 제공해야 합니다. 여기에는 새로 방문한 페이지뿐만 아니라 있습니다. intermediateDestinationIndex가 새로 추가/수정된 중간 대상, 신규/업데이트된 중간 대상 목적지는 차량의 waypoints 또는 경로의 remainingWaypoints에 추가되지 않습니다. intermediateDestinationIndex 이전의 모든 중간 도착 페이지가 이미 방문한 것으로 처리됩니다.

이동 상태 변경사항

(RPC | REST)의 intermediateDestinationsVersion 필드 Fleet Engine에 전송된 이동 상태 업데이트 요청에 중간 대상이 통과한 경우입니다 타겟팅된 중간 대상 intermediateDestinationIndex 필드를 통해 지정됩니다. tripStatus (RPC | REST)이 ENROUTE_TO_INTERMEDIATE_DESTINATION인 경우 [0..N-1] 은 차량이 다음으로 교차할 중간 목적지를 나타냅니다. tripStatus이 ARRIVED_AT_INTERMEDIATE_DESTINATION인 경우 [0..N-1] 은 차량이 위치한 중간 목적지를 나타냅니다.

다음 코드 예에서는 이동 상태를 '배송 중'으로 업데이트하는 방법을 보여줍니다. 첫 번째 중간 목적지에 여정이 승차 지점을 통과한 경우

자바

static final String PROJECT_ID = "project-id";
static final String TRIP_ID = "multi-destination-trip-A";

String tripName = "providers/" + PROJECT_ID + "/trips/" + TRIP_ID;
Trip trip = …; // Fetch trip object from FleetEngine or your storage.

TripServiceBlockingStub tripService = TripService.newBlockingStub(channel);

// Trip settings to update.
Trip trip = Trip.newBuilder()
    // Trip status cannot go back to a previous status once it is passed
    .setTripStatus(TripStatus.ENROUTE_TO_INTERMEDIATE_DESTINATION)
    // Enrouting to the first intermediate destination.
    .setIntermediateDestinationIndex(0)
    // intermediate_destinations_version MUST be provided to ensure you
    // have the same picture on intermediate destinations list as FleetEngine has.
    .setIntermediateDestinationsVersion(
        trip.getIntermediateDestinationsVersion())
    .build();

// Trip update request
UpdateTripRequest updateTripRequest =
    UpdateTripRequest.newBuilder()
        .setName(tripName)
        .setTrip(trip)
        .setUpdateMask(
            FieldMask.newBuilder()
                .addPaths("trip_status")
                .addPaths("intermediate_destination_index")
                // intermediate_destinations_version must not be in the
                // update mask.
                .build())
        .build();

// Error handling
try {
  Trip updatedTrip = tripService.updateTrip(updateTripRequest);
} catch (StatusRuntimeException e) {
  Status s = e.getStatus();
  switch (s.getCode()) {
    case NOT_FOUND:  // Trip does not exist.
      break;
    case FAILED_PRECONDITION:  // The given trip status is invalid, or the
                                // intermediate_destinations_version
                                // doesn’t match FleetEngine’s.
      break;
    case PERMISSION_DENIED:
      break;
  }
  return;
}

방법: Fleet Engine API에서 알림 메시지 구독

Fleet Engine API는 Google Cloud Pub/Sub를 사용합니다. 소비자 Google Cloud에서 만든 주제에 대한 알림을 게시할 수 있습니다. Project(프로젝트) Google Cloud의 Fleet Engine에는 Pub/Sub가 기본적으로 사용 설정되지 않았습니다. 살펴보겠습니다 지원 케이스를 제출하거나 고객 엔지니어에게 문의하여 Pub/Sub를 사용 설정하세요.

Cloud 프로젝트에서 주제를 만들려면 이 안내를 따르세요. 주제 ID는 'fleet_engine_notifications'여야 합니다.

주제는 Fleet Engine을 호출하는 동일한 Cloud 프로젝트에서 만들어야 합니다. API에 액세스할 수 있습니다

주제가 생성되면 Fleet Engine API에 권한을 부여해야 합니다. 주제에 게시할 수 있는 권한이 있어야 합니다. 원하는 주제를 클릭하여 새 권한을 추가할 수 있습니다. 정보 패널 표시를 클릭하여 권한 편집기를 열어야 할 수도 있습니다. 주 구성원은 geo-fleet-engine@system.gserviceaccount.com이어야 합니다. 역할은 Pub/Sub publisher여야 합니다.

알림을 구독하도록 Cloud 프로젝트를 설정하려면 이 안내를 따르세요.

Fleet Engine API에서 각 알림을 2가지 데이터로 게시합니다. 형식, protobufjson입니다. 각 알림의 데이터 형식은 PubsubMessage 속성 (키는 data_format, 값은 protobuf 또는 json)

알림 스키마:

Protobuf

// A batch of notifications that is published by the Fleet Engine service using
// Cloud Pub/Sub in a single PubsubMessage.
message BatchNotification {
  // Required. At least one notification must exist.
  // List of notifications containing information related to changes in
  // Fleet Engine data.
  repeated Notification notifications = 1;
}

// A notification related to changes in Fleet Engine data.
// The data provides additional information specific to the type of the
// notification.
message Notification {
  // Required. At least one type must exist.
  // Type of notification.
  oneof type {
    // Notification related to changes in vehicle data.
    VehicleNotification vehicle_notification = 1;
  }
}

// Notification sent when a new vehicle was created.
message CreateVehicleNotification {
  // Required.
  // Vehicle must contain all fields that were set when it was created.
  Vehicle vehicle = 1;
}

// Notification sent when an existing vehicle is updated.
message UpdateVehicleNotification {
  // Required.
  // Vehicle must only contain name and fields that are present in the
  // field_mask field below.
  Vehicle vehicle = 1;

  // Required.
  // Contains vehicle field paths that were specifically requested
  // by the Provider.
  google.protobuf.FieldMask field_mask = 2;
}

// Notification related to changes in vehicle data.
message VehicleNotification {
  // Required. At least one type must be set.
  // Type of notification.
  oneof type {
    // Notification sent when a new vehicle was created.
    CreateVehicleNotification create_notification = 1;
    // Notification sent when an existing vehicle is updated.
    UpdateVehicleNotification update_notification = 2;
  }
}

JSON

BatchNotification: {
  "description": "A batch of notifications that is published by the Fleet Engine service using Cloud Pub/Sub in a single PubsubMessage.",
  "type": "object",
  "required": ["notifications"],
  "properties": {
    "notifications": {
      "description": "At least one notification must exist. List of notifications containing information related to changes in Fleet Engine data.",
      "type": "Notification[]"
    }
  }
}

Notification: {
  "description": "A notification related to changes in Fleet Engine data. The data provides additional information specific to the type of the notification.",
  "type": "object",
  "properties": {
    "vehicleNotification": {
      "description": "Notification related to changes in vehicle data.",
      "type": "VehicleNotification"
    }
  }
}

VehicleNotification: {
  "description": "Notification related to changes in vehicle data.",
  "type": "object",
  "properties": {
    "createNotification": {
      "description": "Notification sent when a new vehicle was created.",
      "type": "CreateVehicleNotification"
    },
    "updateNotification": {
      "description": "Notification sent when an existing vehicle is updated.",
      "type": "UpdateVehicleNotification"
    }
  }
}

CreateVehicleNotification: {
  "description": "Notification sent when a new vehicle was created.",
  "type": "object",
  "required": ["vehicle"],
  "properties": {
    "vehicle": {
      "description": "Vehicle must contain all fields that were set when it was created.",
      "type": "Vehicle"
    }
  }
}

UpdateVehicleNotification: {
  "description": "Notification sent when an existing vehicle is updated.",
  "type": "object",
  "required": ["vehicle", "fieldMask"],
  "properties": {
    "vehicle": {
      "description": "Vehicle must only contain name and fields that are present in the fieldMask field below.",
      "type": "Vehicle"
    },
    "fieldMask": {
      "description": "Contains vehicle field paths that were specifically requested by the Provider.",
      "type": "FieldMask"
    }
  }
}