Fleet Engine を使ってみる

Fleet Engine On-demand Rides and Deliveries API を使ってルートを管理する 車両の状態に関する問題を解決できます。 Driver SDK、Consumer SDK、SDK 間のトランザクションを Fleet Engine と通信できるバックエンド サービスです。 gRPC のいずれか または REST 呼び出しです。

前提条件

開発では、必ず Cloud Shell を SDK(gcloud)を使用して認証され、 できます。

shell

gcloud auth login

次のような成功メッセージが表示されます。

You are now logged in as [my-user@example.com].
Your current project is [project-id].  You ...

オンデマンド配車と配達ソリューションの Fleet Engine API が適切に構成されていることを確認する。

shell

gcloud --project=project-id services enable fleetengine.googleapis.com

このコマンドでエラーが発生した場合は、プロジェクト管理者にお問い合わせください および Google サポート担当者にお問い合わせのうえ、アクセス権を取得してください。

ロギング

Fleet Engine は、受信した API 呼び出しに関するログメッセージを書き込むことができます。 Google Cloud Platform ログにインポートします 詳細については、Cloud Logging のドキュメントをご覧ください。 ログの読み取りと分析方法の概要を説明します。

以前に作成されたプロジェクトについては、ロギングがデフォルトで有効になっていない可能性があります。 2022 年 2 月 10 日詳しくは、 ロギングのドキュメント をご覧ください。

クライアント ライブラリ

クライアント ライブラリは複数の一般的なプログラミング言語で公開されています。これらの 未加工の REST や gRPC よりも優れたデベロッパー エクスペリエンスを提供できます。 サーバー アプリケーション用のクライアント ライブラリを入手する方法については、 クライアント ライブラリ

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

認証と認可

[移動状況] と [注文状況] が提供する機能は、 Google Cloud コンソールを使用しますこれらの API と SDK では、JSON Web Token を使用して、 サービス アカウントを使用して作成された できます。

Cloud プロジェクトの設定

クラウド プロジェクトを設定するには、まずプロジェクトを作成してから、 作成することもできます。

Google Cloud プロジェクトを作成するには:

  1. Google Cloud コンソールを使用して Google Cloud プロジェクトを作成します。
  2. [API とサービス] ダッシュボードを使用して、 Local Rides and Deliveries API。

サービス アカウントは 1 つ以上のロールに関連付けられています。これらを使用して、 リクエストに応じて異なる一連の権限を付与する JSON Web Token できます。通常、不正使用の可能性を減らすために、複数の 必要最小限のロールがそれぞれ付与されています。

移動状況と注文状況では、次のロールを使用します。

ロール説明
Fleet Engine Consumer SDK ユーザー

roles/fleetengine.consumerSdkUser
車両を検索する権限と情報を取得する権限を付与します 分析できますこのサービス アカウントで作成されたトークンは、 ロールは、一般的にライドシェアリングや配達用のアプリのモバイル デバイスから使用されます。
Fleet Engine Driver SDK ユーザー

roles/fleetengine.driverSdkUser
車両の位置情報、ルート、およびルートを更新する権限を付与します 車両やルートに関する情報を取得できます。作成されたトークン サービス アカウントによって付与されるロールは、通常は 配車サービスや配達ドライバー アプリのモバイル デバイス。
Fleet Engine On-demand 管理者

roles/fleetengine.ondemandAdmin
すべての車両リソースとルートリソースに対する読み取り / 書き込み権限を付与します。 このロールを持つプリンシパルは JWT を使用する必要がないため、JWT を使用する必要があります アプリケーションのデフォルト認証情報を使用します。カスタム JWT クレームは無視されます。 このロールは、信頼できる環境(お客様のバックエンド)に限定する必要があります。
FleetEngine サービス スーパー ユーザー **(非推奨)**

roles/fleetengine.serviceSuperUser
すべての車両 API とルート API に権限を付与します。作成されたトークン サービス アカウントによって付与されるロールは、通常、バックエンド 説明します。このロールは非推奨になりました。優先 代わりに roles/fleetengine.ondemandAdmin を使用してください。

たとえば、3 つのロールのそれぞれにサービス アカウントを作成し、 割り当てることができます。

gcloud --project=project-id iam service-accounts create fleet-engine-consumer-sdk
gcloud projects add-iam-policy-binding project-id \
       --member=serviceAccount:fleet-engine-consumer-sdk@project-id.iam.gserviceaccount.com \
       --role=roles/fleetengine.consumerSdkUser

gcloud --project=project-id iam service-accounts create fleet-engine-driver-sdk
gcloud projects add-iam-policy-binding project-id \
       --member=serviceAccount:fleet-engine-driver-sdk@project-id.iam.gserviceaccount.com \
       --role=roles/fleetengine.driverSdkUser

gcloud --project=project-id iam service-accounts create fleet-engine-su
gcloud projects add-iam-policy-binding project-id \
       --member=serviceAccount:fleet-engine-su@project-id.iam.gserviceaccount.com \
       --role=roles/fleetengine.serviceSuperUser

Driver SDK と Consumer SDK は、これらの標準ロールを中心に構築されています。

または、サービス アカウントを持つユーザーによる 任意の権限のセットをバンドルできます。 Driver SDK と Consumer SDK は、API 呼び出しが 必要な権限がありません。そのため、Google では強く カスタムロールは使用せず、上記の標準的なロールのセットを使用します。

利便性のため、信頼できないクライアント用の JWT トークンを作成する必要がある場合は、 サービス アカウント トークン作成者ロールを付与されたユーザーは、 gcloud コマンドライン ツールを使用する。

gcloud projects add-iam-policy-binding project-id \
       --member=user:my-user@example.com \
       --role=roles/iam.serviceAccountTokenCreator

ここで、my-user@example.com は、アクセスに使用するメールアドレスです。 gcloud で認証する(gcloud auth list --format='value(account)')。

Fleet Engine Auth ライブラリ

Fleet Engine は、JSON Web Token(JWT)を使用して、 Fleet Engine API新しい Fleet Engine Auth Library GitHub で入手可能 Fleet Engine JWT の構築を簡素化し、安全に署名できます。

このライブラリには次のような利点があります。

  • Fleet Engine トークンの作成プロセスを簡素化します。
  • 認証情報ファイル( 使用しないでください)。
  • 署名付きトークンを gRPC スタブまたは GAPIC クライアント。
で確認できます。

認可用の JSON Web Token(JWT)を作成する

Fleet Engine Auth Library を使用しない場合は、JSON Web Token(JWT)を コードベースで直接作成できますそのためには、データ アナリストと JWT の概要と Fleet Engine との関係について説明します。だからこそ Fleet Engine Auth Library の利用を強くおすすめします。

Fleet Engine 内では、JSON Web Token(JWT)が有効期間の短い認証を提供する また、デバイスがユーザーの予定に基づいて 認可されます。JWT にはヘッダーとクレーム セクションが含まれています。 header セクションには、 使用する秘密鍵(サービス アカウントから取得)と暗号化 アルゴリズムです。申し立てセクションには、 トークンの有効期間、トークンの有効期間、トークンの アクセスの要求や、スコープを絞り込むためのその他の アクセスたとえば車両 ID などです

