Haltestellenstatus aktualisieren

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

Wie unter Geplante Aufgaben in den Fleet Engine Essentials beschrieben, erstellen Sie Aufgaben und ordnen sie einem Fahrzeugstopp zu, um die tatsächliche Verknüpfung zwischen der Aufgabe und dem Ort zu modellieren, an dem das Fahrzeug voraussichtlich anhalten wird, damit der Fahrer die Aufgabe erledigen kann.

Dort können Sie den Fortschritt von Aufgaben während ihres gesamten Lebenszyklus verwalten, indem Sie Updates an die Fleet Engine senden, damit sie die Routen- und Statusaktualisierungen während des gesamten Ablaufs der Aufgabe optimal ausführen kann. Eine wichtige Möglichkeit dazu besteht darin, die Haltestelle zu aktualisieren, wenn sich das Fahrzeug der Haltestelle nähert, ankommt und sie verlässt. So können sowohl Flottenbetreiber als auch Endnutzer Berichte und Analysen zum Fortschritt der Aufgabe erstellen. Diese Statusaktualisierungen sind:

  • Unterwegs: Im STATE-Enum für VehicleStop wird mit ENROUTE angegeben, dass die Haltestelle als Nächstes auf der Liste für den Fahrzeugreiseplan steht. Aus Sicht der Aufgabe bedeutet das, dass alle mit der Haltestelle verknüpften Aufgaben als Nächstes auf der Liste abgearbeitet werden.
  • Angekommen: Im Enum STATE für VehicleStop wird mit ARRIVED angegeben, dass das Fahrzeug an der Haltestelle angekommen ist. Aus Sicht der Aufgabe bedeutet das, dass an allen mit der Haltestelle verknüpften Aufgaben aktiv gearbeitet wird.
  • Abgeschlossen: Sie kennzeichnen eine Haltestelle als abgeschlossen, indem Sie sie aus der Liste der Haltestellen für das Fahrzeug entfernen. Dadurch werden alle zugehörigen Aufgaben automatisch als GESCHLOSSEN gekennzeichnet. Weitere Informationen zum Schließen von Aufgaben finden Sie unter Aufgaben abschließen.

In diesem Dokument wird beschrieben, wie Sie den Status einer Haltestelle mithilfe serverseitiger Methoden 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 Conditions zu vermeiden und eine einzige zentrale Datenquelle zu haben.

Fahrzeug ist auf dem Weg zur Haltestelle

Ihr System sollte Fleet Engine benachrichtigen, wenn das Fahrzeug mit der Navigation zur nächsten Haltestelle beginnt. Dadurch werden die geschätzte Ankunftszeit und die Routenberechnung verbessert.

Pflichtfelder für Updates für Haltestellen

Alle anderen Felder im Element werden von der Fleet Engine für die Benachrichtigung ignoriert.

FeldWert
remainingVehicleJourneySegments Liste der verbleibenden Haltestellen mit dem Status „State.NEW“.

Beispiel für eine Route zur Haltestelle

In den folgenden Beispielen wird gezeigt, wie Sie Fleet Engine darüber informieren, dass sich ein Fahrzeug auf dem Weg zur nächsten Haltestelle befindet. Dazu können Sie entweder die Java gRPC-Bibliothek oder einen HTTP-REST-Aufruf an UpdateDeliveryVehicle verwenden. 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 das Feld Authorization mit dem Wert Bearer <token> enthalten. Dabei wird <token> von deinem Server gemäß den in den Abschnitten Rollen von Dienstkonten und JSON Web Tokens beschriebenen Richtlinien ausgestellt.
  • 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

Fahrzeug kommt an der Haltestelle an

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

Pflichtfelder für Aktualisierungen von Haltestellen

Alle anderen Felder im Element werden von der Fleet Engine für die Benachrichtigung ignoriert.

FeldWert
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 Fleet Engine darüber informieren, dass ein Fahrzeug an der Haltestelle angekommen ist. Dazu können Sie entweder die Java gRPC-Bibliothek oder einen HTTP-REST-Aufruf an UpdateDeliveryVehicle verwenden. 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
  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 das Feld Authorization mit dem Wert Bearer <token> enthalten. Dabei wird <token> von deinem Server gemäß den in den Abschnitten Rollen von Dienstkonten und JSON Web Tokens beschriebenen Richtlinien ausgestellt.
  • 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 beendet einen Halt

Fleet Engine muss benachrichtigt werden, wenn ein Fahrzeug eine Haltestelle erreicht. Dadurch werden alle mit der Haltestelle verknüpften Aufgaben in den Status „Geschlossen“ gesetzt.

Pflichtfelder für Aktualisierungen von Haltestellen

Alle anderen Felder im Element werden von der Fleet Engine für die Benachrichtigung ignoriert.

FeldWert
remainingVehicleJourneySegments Liste der verbleibenden Haltestellen mit dem Status „State.NEW“. Der Status des ersten Halts in der Liste muss „State.ENROUTE“ sein.

Beispiel für eine Haltestelle fertigstellen

In den folgenden Beispielen wird gezeigt, wie Sie Fleet Engine darüber informieren, dass ein Fahrzeug an der Haltestelle angekommen ist. Dazu können Sie entweder die Java gRPC-Bibliothek oder einen HTTP-REST-Aufruf an UpdateDeliveryVehicle verwenden. 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
  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 das Feld Authorization mit dem Wert Bearer <token> enthalten. Dabei wird <token> von deinem Server gemäß den in den Abschnitten Rollen von Dienstkonten und JSON Web Tokens beschriebenen Richtlinien ausgestellt.
  • 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

Nächste Schritte