Haltestellenstatus aktualisieren

In diesem Dokument wird davon ausgegangen, dass Sie mit Folgendem vertraut sind:

  • [Lieferaufgaben erstellen][1]
  • Die Einführung in [Geplante Aufgaben][3], in der die Beziehung zwischen Aufgaben, Haltestellen und Fahrzeugen im Detail beschrieben wird.

Wie unter [Geplante Aufgaben][3] in den Grundlagen der Fleet Engine beschrieben, erstellen Sie Aufgaben und verknüpfen sie mit einem Fahrzeughalt, um die reale Verknüpfung zwischen der Aufgabe und dem Ort zu modellieren, an dem das Fahrzeug voraussichtlich halten wird, damit der Fahrer die Aufgabe erledigen kann.

Anschließend verwalten Sie den Fortschritt der Aufgaben während ihres gesamten Lebenszyklus, indem Sie Updates an die Fleet Engine senden, damit diese die Routenplanung und Statusaktualisierungen während der Ausführung der Aufgaben optimal durchführen kann. Eine wichtige Möglichkeit hierfür ist, die Haltestelle des Fahrzeugs zu aktualisieren, wenn sich das Fahrzeug der Haltestelle nähert, dort ankommt und sie verlässt. So können Berichte und Analysen zum Fortschritt der Aufgabe sowohl für Flottenbetreiber als auch für Endnutzer erstellt werden. Diese Statusaktualisierungen sind:

  • Unterwegs: Das STATE-Enum für VehicleStop verwendet ENROUTE, um anzugeben, dass die Haltestelle als Nächstes auf der Liste für den Reiseplan des Fahrzeugs steht. Aus Sicht der Aufgabe bedeutet das, dass jede mit dem Halt verknüpfte Aufgabe als Nächstes auf der Liste steht.
  • Angekommen: Der STATE-Enum für VehicleStop verwendet ARRIVED, um anzugeben, dass das Fahrzeug an der Haltestelle angekommen ist. Aus Sicht der Aufgabe bedeutet dies, dass alle mit dem Stopp verknüpften Aufgaben nicht mehr aktiv bearbeitet werden.
  • Abgeschlossen: Sie markieren einen Halt als abgeschlossen, indem Sie ihn aus der Liste der Halte für das Fahrzeug entfernen. In diesem Fall werden alle zugehörigen Aufgaben von Fleet Engine automatisch als GESCHLOSSEN markiert. Weitere Informationen zum Schließen von Aufgaben finden Sie unter [Aufgaben abschließen][4].

In diesem Dokument wird beschrieben, wie Sie den Status „Halt“ mithilfe serverseitiger Ansätze aktualisieren. Sie können dies auch über Ihre Fahrer-App tun, wenn Sie dem Fahrer die Möglichkeit geben, Aufgaben über ein vertrauenswürdiges Gerät zu verwalten. Verwenden Sie nur eine Methode, um Race-Bedingungen zu vermeiden und eine zentrale Informationsquelle zu erhalten.

Das Fahrzeug ist auf dem Weg zur Haltestelle.

Ihr System sollte die Fleet Engine benachrichtigen, wenn das Fahrzeug die Navigation zum nächsten Halt startet. Dadurch werden die Berechnungen der voraussichtlichen Ankunftszeit und der Route verbessert.

Pflichtfelder für Haltestellen-Updates

Die Fleet Engine ignoriert alle anderen Felder in der Entität für die Benachrichtigung.

FeldWert
remainingVehicleJourneySegments Liste der verbleibenden Haltestellen des Fahrzeugs, deren Status als State.NEW gekennzeichnet ist.

Beispiel für „Auf dem Weg zum Halt“

In den folgenden Beispielen wird gezeigt, wie Sie die Fleet Engine mithilfe der [Java gRPC-Bibliothek][5] oder eines HTTP-REST-Aufrufs an UpdateDeliveryVehicle darüber informieren, dass ein Fahrzeug auf dem Weg zum nächsten Halt ist. Alle anderen Haltestellen werden 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 Anfrageheader muss ein Feld Authorization mit dem Wert Bearer <token> enthalten, wobei <token> von Ihrem Server gemäß den Richtlinien in [Dienstkontorollen][6] und [JSON Web Tokens][6] ausgestellt wird.
  • Der Anfragetext muss eine DeliveryVehicle-Entität enthalten:

Beispiel eines curl-Befehls:

 # 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