JWT ヘッダー セクションには、次のフィールドがあります。

項目説明
alg 使用するアルゴリズム。`RS256`。
標準 トークンのタイプ。JWT。
子供 サービス アカウントの秘密鍵 ID。この値は をサービス アカウントの JSON ファイルの「private_key_id」フィールドで設定します。 適切なレベルの権限を持つサービス アカウントのキーを使用してください。

JWT クレーム セクションには、次のフィールドがあります。

項目説明
iss サービス アカウントのメールアドレス。
Pub/Subです サービス アカウントのメールアドレス。
AUD サービス アカウントの SERVICE_NAME。この場合は https://fleetengine.googleapis.com/ です。
iat トークン作成時のタイムスタンプ(経過時間(秒)) 1970 年 1 月 1 日 00:00:00 UTC から。スキューには 10 分かかります。もし タイムスタンプが古すぎるか、将来の場合にサーバーがエラーを報告する可能性があります。
exp トークンが期限切れになったときのタイムスタンプ(経過時間(秒)) 1970 年 1 月 1 日 00:00:00 UTC から。タイムスタンプが無効な場合、リクエストは失敗します。 1 時間以上先になります
authorization ユースケースに応じて、`vehicleid` または `tripid` を含めることができます。

JWT トークンの作成と署名です。手順とコードサンプル については、以下をご覧ください。 OAuth を使用しないサービス アカウント認証。 その後、署名付きトークンを gRPC 呼び出しまたは使用するその他のメソッドにアタッチできます。 Fleet Engine にアクセスします。

JWT クレーム

JWT ペイロードを作成するときに、認可にクレームを追加する セクションで、キー vehicleid または tripid が 通話を発信している車両 ID またはルート ID。

Driver SDK は、オペレーティング システムに関係なく、常に vehicleid クレームを使用します。 移動や車両などですFleet Engine バックエンドは は、変更を行う前に、リクエストされたルートと関連付けられます。

Consumer SDK は常に tripid クレームを使用します。

配車サービスまたは配達プロバイダは、vehicleid または tripid で「*」を使用する必要がありますから すべての Vehicles と Trips に一致します。なお、JWT には両方のトークンを含めることができ、 トークン署名の実装が簡素化される可能性があります。

JWT のユースケース

以下に、プロバイダ サーバーのトークンの例を示します。

{
  "alg": "RS256",
  "typ": "JWT",
  "kid": "private_key_id_of_provider_service_account"
}
.
{
  "iss": "provider@yourgcpproject.iam.gserviceaccount.com",
  "sub": "provider@yourgcpproject.iam.gserviceaccount.com",
  "aud": "https://fleetengine.googleapis.com/",
  "iat": 1511900000,
  "exp": 1511903600,
  "authorization": {
     "vehicleid": "*",
     "tripid": "*"
   }
}

次に、コンシューマ アプリのトークンの例を示します。

{
  "alg": "RS256",
  "typ": "JWT",
  "kid": "private_key_id_of_consumer_service_account"
}
.
{
  "iss": "consumer@yourgcpproject.iam.gserviceaccount.com",
  "sub": "consumer@yourgcpproject.iam.gserviceaccount.com",
  "aud": "https://fleetengine.googleapis.com/",
  "iat": 1511900000,
  "exp": 1511903600,
  "authorization": {
     "tripid": "trip_54321"
   }
}

以下は、Driver app のトークンの例です。

{
  "alg": "RS256",
  "typ": "JWT",
  "kid": "private_key_id_of_driver_service_account"
}
.
{
  "iss": "driver@yourgcpproject.iam.gserviceaccount.com",
  "sub": "driver@yourgcpproject.iam.gserviceaccount.com",
  "aud": "https://fleetengine.googleapis.com/",
  "iat": 1511900000,
  "exp": 1511903600,
  "authorization": {
     "vehicleid": "driver_12345"
   }
}
  • ヘッダーの kid フィールドに、サービス アカウントの秘密鍵を指定します。 あります。この値は、サービスの private_key_id フィールドで確認できます。 JSON 形式のファイル。
  • iss フィールドと sub フィールドに、サービス アカウントのメールアドレスを指定します。 この値は、サービス アカウントの client_email フィールドで確認できます。 JSON ファイルです。
  • aud フィールドに https://SERVICE_NAME/ を指定します。
  • iat フィールドには、トークン作成時のタイムスタンプを使用します。 1970 年 1 月 1 日 00:00:00 UTC からの経過時間(秒)として指定します。 スキューには 10 分かかります。タイムスタンプが古すぎる場合は または将来、サーバーからエラーが報告される可能性があります。
  • exp フィールドには、トークンの有効期限が切れたときのタイムスタンプを使用します。 1970 年 1 月 1 日 00:00:00 UTC からの経過秒数で指定します。最大値 指定できる値は iat + 3600 です。

モバイル デバイスに渡す JWT に署名する際は、必ず Driver SDK ロールまたは Consumer SDK ロールのサービス アカウント。それ以外の場合、 デバイスは、持たないはずの状態を変更できるようになります。

同様に、特権呼び出しに使用する JWT に署名する場合は、 使用してサービス アカウントを使用する権限を 付与する必要がありますそれ以外の場合、 オペレーションが失敗します。

テスト用の JWT を生成する

ターミナルでトークンを生成すると、テストに役立ちます。

この手順を実施するには サービス アカウント トークン作成者のロールが必要です。

gcloud projects add-iam-policy-binding project-id \
       --member=user:my-user@example.com \
       --role=roles/iam.serviceAccountTokenCreator

次の内容の新しいファイルを unsigned_token.json という名前で作成します。iat プロパティは、エポックからの経過秒数で表された現在の時刻です。 ターミナルで date +%s を実行して取得します。exp プロパティは、 エポックからの経過秒数で表された有効期限。これは iat に 3600 を追加します。有効期限は、 説明します。

{
  "aud": "https://fleetengine.googleapis.com/",
  "iss": "super-user-service-account@project-id.iam.gserviceaccount.com",
  "sub": "super-user-service-account@project-id.iam.gserviceaccount.com",
  "iat": iat,
  "exp": exp,
  "authorization": {
     "vehicleid": "*",
     "tripid": "*"
   }
}

次に、以下の gcloud コマンドを実行して、スーパーユーザーに代わってトークンに署名します。 ユーザー サービス アカウント:

gcloud beta iam service-accounts sign-jwt --iam-account=super-user-service-account@project-id.iam.gserviceaccount.com unsigned_token.json signed_token.jwt

署名付き Base64 エンコード JWT をファイルに保存する必要があります signed_token.jwt。トークンは今後 1 時間有効です。

これで、List Vehicles に対して curl コマンドを実行して、トークンをテストできるようになりました。 REST エンドポイント:

curl -X GET "https://fleetengine.googleapis.com/v1/providers/project-id/vehicles" -H "Authorization: Bearer $(cat signed_token.jwt)"

車両とそのライフサイクル

Vehicle は、ドライバーと車両のペアを表すエンティティです。現在、 ドライバーと車両を個別にトラッキングすることはできません。配車サービスまたは宅配業者 プロバイダ ID( サービス アカウントを含む Google Cloud プロジェクトのプロジェクト ID Fleet Engine API を呼び出すために使用する車両)と、配車サービス プロバイダまたは配達プロバイダが所有する車両 ID です。

