Fleet Engine のスタートガイドでフリート パフォーマンスの向上を実現

Fleet Engine Deliveries API を使用して、配送のファースト ワンマイルとラスト ワンマイルのフリート アクティビティをモデル化します。この API は、Android 用と iOS 用の Driver SDK を使用して使用するか、HTTP REST または gRPC 呼び出しを使用して直接使用できます。

初期設定

Google Cloud コンソールで Fleet Engine Deliveries API を構成します。

設定を確認する

サービス アカウントを作成したら、設定が完了し、配送車両を作成できることを確認します。設定をすぐに確認することで、プロジェクトの設定時に発生する可能性のある一般的な承認の問題に対処できます。設定を確認するには、次の 2 つの方法があります。

クライアント ライブラリ

未加工の gRPC や REST よりも優れたデベロッパー エクスペリエンスを実現するには、いくつかの一般的なプログラミング言語でクライアント ライブラリを使用します。サーバー アプリケーション用のクライアント ライブラリを取得する手順については、クライアント ライブラリをご覧ください。

このドキュメントの Java の例は、gRPC に精通していることを前提としています。

データ構造

Fleet Engine Deliveries API は、次の 2 つのデータ構造を使用して荷物の集荷と配送をモデル化します。

  • 荷物の輸送に使用された配送車両。
  • 荷物の集荷と配送のタスク。

また、タスクを使用して、1 日を通してドライバーの休憩と予定されている停車地をモデル化します。

配達車両

配達車両は、荷物をデポから配達場所へ、および集荷場所からデポに輸送します。場合によっては、集荷場所から配達場所に直接荷物を輸送することもできます。

Driver SDK を使用して Fleet Engine に DeliveryVehicle オブジェクトを作成し、配送とフリート追跡のために位置情報の更新を送信します。

注: 最大 500 個のタスクと、残りの 300 個の車両の旅程セグメントを DeliveryVehicle オブジェクトに割り当てることができます。

タスク

車両が 1 日に行うアクションについては、アクションのタイプに応じてタスクを割り当てます。

  • 集荷と配送の場合は、[配送タスク] を割り当てます。
  • 必要な休憩など、ドライバーが対応できない時間には、利用不可タスクを割り当てます。
  • ドロップ ボックスやお客様の場所での運転以外のタスクには、スケジュールされた停止タスクを割り当てます。

割り当てる各タスクには一意のタスク ID が必要ですが、タスクは同じトラッキング ID を共有できます。Fleet Engine は、各タスクの ETA 時間枠を計算する際、すべてのタスクと、タスクのスケジュール順序を使用して見積もりを行います。タスク ID の詳細については、タスク ID のガイドラインをご覧ください。

Fleet Engine でタスクを作成するには、Driver SDK タスク マネージャーを使用します。

配送タスク

荷物の集荷と配送の両方の配送タスクを作成し、次の情報を含めます。

  • 受け取りまたは宅配の配送先。
  • 荷物追跡番号または ID。
  • タスクを完了する、駐車場を探す、または引き渡し場所まで徒歩で移動するための追加の時間を考慮した滞留時間。
  • 一意のタスク ID。タスク ID のガイドラインをご覧ください。

詳しくは、次のトピックをご覧ください。

Android

iOS

利用不可タスク

利用不可タスクには、車両の給油のための休憩や運転手の休憩休憩など、車両の集荷や配送ができない期間が含まれます。

次の情報を使用して、利用不可のタスクを作成します。

  • 休憩の長さ。
  • (省略可)挿入点の場所。特定の場所を指定する必要はありませんが、指定すると、1 日を通してより正確な到着予定時刻を指定できます。

詳しくは、次のトピックをご覧ください。

Android

iOS

スケジュール設定された停止タスク

スケジュールされた停車タスクを作成して、配達車両が行う必要がある停車地をモデル化します。たとえば、同じ場所での他の配達や集荷とは無関係に、毎日特定の場所で集荷をスケジュール設定する停止タスクを作成します。また、ドロップ ボックスからの集荷、フィーダーと車両の乗り換え、サービス センターやサービス ポイントでの停車地をモデル化するための、スケジュール設定された停止タスクを作成することもできます。

詳しくは、次のトピックをご覧ください。

Android

iOS

タスク ID のガイドライン

タスク ID を作成する場合は、以下の内容と形式に関するガイドラインに沿って作成してください。

  • 一意のタスク ID を作成する
  • 個人を特定できる情報(PII)やクリアテキスト データは公開しないでください。
  • 有効な Unicode 文字列を使用してください。
  • 使用できる文字数は 64 文字までです。
  • ASCII 文字「/」、「:」、「\"」、「?」、「#」は含めないでください。
  • Unicode 正規化フォーム C に沿って正規化します。

適切なタスク ID の例を次に示します。

  • 566c33d9-2a31-4b6a-9cd4-80ba1a0c643b
  • e4708eabcfa39bf2767c9546c9273f747b4626e8cc44e9630d50f6d129013d38
  • NTA1YTliYWNkYmViMTI0ZmMzMWFmOWY2NzNkM2Jk

次の表に、サポートされていないタスク ID の例を示します。

サポートされていないタスク ID 理由
8/31/2019-20:48-46.70746,-130.10807,-85.17909,61.33680 個人情報(PII)と文字要件に違反する(カンマ、ピリオド、コロン、スラッシュ)。
JohnDoe-577b484da26f-Cupertino-SantaCruz 個人情報(PII)の要件に違反している。
4R0oXLToF"112 Summer Dr. East Hartford, CT06118"577b484da26f8a 個人情報(PII)と文字要件に違反しています(空白文字、カンマ、引用符)。64 文字を超える。

その他のリソース

各データ構造に含まれる特定のフィールドについては、DeliveryVehiclegRPCREST)と TaskgRPCREST)の API リファレンス ドキュメントをご覧ください。

自動車のライフサイクル

DeliveryVehicle オブジェクトは、配送のファースト ワンマイルまたはラスト ワンマイルの車両を表します。次のコマンドを使用して DeliveryVehicle オブジェクトを作成します。

  • Fleet Engine API の呼び出しに使用されるサービス アカウントを含む Google Cloud プロジェクトのプロジェクト ID。
  • 顧客所有の車両 ID。

車両ごとに一意の車両 ID を使用してください。元の車両にアクティブなタスクがない場合を除き、車両 ID を再利用しないでください。

Fleet Engine は、UpdateDeliveryVehicle を使用して更新されていない DeliveryVehicle オブジェクトを 7 日後に自動的に削除されます。車両が存在するかどうかを確認するには:

  1. UpdateDeliveryVehicle を呼び出します。
  2. NOT_FOUND エラーが発生した場合は、CreateDeliveryVehicle を呼び出して車両を再作成します。通話から車両が返された場合は、引き続き更新が可能です。

車両属性

DeliveryVehicle エンティティには DeliveryVehicleAttribute の繰り返しフィールドが含まれています。ListDeliveryVehicles API には、返される DeliveryVehicle エンティティを、指定された属性を持つエンティティに制限できる filter フィールドが含まれています。DeliveryVehicleAttribute は、Fleet Engine のルーティング動作には影響しません。

個人を特定できる情報(PII)や機密情報を属性に含めないでください。この項目はユーザーに表示される可能性があるためです。

タスクのライフサイクル

Deliveries API gRPC または REST インターフェースを使用して、Fleet Engine でタスクを作成、更新、クエリできます。

Task オブジェクトには、ライフサイクルの経過を追跡する状態フィールドがあります。値が OPEN から CLOSED に移行します。新しいタスクは OPEN 状態で作成されます。これは次のいずれかを示しています。

  • タスクはまだ配達車両に割り当てられていません。
  • 配達車両は、タスクに割り当てられた車両の停車地をまだ通過していません。

タスクのガイドライン

車両にタスクを割り当てることができるのは、車両が OPEN 状態の場合のみです。

タスクをキャンセルするには、車両の停車場所のリストから削除すると、タスクの状態が自動的に「CLOSED」に設定されます。

タスクの車両がタスクの車両の停止を完了したとき:

  1. タスクの結果フィールドを [SUCCEEDED] または [FAILED] に更新します。

  2. イベントのタイムスタンプを指定します。

    JavaScript Fleet Tracking ライブラリがタスクの結果を示し、タスクのステータスが自動的に「CLOSED」に設定されます。詳しくは、JavaScript Fleet Tracking ライブラリを使用してフリートをトラッキングするをご覧ください。

車両と同様に、Fleet Engine は 7 日後に更新されていないタスクを削除します。既存の ID でタスクを作成しようとすると、エラーが返されます。

注: Fleet Engine では、タスクの明示的な削除はサポートされていません。サービスは、更新されずに 7 日後にタスクを自動的に削除します。タスクデータを 7 日間を超えて保持する場合は、この機能を自分で実装する必要があります。

タスク属性

Task エンティティには TaskAttribute の繰り返しフィールドが含まれます。このフィールドには、文字列、数値、ブール値の 3 つの型のいずれかの値を指定できます。ListTasks API には filter フィールドがあり、返される Task エンティティを、指定された属性を持つエンティティに限定できます。タスク属性は Fleet Engine のルーティング動作に影響しません。

個人を特定できる情報(PII)などの機密情報は、ユーザーに表示される可能性があるため、属性に含めないでください。

車両とタスクのライフサイクルを管理する

注意: 内部システムは、Fleet Engine Deliveries API がユーザーに代わって拡張するデータの信頼できるソースとして機能します。

システムで車両とタスクのライフサイクルを管理するには、Fleet Engine Deliveries API を使用して、車両と車両に関連するタスクを作成、更新、追跡します。

同時に、ドライバ アプリケーションは Fleet Engine と直接通信して、デバイスの位置情報とルート情報を更新します。このモデルにより Fleet Engine は リアルタイムの位置情報を効率的に管理できます位置情報がトラッキング ライブラリに直接送信されます。このライブラリを使用して、ユーザーに注文のステータスに関する最新情報を伝えることができます。

たとえば、次のシナリオがあるとします。

  • ドライバーが配達センターに近づいています。ドライバ アプリケーションが Fleet Engine に位置情報を送信します。
  • Fleet Engine はデバイスの位置情報をトラッキング ライブラリに送信します。ユーザー アプリケーションはこのライブラリを使用して、荷物が近くにあることを消費者に警告します。
  • ドライバーは配送を完了したら、ドライバー アプリケーションの [Shipment delivered] ボタンをクリックします。
  • 「配送済み」のアクションでは、情報がバックエンド システムに送信されます。バックエンド システムは、必要なビジネス検証と確認手順を実施します。
  • システムがタスクを成功として確認し、Deliveries API を使用して Fleet Engine を更新します。

次の図は、これらのプロセスを一般的なレベルで示しています。また、システム、クライアント、Fleet Engine の間の標準的な関係も示しています。

Deliveries API の統合を示す図>

クライアント トークンを管理する

ドライバ アプリケーションから送信され、Fleet Engine に直接送信される位置情報の更新には、認証トークンが必要です。クライアントから Fleet Engine への更新を処理する場合のおすすめの方法は次のとおりです。

  1. Fleet Engine Delivery の信頼されていないドライバ ユーザーのサービス アカウント ロールを使用してトークンを生成します。

  2. 限定されたスコープのトークンをドライバ アプリケーションに提供する。このスコープでは、Fleet Engine 内のデバイスの位置情報の更新のみが許可されます。

このアプローチにより、信頼性の低い環境とみなされるモバイル デバイスからの呼び出しが最小権限の原則に従うようになります。

その他のサービス アカウントのロール

特定のタスクの更新など、信頼されていないドライバのロール以外で Fleet Engine を直接更新するドライバ アプリケーションを承認する場合は、信頼できるドライバのロールを使用できます。信頼できるドライバのロールを使用するモデルについては、信頼できるドライバモデルをご覧ください。

