Criar e exibir viagens em sequência

Viagens de ida e volta são viagens exclusivas e independentes que ocorrem uma após a outra, em que o motorista se compromete a buscar o próximo consumidor antes de concluir a viagem atual.

A principal diferença entre uma viagem de ida e volta e uma de destino único é que, em uma viagem de ida e volta, o operador pode atribuir uma viagem a um veículo que já tenha sido atribuído a elas.

Este tutorial orienta você no processo de criação de uma viagem de ida e volta. Ele também mostra como você pode integrar essa viagem ao seu aplicativo para o consumidor, de modo que os clientes possam visualizar o andamento da viagem em seus celulares. Você faz essa integração usando o SDK do consumidor.

Pré-requisitos

Para concluir este tutorial, faça o seguinte:

  1. Configure a frota de veículos. Para mais informações, consulte Mecanismo de frota: configuração inicial.

  2. Integre seu app com o SDK do driver. Para mais informações, consulte Como inicializar o SDK do driver para Android e Guia de integração para o SDK do driver para iOS.

  3. Integre seu app para o consumidor com o SDK do consumidor. Para mais informações, consulte Primeiros passos com o SDK do consumidor para Android e Primeiros passos com o SDK do consumidor para iOS.

  4. Configure os tokens de autorização. Para mais informações sobre tokens de autorização, consulte Como criar um JSON Web Token para autorização no guia "Introdução ao Fleet Engine" e Autenticação e autorização na documentação do SDK do consumidor para o Fleet Engine.

Etapa 1. Criar um veículo no Fleet Engine

Os veículos são objetos que representam os veículos da sua frota. Você precisa criar no Fleet Engine para rastrear no app do consumidor.

Você pode criar um veículo usando uma das duas abordagens a seguir:

gRPC
Ligue para o CreateVehicle() com o método CreateVehicleRequest com a mensagem de solicitação. Você precisa ter os privilégios de superusuário do Fleet Engine para chamar CreateVehicle().
REST
Ligue para https://fleetengine.googleapis.com/v1/providers.vehicles.create.

Advertências

As seguintes advertências se aplicam quando você cria um veículo.

  • Defina o estado inicial do veículo como OFFLINE Isso garante que o Fleet Engine possa encontrar seu veículo para fazer a correspondência de viagem.

  • O provider_id do veículo precisa ser igual ao ID do projeto do Projeto do Google Cloud que contém as contas de serviço usadas para chamar a frota Engine. Várias contas de serviço podem acessar o Fleet Engine para os mesmos provedor de transporte por aplicativo, o Fleet Engine não oferece suporte a contas de serviço de projetos diferentes do Google Cloud acessando os mesmos veículos.

  • A resposta retornada de CreateVehicle() contém a instância Vehicle. A instância será excluída após sete dias se não tiver sido atualizada com o UpdateVehicle(): Chame GetVehicle() antes de ligar CreateVehicle(), apenas para confirmar que o veículo ainda não existe. Se GetVehicle() retorna um erro NOT_FOUND, então continue a chamada CreateVehicle() Para mais informações, consulte Veículos e o ciclo de vida deles.

Exemplo

O exemplo de código de provedor a seguir demonstra como criar um veículo no a frota de veículos.

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

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))
    .build();

CreateVehicleRequest createVehicleRequest = CreateVehicleRequest.newBuilder()
    .setParent(parent)
    .setVehicleId("8241890")  // Vehicle ID assigned by solution provider.
    .setVehicle(vehicle)      // Initial state.
    .build();

// The Vehicle is created in the OFFLINE state, and no initial position is
// provided.  When the driver app calls the rideshare provider, the state can be
// set to ONLINE, and the driver app updates 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;
}

Para criar um Vehicle que ofereça suporte a viagens de ida e volta, defina o campo backToBackEnabled no objeto Vehicle transmitido para CreateVehicleRequest como true.

Vehicle vehicle = Vehicle.newBuilder()
    .setVehicleState(VehicleState.OFFLINE)
    .addSupportedTripTypes(TripType.EXCLUSIVE)
    .setMaximumCapacity(4)
    .setVehicleType(VehicleType.newBuilder().setCategory(VehicleType.Category.AUTO))
    .setBackToBackEnabled(true) // Set as 'true' so vehicle can be assigned back-to-back trips.
    .build();