7 日経過しても UpdateVehicle で更新されていない車両は、 自動的に削除され、割り当てられたルート(ある場合)に 割り当てられていません。車両を利用可能な状態にしておくためのおすすめの方法 Fleet Engine では、位置情報を定期的に更新します。ほとんどの Vehicle エンティティの他のフィールドも存続期間が延長されます。ただし、次の条件が適用されます。 新しいフィールド値が既存の値と異なります。

注: Vehicle エンティティの一部のフィールド(device_settings など)は純粋にデバッグ用のフィールドです。 Fleet Engine によって保持されない情報です。更新しても、 Vehicle エンティティの有効期間を延長する。

次を使用して CreateVehicle を呼び出すとエラーになります。 すでに存在するプロバイダ ID と車両 ID のペアです。たとえば、 更新頻度が低い場合、次の 2 つの方法で処理できます。 CreateVehicle は、想定されるプロバイダ ID と車両 ID のペアに置き換え、破棄します 車両がすでに存在する場合は、エラーが発生します。または、CreateVehicle を呼び出した後に UpdateVehicle から NOT_FOUND エラーが返されます。

車両の位置情報の更新

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

  1. Driver SDK を使用する - AndroidiOS -- 最もシンプルなオプションです。
  2. カスタムコードを使用します。 中継に使用されるか、Android または iOS 以外のデバイスを iOS。

車種

Vehicle エンティティには、必須フィールド VehicleType が含まれています。このフィールドには、 AUTOTAXITRUCK のいずれかとして指定できる Category 列挙型。 TWO_WHEELERBICYCLE、または PEDESTRIAN。車両タイプは SearchVehiclesListVehicles のフィルタ条件。

車両のすべてのルート選択で、対応する RouteTravelMode が カテゴリが AUTOTWO_WHEELERBICYCLEPEDESTRIAN のいずれかに設定されている。 カテゴリが TAXI または TRUCK に設定されている場合、ルーティングは AUTO モード。

車両属性

Vehicle エンティティには、VehicleAttribute の繰り返しフィールドが含まれています。これらの Fleet Engine では解釈されません。SearchVehicles API に、一致した Vehicles にすべての値を含める必要がある 含まれる属性が指定された値に設定されます。

属性フィールドは、サポートされている他のフィールドに加えて、 Vehicle メッセージ(vehicle_typesupported_trip_types など)。

車両の残りの地点

Vehicle エンティティには、TripWaypointRPC | REST)の繰り返しフィールドが含まれます。 waypointsRPC | REST)と呼ばれます。 このフィールドには、ルートの残りのウェイポイントが、 到達するまでにFleet Engine は、ルートに従ってこのフィールドを計算します。 割り当てられ、ルートのステータスが変更されると更新されます。 これらのウェイポイントは、TripId フィールドと WaypointType フィールドで識別できます。

車両のマッチング条件の拡大

通常、配車サービスまたは配達業者のサービスによってルートの照合が行われます。 リクエストの数を減らせます。サービスは車両属性を使用して、 表示されます。たとえば、プロバイダは Google Cloud で 以下が提供する特典や能力のレベルに対応する属性のセット。 車。たとえば、3 つのレベルをブール値の属性のセットとすることができます。 is_bronze_levelis_silver_levelis_gold_level です。自動車 3 つすべてに該当しますFleet Engine がサービスのリクエストを受信すると、 シルバーレベルの能力を必要とする旅程である場合、その車両が検索の対象になります。 このように属性を使用すると、さまざまな車両を販売できます。 提供します

車両属性を更新する方法は 2 つあります。1 つは UpdateVehicle APIこの API を使用すると、車両属性のセット全体が 値に設定されます。1 つの属性のみを更新することはできません。 もう 1 つのメソッドは UpdateVehicleAttributes API です。このメソッドは、 更新する属性を指定します。リクエストに含まれる属性は 新しい値に設定するか、追加します。指定されていない属性は変更されません。

ハウツー: 車両を作成する

Vehicle エンティティは、フリートで追跡する車両ごとに作成する必要があります。

CreateVehicle エンドポイントと CreateVehicleRequest を使用して、 車両。

Vehicleprovider_id はプロジェクト ID にする必要があります。 (例: my-on-demand-project など)を含む Google Cloud プロジェクトの Fleet Engine の呼び出しに使用されるサービス アカウント。なお、 複数のサービス アカウントが、同じ配車サービスの Fleet Engine にアクセスできる Fleet Engine では現在、Fleet Engine では 複数の Google Cloud プロジェクトが同じ Vehicles にアクセスしている。

Vehicle は、OFFLINE 状態または ONLINE 状態で作成できます。条件 作成: ONLINESearchVehicles へのレスポンスですぐに返される場合があります。 分析できます

最初の last_locationCreateVehicle 呼び出しに含めることができます。 許可されていますが、VehicleONLINE 状態で作成しないでください。 last_location

車両の詳細については、車両タイプを参照してください。 type フィールド。

詳しくは、車両属性をご覧ください。 [属性]フィールドに入力します

CreateVehicle から返される値は、作成された Vehicle エンティティです。

shell

curl -X POST \
  "https://fleetengine.googleapis.com/v1/providers/project-id/vehicles?vehicleId=vid-8241890" \
  -H "Authorization: Bearer $JWT" \
  -H "Content-Type: application/json" \
  --data-binary @- << EOM
{
    "vehicleState": "OFFLINE",
    "supportedTripTypes": ["EXCLUSIVE"],
    "maximumCapacity": 4,
    "vehicleType": {"category": "AUTO"},
    "attributes": [{"key": "on_trip", "value": "false"}]
}
EOM

詳しくは、 providers.vehicles.create ご覧ください。

Java

static final String PROJECT_ID = "project-id";

VehicleServiceBlockingStub vehicleService =
    VehicleService.newBlockingStub(channel);

String parent = "providers/" + PROJECT_ID;
Vehicle vehicle = Vehicle.newBuilder()
    .setVehicleState(VehicleState.OFFLINE)  // Initial state
    .addSupportedTripTypes(TripType.EXCLUSIVE)
    .setMaximumCapacity(4)
    .setVehicleType(VehicleType.newBuilder().setCategory(VehicleType.Category.AUTO))
    .addAttributes(VehicleAttribute.newBuilder()
        .setKey("on_trip").setValue("false"))  // Opaque to the Fleet Engine
    // Add .setBackToBackEnabled(true) to make this vehicle eligible for trip
    // matching while even if it is on a trip.  By default this is disabled.
    .build();

CreateVehicleRequest createVehicleRequest =
    CreateVehicleRequest.newBuilder()  // no need for the header
        .setParent(parent)
        .setVehicleId("vid-8241890")  // Vehicle ID assigned by Rideshare or Delivery Provider
        .setVehicle(vehicle)  // Initial state
        .build();

// In this case, the Vehicle is being created in the OFFLINE state and
// no initial position is being provided.  When the Driver App checks
// in with the Rideshare or Delivery Provider, the state can be set to ONLINE and
// the Driver App will update the Vehicle Location.