信頼できない、信頼できるドライバのロールの使用方法の詳細については、Cloud プロジェクトの設定をご覧ください。

勤務日のモデルを作成する

次の表に、配送および物流会社におけるファースト ワンマイルまたはラスト ワンマイルのドライバーの勤務日を示します。詳細は会社によって異なる場合がありますが、勤務日のモデル化は確認できます。

時間アクティビティモデリング
1 日の始まりから 24 時間以内 コーディネーターが荷物を配送車両またはルートに割り当てます。 配送、集荷、休憩などのタスクを Fleet Engine で事前に作成できます。たとえば、集荷タスク配送タスク利用不可のスケジュールスケジュール設定された停止などを作成できます。

配送パッケージのセットと配送順序が確定したら、タスクを車両に割り当てます。
1 日の始まり ドライバーはドライバーアプリにログインして、デポでその日をスタートします。 Delivery Driver API を初期化します。必要に応じて、Fleet Engine で配達車両を作成します。
ドライバーが荷物を配達車両に積み込み、荷物をスキャンする。 配送タスクが事前に作成されていない場合は、スキャン時に配送タスクを作成します。
ドライバーが、実行するタスクの順序を確認します。 事前に作成されていない場合は、配送の集荷タスク利用不可のスケジュール停車地のスケジュールを作成します。
ドライバはデポを離れ、完了する次の数のタスクに commit します。 完了順序を commit することで、すべてのタスクまたはタスクのサブセットを車両に割り当てます。
ドライバーが荷物を配達します。 停車地に到着したら、停車地に到着する車両に関連するアクションを実行します。荷物を配達したら、配送タスクを終了し、必要に応じて配送ステータスとその他のメタ情報を保存します。停車地ですべてのタスクを完了し、次の停車地への運転を開始する前に、車両が停車地を完了および次の停車地に向かっている車両に関連するアクションを実行します。
ドライバーはフィーダー車両に会い、追加の荷物を配達車両に移す。 フィーダー車両と配送車両を乗り換える際の待ち合わせ場所は、停車地としてモデル化する必要があります。

配送を転送してスキャンした後、配送タスクを作成します(まだ作成していない場合)。次に、タスクを車両に割り当てタスクの順序を更新して、タスクの完了順序を更新します。
ドライバーが集荷リクエストの通知を受け取る。 集荷リクエストを承認したら、荷物の受け取りタスクを作成します。次に、タスクを車両に割り当てタスクの順序を更新して、タスクの実行順序を更新します。
正午 ドライバーは昼食休憩を取る。 ロケーションが利用不可タスクに関連付けられている場合は、他のタスクと同様に扱います。車両が停車地に到着する、車両が停車地を完了次の停車地へ向かっている車両に関連するアクションを実行する。

それ以外の場合は、休憩が終わるまではそれ以上の対応は必要ありません。 次のタスクと残りのタスクを確認し、タスクの順序を更新して、タスクを削除します。
ドライバーが荷物を受け取る。 これは、停車地のようにモデル化されます。車両の停車地への到着タスクの終了に関連するアクションを実行します。また、必要に応じて配送ステータスなどのメタ情報を保存します。停車地ですべてのタスクを完了し、次の停車地への運転を開始する前に、車両が停車地を完了および次の停車地に向かっている車両に関連するアクションを実行します。注: 正しい請求が行われるようにするには、すべての集荷に対応する配達タスクが必要です。その日にドライバーの同じルート上の別の場所に集荷を配達する場合は、その配達タスクをルート上の他の配達タスクとしてモデル化することをおすすめします。ドライバーがピックアップを車庫に持ち帰る場合は、車庫の目的地に配達タスクを作成することをおすすめします。
ドライバーは、ドロップ ボックスから荷物を受け取るために、スケジュールされた停車を行います。 他の乗車停留所と同様にモデル化されます。停車地に到着する車両タスクの終了に関連するアクションの実行。停車地ですべてのタスクを完了し、次の停車地への運転を開始したら、車両が停車地を完了および次の停車地に向かっている車両に関連するアクションを実行します。
ドライバーが、荷物が別の場所に配送されるという通知を受け取りました。 元の配送タスクのステータスを COMPLETED に設定し、新しい配送場所に対して新しい配送タスクを作成します。詳しくは、配送の配送先を変更するをご覧ください。
ドライバーが荷物を配達しようとしたが、配達できなかった。 これは、配信の停止の成功と同様にモデル化され、配信タスクを完了としてマークします。停車地に到着する車両に関連するアクションを実行します。配送に失敗した場合は、タスクを終了し、必要に応じて配送ステータスとその他のメタ情報を保存します。停車地ですべてのタスクを完了し、次の停車地への運転を開始する前に、車両が停車地を完了および次の停車地に向かっている車両に関連するアクションを実行します。
ドライバーに荷物を留め置く(配達しない)ように通知された。 通知を受信して確認したら、タスクのステータスを COMPLETED に設定します。
ドライバーは、次に特定の荷物を配達するように通知され、確約した配達注文を変更しました。 タスクの順序を更新します
ドライバーが注文した品物を注文せずに配送することを選択します。 タスクの順序を更新してから、通常どおりに進みます。
ドライバーが複数の荷物を 1 か所に配達している。 これは、単一の配送の停車地と同様にモデル化されます。 停車地に到着したら、停車地に到着する車両に関連する操作を行います。各配送を配達したら、各タスクを終了します。必要に応じて、店舗の配送ステータスとその他のメタ情報も入力します。停車地ですべてのタスクを完了し、次の停車地への運転を開始する前に、車両が停車地を完了および次の停車地に向かっている車両に関連するアクションを実行します。
日程終了 ドライバーがデポに戻る。 ドライバーが配送中に集荷された荷物を運送業者に戻した場合は、正しい請求が行われるように、配送タスクとして各パッケージを作成して閉じる必要もあります。これは、他の配送所要所と同様に、配送拠点をモデル化することで実施できます。その車両の停車場所が配達の停車地として使用されていなくても、必要に応じてその車両の停車地をスケジュールされた停車地としてモデル化できます。停車地をモデル化すると、ドライバーはデポに戻るルートを確認し、到着予定時刻を可視化できます。

位置情報の更新の仕組み

Fleet Engine で最高のパフォーマンスを得るには、車両位置情報の更新のストリームを提供します。次のいずれかの方法で最新情報を提供します。

  1. Driver SDK を使用します(AndroidiOS)。最もシンプルなオプションです。
  2. カスタムコードを使用します。これは、位置情報がバックエンド経由でリレーされる場合や、Android または iOS 以外のデバイスを使用している場合に役立ちます。

車両位置情報の更新を提供する方法に関係なく、配達車両が停車地に到着中(車庫を含む)と停車地に到着したときは、バックエンドで Fleet Engine を更新します。Fleet Engine は、これらのイベントを自動的に検出しません。

車両の停車場所と配送先

車両は、配達車両が出荷作業などの作業を完了する場所です。ローディング ホルダーなどのアクセス ポイントや、道路にスナップされた場所のいずれかです。

配送場所とは、荷物が配達または集荷される場所です。車両の停車場所までは徒歩で移動する必要があります。

たとえば、ドライバーがショッピング モール内の店舗に荷物を配達している場合、配達車両は、店舗に最も近いエントランスの近くにあるショッピング モールの駐車場に停車します。これが車両の停車地です。その後、運転手は車両の停車地から歩いて、ショッピング モール内の店舗のある場所に移動します。これは配送先です。

ユーザーが配送追跡を快適に行えるように、配送タスクが車両の停車場所にどのように割り当てられるかを考慮してください。また、配送タスクの残りの車両拠点の数がユーザーに報告され、配送の進捗状況を確認できるようになっています。

たとえば、ドライバーが 1 つのオフィス ビルディングに多数の配達を行っている場合は、すべての配達タスクを 1 つの車両停留所に割り当てることを検討してください。各配送タスクが独自の車両の停車場所に割り当てられている場合、車両が目的地までの停車地の数を制限されている場合にのみ追跡が可能になるため、荷物追跡エクスペリエンスのユーザーの有用性が低くなります。短時間に多くの車両の停車場所が完了しても、ユーザーが配送の進捗状況を追跡するための時間を十分に確保することはできません。

モバイル SDK を使用する

Driver SDK を呼び出す前に、必ず初期化してください。

Delivery Driver API を初期化する

Driver SDK で Delivery Driver API を初期化する前に、Navigation SDK を初期化する必要があります。次に、次の例に示すように Delivery Driver API を初期化します。

static final String PROVIDER_ID = "provider-1234";
static final String VEHICLE_ID = "vehicle-8241890";

NavigationApi.getNavigator(
   this, // Activity.
   new NavigatorListener() {
     @Override
     public void onNavigatorReady(Navigator navigator) {
       DeliveryDriverApi.createInstance(DriverContext.builder(getApplication())
         .setNavigator(navigator)
         .setProviderId(PROVIDER_ID)
         .setVehicleId(VEHICLE_ID)
         .setAuthTokenFactory((context) -> "JWT") // AuthTokenFactory returns JWT for call context.
         .setRoadSnappedLocationProvider(NavigationApi.getRoadSnappedLocationProvider(getApplication()))
         .setNavigationTransactionRecorder(NavigationApi.getNavigationTransactionRecorder(getApplication()))
         .setStatusListener((statusLevel,statusCode,statusMsg) -> // Optional, surfaces polling errors.
             Log.d("TAG", String.format("New status update. %s, %s, %s", statusLevel, statusCode, statusMsg)))
         .build));
     }
     @Override
     public void onError(int errorCode) {
       Log.e("TAG", String.format("Error loading Navigator instance: %s", errorCode));
     }
   });

使用例

このセクションでは、Deliveries API を使用して一般的なユースケースをモデル化する方法について説明します。

一意のエンティティ ID

REST 呼び出しで使用される一意のエンティティ ID の形式と値は、Fleet Engine からは見えません。自動インクリメント ID は使用せず、ID に運転手の電話番号などの個人を特定できる情報(PII)が含まれないようにしてください。

車両を作成する

車両は、Driver SDK から、または gRPC や REST を使用するサーバー環境から作成できます。

gRPC

新しい車両を作成するには、Fleet Engine に対して CreateDeliveryVehicle を呼び出します。CreateDeliveryVehicleRequest オブジェクトを使用して、新しい配達車両の属性を定義します。Name フィールドに指定された値は、ユーザー指定の ID の API ガイダンスに従って無視されます。車両 ID を設定するには、DeliveryVehicleId フィールドを使用する必要があります。

DeliveryVehicle を作成するときに、必要に応じて次のフィールドを指定できます。

  • 属性
  • LastLocation
  • タイプ

他のフィールドは設定しないでください。この場合、Fleet Engine は、これらのフィールドが読み取り専用であるか、UpdateDeliveryVehicle の呼び出しでのみ更新できるため、エラーを返します。

オプション フィールドを設定せずに車両を作成するには、CreateDeliveryVehicleRequestDeliveryVehicle フィールドを未設定のままにします。