Etapa 2. Ativar rastreamento de localização

O rastreamento de localização é o rastreamento da localização do veículo durante a viagem. em que o app do motorista envia telemetria para o Fleet Engine, que contém a localização atual dos veículos. Esse fluxo de posicionamento atualizado constantemente são usadas para informar o andamento do veículo ao longo do trajeto da viagem. Quando você ativa o rastreamento de localização, o app do motorista começa a enviar essa telemetria, em uma frequência padrão de uma vez a cada cinco segundos.

Para ativar o acompanhamento de local para Android e iOS, faça o seguinte:

.

Exemplo

O exemplo de código a seguir demonstra como ativar o rastreamento de localização.

Java

RidesharingVehicleReporter vehicleReporter = ...;

vehicleReporter.enableLocationTracking();

Kotlin

val vehicleReporter = ...

vehicleReporter.enableLocationTracking()

Swift

vehicleReporter.locationTrackingEnabled = true

Objective-C

_vehicleReporter.locationTrackingEnabled = YES;

Etapa 3. Definir o estado do veículo como on-line

Você coloca um veículo em funcionamento (ou seja, para torná-lo disponível para uso) definindo seu estado como on-line, mas você só pode fazer isso depois de ativaram o rastreamento de localização.

Para definir o estado do veículo como on-line para Android e iOS, faça o seguinte:

Exemplo

O exemplo de código a seguir demonstra como definir o estado do veículo como ONLINE:

Java

vehicleReporter.setVehicleState(VehicleState.ONLINE);

Kotlin

vehicleReporter.setVehicleState(VehicleState.ONLINE)

Swift

vehicleReporter.update(.online)

Objective-C

[_vehicleReporter updateVehicleState:GMTDVehicleStateOnline];

Etapa 4. Criar uma viagem no Fleet Engine

Para criar uma viagem de ida e volta, crie um objeto Trip da mesma forma que você faria para uma viagem de destino único.

Uma viagem é um objeto que representa uma jornada, ou seja, uma coleção de pontos de coordenadas geográficas, incluindo origem, waypoints e pontos de desembarque. Você precisa criar um objeto Trip para cada solicitação de viagem de modo que a solicitação possa ser associada a um veículo e rastreada.

Forneça os atributos obrigatórios

Para criar uma viagem de ida e volta, forneça os seguintes campos:

parent
Uma string que inclui o ID do provedor. Precisa ser igual ao ID do projeto do Google Cloud que contém as contas de serviço usada para chamar o Fleet Engine
trip_id
Uma string criada por você que identifica exclusivamente essa viagem.
trip
Trip a ser criado.

Os campos a seguir precisam ser definidos no objeto Trip transmitido para CreateTripRequest:

trip_type
TripType.EXCLUSIVE
pickup_point
O ponto de origem da viagem.
dropoff_point
O ponto de desembarque da viagem. Esse campo não é obrigatório na criação da viagem e pode ser definido posteriormente chamando UpdateTrip.
.

Exemplo

O exemplo de integração de back-end a seguir demonstra como criar uma viagem e atribuí-la a um veículo.

// A vehicle with ID 'my-vehicle' is already created and it is assigned to a trip with ID 'current-trip'.

static final String PROJECT_ID = "my-rideshare-co-gcp-project";
static final String VEHICLE_ID =" my-vehicle";
static final String TRIP_ID = "back-to-back-trip");

TripServiceBlockingStub tripService = TripService.newBlockingStub(channel);

String parent = "providers/" + PROJECT_ID;

Trip trip = Trip.newBuilder()
    .setTripType(TripType.EXCLUSIVE)
    .setPickupPoint(
        TerminalLocation.newBuilder().setPoint(
            LatLng.newBuilder()
                .setLatitude(-6.195139).setLongitude(106.820826)))
    .setDropoffPoint(
        TerminalLocation.newBuilder().setPoint(
            LatLng.newBuilder()
                .setLatitude(-6.1275).setLongitude(106.6537)))
    .setVehicleId(VEHICLE_ID)
    .build();

// Create trip request
CreateTripRequest createTripRequest = CreateTripRequest.newBuilder()
    .setParent(parent)
    .setTripId(TRIP_ID)
    .setTrip(trip)
    .build();