try {
  Vehicle createdVehicle =
      vehicleService.createVehicle(createVehicleRequest);
} catch (StatusRuntimeException e) {
  Status s = e.getStatus();
  switch (s.getCode()) {
    case ALREADY_EXISTS:
      break;
    case PERMISSION_DENIED:
      break;
  }
  return;
}
// If no Exception, Vehicle created successfully.

車両作成のための Google Cloud Platform ログ

Fleet Engine API は、Google Cloud Platform のログを介して CreateVehicle エンドポイントへの呼び出しが受信される。このログエントリには CreateVehicle リクエストの値に関する情報。もし 成功した場合は、正常に完了した Vehicle に関する情報も 返されます。

shell

gcloud --project=project-id logging read --freshness=1h '
  jsonPayload.request.vehicleId="vid-8241890"
  jsonPayload.@type="type.googleapis.com/maps.fleetengine.v1.CreateVehicleLog"
'

次のようなレコードが出力されます。

---
insertId: c2cf4d3a180251c1bdb892137c14f022
jsonPayload:
  '@type': type.googleapis.com/maps.fleetengine.v1.CreateVehicleLog
  request:
    vehicle:
      attributes:
      - key: on_trip
        value: 'false'
      maximumCapacity: 4
      state: VEHICLE_STATE_OFFLINE
      supportedTrips:
      - EXCLUSIVE_TRIP
      vehicleType:
        vehicleCategory: AUTO
    vehicleId: vid-8241890
  response:
    attributes:
    - key: on_trip
      value: 'false'
    availableCapacity: 4
    currentRouteSegmentHandle: AdSiwAwCO9gZ7Pw5UZZimOXOo41cJTjg/r3SuwVPQmuuaV0sU3+3UCY+z53Cl9i6mWHLoCKbBt9Vsj5PMRgOJ8zX
    maximumCapacity: 4
    name: providers/project-id/vehicles/vid-8241890
    state: VEHICLE_STATE_OFFLINE
    supportedTrips:
    - EXCLUSIVE_TRIP
    vehicleType:
      vehicleCategory: AUTO
labels:
  vehicle_id: vid-8241890
logName: projects/project-id/logs/fleetengine.googleapis.com%2Fcreate_vehicle
receiveTimestamp: '2021-09-22T03:25:16.361159871Z'
resource:
  labels:
    location: global
    resource_container: projects/project-id
  type: fleetengine.googleapis.com/Fleet
timestamp: '2021-09-22T03:25:15.724998Z'

車両作成のための Cloud Pub/Sub 通知

Fleet Engine API は、新しい通知を送信すると、Cloud Pub/Sub 経由で 車両が作成されます。これらの通知を受け取るには、 手順はこちらをご覧ください。

HOW-TO: 車両の位置情報を更新する

車両の位置情報の更新に Driver SDK を使用しない場合は、 車両の位置情報とともに Fleet Engine に直接呼び出します。アクティブな車両の場合 Fleet Engine は、少なくとも 1 分に 1 回、最大で位置情報の更新を要求する 更新頻度は 5 秒に 1 回ですこれらの更新に必要なのは Fleet Engine Driver SDK ユーザーのみです できます。

shell

curl -X PUT \
  "https://fleetengine.googleapis.com/v1/providers/project-id/vehicles/vid-8241890?updateMask=last_location" \
  -H "Authorization: Bearer $JWT" \
  -H "Content-Type: application/json" \
  --data-binary @- << EOM
{
    "supplementalLocation": {"latitude": 12.1, "longitude": 14.5},
    "supplementalLocationTime": "$(date -u --iso-8601=seconds)",
    "supplementalLocationSensor": "CUSTOMER_SUPPLIED_LOCATION",
    "supplementalLocationAccuracy": 15
}
EOM

詳しくは、 providers.vehicles.update ご覧ください。

Java

static final String PROJECT_ID = "project-id";
static final String VEHICLE_ID = "vid-8241890";

VehicleServiceBlockingStub vehicleService = VehicleService.newBlockingStub(channel);

String vehicleName = "providers/" + PROJECT_ID + "/vehicles/" + VEHICLE_ID;
Vehicle updatedVehicle = Vehicle.newBuilder()
    .setLastLocation(VehicleLocation.newBuilder()
        .setSupplementalLocation(LatLng.newBuilder()
            .setLatitude(37.3382)
            .setLongitude(121.8863))
        .setSupplementalLocationTime(now())
        .setSupplementalLocationSensor(LocationSensor.CUSTOMER_SUPPLIED_LOCATION)
        .setSupplementalLocationAccuracy(DoubleValue.of(15.0)))  // Optional)
    .build();

UpdateVehicleRequest updateVehicleRequest = UpdateVehicleRequest.newBuilder()
    .setName(vehicleName)
    .setVehicle(updatedVehicle)
    .setUpdateMask(FieldMask.newBuilder()
        .addPaths("last_location"))
    .build();

try {
  Vehicle updatedVehicle =
      vehicleService.updateVehicle(updateVehicleRequest);
} catch (StatusRuntimeException e) {
  Status s = e.getStatus();
  switch (s.getCode()) {
    case NOT_FOUND:
      // Most implementations will call CreateVehicle in this case
      break;
    case PERMISSION_DENIED:
      break;
  }
  return;
}
// If no Exception, Vehicle updated successfully.

方法: その他の車両フィールドを更新する

車両状態の他の属性の更新頻度は、 役立ちますlast_location 以外の属性を更新するには Fleet Engine スーパー ユーザーの権限。

UpdateVehicleRequest には、表示するフィールドを示す update_mask が含まれています。 更新されますフィールドの動作は、次の Protobuf ドキュメントの 使用できます。

車両属性で説明されているように、 attributes フィールドには、保持するすべての属性を書き込む必要があります。これは、 1 つの Key-Value ペアの値を UpdateVehicle の呼び出し。特定の属性の値を更新するには、 UpdateVehicleAttributes API を使用できます。

この例では、back_to_back を有効にしています。

shell

curl -X PUT \
  "https://fleetengine.googleapis.com/v1/providers/project-id/vehicles/vid-8241890?updateMask=vehicle_state,attributes,back_to_back_enabled" \
  -H "Authorization: Bearer $JWT" \
  -H "Content-Type: application/json" \
  --data-binary @- << EOM
{
    "vehicleState": "ONLINE",
    "attributes": [
      {"key": "on_trip", "value": "true"},
      {"key": "cash_only", "value": "false"}
    ],
    "backToBackEnabled": true
}
EOM

詳しくは、 providers.vehicles.update ご覧ください。

Java

static final String PROJECT_ID = "project-id";
static final String VEHICLE_ID = "vid-8241890";

VehicleServiceBlockingStub vehicleService = VehicleService.newBlockingStub(channel);

String vehicleName = "providers/" + PROJECT_ID + "/vehicles/" + VEHICLE_ID;
Vehicle updatedVehicle = Vehicle.newBuilder()
    .setVehicleState(VehicleState.ONLINE)
    .addAllAttributes(ImmutableList.of(
        VehicleAttribute.newBuilder().setKey("on_trip").setValue("true").build(),
        VehicleAttribute.newBuilder().setKey("cash_only").setValue("false").build()))
    .setBackToBackEnabled(true)
    .build();