次の例は、Java gRPC ライブラリを使用して車両を作成する方法を示しています。

    static final String PROJECT_ID = "my-delivery-co-gcp-project";
    static final String VEHICLE_ID = "vehicle-8241890"; // Avoid auto-incrementing IDs.

    DeliveryServiceBlockingStub deliveryService =
      DeliveryServiceGrpc.newBlockingStub(channel);

    // Vehicle settings
    String parent = "providers/" + PROJECT_ID;
    DeliveryVehicle vehicle = DeliveryVehicle.newBuilder()
      .addAttributes(DeliveryVehicleAttribute.newBuilder()
        .setKey("route_number").setValue("1"))  // Opaque to the Fleet Engine
      .build();

    // Vehicle request
    CreateDeliveryVehicleRequest createVehicleRequest =
      CreateDeliveryVehicleRequest.newBuilder()  // No need for the header
          .setParent(parent)
          .setDeliveryVehicleId(VEHICLE_ID)     // Vehicle ID assigned by the Provider
          .setDeliveryVehicle(vehicle)
          .build();

    // Error handling
    // If Fleet Engine does not have vehicle with that ID and the credentials of the
    // requestor pass, the service creates the vehicle successfully.

    try {
      DeliveryVehicle createdVehicle =
        deliveryService.createDeliveryVehicle(createVehicleRequest);
    } catch (StatusRuntimeException e) {
      Status s = e.getStatus();
      switch (s.getCode()) {
         case ALREADY_EXISTS:
           break;
         case PERMISSION_DENIED:
           break;
      }
      return;
    }

REST

サーバー環境から車両を作成するには、CreateDeliveryVehicle に対して HTTP REST 呼び出しを行います。

POST https://fleetengine.googleapis.com/v1/providers/<project_id>/deliveryVehicles?deliveryVehicleId=<id>

<id> は、フリート内の配送車両の一意の識別子です。

リクエスト ヘッダーには、値が Bearer <token>Authorization フィールドが含まれている必要があります。ここで、<token>Fleet Engine トークン ファクトリによって発行されたトークンです。

POST 本文は、作成する DeliveryVehicle エンティティを表します。次のオプション フィールドを指定できます。

  • 属性
  • lastLocation
  • type

curl コマンドの例:

# Set $JWT, $PROJECT_ID, and $VEHICLE_ID in the local
# environment
curl -X POST "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/deliveryVehicles?deliveryVehicleId=${VEHICLE_ID}" \
  -H "Content-type: application/json" \
  -H "Authorization: Bearer ${JWT}" \
--data-binary @- << EOM
{
  "attributes": [{"key": "model", "value": "sedan"}],
  "lastLocation": {"location": {"latitude": 12.1, "longitude": 14.5}}
}
EOM

Fleet Engine は、ユーザー指定の ID の API ガイダンスに従い、DeliveryVehicle エンティティの name フィールドを無視します。他のフィールドは設定しないでください。この場合、Fleet Engine は、これらのフィールドが読み取り専用であるか、UpdateDeliveryVehicle の呼び出しでのみ更新できるため、エラーを返します。

フィールドを設定せずに車両を作成するには、POST リクエストの本文を空のままにします。新しく作成された車両は、POST URL の deliveryVehicleId パラメータから車両 ID を抽出します。

curl コマンドの例:

# Set $JWT, $PROJECT_ID, and $VEHICLE_ID in the local
# environment
curl -X POST "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/deliveryVehicles?deliveryVehicleId=${VEHICLE_ID}" \
  -H "Content-type: application/json" \
  -H "Authorization: Bearer ${JWT}"

荷物の受け取りタスクを作成する

集荷タスクは、Driver SDK から、または gRPC や REST を使用してサーバー環境から作成できます。

gRPC

次の例は、Java gRPC ライブラリを使用して配送受け取りタスクを作成する方法を示しています。

static final String PROJECT_ID = "my-delivery-co-gcp-project";

DeliveryServiceBlockingStub deliveryService =
  DeliveryServiceGrpc.newBlockingStub(channel);

// Task settings
String parent = "providers/" + PROJECT_ID;
Task task = Task.newBuilder()
  .setType(Task.Type.PICKUP)
  .setState(Task.State.OPEN)
  .setTrackingId("my-tracking-id")
  .setPlannedLocation(               // Grand Indonesia East Mall
    LocationInfo.newBuilder().setPoint(
      LatLng.newBuilder().setLatitude(-6.195139).setLongitude(106.820826)))
  .setTaskDuration(
    Duration.newBuilder().setSeconds(2 * 60))
  .setTargetTimeWindow(
    TimeWindow.newBuilder()
      .setStartTime(Timestamp.newBuilder().setSeconds(1680123600))
      .setEndTime(Timestamp.newBuilder().setSeconds(1680130800)))
  .addAttributes(TaskAttribute.newBuilder().setKey("foo").setStringValue("value"))
  .addAttributes(TaskAttribute.newBuilder().setKey("bar").setNumberValue(10))
  .addAttributes(TaskAttribute.newBuilder().setKey("baz").setBoolValue(false))
  .build();

// Task request
CreateTaskRequest createTaskRequest =
  CreateTaskRequest.newBuilder()  // No need for the header
      .setParent(parent)          // Avoid using auto-incrementing IDs for the taskId
      .setTaskId("task-8241890")  // Task ID assigned by the Provider
      .setTask(task)              // Initial state
      .build();

// Error handling
// If Fleet Engine does not have a task with that ID and the credentials of the
// requestor pass, the service creates the task successfully.

try {
  Task createdTask = deliveryService.createTask(createTaskRequest);
} catch (StatusRuntimeException e) {
  Status s = e.getStatus();
  switch (s.getCode()) {
     case ALREADY_EXISTS:
       break;
     case PERMISSION_DENIED:
       break;
  }
  return;
}

REST

サーバー環境から配送受け取りタスクを作成するには、CreateTask に対して HTTP REST 呼び出しを行います。

`POST https://fleetengine.googleapis.com/v1/providers/<project_id>/tasks?taskId=<id>`

<id> は、タスクの一意の識別子です。荷物追跡番号は使用できません。システムにタスク ID がない場合は、UUID(Universally Unique Identifier)を生成できます。

リクエスト ヘッダーには、値が Bearer <token>Authorization フィールドが含まれている必要があります。ここで、<token>Fleet Engine トークン ファクトリによって発行されたトークンです。

リクエストの本文には Task エンティティを含める必要があります。

  • 必須フィールド:

    項目
    type Type.PICKUP
    state State.OPEN
    trackingId 配送の追跡に使用している番号または ID。
    plannedLocation タスクを完了する場所。この場合は、荷物の集荷場所です。
    taskDuration 集荷場所で荷物を受け取るまでの推定所要時間(秒単位)。

  • 省略可能フィールド:

    項目
    targetTimeWindow タスクが完了するまでの時間枠。これはルーティングの動作には影響しません。
    属性 カスタムタスク属性のリスト。各属性には一意のキーが必要です。

エンティティの他のフィールドはすべて、作成で無視されます。割り当てられた deliveryVehicleId がリクエストに含まれている場合、Fleet Engine は例外をスローします。タスクの割り当てには UpdateDeliveryVehicleRequest を使用します。詳しくは、タスクを車両に割り当てるUpdateDeliveryVehicleRequest をご覧ください。

curl コマンドの例:

# Set $JWT, $PROJECT_ID, $TRACKING_ID, and $TASK_ID in the local
# environment
curl -X POST "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/tasks?taskId=${TASK_ID}" \
  -H "Content-type: application/json" \
  -H "Authorization: Bearer ${JWT}" \
  --data-binary @- << EOM
{
  "type": "PICKUP",
  "state": "OPEN",
  "trackingId": "${TRACKING_ID}",
  "plannedLocation": {
     "point": {
        "latitude": -6.195139,
        "longitude": 106.820826
     }
  },
  "taskDuration": "90s",
  "targetTimeWindow": {
    "startTime": "2023-03-29T21:00:00Z",
    "endTime": "2023-03-29T23:00:00Z"
  }
}
EOM

配送タスクを作成する

Driver SDK から、または gRPC や REST を使用してサーバー環境から、配送タスクを作成します。

gRPC

次の例は、Java gRPC ライブラリを使用して配送タスクを作成する方法を示しています。

static final String PROJECT_ID = "my-delivery-co-gcp-project";

DeliveryServiceBlockingStub deliveryService =
  DeliveryServiceGrpc.newBlockingStub(channel);

// Task settings
String parent = "providers/" + PROJECT_ID;
Task task = Task.newBuilder()
  .setType(Task.Type.DELIVERY)
  .setState(Task.State.OPEN)
  .setTrackingId("my-tracking-id")
  .setPlannedLocation(               // Grand Indonesia East Mall
    LocationInfo.newBuilder().setPoint(
      LatLng.newBuilder().setLatitude(-6.195139).setLongitude(106.820826)))
  .setTaskDuration(
    Duration.newBuilder().setSeconds(2 * 60))
  .setTargetTimeWindow(
    TimeWindow.newBuilder()
      .setStartTime(Timestamp.newBuilder().setSeconds(1680123600))
      .setEndTime(Timestamp.newBuilder().setSeconds(1680130800)))
  .addAttributes(TaskAttribute.newBuilder().setKey("foo").setStringValue("value"))
  .addAttributes(TaskAttribute.newBuilder().setKey("bar").setNumberValue(10))
  .addAttributes(TaskAttribute.newBuilder().setKey("baz").setBoolValue(false))
  .build();

// Task request
CreateTaskRequest createTaskRequest =
  CreateTaskRequest.newBuilder()  // No need for the header
      .setParent(parent)          // Avoid using auto-incrementing IDs for the taskId
      .setTaskId("task-8241890")  // Task ID assigned by the Provider
      .setTask(task)              // Initial state
      .build();

// Error handling
// If Fleet Engine does not have task with that ID and the credentials of the
// requestor pass, the service creates the task successfully.

try {
  Task createdTask = deliveryService.createTask(createTaskRequest);
} catch (StatusRuntimeException e) {
  Status s = e.getStatus();
  switch (s.getCode()) {
     case ALREADY_EXISTS:
       break;
     case PERMISSION_DENIED:
       break;
  }
  return;
}

REST

gRPC または REST を使用してサーバー環境から配送タスクを作成するには、CreateTask に対して HTTP REST 呼び出しを行います。

`POST https://fleetengine.googleapis.com/v1/providers/<project_id>/tasks?taskId=<id>`

<id> は、タスクの一意の識別子です。荷物追跡番号は使用できません。システムにタスク ID がない場合は、UUID(Universally Unique Identifier)を生成できます。

リクエスト ヘッダーには、値が Bearer <token>Authorization フィールドが含まれている必要があります。ここで、<token>Fleet Engine トークン ファクトリによって発行されたトークンです。

リクエストの本文には Task エンティティを含める必要があります。

  • 必須フィールド:

    項目
    type Type.DELIVERY
    state State.OPEN
    trackingId 配送の追跡に使用している番号または ID。
    plannedLocation タスクが完了する場所。この場合は、この配送の配送先です。
    taskDuration 荷物を配送先に持ち込むのにかかる予想時間(秒)。

  • 省略可能フィールド:

    項目
    targetTimeWindow タスクが完了するまでの時間枠。これはルーティングの動作には影響しません。
    属性 カスタムタスク属性のリスト。各属性には一意のキーが必要です。

エンティティの他のフィールドはすべて、作成で無視されます。割り当てられた DeliveryVehicleId がリクエストに含まれている場合、Fleet Engine は例外をスローします。タスクの割り当てには UpdateDeliveryVehicleRequest を使用します。詳しくは、タスクを車両に割り当てるUpdateDeliveryVehicleRequest をご覧ください。

curl コマンドの例:

# Set $JWT, $PROJECT_ID, $TRACKING_ID, and $TASK_ID in the local
# environment
curl -X POST "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/tasks?taskId=${TASK_ID}" \
  -H "Content-type: application/json" \
  -H "Authorization: Bearer ${JWT}" \
  --data-binary @- << EOM
{
  "type": "DELIVERY",
  "state": "OPEN",
  "trackingId": "${TRACKING_ID}",
  "plannedLocation": {
     "point": {
        "latitude": -6.195139,
        "longitude": 106.820826
     }
  },
  "taskDuration": "90s",
  "targetTimeWindow": {
    "startTime": "2023-03-29T21:00:00Z",
    "endTime": "2023-03-29T23:00:00Z"
  }
}
EOM