// Error handling.
try {
  // Fleet Engine automatically assigns a 'waypoints' list to the trip containing
  // the vehicle's current trip waypoints.
  Trip createdTrip =
      tripService.createTrip(createTripRequest);
} catch (StatusRuntimeException e) {
  Status s = e.getStatus();
  switch (s.getCode()) {
    case ALREADY_EXISTS:
      break;
    case PERMISSION_DENIED:
      break;
  }
  return;
}

Etapa 5. Atualizar a viagem com o ID do veículo e waypoints

Você precisa configurar a viagem com um ID de veículo para que o Fleet Engine possa rastrear o veículo ao longo do trajeto. Para sucessos, uma viagem é atribuída a um veículo, mesmo que já tenha sido atribuído a ele.

Depois de atribuir a viagem a um veículo, o Fleet Engine adiciona automaticamente o waypoints associados às viagens de ida e volta até os waypoints do veículo . O campo remainingWaypoints de uma viagem contém uma lista de todos os waypoints, incluindo os de viagens simultâneas, que serão visitados antes de o desembarque da viagem.

Por exemplo, considere duas viagens de ida e volta: Viagem A. e a Viagem B. O veículo buscou o consumidor por Viagem A e, durante o trajeto até o local de desembarque, o motorista recebe uma solicitação para retirar outro consumidor para a próxima viagem. (viagem B).

  • Chamar getVehicle() retorna uma lista de waypoints restantes (remainingWaypoints) que contém
    Uma desistênciaB RetiradaB Desistência.
  • getTrip() ou o Callback onTripRemainingWaypointsUpdated para Viagem A: retorna uma lista de waypoints restantes (remainingWaypoints) que contém Uma Desistência.
  • getTrip() ou o Callback onTripRemainingWaypointsUpdated para Viagem B: retorna uma lista de waypoints restantes. (remainingWaypoints) que contém Uma desistênciaB Retirada → e B Desistência.

Etapa 6. Detectar atualizações de viagem no app para o consumidor

  • No Android, é possível detectar atualizações de dados de uma viagem adquirindo um objeto TripModel. do TripModelManager e registrar um listener TripModelCallback.

  • No iOS, você pode detectar atualizações de dados de uma viagem conseguindo um objeto GMTCTripModel. do GMTCTripService e registrar um assinante GMTCTripModelSubscriber.

Um listener TripModelCallback e um assinante GMTCTripModelSubscriber permitem que o app receba periodicamente o progresso das viagens a cada atualização com base no intervalo de atualização automática. Somente valores que mudam podem acionar o callback. Caso contrário, o callback permanece em silêncio.

Os métodos TripModelCallback.onTripUpdated() e tripModel(_:didUpdate:updatedPropertyFields:) são sempre chamados, independentemente de qualquer mudança nos dados.

Exemplo 1

O exemplo de código a seguir demonstra como acessar um TripModel de TripModelManager/GMTCTripService e defina um listener nele.

Java

// Start journey sharing after a trip has been created via Fleet Engine.
TripModelManager tripModelManager = consumerApi.getTripModelManager();

// Get a TripModel object.
TripModel tripModel = tripModelManager.getTripModel(tripName);

// Register a listener on the trip.
TripModelCallback tripCallback = new TripModelCallback() {
  ...
};
tripModel.registerTripCallback(tripCallback);

// Set the refresh interval.
TripModelOptions tripModelOptions = TripModelOptions.builder()
    .setRefreshInterval(5000) // interval in milliseconds, so 5 seconds
    .build();
tripModel.setTripModelOptions(tripModelOptions);

// The trip stops auto-refreshing when all listeners are unregistered.
tripModel.unregisterTripCallback(tripCallback);

Kotlin

// Start journey sharing after a trip has been created via Fleet Engine.
val tripModelManager = consumerApi.getTripModelManager()

// Get a TripModel object.
val tripModel = tripModelManager.getTripModel(tripName)

// Register a listener on the trip.
val tripCallback = TripModelCallback() {
  ...
}

tripModel.registerTripCallback(tripCallback)

// Set the refresh interval.
val tripModelOptions =
  TripModelOptions.builder()
    .setRefreshInterval(5000) // interval in milliseconds, so 5 seconds
    .build()

tripModel.setTripModelOptions(tripModelOptions)