UpdateVehicleRequest updateVehicleRequest = UpdateVehicleRequest.newBuilder()
    .setName(vehicleName)
    .setVehicle(updatedVehicle)
    .setUpdateMask(FieldMask.newBuilder()
        .addPaths("vehicle_state")
        .addPaths("attributes")
        .addPaths("back_to_back_enabled"))
    .build();

// Attributes and vehicle state are being updated, so both are
// included in the field mask.  Note that of on_trip were
// not being updated, but rather cash_only was being changed,
// the desired value of "on_trip" would still need to be written
// as the attributes are completely replaced in an update operation.

try {
  Vehicle updatedVehicle =
      vehicleService.updateVehicle(updateVehicleRequest);
} catch (StatusRuntimeException e) {
  Status s = e.getStatus();
  switch (s.getCode()) {
    case NOT_FOUND:
      // Most implementations will call CreateVehicle in this case
      break;
    case PERMISSION_DENIED:
      break;
  }
  return;
}
// If no Exception, Vehicle updated successfully.

車両アップデートの Google Cloud Platform ログ

Fleet Engine API は、Google Cloud Platform のログを介して UpdateVehicle エンドポイントへの呼び出しが受信される。このログエントリには UpdateVehicle リクエストの値に関する情報。もし 成功した場合は、正常に完了した Vehicle に関する情報も 返されます。

shell

gcloud --project=project-id logging read --freshness=1h '
  jsonPayload.request.vehicleId="vid-8241890"
  jsonPayload.@type="type.googleapis.com/maps.fleetengine.v1.UpdateVehicleLog"
'

車両の更新に関する Cloud Pub/Sub 通知

Fleet Engine API は、既存のアプリケーションが Cloud Pub/Sub 経由で 更新されます。これらの通知を受け取るには、 手順はこちらをご覧ください。

ハウツー: 車両を検索する

Fleet Engine は車両の検索に対応しています。SearchVehicles API を使用すると、近くの空いているドライバーの中から、次のようなタスクに最適なドライバーを見つけることができます。 配車サービスや配達リクエストに対応しますSearchVehicles API は タスク属性と車両の属性に一致するドライバーのランク付けされたリスト 管理できます。詳細については、次をご覧ください: 近くのドライバーを探す

在庫のある車両を検索するとき、Fleet Engine は 設定することができます。配車サービスまたは配達業者のサービスには、 明示的に含めることもできます。次の例で、 それらの車両を、グランド ゾーンのルートに一致する車両の検索に含める インドネシア イースト モールからバライ シダン ジャカルタ コンベンション センターまで。

shell

まず、前の手順で作成した車両の位置情報を更新して、 対象です。実際には、ドライバ SDK で実行される Driver SDK が実行します。 車内の Android デバイスまたは iOS デバイスで確認できます。

curl -X PUT \
  "https://fleetengine.googleapis.com/v1/providers/project-id/vehicles/vid-8241890?updateMask=last_location,attributes" \
  -H "Authorization: Bearer $JWT" \
  -H "Content-Type: application/json" \
  --data-binary @- << EOM
{
  "lastLocation": {
    "updateTime": "$( date -u +"%Y-%m-%dT%H:%M:%SZ" )",
    "location": {
      "latitude": "-6.195139",
      "longitude": "106.820826"
    }
  },
  "attributes": [{"key": "on_trip", "value": "false"}]
}
EOM

検索を実行すると、少なくともその車両が見つかるはずです。

curl -X POST \
  "https://fleetengine.googleapis.com/v1/providers/project-id/vehicles:search" \
  -H "Authorization: Bearer $JWT" \
  -H "Content-Type: application/json" \
  --data-binary @- << EOM
{
  "pickupPoint": {
    "point": {"latitude": "-6.195139", "longitude": "106.820826"}
  },
  "dropoffPoint": {
    "point": {"latitude": "-6.1275", "longitude": "106.6537"}
  },
  "pickupRadiusMeters": 2000,
  "count": 10,
  "minimumCapacity": 2,
  "tripTypes": ["EXCLUSIVE"],
  "vehicleTypes": [{"category": "AUTO"}],
  "filter": "attributes.on_trip=\"false\"",
  "orderBy": "PICKUP_POINT_ETA",
  "includeBackToBack": true
}
EOM

詳しくは、 providers.vehicles.search ご覧ください。

Java

static final String PROJECT_ID = "project-id";

VehicleServiceBlockingStub vehicleService = VehicleService.newBlockingStub(channel);

String parent = "providers/" + PROJECT_ID;
SearchVehiclesRequest searchVehiclesRequest = SearchVehiclesRequest.newBuilder()
    .setParent(parent)
    .setPickupPoint( // Grand Indonesia East Mall
        TerminalLocation.newBuilder().setPoint(
            LatLng.newBuilder().setLatitude(-6.195139).setLongitude(106.820826)))
    .setDropoffPoint( // Balai Sidang Jakarta Convention Center
        TerminalLocation.newBuilder().setPoint(
            LatLng.newBuilder().setLatitude(-6.213796).setLongitude(106.807195)))
    .setPickupRadiusMeters(2000)
    .setCount(10)
    .setMinimumCapacity(2)
    .addTripTypes(TripType.EXCLUSIVE)
    .addVehicleTypes(VehicleType.newBuilder().setCategory(VehicleType.Category.AUTO))
    .setFilter("attributes.on_trip=\"false\"")
    .setOrderBy(VehicleMatchOrder.PICKUP_POINT_ETA)
    .setIncludeBackToBack(true) // Fleet Engine includes vehicles that are en route.
    .build();

// Error handling
// If matches are returned and the authentication passed, the request completed
// successfully

try {
  SearchVehiclesResponse searchVehiclesResponse =
      vehicleService.searchVehicles(searchVehiclesRequest);

  // Search results: Each vehicle match contains a vehicle entity and information
  // about the distance and ETA to the pickup point and dropoff point.
  List<VehicleMatch> vehicleMatches = searchVehiclesResponse.getMatchesList();
} catch (StatusRuntimeException e) {
  Status s = e.getStatus();
  switch (s.getCode()) {
    case NOT_FOUND:
      break;
    case PERMISSION_DENIED:
      break;
  }
  return;
}

車両フィルタリング クエリ

SearchVehiclesListVehicles が車両属性でのフィルタリングをサポート フィルタクエリを使用できますフィルタクエリの構文については、以下をご覧ください。 AIP-160 をご覧ください。

なお、フィルタクエリでは車両属性のフィルタのみがサポートされています。 他のフィールドには使用できません。フィルタクエリは AND 句として機能する 他の制約(minimum_capacityvehicle_types など)を SearchVehiclesRequest

ハウツー: 車両を一覧表示する

SearchVehicles は、ランキングで少数の車両を見つけるために最適化されています すばやく注文でき、主に最適な近隣のドライバーを見つけるために使用されます タスクに追加できます。ただし、特定の条件を満たすすべての車両を 結果をページ分割する必要がある場合でも同じですListVehicles は そのユースケース向けに設計されています