タスクの一括作成

gRPC または REST を使用して、サーバー環境から一連のタスクを作成できます。

gRPC

次の例は、Java gRPC ライブラリを使用して 2 つのタスク(1 つは配達用、もう 1 つは同じ場所での集荷用)を作成する方法を示しています。

static final String PROJECT_ID = "my-delivery-co-gcp-project";

DeliveryServiceBlockingStub deliveryService =
  DeliveryServiceGrpc.newBlockingStub(channel);

// Delivery Task settings
Task deliveryTask = Task.newBuilder()
  .setType(Task.Type.DELIVERY)
  .setState(Task.State.OPEN)
  .setTrackingId("delivery-tracking-id")
  .setPlannedLocation(               // Grand Indonesia East Mall
    LocationInfo.newBuilder().setPoint(
      LatLng.newBuilder().setLatitude(-6.195139).setLongitude(106.820826)))
  .setTaskDuration(
    Duration.newBuilder().setSeconds(2 * 60))
  .build();

// Delivery Task request
CreateTaskRequest createDeliveryTaskRequest =
  CreateTaskRequest.newBuilder()  // No need for the header or parent fields
      .setTaskId("task-8312508")  // Task ID assigned by the Provider
      .setTask(deliveryTask)      // Initial state
      .build();

// Pickup Task settings
Task pickupTask = Task.newBuilder()
  .setType(Task.Type.PICKUP)
  .setState(Task.State.OPEN)
  .setTrackingId("pickup-tracking-id")
  .setPlannedLocation(               // Grand Indonesia East Mall
    LocationInfo.newBuilder().setPoint(
      LatLng.newBuilder().setLatitude(-6.195139).setLongitude(106.820826)))
  .setTaskDuration(
    Duration.newBuilder().setSeconds(2 * 60))
  .build();

// Pickup Task request
CreateTaskRequest createPickupTaskRequest =
  CreateTaskRequest.newBuilder()  // No need for the header or parent fields
      .setTaskId("task-8241890")  // Task ID assigned by the Provider
      .setTask(pickupTask)        // Initial state
      .build();

// Batch Create Tasks settings
String parent = "providers/" + PROJECT_ID;

// Batch Create Tasks request
BatchCreateTasksRequest batchCreateTasksRequest =
  BatchCreateTasksRequest.newBuilder()
      .setParent(parent)
      .addRequests(createDeliveryTaskRequest)
      .addRequests(createPickupTaskRequest)
      .build();

// Error handling
// If Fleet Engine does not have any task(s) with these task ID(s) and the
// credentials of the requestor pass, the service creates the task(s)
// successfully.

try {
  BatchCreateTasksResponse createdTasks = deliveryService.batchCreateTasks(
    batchCreateTasksRequest);
} catch (StatusRuntimeException e) {
  Status s = e.getStatus();
  switch (s.getCode()) {
     case ALREADY_EXISTS:
       break;
     case PERMISSION_DENIED:
       break;
  }
  return;
}

REST

サーバー環境から配達と受け取りのタスクを作成するには、BatchCreateTasks に対して HTTP REST 呼び出しを行います。

POST https://fleetengine.googleapis.com/v1/providers/<project_id>/tasks:batchCreate

リクエスト ヘッダーには、値が Bearer <token>Authorization フィールドが含まれている必要があります。ここで、<token>Fleet Engine トークン ファクトリによって発行されたトークンです。

リクエストの本文には BatchCreateTasksRequest エンティティを含める必要があります。

  • 必須フィールド:

    項目
    リクエスト 配列<CreateTasksRequest>

  • 省略可能フィールド:

    項目
    header DeliveryRequestHeader

requests 内の各 CreateTasksRequest 要素は、CreateTask リクエストと同じ検証ルールを渡す必要があります。ただし、parent フィールドと header フィールドは省略できます。設定する場合は、トップレベルの BatchCreateTasksRequest にあるそれぞれのフィールドと同じにする必要があります。それぞれの特定の検証ルールについては、配送の受け取りタスクを作成する配送タスクを作成するをご覧ください。

詳細については、BatchCreateTasksgRPCREST)の API リファレンス ドキュメントをご覧ください。

curl コマンドの例:

# Set $JWT, $PROJECT_ID, $DELIVERY_TRACKING_ID, $DELIVERY_TASK_ID,
# $PICKUP_TRACKING_ID, and $PICKUP_TASK_ID in the local environment
curl -X POST "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/tasks:batchCreate" \
  -H "Content-type: application/json" \
  -H "Authorization: Bearer ${JWT}" \
  --data-binary @- << EOM
{
  "requests" : [
    {
      "taskId": "${DELIVERY_TASK_ID}",
      "task" : {
        "type": "DELIVERY",
        "state": "OPEN",
        "trackingId": "${DELIVERY_TRACKING_ID}",
        "plannedLocation": {
          "point": {
              "latitude": -6.195139,
              "longitude": 106.820826
          }
        },
        "taskDuration": "90s"
      }
    },
    {
      "taskId": "${PICKUP_TASK_ID}",
      "task" : {
        "type": "PICKUP",
        "state": "OPEN",
        "trackingId": "${PICKUP_TRACKING_ID}",
        "plannedLocation": {
          "point": {
              "latitude": -6.195139,
              "longitude": 106.820826
          }
        },
        "taskDuration": "90s"
      }
    }
  ]
}
EOM

スケジュール設定された非可用性

利用不可を示すタスク(ドライバーの休憩や車両の給油など)は、Driver SDK から、または gRPC または REST を使用するサーバー環境から作成できます。スケジュール設定された非可用性タスクにトラッキング ID を含めることはできません。必要に応じて場所を指定できます。

gRPC

次の例は、Java gRPC ライブラリを使用して使用不能タスクを作成する方法を示しています。

    static final String PROJECT_ID = "my-delivery-co-gcp-project";

    DeliveryServiceBlockingStub deliveryService =
      DeliveryServiceGrpc.newBlockingStub(channel);

    // Task settings
    String parent = "providers/" + PROJECT_ID;
    Task task = Task.newBuilder()
      .setType(Task.Type.UNAVAILABLE)
      .setState(Task.State.OPEN)
      .setTaskDuration(
        Duration.newBuilder().setSeconds(60 * 60))  // 1hr break
      .build();

    // Task request
    CreateTaskRequest createTaskRequest =
      CreateTaskRequest.newBuilder()  // No need for the header
          .setParent(parent)          // Avoid using auto-incrementing IDs for the taskId
          .setTaskId("task-8241890")  // Task ID assigned by the Provider
          .setTask(task)              // Initial state
          .build();

    // Error handling
    // If Fleet Engine does not have task with that ID and the credentials of the
    // requestor pass, the service creates the task successfully.

    try {
      Task createdTask = deliveryService.createTask(createTaskRequest);
    } catch (StatusRuntimeException e) {
      Status s = e.getStatus();
      switch (s.getCode()) {
         case ALREADY_EXISTS:
           break;
         case PERMISSION_DENIED:
           break;
      }
      return;
    }

REST

サーバー環境から利用不可タスクを作成するには、CreateTask に対して HTTP REST 呼び出しを行います。

`POST https://fleetengine.googleapis.com/v1/providers/<project_id>/tasks?taskId=<id>`

<id> は、タスクの一意の識別子です。システムにタスク ID がない場合は、UUID(Universally Unique Identifier)を生成できます。

リクエスト ヘッダーには、値が Bearer <token>Authorization フィールドが含まれている必要があります。ここで、<token>Fleet Engine トークン ファクトリによって発行されたトークンです。

リクエストの本文には Task エンティティを含める必要があります。

  • 必須フィールド:

    項目
    type Type.UNAVAILABLE
    state State.OPEN
    taskDuration 休憩の長さ(秒単位)。

  • 省略可能フィールド:

    項目
    plannedLocation 休憩の場所(特定の場所で撮影する必要がある場合)。

エンティティの他のフィールドはすべて、作成で無視されます。割り当てられた DeliveryVehicleId がリクエストに含まれている場合、Fleet Engine は例外をスローします。タスクの割り当てには UpdateDeliveryVehicleRequest を使用します。詳しくは、タスクを車両に割り当てるUpdateDeliveryVehicleRequest をご覧ください。

curl コマンドの例:

    # Set $JWT, $PROJECT_ID, and $TASK_ID in the local environment
    curl -X POST "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/tasks?taskId=${TASK_ID}" \
      -H "Content-type: application/json" \
      -H "Authorization: Bearer ${JWT}" \
      --data-binary @- << EOM
    {
      "type": "UNAVAILABLE",
      "state": "OPEN",
      "plannedLocation": {
         "point": {
            "latitude": -6.195139,
            "longitude": 106.820826
         }
      },
      "taskDuration": "300s"
    }
    EOM

スケジュールされた経由地

スケジュール設定された停止タスクは、Driver SDK から、または gRPC や REST を使用するサーバー環境から作成できます。スケジュールされた停止タスクにトラッキング ID を含めることはできません。

gRPC

次の例は、Java gRPC ライブラリを使用してスケジュールされた停止タスクを作成する方法を示しています。

static final String PROJECT_ID = "my-delivery-co-gcp-project";

DeliveryServiceBlockingStub deliveryService =
  DeliveryServiceGrpc.newBlockingStub(channel);

// Task settings
String parent = "providers/" + PROJECT_ID;
Task task = Task.newBuilder()
  .setType(Task.Type.SCHEDULED_STOP)
  .setState(Task.State.OPEN)
  .setPlannedLocation(               // Grand Indonesia East Mall
    LocationInfo.newBuilder().setPoint(
      LatLng.newBuilder().setLatitude(-6.195139).setLongitude(106.820826)))
  .setTaskDuration(
    Duration.newBuilder().setSeconds(2 * 60))
  .build();

// Task request
CreateTaskRequest createTaskRequest =
  CreateTaskRequest.newBuilder()  // No need for the header
      .setParent(parent)
      .setTaskId("task-8241890")  // Task ID assigned by the Provider
      .setTrip(task)              // Initial state
      .build();

// Error handling
// If Fleet Engine does not have task with that ID and the credentials of the
// requestor pass, the service creates the task successfully.

try {
  Task createdTask = deliveryService.createTask(createTaskRequest);
} catch (StatusRuntimeException e) {
  Status s = e.getStatus();
  switch (s.getCode()) {
     case ALREADY_EXISTS:
       break;
     case PERMISSION_DENIED:
       break;
  }
  return;
}

REST

サーバー環境からスケジュール設定された停止タスクを作成するには、CreateTask に対して HTTP REST 呼び出しを行います。

`POST https://fleetengine.googleapis.com/v1/providers/<project_id>/tasks?taskId=<id>`

<id> は、タスクの一意の識別子です。システムにタスク ID がない場合は、UUID(Universally Unique Identifier)を生成できます。

リクエスト ヘッダーには、値が Bearer <token>Authorization フィールドが含まれている必要があります。ここで、<token>Fleet Engine トークン ファクトリによって発行されたトークンです。

リクエストの本文には Task エンティティを含める必要があります。

  • 必須フィールド:

    項目
    type Type.SCHEDULED_STOP
    state State.OPEN
    plannedLocation 停車地の場所。
    taskDuration 想定される停車地の長さ(秒単位)。

  • 省略可能フィールド:

    • なし

エンティティの他のフィールドはすべて、作成で無視されます。割り当てられた DeliveryVehicleId がリクエストに含まれている場合、Fleet Engine は例外をスローします。タスクの割り当てには UpdateDeliveryVehicleRequest を使用します。詳しくは、タスクを車両に割り当てるUpdateDeliveryVehicleRequest をご覧ください。