// The trip stops auto-refreshing when all listeners are unregistered.
tripModel.unregisterTripCallback(tripCallback)

Swift

let tripService = GMTCServices.shared().tripService

// Create a tripModel instance for listening for updates from the trip
// specified by the trip name.
let tripModel = tripService.tripModel(forTripName: tripName)

// Register for the trip update events.
tripModel.register(self)

// Set the refresh interval (in seconds).
tripModel.options.autoRefreshTimeInterval = 5

// Unregister for the trip update events.
tripModel.unregisterSubscriber(self)

Objective-C

GMTCTripService *tripService = [GMTCServices sharedServices].tripService;

// Create a tripModel instance for listening for updates from the trip
// specified by the trip name.
GMTCTripModel *tripModel = [tripService tripModelForTripName:tripName];

// Register for the trip update events.
[tripModel registerSubscriber:self];

// Set the refresh interval (in seconds).
tripModel.options.autoRefreshTimeInterval = 5;

// Unregister for the trip update events.
[tripModel unregisterSubscriber:self];

Exemplo 2

O exemplo de código abaixo demonstra como configurar um TripModelCallback. listener e assinante GMTCTripModelSubscriber.

Java

// Implements a callback for the trip model so your app can listen for trip
// updates from Fleet Engine.
TripModelCallback subscriber =
  new TripModelCallback() {

    @Override
    public void onTripStatusUpdated(TripInfo tripInfo, @TripStatus int status) {
      // ...
    }

    @Override
    public void onTripActiveRouteUpdated(TripInfo tripInfo, List<LatLng> route) {
      // ...
    }

    @Override
    public void onTripVehicleLocationUpdated(
        TripInfo tripInfo, @Nullable VehicleLocation vehicleLocation) {
      // ...
    }

    @Override
    public void onTripPickupLocationUpdated(
        TripInfo tripInfo, @Nullable TerminalLocation pickup) {
      // ...
    }

    @Override
    public void onTripPickupTimeUpdated(TripInfo tripInfo, @Nullable Long timestampMillis) {
      // ...
    }

    @Override
    public void onTripDropoffLocationUpdated(
        TripInfo tripInfo, @Nullable TerminalLocation dropoff) {
      // ...
    }

    @Override
    public void onTripDropoffTimeUpdated(TripInfo tripInfo, @Nullable Long timestampMillis) {
      // ...
    }

    @Override
    public void onTripETAToNextWaypointUpdated(
        TripInfo tripInfo, @Nullable Long timestampMillis) {
      // ...
    }

    @Override
    public void onTripActiveRouteRemainingDistanceUpdated(
        TripInfo tripInfo, @Nullable Integer distanceMeters) {
      // ...
    }

    @Override
    public void onTripUpdateError(TripInfo tripInfo, TripUpdateError error) {
      // ...
    }

    @Override
    public void onTripUpdated(TripInfo tripInfo) {
      // ...
    }

    @Override
    public void onTripRemainingWaypointsUpdated(
        TripInfo tripInfo, List<TripWaypoint> waypointList) {
      // ...
    }

    @Override
    public void onTripIntermediateDestinationsUpdated(
        TripInfo tripInfo, List<TerminalLocation> intermediateDestinations) {
      // ...
    }

    @Override
    public void onTripRemainingRouteDistanceUpdated(
        TripInfo tripInfo, @Nullable Integer distanceMeters) {
      // ...
    }

    @Override
    public void onTripRemainingRouteUpdated(TripInfo tripInfo, List<LatLng> route) {
      // ...
    }
  };

Kotlin

