이동 업데이트 및 상태 관리

이 문서에서는 경로를 업데이트하고 상태를 관리하는 방법을 설명합니다. 여기에는 필드 마스크를 사용하여 경로와 관련된 필드를 설정하는 작업이 포함됩니다. 이 사이트에 설명된 대로 Fleet Engine을 설정했으며 이동에 할당된 차량으로 작업하고 있다고 가정합니다.

경로 업데이트 기본사항

시스템은 다음과 같은 상황에서 Fleet Engine을 사용하여 이동을 업데이트합니다.

  • 차량이 생성된 후 이동에 차량을 할당할 때
  • 이동 상태가 변경되는 경우(예: 차량이 중간 지점을 통과하는 경우)
  • 승객 수 및 하차 지점과 같은 경로 필드를 업데이트할 때

이동을 업데이트하려면 gRPC 또는 REST를 사용하여 요청을 전송합니다.

  • UpdateTrip() 메서드: gRPC 또는 REST
  • UpdateTripRequest 메시지: gRPC만 해당

Fleet Engine: 서비스 계정 역할에 설명된 대로 프로젝트의 서비스 계정에 적절한 사용자 인증 정보를 사용합니다.

이동 경로 필드 업데이트

단일 목적지 경로 만들기경로 필드에 설명된 경로 필드를 업데이트할 수 있습니다. 예를 들어 이동을 만든 후에는 먼저 차량을 찾은 다음 이동 vehicle_id 필드를 업데이트하여 이동을 실행할 차량과 연결하는 것이 일반적입니다.

필드 마스크 사용

필드 마스크는 API 호출자가 요청에서 업데이트해야 하는 필드를 나열하는 방법입니다. FieldMask를 사용하면 불필요한 작업을 방지하고 성능을 개선할 수 있습니다. Fleet Engine은 모든 리소스에서 필드를 업데이트하는 데 필드 마스크를 사용합니다.

차량 ID로 이동 업데이트

Fleet Engine이 경로를 따라 차량을 추적할 수 있도록 차량 ID로 이동을 구성해야 합니다. 다음 코드 샘플은 차량 ID로 이동을 업데이트하는 방법을 보여줍니다.

static final String PROJECT_ID = "my-rideshare-co-gcp-project";
static final String TRIP_ID = "trip-8241890";

String tripName = "providers/" + PROJECT_ID + "/trips/" + TRIP_ID;

TripServiceBlockingStub tripService = TripService.newBlockingStub(channel);

// The trip settings to update.
Trip trip = Trip.newBuilder()
    .setVehicleId("8241890")
    .build();

// The trip update request.
UpdateTripRequest updateTripRequest =
    UpdateTripRequest.newBuilder()      // No need for the header.
        .setName(tripName)
        .setTrip(trip)
        .setUpdateMask(FieldMask.newBuilder().addPaths("vehicle_id"))
        .build();

// Error handling.
// If the Fleet Engine has both a trip and vehicle with IDs, and if the
// credentials validate, then the service updates the trip.
try {
  Trip updatedTrip = tripService.updateTrip(updateTripRequest);
} catch (StatusRuntimeException e) {
  Status s = e.getStatus();
  switch (s.getCode()) {
    case NOT_FOUND:                    // Neither the trip nor vehicle exist.
      break;
    case PERMISSION_DENIED:
      break;
  }
  return;
}

이동의 이동 상태 관리

TripStatus 열거형 값 중 하나를 사용하여 이동 상태를 지정합니다. 이동 상태가 변경되면(예: ENROUTE_TO_PICKUP에서 ARRIVED_AT_PICKUP으로) Fleet Engine에서 이동 상태를 업데이트합니다. 이동 수명 주기는 항상 상태 값 NEW로 시작하고 COMPLETE 또는 CANCELED 값으로 끝납니다.

이동 업데이트 예시

다음은 Fleet Engine에서 연달아 발생한 이동의 이동 상태를 업데이트하는 방법을 보여줍니다.

static final String PROJECT_ID = "my-rideshare-co-gcp-project";
static final String TRIP_ID = "trip-8241890";

String tripName = "providers/" + PROJECT_ID + "/trips/" + TRIP_ID;

TripServiceBlockingStub tripService = TripService.newBlockingStub(channel);

// Trip settings to be updated.
Trip trip = Trip.newBuilder()
    .setTripStatus(TripStatus.ARRIVED_AT_PICKUP)
    .build();

// Trip update request
UpdateTripRequest updateTripRequest = UpdateTripRequest.newBuilder()
    .setName(tripName)
    .setTrip(trip)
    .setUpdateMask(FieldMask.newBuilder().addPaths("trip_status"))
    .build();

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

기타 이동 유형 섹션에서 이동을 업데이트하는 다른 예시를 확인할 수 있습니다.

이동 오류 처리

기존 이동 경로를 업데이트하거나 찾을 때 DEADLINE_EXCEEDED 오류가 발생할 수 있으며, 이 경우 Fleet Engine의 상태를 알 수 없습니다. 이를 조사하려면 먼저 업데이트하거나 모니터링하려는 것과 동일한 이동 ID를 사용하여 CreateTrip를 다시 호출합니다. 그러면 201 (CREATED) 또는 409 (CONFLICT)가 반환됩니다. 후자의 경우 이전 요청이 DEADLINE_EXCEEDED 전에 성공했습니다.

Android 또는 iOS용 소비자 SDK의 네트워크 오류 목록을 참고하세요.

다음 단계