ListVehicles API を使用すると、特定の条件を満たすすべての車両を検索できます リクエスト オプション。ListVehicles API は、次の場所の車両のページ分けされたリストを返します。 該当するプロジェクトを選択します。

車両属性でフィルタするには、以下をご覧ください。 車両フィルタリング クエリ

この例では、vehicle_type filter 文字列。

shell

curl -X POST \
  "https://fleetengine.googleapis.com/v1/providers/project-id/vehicles:list" \
  -H "Authorization: Bearer $JWT" \
  -H "Content-Type: application/json" \
  --data-binary @- << EOM
{
  "vehicleTypes": [{"category": "AUTO"}],
  "filter": "attributes.on_trip=\"false\"",
}
EOM

詳しくは、 providers.vehicles.list ご覧ください。

Java

static final String PROJECT_ID = "project-id";

VehicleServiceBlockingStub vehicleService = VehicleService.newBlockingStub(channel);

String parent = "providers/" + PROJECT_ID;
ListVehiclesRequest listVehiclesRequest = ListVehiclesRequest.newBuilder()
    .setParent(parent)
    .addTripTypes(TripType.EXCLUSIVE)
    .addVehicleTypes(VehicleType.newBuilder().setCategory(VehicleType.Category.AUTO))
    .setFilter("attributes.on_trip=\"false\"")
    .setIncludeBackToBack(true) // Fleet Engine includes vehicles that are en route.
    .build();

// Error handling
// If matches are returned and the authentication passed, the request completed
// successfully

try {
  ListVehiclesResponse listVehiclesResponse =
      vehicleService.listVehicles(listVehiclesRequest);
} catch (StatusRuntimeException e) {
  Status s = e.getStatus();
  switch (s.getCode()) {
    case NOT_FOUND:
      break;
    case PERMISSION_DENIED:
      break;
  }
  return;
}

ルートとそのライフサイクル

Trip API とライフサイクルは、Vehicle API とそのライフサイクルに似ています。 ライドシェア プロバイダは、Fleet Engine を使用したルートの作成を担当します。 インターフェースです。Fleet Engine では、RPC サービスと TripService 、REST リソース、provider.trips をタップします。これらのインターフェースにより、ルートエンティティの作成、情報のリクエスト、検索、 更新機能を実装する必要があります

Trip には、ライフサイクル全体の進行状況を追跡するためのステータス フィールドがあります。 値は NEW から COMPLETE、さらに CANCELEDUNKNOWN_TRIP_STATUS へと移動します。 をタップします。RPC の trip_status を参照 または TripStatus for REST を参照してください。

  • NEW
  • ENROUTE_TO_PICKUP
  • ARRIVED_AT_PICKUP
  • ENROUTE_TO_INTERMEDIATE_DESTINATION
  • ARRIVED_AT_INTERMEDIATE_DESTINATION
  • ENROUTE_TO_DROPOFF
  • COMPLETE

CANCELEDへのルートは、これらのいずれかのステータスから更新できます。 サービスでルートが作成されると、エンジンによってステータスが NEW に設定されます。 vehicle_id は省略可能です。車両と同様に、未割り当てのルートは自動的に削除されます 更新されずに 7 日経過すると報告されますサービスでルートを 存在する場合は、エラーが返されます。次の場合、ルートは「有効」と見なされます。 ステータスが COMPLETE または CANCELED 以外。この区別は、 Vehicle エンティティの active_trips フィールドと SearchTripsRequest で重要です。

ルートに割り当てられたvehicle_idは、ルートが は有効です。たとえば、ドライバーが 24 時間の間にルートをキャンセルした場合に、 ルートが別の車両に再割り当てされた場合。

ステータスは、連続して実装する場合に重要です。 出張サポート。このサポートにより、プロバイダは新しいルートを車両に割り当てることができます その車両はアクティブなルートを 運航していることがわかりますコード 連続するルートの作成は 1 つのルートと同じで、 車両 ID。Fleet Engine は、新しいルートの出発地と目的地を 必要があります。連続したルートについて詳しくは、次をご覧ください: 複数の地点のルートを作成する

ルートの残りのウェイポイント

Trip エンティティには、TripWaypointRPC | REST)の繰り返しフィールドが含まれています。 remainingWaypointsRPC | REST)と呼ばれるものです。 このフィールドには、車両が順番に移動する必要があるすべての地点が含まれます 目的地に到着するまでの時間です次を計算します。 車両の残りのウェイポイント。 Back-to-back や Carpool の場合、このリストには このルートより前に通過する他のルート(ただしウェイポイントは除外) 選択します。リスト内のウェイポイントは TripId で識別できます および WaypointType

ルート状況と車両の残りの地点の関係

車両の残りのウェイポイントRPC | REST)は、 Fleet Engine が走行状況の変更リクエストを受信したときに更新する必要があります。「 以前のウェイポイントは、次の場合に車両の残りのウェイポイント リストから削除されます tripStatusRPC | REST) その他のステータスが ENROUTE_TO_XXX に変更されます。つまり ルートステータスが ENROUTE_TO_PICKUP から ARRIVED_AT_PICKUP に 乗車ポイントは車両の残りのウェイポイント リストに引き続き含まれますが、ルートが ステータスが ENROUTE_TO_INTERMEDIATE_DESTINATION または ENROUTE_TO_DROPOFF に変更され、 乗車ポイントは車両の残りのウェイポイントから削除されます。

ARRIVED_AT_INTERMEDIATE_DESTINATION と ENROUTE_TO_INTERMDEDIATE_DESTINATION.ARRIVED_AT_INTERMEDIATE_DESTINATION の場合、 現在の中間目的地は車両の残りの場所から削除されません 車両が次のウェイポイントに進んでいることを報告するまで、ウェイポイント リストが保持されます。

ルートのステータスが「COMPLETED」に変更されると、このルートからの地点は使用できなくなります 車両の残りのウェイポイント リストにあります。

ハウツー: ルートを作成する

各ルート リクエストをトラッキングし、Trip フリートの車両と一致します。CreateTripRequestCreateTrip エンドポイントを使用する 旅行を作成します

ルートを作成するには、次の属性が必要です。

  • parent - Google Cloud API リクエストの作成時に作成されたプロバイダ ID を含む文字列 Cloud プロジェクトが作成されました。
  • trip_id - ライドシェア プロバイダが作成する文字列。
  • trip - ルートを記述する基本的なメタデータを含むコンテナ。
    • trip_type - ルートに他の乗客がいるかどうかを表す列挙型 同じ車両(SHARED)内の異なる出発地と目的地から 単一当事者のみ(EXCLUSIVE)を指定できます。
    • pickup_point - 出発地を表す TerminalLocation 移動しますRPC リファレンスを参照 または REST リファレンス

ルートを作成するときに、number_of_passengersdropoff_point を指定できます。 および vehicle_id。これらのフィールドは必須ではありませんが、入力すると、 保持されます。その他の [ルート] フィールドはすべて無視されます。たとえば、すべてのルートが 次の trip_status を渡す場合でも、NEWtrip_status で開始します。 作成リクエストの CANCELED

