Questo documento descrive come aggiornare una corsa e gestirne lo stato, il che comporta l'utilizzo di una maschera di campo per impostare i campi pertinenti per una corsa. Si presuppone che tu abbia configurato Fleet Engine come descritto in questo sito e che stia lavorando con un veicolo assegnato a una corsa.
Nozioni di base sugli aggiornamenti dei percorsi
Il tuo sistema utilizza Fleet Engine per aggiornare una corsa nelle seguenti situazioni:
- Quando assegni un veicolo a una corsa dopo la sua creazione.
- Quando lo stato della corsa cambia, ad esempio quando il veicolo passa attraverso i waypoint.
- Quando aggiorni i campi della corsa, come il numero di passeggeri e il punto di arrivo.
Per aggiornare una corsa, invia una richiesta utilizzando gRPC e REST.
Utilizza le credenziali appropriate per il service account del tuo progetto, come descritto in Fleet Engine: ruoli dei service account.
Aggiorna i campi della corsa
Puoi aggiornare uno qualsiasi dei campi della corsa descritti in Campi della corsa in Crea una corsa con una sola destinazione. Ad esempio, dopo aver creato una corsa, è prassi comune trovare prima un veicolo e poi aggiornare il campo vehicle_id della corsa per associarla al veicolo che la effettuerà.
Utilizza le maschere di campo
Le maschere di campo consentono ai chiamanti dell'API di elencare i campi che una richiesta deve aggiornare. L'utilizzo di un FieldMask evita operazioni non necessarie e migliora le prestazioni. Fleet Engine utilizza le maschere di campo per aggiornare i campi in tutte le risorse.
Aggiorna la corsa con l'ID veicolo
Devi configurare una corsa con un ID veicolo in modo che Fleet Engine possa monitorare il veicolo lungo il suo percorso. Il seguente esempio di codice mostra come aggiornare la corsa con un ID veicolo.
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;
}
Gestisci lo stato delle corse
Puoi specificare lo stato di una corsa utilizzando uno dei valori di enumerazione TripStatus. Quando lo stato di una corsa cambia, ad esempio da ENROUTE_TO_PICKUP a ARRIVED_AT_PICKUP, aggiorna lo stato della corsa in Fleet Engine. Il ciclo di vita della corsa inizia sempre con un valore di stato NEW e termina con un valore COMPLETE o CANCELED.
Esempio di aggiornamento sulle corse
Di seguito viene mostrato come aggiornare lo stato della corsa per una corsa consecutiva in 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;
}
Puoi vedere altri esempi di come aggiornare i percorsi nella sezione Altri tipi di percorsi.
Gestisci gli errori relativi ai percorsi
Quando aggiorni o trovi corse esistenti, potresti riscontrare un errore DEADLINE_EXCEEDED. In questo caso, lo stato di Fleet Engine è sconosciuto.
Per indagare sul problema, chiama di nuovo CreateTrip utilizzando lo stesso ID corsa che stai tentando di aggiornare o monitorare. Dovrebbe essere restituito 201 (CREATED) o 409 (CONFLICT). In quest'ultimo caso, la richiesta precedente è andata a buon fine prima di DEADLINE_EXCEEDED.
Consulta l'elenco degli errori di rete nell'SDK Consumer per Android o iOS.