curl コマンドの例:

    # Set $JWT, $PROJECT_ID, and $TASK_ID in the local environment
    curl -X POST "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/tasks?taskId=${TASK_ID}" \
      -H "Content-type: application/json" \
      -H "Authorization: Bearer ${JWT}" \
      --data-binary @- << EOM
    {
      "type": "SCHEDULED_STOP",
      "state": "OPEN",
      "plannedLocation": {
         "point": {
            "latitude": -6.195139,
            "longitude": 106.820826
         }
      },
      "taskDuration": "600s"
    }
    EOM

ターゲット期間の設定

ターゲット時間枠は、タスクが完了するまでの TimeWindow です。たとえば、配達の時間枠を配達先に伝える場合は、タスクのターゲット時間枠を使用してこの時間枠をキャプチャし、フィールドを使用してアラートを生成したり、トリップ後のパフォーマンスを分析したりできます。

ターゲット時間枠は開始時刻と終了時刻で構成され、任意のタスクタイプに設定できます。ターゲット時間枠はルーティング動作に影響しません

gRPC

次の例は、Java gRPC ライブラリを使用してタスクの時間枠を設定する方法を示しています。

    static final String PROJECT_ID = "my-delivery-co-gcp-project";
    static final String TASK_ID = "task-8241890";

    DeliveryServiceBlockingStub deliveryService =
      DeliveryServiceGrpc.newBlockingStub(channel);

    // Task settings
    String taskName = "providers/" + PROJECT_ID + "/tasks/" + TASK_ID;
    Task task = Task.newBuilder()
      .setName(taskName)
      .setTargetTimeWindow(
        TimeWindow.newBuilder()
          .setStartTime(Timestamp.newBuilder().setSeconds(1680123600))
          .setEndTime(Timestamp.newBuilder().setSeconds(1680130800)))
      .build();

    // Task request
    UpdateTaskRequest updateTaskRequest =
      UpdateTaskRequest.newBuilder()  // No need for the header
          .setTask(task)
          .setUpdateMask(FieldMask.newBuilder().addPaths("targetTimeWindow"))
          .build();

    try {
      Task updatedTask = deliveryService.updateTask(updateTaskRequest);
    } catch (StatusRuntimeException e) {
      Status s = e.getStatus();
      switch (s.getCode()) {
         case NOT_FOUND:
           break;
         case PERMISSION_DENIED:
           break;
      }
      return;
    }

REST

HTTP を使用してタスクの時間枠を設定するには、UpdateTask を呼び出します。

`PATCH https://fleetengine.googleapis.com/v1/providers/<project_id>/tasks/<id>?updateMask=targetTimeWindow`

<id> は、タスクの一意の識別子です。

リクエスト ヘッダーには、値が Bearer <token>Authorization フィールドが含まれている必要があります。ここで、<token>Fleet Engine トークン ファクトリによって発行されたトークンです。

リクエストの本文には Task エンティティを含める必要があります。

  • 必須フィールド:

    項目
    targetTimeWindow タスクが完了するまでの時間枠。この設定はルーティングの動作には影響しません

  • 省略可能フィールド:

    • なし

エンティティの他のフィールドはすべて、更新で無視されます。

curl コマンドの例:

# Set JWT, PROJECT_ID, and TASK_ID in the local environment
curl -X PATCH "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/tasks/${TASK_ID}?updateMask=targetTimeWindow" \
  -H "Content-type: application/json" \
  -H "Authorization: Bearer ${JWT}" \
  --data-binary @- << EOM
{
  "targetTimeWindow": {
    "startTime": "2023-03-29T21:00:00Z",
    "endTime": "2023-03-29T23:00:00Z"
  }
}
EOM

タスク トラッキングの公開設定を設定

配送追跡ライブラリ内のデータと、GetTaskTrackingInfo の呼び出しで返されたデータの公開設定は、タスクに TaskTrackingViewConfig を設定することで、タスクごとに制御できます。詳しくは、アクティブな車両タスクをご覧ください。これは、タスクの作成時または更新時に行うことができます。この構成でタスクを更新する例を次に示します。

gRPC

次の例は、Java gRPC ライブラリを使用してタスク トラッキング ビュー構成を設定する方法を示しています。

static final String PROJECT_ID = "my-delivery-co-gcp-project";
static final String TASK_ID = "task-8241890";

DeliveryServiceBlockingStub deliveryService =
  DeliveryServiceGrpc.newBlockingStub(channel);

// Task settings
String taskName = "providers/" + PROJECT_ID + "/tasks/" + TASK_ID;
Task task = Task.newBuilder()
  .setName(taskName)
  .setTaskTrackingViewConfig(
    TaskTrackingViewConfig.newBuilder()
      .setRoutePolylinePointsVisibility(
        VisibilityOption.newBuilder().setRemainingStopCountThreshold(3))
      .setEstimatedArrivalTimeVisibility(
        VisibilityOption.newBuilder().remainingDrivingDistanceMetersThreshold(5000))
      .setRemainingStopCountVisibility(
        VisibilityOption.newBuilder().setNever(true)))
  .build();

// Task request
UpdateTaskRequest updateTaskRequest =
  UpdateTaskRequest.newBuilder()  // No need for the header
      .setTask(task)
      .setUpdateMask(FieldMask.newBuilder().addPaths("taskTrackingViewConfig"))
      .build();

try {
  Task updatedTask = deliveryService.updateTask(updateTaskRequest);
} catch (StatusRuntimeException e) {
  Status s = e.getStatus();
  switch (s.getCode()) {
      case NOT_FOUND:
        break;
      case PERMISSION_DENIED:
        break;
  }
  return;
}

REST

HTTP を使用してタスク トラッキング ビュー設定ウィンドウを設定するには、UpdateTask を呼び出します。

`PATCH https://fleetengine.googleapis.com/v1/providers/<project_id>/tasks/<id>?updateMask=taskTrackingViewConfig`

<id> は、タスクの一意の識別子です。

リクエスト ヘッダーには、値が Bearer <token>Authorization フィールドが含まれている必要があります。ここで、<token>Fleet Engine トークン ファクトリによって発行されたトークンです。

リクエストの本文には Task エンティティを含める必要があります。

  • 必須フィールド:

    項目
    taskTrackingViewConfig どのような状況でエンドユーザーに表示されるデータ要素を指定するタスク トラッキングの構成。

  • 省略可能フィールド:

    • なし

エンティティの他のフィールドはすべて、更新で無視されます。

curl コマンドの例:

# Set JWT, PROJECT_ID, and TASK_ID in the local environment
curl -X PATCH "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/tasks/${TASK_ID}?updateMask=taskTrackingViewConfig" \
  -H "Content-type: application/json" \
  -H "Authorization: Bearer ${JWT}" \
  --data-binary @- << EOM
{
  "taskTrackingViewConfig": {
    "routePolylinePointsVisibility": {
      "remainingStopCountThreshold": 3
    },
    "estimatedArrivalTimeVisibility": {
      "remainingDrivingDistanceMetersThreshold": 5000
    },
    "remainingStopCountVisibility": {
      "never": true
    }
  }
}
EOM

車両にタスクを割り当てる

車両のタスクの順序を更新して、配送車両にタスクを割り当てます。車両のタスクの順序は、配達車両の停車場所のリストによって決まり、各車両の停車地に 1 つ以上のタスクを割り当てることができます。詳細については、タスクの順序を更新するをご覧ください。

車両から別の車両に配送を変更するには、元のタスクを閉じてから再作成してから、新しい車両を割り当てます。すでに別の車両に割り当てられているタスクの順序を更新すると、エラーが発生します。

タスクの順序を更新する

車両に割り当てられた注文タスクは、Driver SDK またはサーバー環境から更新できます。競合状態を回避し、信頼できる唯一の情報源を維持するため、両方の方法を使用しないでください。

車両のタスクの順序を更新すると、次の処理も行われます。

  • 車両を初めて使用するタスクを割り当てます。
  • 以前に車両に割り当てられていたものの、更新された注文には含まれていないタスクを閉じます。

車両から別の車両に配送を変更するには、元のタスクを閉じてから再作成してから、新しい車両を割り当てます。すでに別の車両に割り当てられているタスクの順序を更新すると、エラーが発生します。

タスクの順序はいつでも変更できます。

gRPC

次の例は、Java gRPC ライブラリを使用して車両のタスクの順序を更新する方法を示しています。

static final String PROJECT_ID = "my-delivery-co-gcp-project";
static final String VEHICLE_ID = "vehicle-8241890";
static final String TASK1_ID = "task-756390";
static final String TASK2_ID = "task-849263";

DeliveryServiceBlockingStub deliveryService =
  DeliveryServiceGrpc.newBlockingStub(channel);

// Vehicle settings
String vehicleName = "providers/" + PROJECT_ID + "/deliveryVehicles/" + VEHICLE_ID;
DeliveryVehicle deliveryVehicle = DeliveryVehicle.newBuilder()
    .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.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 updateDeliveryRequest =
  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

サーバー環境から車両のタスクの順序を更新するには、UpdateDeliveryVehicle に対して HTTP REST 呼び出しを行います。

`PATCH https://fleetengine.googleapis.com/v1/providers/<project_id>/deliveryVehicles/<id>?updateMask=remainingVehicleJourneySegments`

<id> は、タスクの順序を更新するフリート内の配送車両の一意の識別子です。これは、車両の作成時に指定した ID です。

リクエスト ヘッダーには、値が Bearer <token>Authorization フィールドが含まれている必要があります。ここで、<token>Fleet Engine トークン ファクトリによって発行されたトークンです。

リクエストの本文には DeliveryVehicle エンティティを含める必要があります。

  • 必須フィールド:

    項目
    remainingVehicleJourneySegments タスクの実行順序によるジャーニー セグメントのリスト。リスト内の最初のタスクが最初に実行されます。
    restVehicleJourneySegments[i].stop リスト内のタスク i の停車場所。
    restrictedVehicleJourneySegments[i].stop.plannedLocation 停車地の計画された場所。
    restrictedVehicleJourneySegments[i].stop.tasks この車両停止で実行するタスクのリスト。
    remainingVehicleJourneySegments[i].stop.state State.NEW

  • 省略可能フィールド:

    • なし

エンティティの他のフィールドはすべて、更新で無視されます。

curl コマンドの例:

# 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.7749,
            "longitude": -122.084061
          }
        },
        "tasks": [
          {
            "taskId": "${TASK1_ID}"
          }
        ]
      }
    },
    {
      "stop": {
        "state": "NEW",
        "plannedLocation": {
          "point": {
            "latitude": 37.3382,
            "longitude": 121.8863
          }
        },
        "tasks": [
          {
            "taskId": "${TASK2_ID}"
          }
        ]
      }
    }
  ]
}
EOM

車両は次の駅 / 停留所に向かっています

車両が停車地を出発したとき、またはナビゲーションを開始したときに、Fleet Engine に通知する必要があります。Fleet Engine への通知は、Driver SDK から、または gRPC または REST を使用するサーバー環境から行えます。競合状態を回避し、信頼できる唯一の情報源を維持するため、両方の方法を使用しないでください。

gRPC

次の例は、Java gRPC ライブラリを使用して、車両が次の駅 / 停留所に向かっていることを Fleet Engine に通知する方法を示しています。

    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

車両がサーバー環境から次の停車地に向かっていることを Fleet Engine に通知するには、UpdateDeliveryVehicle に対して HTTP REST 呼び出しを行います。

`PATCH https://fleetengine.googleapis.com/v1/providers/<project_id>/deliveryVehicles/<id>?updateMask=remainingVehicleJourneySegments`

<id> は、タスクの順序を更新するフリート内の配送車両の一意の識別子です。これは、車両の作成時に指定した ID です。