// Implements a callback for the trip model so your app can listen for trip
// updates from Fleet Engine.
val subscriber =
  object : TripModelCallback() {
    override fun onTripStatusUpdated(tripInfo: TripInfo, status: @TripStatus Int) {
      // ...
    }

    override fun onTripActiveRouteUpdated(tripInfo: TripInfo, route: List<LatLng>) {
      // ...
    }

    override fun onTripVehicleLocationUpdated(
      tripInfo: TripInfo,
      vehicleLocation: VehicleLocation?
    ) {
      // ...
    }

    override fun onTripPickupLocationUpdated(tripInfo: TripInfo, pickup: TerminalLocation?) {
      // ...
    }

    override fun onTripPickupTimeUpdated(tripInfo: TripInfo, timestampMillis: Long?) {
      // ...
    }

    override fun onTripDropoffLocationUpdated(tripInfo: TripInfo, dropoff: TerminalLocation?) {
      // ...
    }

    override fun onTripDropoffTimeUpdated(tripInfo: TripInfo, timestampMillis: Long?) {
      // ...
    }

    override fun onTripETAToNextWaypointUpdated(tripInfo: TripInfo, timestampMillis: Long?) {
      // ...
    }

    override fun onTripActiveRouteRemainingDistanceUpdated(
      tripInfo: TripInfo,
      distanceMeters: Int?
    ) {
      // ...
    }

    override fun onTripUpdateError(tripInfo: TripInfo, error: TripUpdateError) {
      // ...
    }

    override fun onTripUpdated(tripInfo: TripInfo) {
      // ...
    }

    override fun onTripRemainingWaypointsUpdated(
      tripInfo: TripInfo,
      waypointList: List<TripWaypoint>
    ) {
      // ...
    }

    override fun onTripIntermediateDestinationsUpdated(
      tripInfo: TripInfo,
      intermediateDestinations: List<TerminalLocation>
    ) {
      // ...
    }

    override fun onTripRemainingRouteDistanceUpdated(tripInfo: TripInfo, distanceMeters: Int?) {
      // ...
    }

    override fun onTripRemainingRouteUpdated(tripInfo: TripInfo, route: List<LatLng>) {
      // ...
    }
  }

Swift

class TripModelSubscriber: NSObject, GMTCTripModelSubscriber {

  func tripModel(_: GMTCTripModel, didUpdate trip: GMTSTrip?, updatedPropertyFields: GMTSTripPropertyFields) {
    // Update the UI with the new `trip` data.
    updateUI(with: trip)
    ...
  }

  func tripModel(_: GMTCTripModel, didUpdate tripStatus: GMTSTripStatus) {
    // Handle trip status did change.
  }

  func tripModel(_: GMTCTripModel, didUpdateActiveRoute activeRoute: [GMTSLatLng]?) {
    // Handle trip active route did update.
  }

  func tripModel(_: GMTCTripModel, didUpdate vehicleLocation: GMTSVehicleLocation?) {
    // Handle vehicle location did update.
  }

  func tripModel(_: GMTCTripModel, didUpdatePickupLocation pickupLocation: GMTSTerminalLocation?) {
    // Handle pickup location did update.
  }

  func tripModel(_: GMTCTripModel, didUpdateDropoffLocation dropoffLocation: GMTSTerminalLocation?) {
    // Handle drop off location did update.
  }

  func tripModel(_: GMTCTripModel, didUpdatePickupETA pickupETA: TimeInterval) {
    // Handle the pickup ETA did update.
  }

  func tripModel(_: GMTCTripModel, didUpdateDropoffETA dropoffETA: TimeInterval) {
    // Handle the drop off ETA did update.
  }

  func tripModel(_: GMTCTripModel, didUpdateRemaining remainingWaypoints: [GMTSTripWaypoint]?) {
    // Handle updates to the pickup, dropoff or intermediate destinations of the trip.
  }

  func tripModel(_: GMTCTripModel, didFailUpdateTripWithError error: Error?) {
    // Handle the error.
  }

  func tripModel(_: GMTCTripModel, didUpdateIntermediateDestinations intermediateDestinations: [GMTSTerminalLocation]?) {
    // Handle the intermediate destinations being updated.
  }

  ...
}

Objective-C

@interface TripModelSubscriber : NSObject <GMTCTripModelSubscriber>
@end

@implementation TripModelSubscriber

- (void)tripModel:(GMTCTripModel *)tripModel
            didUpdateTrip:(nullable GMTSTrip *)trip
    updatedPropertyFields:(GMTSTripPropertyFields)updatedPropertyFields {
  // Update the UI with the new `trip` data.
  [self updateUIWithTrip:trip];
  ...
}

- (void)tripModel:(GMTCTripModel *)tripModel didUpdateTripStatus:(enum GMTSTripStatus)tripStatus {
  // Handle trip status did change.
}

- (void)tripModel:(GMTCTripModel *)tripModel
    didUpdateActiveRoute:(nullable NSArray<GMTSLatLng *> *)activeRoute {
  // Handle trip route did update.
}

