Haltestellenstatus aktualisieren

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

Wie in Geplante Aufgaben in den Fleet Engine Essentials beschrieben, erstellen Sie Aufgaben und verknüpfen sie mit einem Fahrzeugstopp, um die reale Beziehung zwischen der Aufgabe und dem Ort zu modellieren, an dem das Fahrzeug anhalten soll, damit der Fahrer die Aufgabe erledigen kann.

Von dort aus verwalten Sie den Fortschritt von Aufgaben während ihres gesamten Lebenszyklus, indem Sie Updates an Fleet Engine senden, damit die Routenplanung und Statusaktualisierungen während der gesamten Aufgabe optimal ausgeführt werden können. Eine wichtige Möglichkeit hierfür ist, die Haltestelle zu aktualisieren, wenn sich das Fahrzeug nähert, an der Haltestelle ankommt und sie verlässt. So können sowohl Flottenbetreiber als auch Endnutzer Berichte und Analysen zum Fortschritt der Aufgabe erstellen. Folgende Statusupdates sind möglich:

  • Unterwegs: Die STATE-Aufzählung für VehicleStop verwendet ENROUTE, um anzugeben, dass die Haltestelle als Nächstes auf der Liste für die Fahrzeugroute steht. Aus Sicht der Aufgabe bedeutet das, dass jede Aufgabe, die mit dem Stopp verknüpft ist, als Nächstes auf der Liste steht.
  • Angekommen: Das STATE-Enum für VehicleStop verwendet ARRIVED, um anzugeben, dass das Fahrzeug an der Haltestelle angekommen ist. Aus Sicht der Aufgabe bedeutet das, dass alle Aufgaben, die mit dem Stopp verknüpft sind, aktiv bearbeitet werden.
  • Abgeschlossen: Sie markieren einen Stopp als abgeschlossen, indem Sie ihn aus der Liste der Stopps für das Fahrzeug entfernen. In diesem Fall markiert 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 Stoppstatus serverseitig 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 Conditions zu vermeiden und eine Single Source of Truth beizubehalten.

Fahrzeug ist auf dem Weg zur Haltestelle

Ihr System sollte Fleet Engine benachrichtigen, wenn das Fahrzeug mit der Navigation zum nächsten Stopp beginnt. Dadurch werden die Berechnungen der voraussichtlichen Ankunftszeit und der Routen verbessert.

Pflichtfelder für Haltestellenaktualisierungen

Alle anderen Felder in der Benachrichtigungsentität werden von Fleet Engine ignoriert.

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

Beispiel für die Anfahrt zu einem Halt

In den folgenden Beispielen wird gezeigt, wie Sie Fleet Engine benachrichtigen, dass ein Fahrzeug auf dem Weg zu seiner nächsten Haltestelle ist. Dazu wird entweder die Java-gRPC-Bibliothek oder ein HTTP-REST-Aufruf an UpdateDeliveryVehicle verwendet. 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 und JSON Web Tokens ausgestellt wird.
  • Der Anfragetext muss eine DeliveryVehicle-Einheit 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 Haltestellenaktualisierungen

Alle anderen Felder in der Benachrichtigungsentität werden von Fleet Engine ignoriert.

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

Beispiel für Ankunft an Haltestelle

In den folgenden Beispielen wird gezeigt, wie Sie 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 Anfrageheader muss ein Feld Authorization mit dem Wert Bearer <token> enthalten, wobei <token> von Ihrem Server gemäß den Richtlinien in Dienstkontorollen und JSON Web Tokens ausgestellt wird.
  • Der Anfragetext muss eine DeliveryVehicle-Einheit 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

Fleet Engine muss benachrichtigt werden, wenn ein Fahrzeug einen Stopp beendet. Dadurch wird für alle mit dem Stopp verknüpften Aufgaben der Status „GESCHLOSSEN“ festgelegt.

Pflichtfelder für Haltestellenaktualisierungen

Alle anderen Felder in der Benachrichtigungsentität werden von Fleet Engine ignoriert.

FeldWert
remainingVehicleJourneySegments Liste der verbleibenden Haltestellen mit dem Status „NEW“. Der Status der ersten Haltestelle auf der Liste muss State.ENROUTE sein.

Vervollständigt ein Beispiel für das Beenden

In den folgenden Beispielen wird gezeigt, wie Sie 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 Anfrageheader muss ein Feld Authorization mit dem Wert Bearer <token> enthalten, wobei <token> von Ihrem Server gemäß den Richtlinien in Dienstkontorollen und JSON Web Tokens ausgestellt wird.
  • Der Anfragetext muss eine DeliveryVehicle-Einheit 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