リクエスト ヘッダーには、値が Bearer <token>Authorization フィールドが含まれている必要があります。ここで、<token>Fleet Engine トークン ファクトリによって発行されたトークンです。

リクエストの本文には DeliveryVehicle エンティティを含める必要があります。

  • 必須フィールド:

    項目
    remainingVehicleJourneySegments 状態が State.NEW とマークされた残りの車両停止のリスト。リストの最初の停車地では、State.ENROUTE を State.ENROUTE としてマークする必要があります。

  • 省略可能フィールド:

    • なし

エンティティの他のフィールドはすべて、通知で無視されます。

curl コマンドの例:

# 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

車の位置情報を更新

Driver SDK を使用して車両の位置情報を更新していない場合は、車両の位置情報を指定して Fleet Engine を直接呼び出すことができます。アクティブな車両について、Fleet Engine は少なくとも 1 分に 1 回、最大で 5 秒に 1 回、位置情報の更新があると想定します。

gRPC

次の例は、Java gRPC ライブラリを使用して、Fleet Engine で車両の位置情報を更新する方法を示しています。

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 myDeliveryVehicle = DeliveryVehicle.newBuilder()
    .setLastLocation(DeliveryVehicleLocation.newBuilder()
        .setSupplementalLocation(LatLng.newBuilder()
            .setLatitude(37.3382)
            .setLongitude(121.8863))
        .setSupplementalLocationTime(now())
        .setSupplementalLocationSensor(DeliveryVehicleLocationSensor.CUSTOMER_SUPPLIED_LOCATION)
        .setSupplementalLocationAccuracy(DoubleValue.of(15.0)))  // Optional
    .build();

// DeliveryVehicle request
UpdateDeliveryVehicleRequest updateDeliveryVehicleRequest =
  UpdateDeliveryVehicleRequest.newBuilder()  // No need for the header
      .setName(vehicleName)
      .setDeliveryVehicle(myDeliveryVehicle)
      .setUpdateMask(FieldMask.newBuilder()
          .addPaths("last_location"))
      .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

HTTP REST を使用して Fleet Engine で車両の位置情報を更新するには、UpdateDeliveryVehicle を呼び出します。

`PATCH https://fleetengine.googleapis.com/v1/providers/<project_id>/deliveryVehicles/<id>?updateMask=last_location`

<id> は、フリート内の配達車両、または場所を更新する車両の一意の識別子です。これは、車両の作成時に指定した ID です。

リクエスト ヘッダーには、値が Bearer <token>Authorization フィールドが含まれている必要があります。ここで、<token>Fleet Engine トークン ファクトリによって発行されたトークンです。

リクエストの本文には DeliveryVehicle エンティティを含める必要があります。

  • 必須フィールド:

    項目
    lastLocation.supplementalLocation 車両の位置。
    lastLocation.supplementalLocationTime 車両がこの場所に到着した、最後に確認されたタイムスタンプ。
    lastLocation.supplementalLocationSensor CUSTOMER_SUPPLIED_LOCATION を設定する必要があります。

  • 省略可能フィールド:

    項目
    lastLocation.supplementalLocationAccuracy 指定された位置情報の精度(メートル単位)。

curl コマンドの例:

# 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
{
  "lastLocation": {
    "supplementalLocation": {"latitude": 12.1, "longitude": 14.5},
    "supplementalLocationTime": "$(date -u --iso-8601=seconds)",
    "supplementalLocationSensor": "CUSTOMER_SUPPLIED_LOCATION",
    "supplementalLocationAccuracy": 15
  }
}
EOM

車両が停車地に到着

車両が停車地に到着すると、Fleet Engine に通知する必要があります。Fleet Engine への通知は、Driver SDK から、または gRPC または REST を使用するサーバー環境から行えます。競合状態を回避し、信頼できる唯一の情報源を維持するため、両方の方法を使用しないでください。

gRPC

次の例は、Java gRPC ライブラリを使用して、車両が停車地に到着したことを Fleet Engine に通知する方法を示しています。

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

サーバー環境から停車地に車両が到着したことを Fleet Engine に通知するには、UpdateDeliveryVehicle に対して HTTP REST 呼び出しを行います。

`PATCH https://fleetengine.googleapis.com/v1/providers/<project_id>/deliveryVehicles/<id>?updateMask=remainingVehicleJourneySegments`

<id> は、タスクの順序を更新するフリート内の配送車両の一意の識別子です。これは、車両の作成時に指定した ID です。

リクエスト ヘッダーには、値が Bearer <token>Authorization フィールドが含まれている必要があります。ここで、<token>Fleet Engine トークン ファクトリによって発行されたトークンです。

リクエストの本文には DeliveryVehicle エンティティを含める必要があります。

  • 必須フィールド:

    項目
    remainingVehicleJourneySegments 到着した停車地の状態が State.ARRIVED で、その後に残りの車両の停車地のリストが、State.NEW とマークされた状態で続きます。

  • 省略可能フィールド:

    • なし

エンティティの他のフィールドはすべて、更新で無視されます。

curl コマンドの例:

# 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

車両が停車した

車両が停止を完了したときに、Fleet Engine に通知する必要があります。これにより、その停車場所に関連付けられているすべてのタスクが CLOSED 状態に設定されます。Fleet Engine への通知は、Driver SDK から、または gRPC または REST を使用するサーバー環境から行うことができます。競合状態を回避し、信頼できる唯一の情報源を維持するため、両方の方法を使用しないでください。

gRPC

次の例は、Java gRPC ライブラリを使用して、車両が停車を完了したことを Fleet Engine に通知する方法を示しています。

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

サーバー環境からの停止の完了を Fleet Engine に通知するには、UpdateDeliveryVehicle に対して HTTP REST 呼び出しを行います。

`PATCH https://fleetengine.googleapis.com/v1/providers/<project_id>/deliveryVehicles/<id>?updateMask=remaining_vehicle_journey_segments`

<id> は、タスクの順序を更新するフリート内の配送車両の一意の識別子です。これは、車両の作成時に指定した ID です。

リクエスト ヘッダーには、値が Bearer <token>Authorization フィールドが含まれている必要があります。ここで、<token>Fleet Engine トークン ファクトリによって発行されたトークンです。

リクエストの本文には DeliveryVehicle エンティティを含める必要があります。

  • 必須フィールド:

    項目
    remaining_vehicle_journey_segments 完了した停車地は、残りの車両停留所のリストから除外されているはずです。

  • 省略可能フィールド:

    • なし

エンティティの他のフィールドはすべて、更新で無視されます。

curl コマンドの例:

    # 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

タスクを更新する

ほとんどのタスク フィールドは不変です。ただし、タスク エンティティを直接更新することで、状態、タスク結果、タスク結果時刻、タスク結果の場所、属性を変更できます。たとえば、タスクが車両に割り当てられていない場合は、状態を直接更新してタスクを閉じることができます。

gRPC

これは、gRPC でタスクを更新する例です。

REST

これは REST でタスクを更新する例です。

タスクを閉じる

車両に割り当てられたタスクを閉じるには、タスクが行われる停車地を車両が完了したことを Fleet Engine に通知するか、車両の停車地のリストから削除します。そのためには、車両のタスクの順序を更新するときと同様に、残りの車両の停車地のリストを設定します。

まだ車両に割り当てられておらず、タスクを閉じる必要がある場合は、タスクを「CLOSED」状態に更新します。ただし、クローズしたタスクを再度開くことはできません。

タスクを閉じても、成功や失敗を示すものではありません。タスクが進行中とみなされなくなったことを示します。フリート トラッキングでは、デリバリーの結果を表示できるように、タスクの実際の結果を示すことが重要です。

gRPC

static final String PROJECT_ID = "my-delivery-co-gcp-project";
static final String TASK_ID = "task-8241890";

DeliveryServiceBlockingStub deliveryService =
  DeliveryServiceGrpc.newBlockingStub(channel);

// Task settings
String taskName = "providers/" + PROJECT_ID + "/tasks/" + TASK_ID;
Task task = Task.newBuilder()
  .setName(taskName)
  .setState(Task.State.CLOSED) // You can only directly CLOSE a
  .build();                    // task that is NOT assigned to a vehicle.

// Task request
UpdateTaskRequest updateTaskRequest =
  UpdateTaskRequest.newBuilder()  // No need for the header
      .setTask(task)
      .setUpdateMask(FieldMask.newBuilder().addPaths("state"))
      .build();

try {
  Task updatedTask = deliveryService.updateTask(updateTaskRequest);
} catch (StatusRuntimeException e) {
  Status s = e.getStatus();
  switch (s.getCode()) {
     case NOT_FOUND:
       break;
     case PERMISSION_DENIED:
       break;
  }
  return;
}

REST

タスクをサーバー環境からクローズ済みとしてマークするには、UpdateTask に対して HTTP REST 呼び出しを行います。

`PATCH https://fleetengine.googleapis.com/v1/providers/<project_id>/tasks/<id>?updateMask=state`

<id> は、タスクの一意の識別子です。

リクエスト ヘッダーには、値が Bearer <token>Authorization フィールドが含まれている必要があります。ここで、<token>Fleet Engine トークン ファクトリによって発行されたトークンです。

リクエストの本文に Task エンティティを含める必要があります。

  • 必須フィールド:

    項目
    state State.CLOSED

  • 省略可能フィールド:

    項目
    taskOutcome Outcome.SUCCEEDED または Outcome.FAILED
    taskOutcomeTime タスクが完了した時刻。
    taskOutcomeLocation タスクが完了した場所。Fleet Engine は、プロバイダが手動でオーバーライドしない限り、デフォルトで最後の車両位置になります。

エンティティの他のフィールドはすべて、更新で無視されます。

curl コマンドの例:

    # Set JWT, PROJECT_ID, and TASK_ID in the local environment
    curl -X PATCH "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/tasks/${TASK_ID}?updateMask=state,taskOutcome,taskOutcomeTime" \
      -H "Content-type: application/json" \
      -H "Authorization: Bearer ${JWT}" \
      --data-binary @- << EOM
    {
      "state": "CLOSED",
      "taskOutcome": "SUCCEEDED",
      "taskOutcomeTime": "$(date -u --iso-8601=seconds)"
    }
    EOM

タスクの結果と結果の場所を設定する

タスクの終了は、成功か失敗かではなく、タスクが進行中とみなされなくなったことを示します。フリートのトラッキングでは、タスクの実際の結果を示すことが重要です。これにより、デリバリーの結果を表示し、サービスに対して適切な課金を行うことができます。一度設定したタスクの結果は変更できません。ただし、タスク結果の時間とロケーションは、設定後に変更できます。

クローズ状態のタスクは、結果を [成功] または [失敗] に設定できます。Fleet Engine では、ステータスが [SUCCEEDED] の配信タスクのみが課金対象となります。

タスクの結果をマークすると、Fleet Engine はタスク結果の場所に、直近の車両の位置情報を自動的に入力します。この動作はオーバーライドできます。

gRPC

結果を設定するときに、タスクの結果の場所を設定することもできます。ロケーションを設定すると、Fleet Engine は直近の車両のロケーションのデフォルトに設定できなくなります。フリート エンジンで設定したタスク結果の場所は、後で上書きすることもできます。Fleet Engine は、ユーザーが指定したタスク結果の場所を上書きしません。タスク結果が設定されていないタスクには、タスク結果の場所を設定できません。同じリクエスト内にタスク結果とタスク結果のロケーションの両方を設定できます。

次の例は、Java gRPC ライブラリを使用してタスクの結果を SUCCEEDED に設定し、タスクが完了したロケーションを設定する方法を示しています。

static final String PROJECT_ID = "my-delivery-co-gcp-project";
static final String TASK_ID = "task-8241890";