- (void)tripModel:(GMTCTripModel *)tripModel
    didUpdateVehicleLocation:(nullable GMTSVehicleLocation *)vehicleLocation {
  // Handle vehicle location did update.
}

- (void)tripModel:(GMTCTripModel *)tripModel
    didUpdatePickupLocation:(nullable GMTSTerminalLocation *)pickupLocation {
  // Handle pickup location did update.
}

- (void)tripModel:(GMTCTripModel *)tripModel
    didUpdateDropoffLocation:(nullable GMTSTerminalLocation *)dropoffLocation {
  // Handle drop off location did update.
}

- (void)tripModel:(GMTCTripModel *)tripModel didUpdatePickupETA:(NSTimeInterval)pickupETA {
  // Handle the pickup ETA did update.
}

- (void)tripModel:(GMTCTripModel *)tripModel
    didUpdateRemainingWaypoints:(nullable NSArray<GMTSTripWaypoint *> *)remainingWaypoints {
  // Handle updates to the pickup, dropoff or intermediate destinations of the trip.
}

- (void)tripModel:(GMTCTripModel *)tripModel didUpdateDropoffETA:(NSTimeInterval)dropoffETA {
  // Handle the drop off ETA did update.
}

- (void)tripModel:(GMTCTripModel *)tripModel didFailUpdateTripWithError:(nullable NSError *)error {
  // Handle the error.
}

- (void)tripModel:(GMTCTripModel *)tripModel
    didUpdateIntermediateDestinations:
        (nullable NSArray<GMTSTerminalLocation *> *)intermediateDestinations {
  // Handle the intermediate destinations being updated.
}
…
@end

Você pode acessar as informações da viagem a qualquer momento da seguinte forma:

  • Chame o método TripModel.getTripInfo() do SDK do consumidor para Android. Chamar esse método não força uma atualização de dados, embora os dados ainda continuem a ser atualizados na frequência de atualização.

  • Acesse a propriedade GMTCTripModel.currentTrip do SDK do consumidor para iOS.

Etapa 7: Mostrar a jornada no app para o consumidor

Você pode acessar as APIs do elemento de interface do usuário Rides e Deliveries da seguinte maneira:

Exemplo

O exemplo de código a seguir demonstra como iniciar a jornada de compartilhamento do usuário interface gráfica do usuário.

Java

JourneySharingSession session = JourneySharingSession.createInstance(tripModel);
consumerController.showSession(session);

Kotlin

val session = JourneySharingSession.createInstance(tripModel)
consumerController.showSession(session)

Swift

let journeySharingSession = GMTCJourneySharingSession(tripModel: tripModel)
mapView.show(journeySharingSession)

Objective-C

GMTCJourneySharingSession *journeySharingSession =
    [[GMTCJourneySharingSession alloc] initWithTripModel:tripModel];
[self.mapView showMapViewSession:journeySharingSession];

Exemplo de cenário

Considere uma viagem de ida e volta na qual o veículo já pegou o consumidor na primeira viagem. O veículo está a caminho do ponto de desembarque quando o motorista recebe uma solicitação para retirar um consumidor diferente após a conclusão do a viagem atual.





Nesse momento, o consumidor da primeira viagem vê o seguinte.





No mesmo momento, o consumidor da segunda viagem verá a imagem a seguir.





Por padrão, o SDK do consumidor exibe apenas o trecho ativo na rota, mas você ter a opção de exibir o trecho restante, que inclui o destino.

Se quiser exibir informações sobre waypoints de outras viagens, pode acessar todos os waypoints relevantes para uma viagem da seguinte maneira:

Etapa 8. Gerenciar o estado da viagem no Fleet Engine

Você especifica o estado de uma viagem usando um dos TripStatus valores de enumeração. Quando o estado de uma viagem muda (por exemplo, mudar da ENROUTE_TO_PICKUP a ARRIVED_AT_PICKUP), você precisa atualizar o estado da viagem usando: a frota de veículos. O estado da viagem sempre começa com o valor NEW e termina com um valor de COMPLETE ou CANCELED. Para mais informações, consulte trip_status

Exemplo

O exemplo de integração de back-end a seguir demonstra como atualizar o estado da viagem no 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;
}