次の例では、グランド インドネシア イースト モールへのルートが作成されます。ルート 乗客 2 人分の特別料金です。Tripprovider_id は プロジェクト ID と同じになります。この例では、配車サービス プロバイダが Google Cloud プロジェクト、project-id。このプロジェクトには、 Fleet Engine の呼び出しに使用されるサービス アカウント。ルートのステータスは NEW です。

その後、ルートと車両が一致すると、サービスは UpdateTrip: ルートが車両に割り当てられる場合に、vehicle_id を変更します。

shell

curl -X POST \
  "https://fleetengine.googleapis.com/v1/providers/project-id/trips?tripId=tid-1f97" \
  -H "Authorization: Bearer $JWT" \
  -H "Content-Type: application/json" \
  --data-binary @- << EOM
{
  "tripType": "EXCLUSIVE",
  "numberOfPassengers": 2,
  "pickupPoint": {
    "point": {"latitude": "-6.195139", "longitude": "106.820826"}
  },
  "dropoffPoint": {
    "point": {"latitude": "-6.1275", "longitude": "106.6537"}
  }
}
EOM

詳しくは、 providers.trips.create ご覧ください。

Java

static final String PROJECT_ID = "project-id";

TripServiceBlockingStub tripService = TripService.newBlockingStub(channel);

String parent = "providers/" + PROJECT_ID;
Trip trip = Trip.newBuilder()
    .setTripType(TripType.EXCLUSIVE) // Use TripType.SHARED for carpooling
    .setPickupPoint(                 // Grand Indonesia East Mall
        TerminalLocation.newBuilder().setPoint(
            LatLng.newBuilder().setLatitude(-6.195139).setLongitude(106.820826)))
    // Provide the number of passengers if available.
    .setNumberOfPassengers(2)
    // Provide the drop-off point if available.
    .setDropoffPoint(
        TerminalLocation.newBuilder().setPoint(
            LatLng.newBuilder().setLatitude(-6.1275).setLongitude(106.6537)))
    .build();

CreateTripRequest createTripRequest =
    CreateTripRequest.newBuilder()  // no need for the header
        .setParent(parent)
        .setTripId("tid-1f97")  // Trip ID assigned by the Provider
        .setTrip(trip)              // Initial state
        .build();

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

try {
  Trip createdTrip =
      tripService.createTrip(createTripRequest);
} catch (StatusRuntimeException e) {
  Status s = e.getStatus();
  switch (s.getCode()) {
    case ALREADY_EXISTS:
      break;
    case PERMISSION_DENIED:
      break;
  }
  return;
}

旅行の作成に関する Google Cloud Platform のログ

Fleet Engine API は、Google Cloud Platform のログを使用して CreateTrip エンドポイントへの呼び出しが受信される。このログエントリには CreateTrip リクエストの値に関する情報。もし 成功した場合は、返された Trip に関する情報も含まれます。

HOW-TO: ルートを更新する

Trip エンティティには、サービスによる追跡を有効にするフィールドと、 ルートの進捗状況を Driver SDK と Consumer SDKプロパティを更新するには、UpdateTripRequest を使用します。 表示されます。これにより、リクエストの field_mask に従って Trip フィールドが更新されます。 UpdateTripRequest をご覧ください。

ライドシェア プロバイダは、以下の属性を更新します。

  • ルートの状況。
  • 車両 ID。作成時に、または車両を 移動します
  • 乗車、降車、地点の変更。

Fleet Engine は、Cloud Storage バケットの使用時に次のフィールドを自動的に Driver SDK または Consumer SDK による移動経路の共有:

  • ルート
  • ETA
  • 残りの距離
  • 車両の位置情報
  • 残りのウェイポイント

RPC で Trip または REST の Resource.Trip

ルート更新情報の Google Cloud Platform ログ

Fleet Engine API は、Google Cloud Platform のログを使用して UpdateTrip エンドポイントへの呼び出しが受信される。このログエントリには UpdateTrip リクエストの値に関する情報。呼び出しに成功したら 返された Trip に関する情報も含まれます。

ハウツー: ルートを検索する

Fleet Engine はルートの検索をサポートしています。前述したように Trip は 7 日後に自動的に削除されるため、SearchTrips は すべてのルートの完全な履歴を公開できます。

SearchTrips は柔軟な API ですが、以下のリストでは 2 つのユースケースを想定しています。

  • 車両のアクティブなルートの特定 -- プロバイダは、車両で現在アクティブなルートを特定できます。SearchTripsRequest 内で、 vehicle_id は検討中の車両、active_trips_only に設定する true に設定する必要があります。

  • プロバイダと Fleet Engine の状態の調整 -- プロバイダは SearchTrips を使用して、トリップ状態と Fleet Engine の状態を一致させる。 これは、TripStatus で特に重要です。ルートの状況が COMPLETE または CANCELED に正しく設定されていない場合、 SearchVehicles に含まれていません。

この方法で SearchTrips を使用するには、vehicle_id を空のままにして、active_trips_only を設定します。 を true に設定し、minimum_staleness をほとんどの貸し出し期間よりも長い時間に設定します。 たとえば、1 時間を使用するとします。検索結果には、 「COMPLETED」または「CANCELED」のいずれかであり、1 時間以上更新されていません。プロバイダ これらのルートを調べて、Fleet Engine でのステータス 確認します。

トラブルシューティング

DEADLINE_EXCEEDED エラーが発生した場合、Fleet Engine の状態は 不明。プロバイダは CreateTrip を再度呼び出す必要があります。これにより、 201(CREATED)または 409(CONFLICT)。後者では前のリクエストが成功し DEADLINE_EXCEEDEDの前日まで。詳しくは、Consumer API ガイドをご覧ください ルートエラーの処理について: Android または iOS から変更することもできます。

相乗り乗車サポート

TripType.SHARED をサポートする車両には、複数の SHARED ルートを割り当てることができます。 割り当てられているすべてのルートについて、通過していないすべてのウェイポイントの順序を指定する必要があります。 を割り当てたときに、Trip.vehicle_waypoints 経由でこの共有乗車の車両 共有されたルートの vehicle_idCreateTrip または UpdateTrip リクエスト)。 RPC の vehicle_waypoints を参照 REST の場合は vehicleWaypoints

複数の宛先のサポート

中間デスティネーションを特定する

フィールド intermediateDestinations とフィールド intermediateDestinationIndex ルート内(RPC | REST) 組み合わせて宛先を指定します

中間デスティネーションを更新

中間デスティネーションは UpdateTrip で更新できます。更新時 中間の宛先を指定するには、中間の宛先の完全なリストを指定する必要があります。 新規訪問だけでなく 訪れたことがあるものも含まれます なります。 intermediateDestinationIndex が、次の位置の後のインデックスを指している場合 新しく追加または変更された中間宛先、新規または更新された中間宛先 目的地は車両の waypoints またはルートの remainingWaypoints に追加されません。 これは、intermediateDestinationIndex より前の中間の宛先があるためです。 アクセス済みのものとして扱われます

ルート状況の変更