DeliveryServiceBlockingStub deliveryService =
  DeliveryServiceGrpc.newBlockingStub(channel);

// Task settings
String taskName = "providers/" + PROJECT_ID + "/tasks/" + TASK_ID;
Task task = Task.newBuilder()
  .setName(taskName)
  .setTaskOutcome(TaskOutcome.SUCCEEDED)
  .setTaskOutcomeTime(now())
  .setTaskOutcomeLocation(               // Grand Indonesia East Mall
    LocationInfo.newBuilder().setPoint(
      LatLng.newBuilder().setLatitude(-6.195139).setLongitude(106.820826)))
  .build();

// Task request
UpdateTaskRequest updateTaskRequest =
  UpdateTaskRequest.newBuilder()  // No need for the header
      .setTask(task)
      .setUpdateMask(FieldMask.newBuilder().addPaths("task_outcome", "task_outcome_time", "task_outcome_location"))
      .build();

try {
  Task updatedTask = deliveryService.updateTask(updateTaskRequest);
} catch (StatusRuntimeException e) {
  Status s = e.getStatus();
  switch (s.getCode()) {
     case NOT_FOUND:
       break;
     case PERMISSION_DENIED:
       break;
  }
  return;
}

REST

サーバー環境からタスクを完了としてマークするには、UpdateTask に対して HTTP REST 呼び出しを行います。

`PATCH https://fleetengine.googleapis.com/v1/providers/<project_id>/tasks/<id>?updateMask=taskOutcome,taskOutcomeTime,taskOutcomeLocation`

<id> は、タスクの一意の識別子です。

リクエスト ヘッダーには、値が Bearer <token>Authorization フィールドが含まれている必要があります。ここで、<token>Fleet Engine トークン ファクトリによって発行されたトークンです。

リクエストの本文には Task エンティティを含める必要があります。

  • 必須フィールド:

    項目
    taskOutcome Outcome.SUCCEEDED または Outcome.FAILED

  • 省略可能フィールド:

    項目
    taskOutcomeLocation タスクが完了した場所。設定しない場合、Fleet Engine はデフォルトで最後の車両の位置を取得します。
    taskOutcomeTime タスクが完了したときのタイムスタンプ。

エンティティの他のフィールドはすべて、更新で無視されます。

curl コマンドの例:

# Set JWT, PROJECT_ID, and TASK_ID in the local environment
curl -X PATCH "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/tasks/${TASK_ID}?updateMask=taskOutcome,taskOutcomeTime,taskOutcomeLocation" \
  -H "Content-type: application/json" \
  -H "Authorization: Bearer ${JWT}" \
  --data-binary @- << EOM
{
  "taskOutcome": "SUCCEEDED",
  "taskOutcomeTime": "$(date -u --iso-8601=seconds)",
  "taskOutcomeLocation": {
    "point": {
      "latitude": -6.195139,
      "longitude": 106.820826
    }
  }
}
EOM

配送ルートを変更する

出荷タスクの作成後に、予定されたロケーションを変更することはできません。配送の配送先を変更するには、結果を設定せずに配送タスクを閉じてから、更新された計画された場所を使用して新しいタスクを作成します。新しいタスクを作成したら、同じ車両にタスクを割り当てます。詳細については、配送タスクを閉じるタスクを割り当てるをご覧ください。

フィーダー車両と配送車両を使用する

1 日を通してフィーダー車両を使用して配達車両に荷物を輸送する場合は、配達車両のスケジュールされた停止タスクとして荷物の移動をモデル化します。位置情報を正確に追跡するには、配送車両に積み込まれた後にのみ、転送された荷物に配送タスクを割り当てます。詳しくは、スケジュールされた停止をご覧ください。

ストアの配送ステータスとその他のメタ情報

出荷タスクが完了すると、タスクの状態と結果がタスクに記録されます。ただし、配送に固有のその他のメタ情報を更新する必要がある場合があります。Fleet Engine サービスの外部で参照できる他のメタ情報を保存するには、タスクに関連付けられた Tracking_id を外部テーブルのキーとして使用します。

詳細については、タスクのライフサイクルをご覧ください。

車両を検索

Driver SDK から、または gRPC や REST を使用してサーバー環境から車両を検索できます。

gRPC

次の例は、Java gRPC ライブラリを使用して車両を検索する方法を示しています。

static final String PROJECT_ID = "my-delivery-co-gcp-project";
static final String VEHICLE_ID = "vehicle-8241890";

DeliveryServiceBlockingStub deliveryService =
  DeliveryServiceGrpc.newBlockingStub(channel);

// Vehicle request
String name = "providers/" + PROJECT_ID + "/deliveryVehicles/" + VEHICLE_ID;
GetDeliveryVehicleRequest getVehicleRequest = GetDeliveryVehicleRequest.newBuilder()  // No need for the header
    .setName(name)
    .build();

try {
  DeliveryVehicle vehicle = deliveryService.getDeliveryVehicle(getVehicleRequest);
} catch (StatusRuntimeException e) {
  Status s = e.getStatus();
  switch (s.getCode()) {
     case NOT_FOUND:
       break;
     case PERMISSION_DENIED:
       break;
  }
  return;
}

REST

サーバー環境から車両を検索するには、GetVehicle に対して HTTP REST 呼び出しを行います。

`GET https://fleetengine.googleapis.com/v1/providers/<project_id>/deliveryVehicles/<vehicleId>`

<id> は、タスクの一意の識別子です。

<vehicleId> は検索する車両の ID です。

リクエスト ヘッダーには、値が Bearer <token>Authorization フィールドが含まれている必要があります。ここで、<token>Fleet Engine トークン ファクトリによって発行されたトークンです。

リクエストの本文は空にする必要があります。

ルックアップが成功した場合、レスポンスの本文には車両エンティティが含まれます。

curl コマンドの例:

# Set JWT, PROJECT_ID, and VEHICLE_ID in the local environment
curl -H "Authorization: Bearer ${JWT}" \
  "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/deliveryVehicles/${VEHICLE_ID}"

タスクを検索する

gRPC または REST を使用して、サーバー環境からタスクを検索できます。Driver SDK はタスクの検索をサポートしていません。

gRPC

次の例は、Java gRPC ライブラリを使用してタスクを検索する方法を示しています。

static final String PROJECT_ID = "my-delivery-co-gcp-project";
static final String TASK_ID = "task-8597549";

DeliveryServiceBlockingStub deliveryService =
  DeliveryServiceGrpc.newBlockingStub(channel);

// Task request
String taskName = "providers/" + PROJECT_ID + "/tasks/" + TASK_ID;
GetTaskRequest getTaskRequest = GetTaskRequest.newBuilder()  // No need for the header
    .setName(taskName)
    .build();

try {
  Task task = deliveryService.getTask(getTaskRequest);
} catch (StatusRuntimeException e) {
  Status s = e.getStatus();
  switch (s.getCode()) {
     case NOT_FOUND:
       break;

     case PERMISSION_DENIED:
       break;
  }
  return;
}

REST

サーバー環境からタスクを検索するには、GetTask に対して HTTP REST 呼び出しを行います。

`GET https://fleetengine.googleapis.com/v1/providers/<project_id>/tasks/<taskId>`

<id> は、タスクの一意の識別子です。

<taskId> は検索するタスクの ID です。

リクエスト ヘッダーには、値が Bearer <token>Authorization フィールドが含まれている必要があります。ここで、<token>Fleet Engine トークン ファクトリによって発行されたトークンです。

リクエストの本文は空にする必要があります。

ルックアップが成功した場合、レスポンスの本文には Task エンティティが含まれます。

curl コマンドの例:

    # Set JWT, PROJECT_ID, and TASK_ID in the local environment
    curl -H "Authorization: Bearer ${JWT}" \
      "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/tasks/${TASK_ID}"

荷物追跡 ID で配送タスク情報を検索する

フリートタスク情報は次の方法で検索できます。それぞれに異なる目的があります。

  • タスク ID: タスクデータの完全なビューにアクセスできるフリート オペレーターなどのユーザーが使用します。
  • トラッキング ID: クライアント ソフトウェアによって、エンドユーザーに限定的な情報(荷物が自宅に届く場合など)を提供するために使用されます。

このセクションでは、トラッキング ID でタスク情報を検索する方法について説明します。タスク ID でタスクを検索する場合は、タスクの検索をご覧ください。

トラッキング ID で情報を検索するには、次のいずれかを使用します。

検索の要件

  • 追跡 ID によって提供される配送情報が、追跡対象の位置情報の表示を管理するに記載されている公開設定ルールを遵守している。

  • Fleet Engine を使用して、荷物追跡 ID で配送情報を検索します。Driver SDK は、トラッキング ID による情報のルックアップをサポートしていません。Fleet Engine でこれを行うには、サーバー環境またはブラウザ環境を使用します。

  • セキュリティ リスクを抑えるために、可能な限り狭いトークンを使用する。たとえば、Delivery コンシューマ トークンを使用する場合、Fleet Engine Deliveries API 呼び出しは配送業者や荷物の受取人など、そのエンドユーザーに関連する情報のみを返します。レスポンス内の他の情報はすべて削除されます。トークンの詳細については、認可用の JSON Web Token(JWT)の作成をご覧ください。

gRPC を使用した Java での Lookup

次の例は、Java gRPC ライブラリを使用して、追跡 ID で配送タスクに関する情報を検索する方法を示しています。

static final String PROJECT_ID = "my-delivery-co-gcp-project";
static final String TRACKING_ID = "TID-7449w087464x5";

DeliveryServiceBlockingStub deliveryService =
  DeliveryServiceGrpc.newBlockingStub(channel);

// Tasks request
String parent = "providers/" + PROJECT_ID;
GetTaskTrackingInfoRequest getTaskTrackingInfoRequest = GetTaskTrackingInfoRequest.newBuilder()  // No need for the header
    .setParent(parent)
    .setTrackingId(TRACKING_ID)
    .build();

try {
  TaskTrackingInfo taskTrackingInfo = deliveryService.getTaskTrackingInfo(getTaskTrackingInfoRequest);
} catch (StatusRuntimeException e) {
  Status s = e.getStatus();
  switch (s.getCode()) {
     case NOT_FOUND:
       break;

     case PERMISSION_DENIED:
       break;
  }
  return;
}

HTTP を使用したルックアップ

ブラウザから出荷タスクを検索するには、GetTaskTrackingInfo に対して HTTP REST 呼び出しを行います。

`GET https://fleetengine.googleapis.com/v1/providers/<project_id>/taskTrackingInfo/<tracking_id>`

<tracking_id> は、タスクに関連付けられたトラッキング ID です。

リクエスト ヘッダーには、値が Bearer <token>Authorization フィールドが含まれている必要があります。ここで、<token>Fleet Engine トークン ファクトリによって発行されたトークンです。

ルックアップが成功した場合、レスポンスの本文には taskTrackingInfo エンティティが含まれます。

curl コマンドの例:

# Set JWT, PROJECT_ID, and TRACKING_ID in the local environment
curl -H "Authorization: Bearer ${JWT}" \
  "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/taskTrackingInfo/${TRACKING_ID}"

タスクの一覧表示

サーバーまたはブラウザ環境にあるタスクを一覧表示できます。Driver SDK は、タスクの一覧表示をサポートしていません。

タスクの一覧表示は、タスクへの幅広いアクセス権をリクエストします。タスクの一覧表示は、信頼できるユーザーのみを対象としています。リストタスクのリクエストを行う場合は、Delivery フリート リーダーまたは Delivery スーパー ユーザー認証トークンを使用します。

リストに記載されているタスクでは、次のフィールドが秘匿化されます。

  • VehicleStop.planned_location
  • VehicleStop.state
  • VehicleStop.TaskInfo.taskId

