In diesem Dokument wird davon ausgegangen, dass Sie mit den folgenden Themen vertraut sind:
- Versandaufgaben erstellen
- Einführung in geplante Aufgaben, in der die Beziehung zwischen Aufgaben, Haltestellen und Fahrzeugen ausführlich behandelt wird.
Wie unter Geplante Aufgaben in den Grundlagen der Fleet Engine beschrieben, erstellen Sie Aufgaben und verknüpfen sie mit einer Haltestelle, um die Beziehung zwischen der Aufgabe und dem Ort, an dem das Fahrzeug anhalten soll, zu modellieren, damit der Fahrer die Aufgabe ausführen kann.
Anschließend verwalten Sie den Fortschritt der Aufgaben während ihres gesamten Lebenszyklus, indem Sie Updates an die Fleet Engine senden, damit sie die Routenplanung und Statusaktualisierungen entlang der Aufgabe optimal ausführen kann. Eine wichtige Möglichkeit hierfür ist, die Haltestelle zu aktualisieren, wenn sich das Fahrzeug der Haltestelle nähert, dort ankommt und sie verlässt. So können sowohl Flottenbetreiber als auch Endnutzer Berichte und Analysen zum Aufgabenfortschritt erhalten. Diese Statusaktualisierungen sind wie folgt:
- Unterwegs: Die
STATEEnum fürVehicleStopverwendetENROUTE, um anzugeben, dass die Haltestelle als Nächstes auf der Liste für die Fahrzeugroute steht. Aus Sicht der Aufgabe bedeutet dies, dass jede Aufgabe, die mit der Haltestelle verknüpft ist, als Nächstes ausgeführt werden muss. - Angekommen: Die
STATEEnum fürVehicleStopverwendetARRIVED, um anzugeben , dass das Fahrzeug an der Haltestelle angekommen ist. Aus Sicht der Aufgabe bedeutet dies, dass jede Aufgabe, die mit der Haltestelle verknüpft ist, aktiv bearbeitet wird. - Abgeschlossen: Sie markieren eine Haltestelle als abgeschlossen, indem Sie sie aus der Liste der Haltestellen für das Fahrzeug entfernen. In diesem Fall markiert die Fleet Engine automatisch alle zugehörigen Aufgaben als GESCHLOSSEN. Weitere Informationen zum Schließen von Aufgaben finden Sie unter Aufgaben abschließen.
In diesem Dokument wird beschrieben, wie Sie den Haltestatus mithilfe von serverseitigen Ansätzen aktualisieren. Sie können dies auch über Ihre Fahrer-App tun, wenn Sie dem Fahrer die Möglichkeit geben, Aufgaben mit einem vertrauenswürdigen Gerät zu verwalten. Verwenden Sie nur eine Methode, um Race-Bedingungen zu vermeiden und eine Single Source of Truth beizubehalten.
Fahrzeug ist unterwegs zur Haltestelle
Ihr System sollte die Fleet Engine benachrichtigen, wenn das Fahrzeug mit der Navigation zur nächsten Haltestelle beginnt. Dadurch werden die Berechnungen der voraussichtlichen Ankunftszeit und der Route verbessert.
Erforderliche Felder für Haltestellenaktualisierungen
Die Fleet Engine ignoriert alle anderen Felder in der Entität für die Benachrichtigung.
| Feld | Wert |
|---|---|
remainingVehicleJourneySegments
|
Liste der verbleibenden Haltestellen mit dem Status „State.NEW“. |
Beispiel für „Unterwegs zur Haltestelle“
In den folgenden Beispielen wird gezeigt, wie Sie die Fleet Engine benachrichtigen, dass ein Fahrzeug
unterwegs zur nächsten Haltestelle ist. Dazu wird entweder die Java gRPC-Bibliothek oder ein HTTP
REST-Aufruf an UpdateDeliveryVehicle verwendet. Alle anderen Haltestellen sind als neu markiert.
gRPC
static final String PROJECT_ID = "my-delivery-co-gcp-project";
static final String VEHICLE_ID = "vehicle-8241890";
DeliveryServiceBlockingStub deliveryService =
DeliveryServiceGrpc.newBlockingStub(channel);
// Vehicle settings
DeliveryVehicle deliveryVehicle = DeliveryVehicle.newBuilder()
// Next stop marked as ENROUTE
.addRemainingVehicleJourneySegments(VehicleJourneySegment.newBuilder() // 1st stop
.setStop(VehicleStop.newBuilder()
.setPlannedLocation(LocationInfo.newBuilder()
.setPoint(LatLng.newBuilder()
.setLatitude(37.7749)
.setLongitude(122.4194)))
.addTasks(TaskInfo.newBuilder().setTaskId(TASK1_ID))
.setState(VehicleStop.State.ENROUTE)))
// All other stops marked as NEW
.addRemainingVehicleJourneySegments(VehicleJourneySegment.newBuilder() // 2nd stop
.setStop(VehicleStop.newBuilder()
.setPlannedLocation(LocationInfo.newBuilder()
.setPoint(LatLng.newBuilder()
.setLatitude(37.3382)
.setLongitude(121.8863)))
.addTasks(TaskInfo.newBuilder().setTaskId(TASK2_ID))
.setState(VehicleStop.State.NEW)))
.build();
// DeliveryVehicle request
UpdateDeliveryVehicleRequest updateDeliveryVehicleRequest =
UpdateDeliveryVehicleRequest.newBuilder() // No need for the header
.setName(vehicleName)
.setDeliveryVehicle(deliveryVehicle)
.setUpdateMask(FieldMask.newBuilder().addPaths("remaining_vehicle_journey_segments"))
.build();
try {
DeliveryVehicle updatedDeliveryVehicle =
deliveryService.updateDeliveryVehicle(updateDeliveryVehicleRequest);
} catch (StatusRuntimeException e) {
Status s = e.getStatus();
switch (s.getCode()) {
case NOT_FOUND:
break;
case PERMISSION_DENIED:
break;
}
return;
}
REST
PATCH https://fleetengine.googleapis.com/v1/providers/<project_id>/deliveryVehicles/<id>?updateMask=remainingVehicleJourneySegments`
- <id> ist eine eindeutige Kennung für die Aufgabe.
- Der Anforderungsheader muss ein Feld Authorization mit dem Wert Bearer <token> enthalten, wobei <token> von Ihrem Server gemäß den Richtlinien unter Dienstkontorollen und JSON-Web-Tokens ausgestellt wird.
- Der Anfragetext muss eine
DeliveryVehicle-Entität enthalten:
Beispiel für einen curl-Befehl:
# Set JWT, PROJECT_ID, VEHICLE_ID, TASK1_ID, and TASK2_ID in the local
# environment
curl -X PATCH "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/deliveryVehicles/${VEHICLE_ID}?updateMask=remainingVehicleJourneySegments" \
-H "Content-type: application/json" \
-H "Authorization: Bearer ${JWT}" \
--data-binary @- << EOM
{
"remainingVehicleJourneySegments": [
{
"stop": {
"state": "ENROUTE",
"plannedLocation": {
"point": {
"latitude": 37.7749,
"longitude": -122.084061
}
},
"tasks": [
{
"taskId": "${TASK1_ID}"
}
]
}
},
{
"stop": {
"state": "NEW",
"plannedLocation": {
"point": {
"latitude": 37.3382,
"longitude": 121.8863
}
},
"tasks": [
{
"taskId": "${TASK2_ID}"
}
]
}
}
]
}
EOM
Fahrzeug kommt an der Haltestelle an
Die Fleet Engine muss benachrichtigt werden, wenn ein Fahrzeug an einer Haltestelle ankommt.
Erforderliche Felder für Haltestellenaktualisierungen
Die Fleet Engine ignoriert alle anderen Felder in der Entität für die Benachrichtigung.
| Feld | Wert |
|---|---|
remainingVehicleJourneySegments
|
Liste der verbleibenden Haltestellen mit dem Status „State.NEW“. |
Beispiel für „Ankunft an der Haltestelle“
In den folgenden Beispielen wird gezeigt, wie Sie die Fleet Engine benachrichtigen, dass ein Fahrzeug an der Haltestelle angekommen ist
. Dazu wird entweder die Java gRPC-Bibliothek oder ein HTTP-REST-Aufruf an
UpdateDeliveryVehicle verwendet. Alle anderen Haltestellen sind als neu markiert.
gRPC
static final String PROJECT_ID = "my-delivery-co-gcp-project";
static final String VEHICLE_ID = "vehicle-8241890";
DeliveryServiceBlockingStub deliveryService =
DeliveryServiceGrpc.newBlockingStub(channel);
// Vehicle settings
String vehicleName = "providers/" + PROJECT_ID + "/deliveryVehicles/" + VEHICLE_ID;
DeliveryVehicle deliveryVehicle = DeliveryVehicle.newBuilder()
// Marking the arrival at stop.
.addRemainingVehicleJourneySegments(VehicleJourneySegment.newBuilder()
.setStop(VehicleStop.newBuilder()
.setPlannedLocation(LocationInfo.newBuilder()
.setPoint(LatLng.newBuilder()
.setLatitude(37.7749)
.setLongitude(122.4194)))
.addTasks(TaskInfo.newBuilder().setTaskId(TASK1_ID))
.setState(VehicleStop.State.ARRIVED)))
// All other remaining stops marked as NEW.
.addRemainingVehicleJourneySegments(VehicleJourneySegment.newBuilder() // 2nd stop
.setStop(VehicleStop.newBuilder()
.setPlannedLocation(LocationInfo.newBuilder()
.setPoint(LatLng.newBuilder()
.setLatitude(37.3382)
.setLongitude(121.8863)))
.addTasks(TaskInfo.newBuilder().setTaskId(TASK2_ID))
.setState(VehicleStop.State.NEW))) // Remaining stops must be NEW.
.build();
// DeliveryVehicle request
UpdateDeliveryVehicleRequest updateDeliveryVehicleRequest =
UpdateDeliveryVehicleRequest.newBuilder() // No need for the header
.setName(vehicleName)
.setDeliveryVehicle(deliveryVehicle)
.setUpdateMask(FieldMask.newBuilder()
.addPaths("remaining_vehicle_journey_segments"))
.build();
try {
DeliveryVehicle updatedDeliveryVehicle =
deliveryService.updateDeliveryVehicle(updateDeliveryVehicleRequest);
} catch (StatusRuntimeException e) {
Status s = e.getStatus();
switch (s.getCode()) {
case NOT_FOUND:
break;
case PERMISSION_DENIED:
break;
}
return;
}
REST
`PATCH https://fleetengine.googleapis.com/v1/providers/<project_id>/deliveryVehicles/<id>?updateMask=remainingVehicleJourneySegments`
- <id> ist eine eindeutige Kennung für die Aufgabe.
- Der Anforderungsheader muss ein Feld Authorization mit dem Wert Bearer <token> enthalten, wobei <token> von Ihrem Server gemäß den Richtlinien unter Dienstkontorollen und JSON-Web-Tokens ausgestellt wird.
- Der Anfragetext muss eine
DeliveryVehicle-Entität enthalten:
Beispiel für einen curl-Befehl:
# Set JWT, PROJECT_ID, VEHICLE_ID, TASK1_ID, and TASK2_ID in the local
# environment
curl -X PATCH "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/deliveryVehicles/${VEHICLE_ID}?updateMask=remainingVehicleJourneySegments" \
-H "Content-type: application/json" \
-H "Authorization: Bearer ${JWT}" \
--data-binary @- << EOM
{
"remainingVehicleJourneySegments": [
{
"stop": {
"state": "ARRIVED",
"plannedLocation": {
"point": {
"latitude": 37.7749,
"longitude": -122.084061
}
},
"tasks": [
{
"taskId": "${TASK1_ID}"
}
]
}
},
{
"stop": {
"state": "NEW",
"plannedLocation": {
"point": {
"latitude": 37.3382,
"longitude": 121.8863
}
},
"tasks": [
{
"taskId": "${TASK2_ID}"
}
]
}
}
]
}
EOM
Fahrzeug schließt eine Haltestelle ab
Die Fleet Engine muss benachrichtigt werden, wenn ein Fahrzeug eine Haltestelle abschließt. Dadurch wird der Status aller Aufgaben, die mit der Haltestelle verknüpft sind, auf „GESCHLOSSEN“ gesetzt.
Erforderliche Felder für Haltestellenaktualisierungen
Die Fleet Engine ignoriert alle anderen Felder in der Entität für die Benachrichtigung.
| Feld | Wert |
|---|---|
remainingVehicleJourneySegments |
Liste der verbleibenden Haltestellen mit dem Status „State.NEW“. Der Status der ersten Haltestelle in der Liste muss „State.ENROUTE“ sein. |
Beispiel für „Haltestelle abgeschlossen“
In den folgenden Beispielen wird gezeigt, wie Sie die Fleet Engine benachrichtigen, dass ein Fahrzeug an der Haltestelle angekommen ist
. Dazu wird entweder die Java gRPC-Bibliothek oder ein HTTP-REST-Aufruf an
UpdateDeliveryVehicle verwendet. Alle anderen Haltestellen sind als neu markiert.
gRPC
static final String PROJECT_ID = "my-delivery-co-gcp-project";
static final String VEHICLE_ID = "vehicle-8241890";
DeliveryServiceBlockingStub deliveryService =
DeliveryServiceGrpc.newBlockingStub(channel);
// Vehicle settings
String vehicleName = "providers/" + PROJECT_ID + "/deliveryVehicles/" + VEHICLE_ID;
DeliveryVehicle deliveryVehicle = DeliveryVehicle.newBuilder()
// This stop has been completed and is commented out to indicate it
// should be removed from the list of vehicle journey segments.
// .addRemainingVehicleJourneySegments(VehicleJourneySegment.newBuilder()
// .setStop(VehicleStop.newBuilder()
// .setPlannedLocation(LocationInfo.newBuilder()
// .setPoint(LatLng.newBuilder()
// .setLatitude(37.7749)
// .setLongitude(122.4194)))
// .addTasks(TaskInfo.newBuilder().setTaskId(TASK1_ID))
// .setState(VehicleStop.State.ARRIVED)))
// All other remaining stops marked as NEW.
// The next stop could be marked as ENROUTE if the vehicle has begun
// its journey to the next stop.
.addRemainingVehicleJourneySegments(VehicleJourneySegment.newBuilder() // Next stop
.setStop(VehicleStop.newBuilder()
.setPlannedLocation(LocationInfo.newBuilder()
.setPoint(LatLng.newBuilder()
.setLatitude(37.3382)
.setLongitude(121.8863)))
.addTasks(TaskInfo.newBuilder().setTaskId(TASK2_ID))
.setState(VehicleStop.State.NEW)))
.build();
// DeliveryVehicle request
UpdateDeliveryVehicleRequest updateDeliveryVehicleRequest =
UpdateDeliveryVehicleRequest.newBuilder() // no need for the header
.setName(vehicleName)
.setDeliveryVehicle(deliveryVehicle)
.setUpdateMask(FieldMask.newBuilder()
.addPaths("remaining_vehicle_journey_segments"))
.build();
try {
DeliveryVehicle updatedDeliveryVehicle =
deliveryService.updateDeliveryVehicle(updateDeliveryVehicleRequest);
} catch (StatusRuntimeException e) {
Status s = e.getStatus();
switch (s.getCode()) {
case NOT_FOUND:
break;
case PERMISSION_DENIED:
break;
}
return;
}
REST
PATCH https://fleetengine.googleapis.com/v1/providers/<project_id>/deliveryVehicles/<id>?updateMask=remaining_vehicle_journey_segments`
- <id> ist eine eindeutige Kennung für die Aufgabe.
- Der Anforderungsheader muss ein Feld Authorization mit dem Wert Bearer <token> enthalten, wobei <token> von Ihrem Server gemäß den Richtlinien unter Dienstkontorollen und JSON-Web-Tokens ausgestellt wird.
- Der Anfragetext muss eine
DeliveryVehicle-Entität enthalten:
Beispiel für einen curl-Befehl:
# Set JWT, PROJECT_ID, VEHICLE_ID, TASK1_ID, and TASK2_ID in the local
# environment
curl -X PATCH "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/deliveryVehicles/${VEHICLE_ID}?updateMask=remainingVehicleJourneySegments" \
-H "Content-type: application/json" \
-H "Authorization: Bearer ${JWT}" \
--data-binary @- << EOM
{
"remainingVehicleJourneySegments": [
{
"stop": {
"state": "NEW",
"plannedLocation": {
"point": {
"latitude": 37.3382,
"longitude": 121.8863
}
},
"tasks": [
{
"taskId": "${TASK2_ID}"
}
]
}
}
]
}
EOM