RPC | REST)のフィールド intermediateDestinationsVersion Fleet Engine に送信されるルート状況の更新リクエストで必要となります。 中間デスティネーションが過ぎたことを示します。ターゲットとなる中間デスティネーション intermediateDestinationIndex フィールドで指定します。 tripStatusRPC | REST)が ENROUTE_TO_INTERMEDIATE_DESTINATION の場合、 [0..N-1] は、車両が次に通過する中間目的地を示します。 tripStatus が ARRIVED_AT_INTERMEDIATE_DESTINATION の場合、この範囲の数字 [0..N-1] は車両がどの中間目的地にいるかを示します。

次のコード例は、ルートのステータスを更新して「配送中」に更新する方法を示しています。 作成済みであると仮定して、最初の中間宛先に 複数の目的地のルートがあり、ルートが乗車地点を過ぎている場合。

Java

static final String PROJECT_ID = "project-id";
static final String TRIP_ID = "multi-destination-trip-A";

String tripName = "providers/" + PROJECT_ID + "/trips/" + TRIP_ID;
Trip trip = …; // Fetch trip object from FleetEngine or your storage.

TripServiceBlockingStub tripService = TripService.newBlockingStub(channel);

// Trip settings to update.
Trip trip = Trip.newBuilder()
    // Trip status cannot go back to a previous status once it is passed
    .setTripStatus(TripStatus.ENROUTE_TO_INTERMEDIATE_DESTINATION)
    // Enrouting to the first intermediate destination.
    .setIntermediateDestinationIndex(0)
    // intermediate_destinations_version MUST be provided to ensure you
    // have the same picture on intermediate destinations list as FleetEngine has.
    .setIntermediateDestinationsVersion(
        trip.getIntermediateDestinationsVersion())
    .build();

// Trip update request
UpdateTripRequest updateTripRequest =
    UpdateTripRequest.newBuilder()
        .setName(tripName)
        .setTrip(trip)
        .setUpdateMask(
            FieldMask.newBuilder()
                .addPaths("trip_status")
                .addPaths("intermediate_destination_index")
                // intermediate_destinations_version must not be in the
                // update mask.
                .build())
        .build();

// Error handling
try {
  Trip updatedTrip = tripService.updateTrip(updateTripRequest);
} catch (StatusRuntimeException e) {
  Status s = e.getStatus();
  switch (s.getCode()) {
    case NOT_FOUND:  // Trip does not exist.
      break;
    case FAILED_PRECONDITION:  // The given trip status is invalid, or the
                                // intermediate_destinations_version
                                // doesn’t match FleetEngine’s.
      break;
    case PERMISSION_DENIED:
      break;
  }
  return;
}

方法: Fleet Engine API からの通知メッセージに登録する

Fleet Engine API は Google Cloud Pub/Sub を使用 コンシューマ Google Cloud リソースによって作成されたトピックに関する通知をパブリッシュし、 プロジェクトですGoogle Cloud の Fleet Engine では Pub/Sub がデフォルトで有効になっていない できます。Pub/Sub を有効にするには、サポートケースを提出するか、カスタマー エンジニアにお問い合わせください。

Cloud プロジェクトにトピックを作成するには、こちらの手順に沿って操作してください。 トピック ID は「fleet_engine_notifications」にする必要があります。

Fleet Engine を呼び出すのと同じ Cloud プロジェクトにトピックを作成する必要がある API

トピックを作成したら、Fleet Engine API に そのトピックで公開する権限を持ちます。トピックをクリックして 新しい権限を追加します。場合によっては、[情報パネルを表示] をクリックして権限エディタを開く必要があります。 プリンシパルは geo-fleet-engine@system.gserviceaccount.com である必要があります ロールは Pub/Sub publisher にする必要があります。

通知にサブスクライブするように Cloud プロジェクトを設定するには、 こちらの手順に沿って操作してください。

Fleet Engine API は、各通知を 2 つの異なるデータでパブリッシュします。 形式、protobufjson。各通知のデータ形式は、 PubsubMessage 属性 キーは data_format、値は protobuf または json です。

通知スキーマ:

Protobuf

// A batch of notifications that is published by the Fleet Engine service using
// Cloud Pub/Sub in a single PubsubMessage.
message BatchNotification {
  // Required. At least one notification must exist.
  // List of notifications containing information related to changes in
  // Fleet Engine data.
  repeated Notification notifications = 1;
}

// A notification related to changes in Fleet Engine data.
// The data provides additional information specific to the type of the
// notification.
message Notification {
  // Required. At least one type must exist.
  // Type of notification.
  oneof type {
    // Notification related to changes in vehicle data.
    VehicleNotification vehicle_notification = 1;
  }
}

// Notification sent when a new vehicle was created.
message CreateVehicleNotification {
  // Required.
  // Vehicle must contain all fields that were set when it was created.
  Vehicle vehicle = 1;
}

// Notification sent when an existing vehicle is updated.
message UpdateVehicleNotification {
  // Required.
  // Vehicle must only contain name and fields that are present in the
  // field_mask field below.
  Vehicle vehicle = 1;

  // Required.
  // Contains vehicle field paths that were specifically requested
  // by the Provider.
  google.protobuf.FieldMask field_mask = 2;
}

// Notification related to changes in vehicle data.
message VehicleNotification {
  // Required. At least one type must be set.
  // Type of notification.
  oneof type {
    // Notification sent when a new vehicle was created.
    CreateVehicleNotification create_notification = 1;
    // Notification sent when an existing vehicle is updated.
    UpdateVehicleNotification update_notification = 2;
  }
}

JSON

BatchNotification: {
  "description": "A batch of notifications that is published by the Fleet Engine service using Cloud Pub/Sub in a single PubsubMessage.",
  "type": "object",
  "required": ["notifications"],
  "properties": {
    "notifications": {
      "description": "At least one notification must exist. List of notifications containing information related to changes in Fleet Engine data.",
      "type": "Notification[]"
    }
  }
}

Notification: {
  "description": "A notification related to changes in Fleet Engine data. The data provides additional information specific to the type of the notification.",
  "type": "object",
  "properties": {
    "vehicleNotification": {
      "description": "Notification related to changes in vehicle data.",
      "type": "VehicleNotification"
    }
  }
}

VehicleNotification: {
  "description": "Notification related to changes in vehicle data.",
  "type": "object",
  "properties": {
    "createNotification": {
      "description": "Notification sent when a new vehicle was created.",
      "type": "CreateVehicleNotification"
    },
    "updateNotification": {
      "description": "Notification sent when an existing vehicle is updated.",
      "type": "UpdateVehicleNotification"
    }
  }
}

CreateVehicleNotification: {
  "description": "Notification sent when a new vehicle was created.",
  "type": "object",
  "required": ["vehicle"],
  "properties": {
    "vehicle": {
      "description": "Vehicle must contain all fields that were set when it was created.",
      "type": "Vehicle"
    }
  }
}

UpdateVehicleNotification: {
  "description": "Notification sent when an existing vehicle is updated.",
  "type": "object",
  "required": ["vehicle", "fieldMask"],
  "properties": {
    "vehicle": {
      "description": "Vehicle must only contain name and fields that are present in the fieldMask field below.",
      "type": "Vehicle"
    },
    "fieldMask": {
      "description": "Contains vehicle field paths that were specifically requested by the Provider.",
      "type": "FieldMask"
    }
  }
}