リストされたタスクは、ほとんどのタスク プロパティでフィルタできます。フィルタクエリの構文については、AIP-160 をご覧ください。フィルタリングに使用できる有効なタスク プロパティは次のとおりです。

  • 属性
  • delivery_vehicle_id
  • state
  • planned_location
  • task_duration
  • task_outcome
  • task_outcome_location
  • task_outcome_location_source
  • task_outcome_time
  • tracking_id
  • type

Google API 改善提案に基づいて、次のフィールド形式を使用します。

フィールド タイプ 形式
タイムスタンプ RFC-3339 task_outcome_time = 2022-03-01T11:30:00-08:00
所要時間 後に続く s 秒の秒数 task_duration = 120s
列挙型 文字列 state = CLOSED AND type = PICKUP
ロケーション point.latitudepoint.longitude planned_location.point.latitude > 36.1 AND planned_location.point.longitude < -122.0

フィルタクエリ演算子の一覧については、AIP-160 をご覧ください。

フィルタクエリが指定されていない場合は、すべてのタスクが一覧表示されます。

タスクリストはページ分けされます。ページサイズはリストタスク リクエストで指定できます。ページサイズが指定されている場合、返されるタスクの数は指定されたページサイズ以下になります。ページサイズが存在しない場合は、妥当なデフォルトが使用されます。リクエストされたページサイズが内部の最大値を超えると、内部の最大値が使用されます。

タスクリストに、結果の次のページを読み取るためのトークンを含めることができます。前のリクエストと同一であるリクエストでページトークンを使用して、タスクの次のページを取得します。返されたページトークンが空の場合、これ以上取得できるタスクはありません。

gRPC

次の例は、Java gRPC ライブラリを使用して、deliveryVehicleId と task 属性のタスクを一覧表示する方法を示しています。成功のレスポンスが空のままになることがあります。空のレスポンスは、指定された deliveryVehicleId に関連付けられているタスクがないことを示します。

static final String PROJECT_ID = "my-delivery-co-gcp-project";
static final String TRACKING_ID = "TID-7449w087464x5";

DeliveryServiceBlockingStub deliveryService =
  DeliveryServiceGrpc.newBlockingStub(channel);

// Tasks request
String parent = "providers/" + PROJECT_ID;
ListTasksRequest listTasksRequest = ListTasksRequest.newBuilder()  // No need for the header
    .setParent(parent)
    .setFilter("delivery_vehicle_id = 123 AND attributes.foo = true")
    .build();

try {
  ListTasksResponse listTasksResponse = deliveryService.listTasks(listTasksRequest);
} catch (StatusRuntimeException e) {
  Status s = e.getStatus();
  switch (s.getCode()) {
     case NOT_FOUND:
       break;

     case PERMISSION_DENIED:
       break;
  }
  return;
}

REST

ブラウザからタスクを一覧表示するには、ListTasks に対して HTTP REST 呼び出しを行います。

`GET https://fleetengine.googleapis.com/v1/providers/<project_id>/tasks`

リストにあるタスクにフィルタを適用するには、URL パラメータとして「filter」を追加し、URL エスケープされたフィルタクエリを値として指定します。

リクエスト ヘッダーには、値が Bearer <token>Authorization フィールドが含まれている必要があります。ここで、<token>Fleet Engine トークン ファクトリによって発行されたトークンです。

ルックアップが成功すると、レスポンスの本文には次の構造のデータが含まれます。

    // JSON representation
    {
      "tasks": [
        {
          object (Task)
        }
      ],
      "nextPageToken": string,
      "totalSize": integer
    }

成功のレスポンスが空のままになることがあります。空のレスポンスは、指定されたフィルタ条件を満たすタスクが見つからなかったことを示します。

curl コマンドの例:

    # Set JWT, PROJECT_ID, and VEHICLE_ID in the local environment
    curl -H "Authorization: Bearer ${JWT}" \
      "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/tasks?filter=state%20%3D%20OPEN%20AND%20delivery_vehicle_id%20%3D%20${VEHICLE_ID}"

配送車両を一覧表示する

サーバー環境またはブラウザ環境から配達車両を一覧表示できます。Driver SDK は、配達車両のリスティングをサポートしていません。

配達車両のリスティングは、配達車両への幅広いアクセスをリクエストし、信頼できるユーザーのみを対象としています。リスト配信車両リクエストを行う場合は、Delivery Fleet Reader または Delivery Super User 認証トークンを使用します。

リストに記載されている配達車両では、レスポンス サイズに影響するため、次のフィールドが削除されます。

  • CurrentRouteSegment
  • RemainingVehicleJourneySegments

リスト配信車両は、attributes プロパティでフィルタできます。たとえば、キーが my_key で値が my_value の属性に対してクエリを実行するには、attributes.my_key = my_value を使用します。複数の属性に対してクエリを実行するには、attributes.key1 = value1 AND attributes.key2 = value2 のように論理 AND および OR 演算子を使用してクエリを結合します。フィルタクエリ構文の詳細については、AIP-160 をご覧ください。

viewport リクエスト パラメータを使用すると、リストされた配送車両をロケーションでフィルタできます。リクエスト パラメータ viewport は、2 つの境界座標(high(北東)と low(南西)の緯度と経度のペア)を使用してビューポートを定義します。低い緯度よりも地理的に低い高い緯度を含むリクエストは拒否されます。

デフォルトでは、配送車両リストは適切なページサイズを使用してページ分割されます。ページサイズを指定すると、リクエストは上限で指定された車両数以下の車両数のみを返します。リクエストされたページサイズが内部の最大値を超えると、内部の最大値が使用されます。デフォルトと最大のページサイズはどちらも 100 台です。

配達車両リストには、結果の次のページを読み取るためのトークンを含めることができます。ページトークンは、取得できる配送車両のより多くのページがある場合にのみ、レスポンスに含まれます。タスクの次のページを取得するには、前のリクエストと同一のリクエストを持つページトークンを使用します。

gRPC

次の例は、Java gRPC ライブラリを使用して、特定の属性を持つ特定の地域の配達車両を一覧表示する方法を示しています。正常なレスポンスは空のままでもかまいません。この場合、指定された属性を持つ車両は、指定されたビューポートにまだ存在しません。

static final String PROJECT_ID = "my-delivery-co-gcp-project";

DeliveryServiceBlockingStub deliveryService =
  DeliveryServiceGrpc.newBlockingStub(channel);

// Tasks request
String parent = "providers/" + PROJECT_ID;
ListDeliveryVehiclesRequest listDeliveryVehiclesRequest =
  ListDeliveryVehiclesRequest.newBuilder()  // No need for the header
      .setParent(parent)
      .setViewport(
            Viewport.newBuilder()
              .setHigh(LatLng.newBuilder()
                  .setLatitude(37.45)
                  .setLongitude(-122.06)
                  .build())
              .setLow(LatLng.newBuilder()
                  .setLatitude(37.41)
                  .setLongitude(-122.11)
                  .build())
      .setFilter("attributes.my_key = my_value")
      .build();

try {
  ListDeliveryVehiclesResponse listDeliveryVehiclesResponse =
      deliveryService.listDeliveryVehicles(listDeliveryVehiclesRequest);
} catch (StatusRuntimeException e) {
  Status s = e.getStatus();
  switch (s.getCode()) {
      case NOT_FOUND:
          break;

      case PERMISSION_DENIED:
          break;
  }
  return;
}

REST

ブラウザからタスクを一覧表示するには、ListDeliveryVehicles に対して HTTP REST 呼び出しを行います。

`GET https://fleetengine.googleapis.com/v1/providers/<project_id>/deliveryVehicles`

リストされたタスクにフィルタを適用するには、URL エスケープされたフィルタクエリを値として持つ「filter」URL パラメータを含めます。

リクエスト ヘッダーには、値が Bearer <token>Authorization フィールドが含まれている必要があります。ここで、<token>Fleet Engine トークン ファクトリによって発行されたトークンです。

ルックアップが成功すると、レスポンスの本文には次の構造のデータが含まれます。

// JSON representation
{
  "deliveryVehicles": [
    {
      object (DeliveryVehicle)
    }
  ],
  "nextPageToken": string,
  "totalSize": integer
}

成功のレスポンスが空のままになることがあります。この場合、指定されたフィルタクエリとビューポートに一致する配達車両が見つからなかったことを意味します。

curl コマンドの例:

# Set JWT, PROJECT_ID, and VEHICLE_ID in the local environment
curl -H "Authorization: Bearer ${JWT}" \
  "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/deliveryVehicles?filter=attributes.my_key%20%3D%20my_value%20&viewport.high.latitude=37.45&viewport.high.longitude=-122.06&viewport.low.latitude=37.41&viewport.low.longitude=-122.11"

フリート トラッキング

Fleet Engine Deliveries API を使用してフリートのトラッキングを有効にするには、次の 2 つの方法があります。

  • 推奨: JavaScript フリート トラッキング ライブラリを使用します。このライブラリを使用すると、Fleet Engine で追跡されている車両の位置と関心のある場所を可視化できます。標準の google.maps.Map オブジェクトの代わりに使用できる JavaScript 地図コンポーネントと、Fleet Engine に接続するためのデータ コンポーネントが含まれています。このコンポーネントを使用すると、ウェブアプリまたはモバイルアプリから、カスタマイズ可能でアニメーション化されたフリート追跡エクスペリエンスを提供できます。

  • Fleet Engine Deliveries API に独自のフリート追跡を実装します。

重要なのは、トラッキング ID でフリートタスクを検索することです。

ロギング

RPC ログを Cloud Logging に送信するように Fleet Engine を設定できます。詳細については、ロギングをご覧ください。

認可ロールとトークン

車両とタスクのライフサイクルを管理すると、個々のユースケースの承認に関する注意事項で説明されているように、Fleet Engine を呼び出すには、サービス アカウントの認証情報を使用して署名された JSON Web Token による認証が必要です。これらのトークンの発行に使用されるサービス アカウントには 1 つ以上のロールがあり、それぞれのロールが異なる一連の権限を付与します。

詳細については、認証と認可をご覧ください。

一般的な問題のトラブルシューティング

問題が発生した場合は、以下のセクションをご覧ください。

復元性

Fleet Engine は信頼できる情報源とはみなされません。必要に応じて、Fleet Engine に依存せずにシステムの状態を復元する必要があります。

Fleet Engine のステータスが失われる

Fleet Engine を使用する場合は、障害が発生した場合にシステムが自己回復するようにクライアントを実装します。たとえば、Fleet Engine が車両を更新しようとすると、車両が存在しないことを示すエラーが返されることがあります。その後、クライアントは新しい状態で車両を再作成する必要があります。この問題はめったに発生しませんが、システムの処理に十分な復元力があることを確認してください。

まれなケースですが、Fleet Engine の壊滅的な障害が発生した場合は、ほとんどまたはすべての車両とタスクを再作成する必要があります。作成レートが高くなりすぎると、割り当ての問題によりリクエストが再び失敗することがあります。これは、サービス拒否(DoS)攻撃を回避するために割り当てチェックが行われているためです。この場合は、再試行のバックオフ戦略を使用して再作成率を遅くします。

ドライバアプリの消失状態

ドライバアプリがクラッシュした場合、アプリは Driver SDK 内に現在の状態を再作成する必要があります。アプリはタスクの再作成を試行して、タスクが存在することを確認し、現在の状態を復元する必要があります。また、Driver SDK の停車地のリストを再作成して明示的に設定する必要があります。

よくある質問

ドライバーが順不同で作業を停止した場合はどうなるでしょうか。

この場合、まずタスクの順序を更新してから、停車地への到着やタスクの完了などの詳細をマークして通常どおり処理を進めます。そうしないと、システムの不整合、ETA の誤り、予期しないエラーの報告が発生する可能性があります。