placeidtrips1: /maps/documentation/mobility/fleet-engine/reference/tasks/rpc/maps.fleetengine.delivery.v1.html#locationinfo placeidtrips2: /maps/documentation/mobility/fleet-engine/reference/tasks/rest/v1/LocationInfo.html placeidtrips3: /maps/documentation/mobility/fleet-engine/reference/tasks/rpc/maps.fleetengine.delivery.v1.html#maps.fleetengine.delivery.v1.LocationInfo.FIELDS.string.maps.fleetengine.delivery.v1.LocationInfo.place placeidtrips4: /maps/documentation/mobility/fleet-engine/reference/tasks/rest/v1/LocationInfo.html#FIELDS.place

Fahrzeug kommt an der Haltestelle an

Die Fleet Engine muss benachrichtigt werden, wenn ein Fahrzeug an einer Haltestelle ankommt.

Pflichtfelder für Haltestellen-Updates

Die Fleet Engine ignoriert alle anderen Felder in der Entität für die Benachrichtigung.

FeldWert
remainingVehicleJourneySegments Liste der verbleibenden Haltestellen des Fahrzeugs, deren Status als State.NEW gekennzeichnet ist.

Beispiel für Ankunft an Haltestelle

In den folgenden Beispielen wird gezeigt, wie Sie die Fleet Engine mithilfe der [Java gRPC-Bibliothek][5] oder eines HTTP-REST-Aufrufs an UpdateDeliveryVehicle darüber informieren, dass ein Fahrzeug am Halt angekommen ist. Alle anderen Haltestellen werden als neu gekennzeichnet.

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 Anfrageheader muss ein Feld Authorization mit dem Wert Bearer <token> enthalten, wobei <token> von Ihrem Server gemäß den Richtlinien in [Dienstkontorollen][6] und [JSON Web Tokens][6] ausgestellt wird.
  • Der Anfragetext muss eine DeliveryVehicle-Entität enthalten:

Beispiel eines curl-Befehls:

  # 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 hält an

Die Fleet Engine muss benachrichtigt werden, wenn ein Fahrzeug einen Halt abgeschlossen hat. Dadurch werden alle mit dem Halt verknüpften Aufgaben in den Status GESCHLOSSEN versetzt.

Pflichtfelder für Haltestellen-Updates

Die Fleet Engine ignoriert alle anderen Felder in der Entität für die Benachrichtigung.

FeldWert
remainingVehicleJourneySegments Liste der verbleibenden Haltestellen des Fahrzeugs, deren Status als State.NEW gekennzeichnet ist. Der Status der ersten Haltestelle in der Liste muss als State.ENROUTE gekennzeichnet sein.

Schließt ein Beispiel für einen Stopp ab

In den folgenden Beispielen wird gezeigt, wie Sie die Fleet Engine mithilfe der [Java gRPC-Bibliothek][5] oder eines HTTP-REST-Aufrufs an UpdateDeliveryVehicle darüber informieren, dass ein Fahrzeug am Halt angekommen ist. Alle anderen Haltestellen werden als neu gekennzeichnet.

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 Anfrageheader muss ein Feld Authorization mit dem Wert Bearer <token> enthalten, wobei <token> von Ihrem Server gemäß den Richtlinien in [Dienstkontorollen][6] und [JSON Web Tokens][6] ausgestellt wird.
  • Der Anfragetext muss eine DeliveryVehicle-Entität enthalten:

Beispiel eines curl-Befehls:

 # 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

placeidtrips1: /maps/documentation/mobility/fleet-engine/reference/tasks/rpc/maps.fleetengine.delivery.v1.html#locationinfo placeidtrips2: /maps/documentation/mobility/fleet-engine/reference/tasks/rest/v1/LocationInfo.html placeidtrips3: /maps/documentation/mobility/fleet-engine/reference/tasks/rpc/maps.fleetengine.delivery.v1.html#maps.fleetengine.delivery.v1.LocationInfo.FIELDS.string.maps.fleetengine.delivery.v1.LocationInfo.place placeidtrips4: /maps/documentation/mobility/fleet-engine/reference/tasks/rest/v1/LocationInfo.html#FIELDS.place

Nächste Schritte

  • [Aufgaben abschließen][4]

[1]: /maps/documentation/mobility/fleet-engine/journeys/tasks/create-shipment-tasks [3]: /maps/documentation/mobility/fleet-engine/essentials/tasks-intro [4]: /maps/documentation/mobility/fleet-engine/journeys/tasks/finalize-tasks [5]: /maps/documentation/mobility/fleet-engine/essentials/client-libraries-tasks [6]: /maps/documentation/mobility/fleet-engine/essentials/set-up-fleet/service-accounts