Fleet Engine'i kullanmaya başlama

Fleet Engine On-İsteğe Bağlı Rides and Deliveries API'si, gezileri yönetmenize olanak tanır ve araç durumu hakkında daha fazla bilgi edinin. Sürücü SDK'sı, Tüketici SDK'sı ve oluşturarak Fleet Engine ile iletişim kurabilen arka uç hizmeti gibi gRPC veya REST çağrıları için geçerlidir.

Ön koşullar

Geliştirme için Google Cloud Platform'u SDK'yı (gcloud) kullanıyorsanız ve kimliği doğrulandığında akılda kalıcı bir yolunu sunar.

kabuk

gcloud auth login

Şuna benzer bir başarı mesajı görmeniz gerekir:

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

İsteğe Bağlı Yolculuklar ve Teslimatlar Çözümü Fleet Engine API'lerinin uygun şekilde yapılandırıldığından emin olun.

kabuk

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

Bu komut hatayla sonuçlanırsa proje yöneticinizle iletişime geçin ve Google destek temsilcinize ulaşın.

Günlük Kaydı

Fleet Engine, aldığı API çağrılarıyla ilgili günlük mesajları yazabilir Google Cloud Platform günlüklerine işlenmesini sağlar. Ayrıntılı bilgi için Cloud Logging günlüklerin nasıl okunacağı ve analiz edileceğine dair genel bakış.

Şu tarihten önce oluşturulan projeler için günlük kaydı varsayılan olarak etkinleştirilmemiş olabilir: 10 Şubat 2022. Bkz. günlük kaydı belgeleri inceleyebilirsiniz.

İstemci Kitaplıkları

Yaygın olarak kullanılan birkaç programlama dilinde istemci kitaplıkları yayınlıyoruz. Bu kitaplıkları, ham REST veya gRPC yerine daha iyi bir geliştirici deneyimi sağlamaya yardımcı olur. Sunucu uygulamanız için istemci kitaplıklarını nasıl edineceğinizle ilgili talimatlar için bkz. İstemci Kitaplıkları.

Bu belgelerdeki Java örneklerinde gRPC hakkında bilgi sahibi olduğu varsayılır.

Kimlik Doğrulama ve Yetkilendirme

Gezi ve Sipariş İlerlemesi tarafından sağlanan özellikleri Google Cloud Console. Bu API'ler ve SDK'lar, aşağıdaki koşulları karşılayan JSON Web Jetonlarının kullanılmasını gerektirir: alan adındaki hizmet hesapları kullanılarak imzalandı Cloud Console.

Bulut projesi kurulumu

Bulut projenizi kurmak için önce projenizi, ardından hizmet hesapları oluşturabilir.

Google Cloud projenizi oluşturmak için:

  1. Google Cloud Console'u kullanarak bir Google Cloud projesi oluşturun.
  2. API'ler ve Hizmetler Kontrol Paneli'ni kullanarak Yerel Yolculuklar ve Teslimatlar API'si.

Hizmet hesapları bir veya daha fazla rolle ilişkilendirilmiş. Bu kitleler, Değişikliğe bağlı olarak farklı izin grupları veren JSON Web Jetonları rollerini anlatacağım. Genellikle kötüye kullanım olasılığını azaltmak için birden fazla ve her biri gereken minimum rol kümesine sahip olmalıdır.

Gezi ve Sipariş İlerlemesi aşağıdaki rolleri kullanır:

RolAçıklama
Fleet Engine Tüketici SDK'sı Kullanıcısı

roles/fleetengine.consumerSdkUser
Araç arama ve bilgi alma izni verir araçlar ve geziler hakkında konuşuyorum. Bununla bir hizmet hesabı tarafından oluşturulan jetonlar rolü genellikle araç paylaşımı veya teslimat tüketici uygulaması mobil cihazlarından kullanılır.
Fleet Engine Sürücü SDK Kullanıcısı

roles/fleetengine.driverSdkUser
Araç konumlarını ve rotalarını güncelleme izni verir ve araçlar ve yolculuklar hakkında bilgi almak için. Jetonlar oluşturuldu bu role sahip bir hizmet hesabı tarafından genellikle araç paylaşımı veya teslimat sürücüsü uygulaması mobil cihazları.
Fleet Engine İsteğe Bağlı Yönetici

roles/fleetengine.ondemandAdmin
Tüm araç ve gezi kaynakları için okuma ve yazma izni verir. Bu role sahip ana hesapların JWT kullanması gerekmez ve bunun yerine Uygulama Varsayılan Kimlik Bilgilerini kullanın. Özel JWT talepleri yoksayılır. Bu rol güvenilir ortamlarla (müşteri arka ucu) sınırlı olmalıdır.
FleetEngine Hizmeti Süper Kullanıcısı **(KULLANIMDAN KALDIRILDI)**

roles/fleetengine.serviceSuperUser
Tüm araçlara ve yolculuk API'lerine izin verir. Basılan jetonlar bu role sahip bir hizmet hesabı tarafından genellikle arka ucunuzdan kullanılır sunucular. Bu rol kullanımdan kaldırıldı. Tercih Bunun yerine roles/fleetengine.ondemandAdmin.

Örneğin, bu üç rolün her biri için birer hizmet hesabı oluşturun ve rolleri açıklayacağım.

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

Sürücü ve Tüketici SDK'ları bu standart roller temel alınarak oluşturulmuştur.

Alternatif olarak, izin verilen özel roller de bir araya getirilecek rastgele izin grubudur. Sürücü ve Tüketici SDK'ları, gerekli izin eksik. Bu nedenle, şunları önemle öneririz: özel roller yerine yukarıda sunulan standart rol grubunu kullanma.

Güvenilmeyen istemciler için JWT jetonları oluşturmanız gerekirse Jeton oluşturabilmeleri için, Hizmet Hesabı Jetonu Oluşturucu rolünün kullanıcıları gcloud komut satırı araçlarını kullanın.

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

my-user@example.com nerede kullanılır? kimliği gcloud (gcloud auth list --format='value(account)') ile doğrulayın.

Fleet Engine Kimlik Doğrulama Kitaplığı

Fleet Engine, aşağıdakilere erişimi kısıtlamak için JSON Web Jetonlarını (JWT) kullanır Fleet Engine API'leri. Yeni Fleet Engine Kimlik Doğrulama Kitaplığı, GitHub'da bulabilirsiniz, Fleet Engine JWT'lerinin yapımını basitleştirir ve bunları güvenli bir şekilde imzalar.

Kitaplık aşağıdaki avantajları sunar:

  • Fleet Engine Jetonları oluşturma işlemini basitleştirir.
  • Kimlik bilgisi dosyalarını kullanmak dışında jeton imzalama mekanizmaları sağlar (ör. bir hizmet hesabının kimliğine bürünme.)
  • İmzalanmış jetonları bir gRPC koçanından veya GAPIC istemcisi.

Yetkilendirme için JSON Web Token (JWT) oluşturma

Fleet Engine Auth Kitaplığı kullanılmadığında, JSON Web Jetonları (JWT) kendi kod tabanınızda kolayca oluşturabilirsiniz. Bu hem geniş kapsamlı ve Fleet Engine'le ilişkisini anlıyor. Bu nedenle Fleet Engine Auth Library'den yararlanmanızı önemle tavsiye ederiz.

Fleet Engine içinde JSON Web Jetonları (JWT'ler) kısa ömürlü kimlik doğrulama sağlar ve cihazların yalnızca tek bir cihazdaki araçları, yolculukları veya görevleri bu verilere erişebilir. JWT'ler bir başlık ve hak talebi bölümü içerir. Üstbilgi bölümünde kullanılacak özel anahtar (hizmet hesaplarından alınır) ve şifreleme algoritmasında yer alır. Hak talebi bölümünde, jetonun oluşturulma zamanı, jetonların geçerlilik süresi, kullanım alanları erişimi talep etme ve diğer yetkilendirme bilgilerini edinin. erişim; Örneğin, araç kimliği.

JWT başlığı bölümü aşağıdaki alanları içerir:

AlanAçıklama
Alg Kullanılacak algoritma. "RS256".
typ Jetonun türü. "JWT".
çocuk Hizmet hesabınızın özel anahtar kimliği. Bu değeri hizmet hesabı JSON dosyanızın "private_key_id" alanında. Doğru izin düzeyine sahip bir hizmet hesabından anahtar kullandığınızdan emin olun.

JWT hak talepleri bölümü aşağıdaki alanları içerir:

AlanAçıklama
iss Hizmet hesabınızın e-posta adresi.
yerine girdi Hizmet hesabınızın e-posta adresi.
Aud Hizmet hesabınızın SERVICE_NAME hizmeti (bu örnekte https://fleetengine.googleapis.com/)
iat Jetonun oluşturulduğu zamana ait zaman damgası (geçen saniye cinsinden belirtilir) 1 Ocak 1970'te 00:00:00'dan (UTC) beri. Eğiklik için 10 dakika bekleyin. Öğe veya gelecekte bir zaman damgası çok ilerideyse sunucu hata bildirebilir.
exp Jetonun süresinin dolacağı zaman damgası (geçen saniye cinsinden belirtilir) 1 Ocak 1970'te 00:00:00'dan (UTC) beri. Zaman damgası daha uzun bir zaman aralığı için.
authorization Kullanım alanına bağlı olarak "vehicleid" veya "tripid" içerebilir.

JWT jetonu oluşturmak, jetonun imzalanması anlamına gelir. Talimatlar ve kod örnekleri için JWT'yi oluşturmak ve imzalamak için bkz. OAuth olmadan hizmet hesabını yetkilendirme. Ardından, imzalı bir jetonu gRPC çağrılarına veya kullanılan diğer yöntemlere ekleyebilirsiniz Fleet Engine'e erişmek için gereklidir.

JWT Hak Talepleri

JWT yükünü oluştururken yetkilendirmeye ek bir talep ekleyin vehicleid veya tripid anahtarının çağrının yapıldığı araç kimliği veya gezi kimliği.

Sürücü SDK'sı, vehicleid bir seyahat aracı olabilir. Fleet Engine arka ucu, aracın , değişikliği yapılmadan önce istenen geziyle ilişkilendirilir.

Tüketici SDK'sı her zaman tripid hak talebini kullanır.

Araç Paylaşımı veya Teslimat Sağlayıcısı, vehicleid ya da tripid öğesini "*" ile kullanmalıdır. - tüm Araçlar ve Seyahatlerle eşleşir. JWT'nin her iki jetonu da içerebileceğini unutmayın. Bu işlem, jeton imzalama uygulamasını basitleştirebilir.

JWT Kullanım Alanları

Aşağıda Sağlayıcı sunucusu için örnek bir jeton gösterilmektedir:

{
  "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": "*"
   }
}

Aşağıda Tüketici uygulaması için örnek bir jeton gösterilmektedir:

{
  "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"
   }
}

Aşağıda Sürücü uygulaması için örnek bir jeton gösterilmektedir:

{
  "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"
   }
}
  • Başlıktaki kid alanı için hizmet hesabınızın özel anahtarını belirtin Kimlik. Bu değeri, hizmetinizin private_key_id alanında bulabilirsiniz. account JSON dosyası.
  • iss ve sub alanları için hizmet hesabınızın e-posta adresini belirtin. Bu değeri, hizmet hesabınızın client_email alanında bulabilirsiniz. JSON dosyası.
  • aud alanı için https://SERVICE_NAME/ değerini belirtin.
  • iat alanı için jetonun oluşturulduğu andaki zaman damgasını kullanın. 1 Ocak 1970 tarihinde 00:00:00 UTC itibarıyla geçen saniye olarak belirtilir. Eğiklik için 10 dakika bekleyin. Zaman damgası çok geçmişteyse ya da ileride sunucu hata bildirebilir.
  • exp alanında, jetonun süresinin dolduğu sıradaki zaman damgasını kullanın. 1 Ocak 1970 00:00:00 (UTC) tarihinden itibaren saniye olarak belirtilir. Maksimum izin verilen değer iat + 3600'dür.

Bir mobil cihaza iletilmek üzere JWT'yi imzalarken Sürücü veya Tüketici SDK'sı rolü için hizmet hesabı. Aksi halde, mobil cihaz, olmaması gereken durumu değiştirebilir.

Benzer şekilde, ayrıcalıklı çağrılar için kullanılacak JWT'yi imzalarken kullanın. Aksi halde, işlemi başarısız olur.

Test için JWT oluşturma

Terminalden jeton oluşturmak test sırasında faydalı olabilir.

Bu adımları uygulamak için kullanıcınız hesap, Hizmet Hesabı Jetonu Oluşturucu rolüne sahip olmalıdır:

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

Aşağıdaki içerikle unsigned_token.json adında yeni bir dosya oluşturun. iat özelliği, dönemden sonraki saniye sayısı cinsinden geçerli zamandır. terminalinizde date +%s çalıştırarak alınır. exp özelliği dönemden sonraki saniye sayısı cinsinden geçerlilik süresi (şu şekilde hesaplanabilir: 3.600 ekleyerek iat. Son kullanma tarihi duymuş olabilirsiniz.

{
  "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": "*"
   }
}

Ardından Super hesabınız adına jetonu imzalamak için aşağıdaki gcloud komutunu çalıştırın Kullanıcı hizmet hesabı:

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

İmzalanmış Base64 kodlu bir JWT artık dosyanın içinde depolanmalıdır signed_token.jwt Jeton önümüzdeki bir saat boyunca geçerlidir.

Artık Araçları Listele üzerinde curl komutu çalıştırarak jetonu test edebilirsiniz REST uç noktası:

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

Araçlar ve yaşam döngüleri

Araç, bir sürücü-araç çiftini temsil eden tüzel kişidir. Şu anda, Sürücü ve Araç ayrı ayrı izlenemez. Araç Paylaşma veya Teslimat Sağlayıcısı kodu, Hizmet hesabını içeren Google Cloud projesinin proje kimliği Filo Motoru API'lerini çağırmak için kullanılır) ve Yolculuk Paylaşımı veya Teslimat Sağlayıcıya ait Araç Kimliği.

Yedi gün geçmesine rağmen UpdateVehicle aracılığıyla güncellenmeyen bir Araç otomatik olarak silinir ve varsa atanmış gezileri, ataması kaldırıldı. Bir aracı ulaşılabilir durumda tutmak için önerilen yaklaşım konumunu düzenli aralıklarla güncellemektir. Çoğunda yapılan güncellemeler Vehicle varlığındaki diğer alanlar da yeni alan değeri mevcut değerden farklı olur.

NOT: Vehicle varlığındaki device_settings gibi bazı alanlar hata ayıklama amacıyla yapılıyor bilgileri için de geçerlidir. Bunların güncellendiğinde Vehicle öğesinin ömrünü uzatır.

CreateVehicle adlı kullanıcının Zaten mevcut olan sağlayıcı kimliği/araç kimliği çifti. 2024 yılında, 2024 yılında Sık sık güncellenmediği durumlar iki şekilde ele alınabilir: sık sık telefon etmek Beklenen bir sağlayıcı kimliği/araç kimliği çiftine sahip CreateVehicle ve siliniyor Araç zaten varsa bu hatayı alma; veya bir anahtar kelimeden sonra CreateVehicle UpdateVehicle, NOT_FOUND hatasıyla döndürülüyor.

Araç konumu güncellemeleri

Fleet Engine ile en iyi performansı elde etmek için Fleet Engine'e bir araç akışı sağlayın Konum güncellemeleri. Bu güncellemeleri sağlamak için aşağıdaki yöntemlerden birini kullanın:

  1. Sürücü SDK'sını kullanın: Android, iOS -- en basit seçenektir.
  2. Özel kod kullanın (konumlar şunlardır: veya Android ya da Chrome OS dışında bir cihaz kullanıyorsanız iOS.

Araç türleri

Araç varlığında, şunları içeren zorunlu VehicleType alanı yer alır: Category enum (şu şekilde belirtilebilir): AUTO, TAXI, TRUCK, TWO_WHEELER, BICYCLE veya PEDESTRIAN. Araç türü SearchVehicles ve ListVehicles reklam grubundaki filtre ölçütlerini kullanın.

Araçlar için tüm rotalarda ilgili RouteTravelMode kullanılacaksa kategorisi AUTO, TWO_WHEELER, BICYCLE veya PEDESTRIAN olarak ayarlanmış. Kategori TAXI veya TRUCK değerine ayarlanırsa yönlendirme AUTO moduna ayarlar.

Araç özellikleri

Araç varlığı, yinelenen bir VehicleAttribute alanı içeriyor. Bu özellikleri Fleet Engine tarafından yorumlanmaz. SearchVehicles API, eşleşen Vehicles öğesinin tümünü içermesini zorunlu kılan bir alan içeriyor eklenen özellikler belirtilen değere ayarlanır.

Özellik alanının, desteklenen diğer birkaç alanın yanı sıra olduğunu unutmayın. (ör. vehicle_type ve supported_trip_types) Vehicle mesajında.

Araç kalan ara noktaları

Araç varlığı, yinelenen bir TripWaypoint alanı içeriyor (RPC | REST), waypoints(TBG | REST) olarak adlandırılır. Bu alan, gezilerdeki geri kalan ara noktaları içerir. Sırayla araç buralara ulaştığında. Fleet Engine, bu alanı geziler olarak hesaplar arabaya atanır ve yolculuklar durumu değiştikçe aracı günceller. Bu referans noktaları, TripId alanı ve WaypointType alanı ile tanımlanabilir.

Bir aracın eşleşmeler için uygunluğunu genişletme

Genellikle, yolculuk paylaşımından Araç Paylaşımı veya Teslimat Sağlayıcısının hizmetleri sorumludur araçlara yapılan talep. Hizmet, araç özelliklerini kullanarak daha fazla aramada kullanılıyor. Örneğin, sağlayıcı tarafından sağlanan ayrıcalık veya yetenek düzeylerine karşılık gelen özellikler grubu araç. Örneğin, üç seviye, boole değeri olan bir özellik kümesi olabilir değerler: is_bronze_level, is_silver_level ve is_gold_level. Araç üçü de için uygun olabilir. Fleet Engine, bir bir geziyi tekrarlarsanız, arama o aracı da içerir. Özelliklerin bu şekilde kullanılması, çeşitli özellikler sunan araçlar için de geçerlidir özellikler.

Araç özelliklerini güncellemenin iki yolu vardır. Biri UpdateVehicle API'ye gidin. Bu API kullanılırken Araç Özellikleri grubunun tamamı: değerine ayarlayın. Yalnızca tek bir özelliği güncellemek mümkün değildir. Diğer yöntem UpdateVehicleAttributes API'sidir. Bu yöntem yalnızca özelliklerin güncellenmesini sağlar. İstekte yer alan özellikler yeni bir değere ayarlanmış veya belirtilmemiş özellikler değiştirilmez.

Nasıl Yapılır?: Araç Oluşturma

Filoda izlenecek her Araç için bir Vehicle varlığı oluşturulmalıdır.

Bir oluşturmak için CreateVehicleRequest ile CreateVehicle uç noktasını kullanın Araç.

Vehicle öğesinin provider_id öğesi proje kimliği olmalıdır (ör.my-on-demand-project) [ör. my-on-demand-project] Fleet Engine'i çağırmak için kullanılacak Hizmet Hesapları. Lütfen Birden fazla hizmet hesabı, aynı Yolculuk Paylaşımı için Fleet Engine'e erişebilir veya Teslimat Sağlayıcısı olarak, Fleet Engine şu anda Aynı Vehicles öğesine erişen birden fazla Google Cloud projesi var.

Vehicle, OFFLINE veya ONLINE durumunda oluşturulabilir. Eğer ONLINE oluşturulduysa SearchVehicles talebine yanıt olarak hemen iade edilebilir daha fazla bilgi edineceksiniz.

CreateVehicle görüşmesine ilk last_location dahil edilebilir. İzin verildiği takdirde, ONLINE durumunda Vehicle oluşturulmamalıdır: last_location.

Araçla ilgili ayrıntılar için Araç Türleri bölümüne bakın tür alanına ekleyin.

Ayrıntılar için Araç Özellikleri bölümüne bakın. değerini girin.

CreateVehicle öğesinden döndürülen değer, oluşturulan Vehicle varlığıdır.

Örnek

kabuk

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

Görüntüleyin providers.vehicles.create bir referans noktası olarak kabul edilir.

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.

Araç oluşturma için Google Cloud platform günlükleri

Bir CreateVehicle uç noktasına çağrı alınır. Günlük girişi CreateVehicle isteğindeki değerlerle ilgili bilgiler. Arama başarılı olursa, Vehicle ile ilgili bilgileri de geri döndü.

kabuk

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

Aşağıdakine benzer bir kayıt yazdırılmalıdır:

---
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'

Araç oluşturmayla ilgili Cloud Pub/Sub bildirimleri

Fleet Engine API, yeni bir otomatik olarak oluşturulur. Bu bildirimleri almak için lütfen şu yönergeleri izleyin: talimatları burada bulabilirsiniz.

NASIL YAPILIR? Bir aracın konumunu güncelleme

Aracın konumunu güncellemek için Sürücü SDK'sını kullanmıyorsanız bir Fleet Engine'e aracın konumuyla birlikte doğrudan çağrı. Tüm etkin araçlarda Fleet Engine, en az dakikada bir, en çok dakikada bir konum güncellemesi bekler 5 saniyede bir. Bu güncellemeler için yalnızca Fleet Engine Sürücü SDK Kullanıcısı gerekir ayrıcalıkları.

Örnek

kabuk

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

Görüntüleyin providers.vehicles.update bir referans noktası olarak kabul edilir.

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.

NASIL YAPILIR? Diğer Araç alanlarını güncelleme

Araç durumunun diğer özelliklerinde güncellemeler şundan daha seyrek yapılır: veya konum güncellemeleri. last_location dışındaki özelliklerde yapılan güncellemeler için gerekli Fleet Engine Süper Kullanıcı ayrıcalıkları.

UpdateVehicleRequest, hangi alanların gösterileceğini belirten bir update_mask içerir güncelleyin. Alanın davranışı, aşağıdaki örnekteki gibi Protobuf dokümanlarındaki gibidir: sahip olacaksınız.

Araç Özellikleri bölümünde belirtildiği gibi, attributes alanına, korunacak tüm özelliklerin yazılması gerekir. Google bir anahtar/değer çiftinin değerini sadece tek bir UpdateVehicle arama. Belirli özelliklerin değerlerini güncellemek için UpdateVehicleAttributes API kullanılabilir.

Örnek

Bu örnekte back_to_back etkinleştirilir.

kabuk

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

Görüntüleyin providers.vehicles.update bir referans noktası olarak kabul edilir.

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.

Araç Güncellemeleri için Google Cloud platform günlükleri

Bir UpdateVehicle uç noktasına çağrı alınır. Günlük girişi UpdateVehicle isteğindeki değerlerle ilgili bilgiler. Arama başarılı olursa, Vehicle ile ilgili bilgileri de geri döndü.

kabuk

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

Araç güncellemeleri için Cloud Pub/Sub bildirimleri

Fleet Engine API, mevcut bir araç güncellendi. Bu bildirimleri almak için lütfen şu yönergeleri izleyin: talimatları burada bulabilirsiniz.

NASIL YAPILIR? Araç arama

Fleet Engine, araç aramayı destekler. SearchVehicles API, aşağıdakiler gibi bir göreve en uygun yakındaki sürücüleri bulmanızı sağlar: yolcu veya teslimat talebi. SearchVehicles API, bir görev özellikleri ile eşleşen sürücülerin sıralı listesi filonuzu test edin. Daha fazla bilgi için bkz. Yakındaki sürücüleri bulma.

Örnek

Kullanılabilir araçlar ararken, Fleet Engine, aşağıdaki yollarda bulunan araçları hariç tutar: varsayılan olarak etkin yolculuk sayısı. Araç paylaşma veya teslimat sağlayıcısı hizmetleri, bunları arama isteklerine açıkça dahil etmesi gerekir. Aşağıdaki örnekte, bu araçları Grand'ten bir geziyle eşleşen araçları aramaya dahil edebilir Balai Sidang Jakarta Kongre Merkezi'ne ev sahipliği yapan Indonesia East Alışveriş Merkezi.

kabuk

Öncelikle, önceki adımlarda oluşturduğumuz aracın konumunu güncelleyin. uygun. Gerçek dünyada bu, çalışan Sürücü SDK'sı tarafından yapılır. araçtaki bir Android veya iOS cihazda.

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

Arama gerçekleştirilirse en azından bu araç getirilmelidir.

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

Görüntüleyin providers.vehicles.search bir referans noktası olarak kabul edilir.

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;
}

Araç filtreleme sorgusu

SearchVehicles ve ListVehicles, araç özelliklerinde filtrelemeyi destekler kullanabilirsiniz. Filtre sorgusu söz dizimi için bkz. Örnekler için AIP-160.

Filtre sorgularının YALNIZCA araç özelliklerinde filtrelemeyi desteklediğini ve diğer alanlar için kullanılamaz. Filtre sorgusu, bir AND ifadesi olarak işlev görür (ör. minimum_capacity veya vehicle_types) SearchVehiclesRequest.

NASIL YAPILIR?: Araçları listeleme

SearchVehicles, sıralamada az sayıda araç bulmak için optimize edildi çok hızlı sipariş verir ve genellikle yakındaki sürücüleri bulmak için kullanılır. kısa bir açıklamadır. Ancak bazen belirli gereksinimleri karşılayan tüm araçları bulmak gerekli olsa bile arama kriterlerini karşılamaya devam edecektir. ListVehicles bu kullanım alanı için tasarladık.

ListVehicles API, belirli bazı araçları karşılayan tüm araçları bulmanıza olanak tanır istek seçenekleri. ListVehicles API, aşağıdaki konumlardaki araçların sayfalara ayrılmış bir listesini döndürür: karşılayıp karşılamadığını görmeye yarar.

Araç özelliklerine göre filtreleme yapmak için lütfen Araç filtreleme sorgusu.

Örnek

Bu örnekte, vehicle_type ve özellikleri filter dizesi.

kabuk

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

Görüntüleyin providers.vehicles.list bir referans noktası olarak kabul edilir.

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;
}

Geziler ve yaşam döngüleri

Triest API ve yaşam döngüsü, Vehicle API ve yaşam döngüsüne benzer. Yolculuk Paylaşımı Sağlayıcısı, Fleet Engine'i kullanarak gezi oluşturmaktan sorumludur kullanır. Fleet Engine, hem RPC hizmeti hem de TripService ve REST kaynakları, provider.trips , Bu arayüzler Seyahat varlığı oluşturma, bilgi isteği, arama ve işlevselliği ve güncelleme yeteneğini içerir.

Trip, yaşam döngüsü boyunca ilerlemesini izlemek için bir durum alanına sahiptir. NEW aralığındaki değerler, COMPLETE artı CANCELED ve UNKNOWN_TRIP_STATUS arasında taşınır , RPC için trip_status konusuna bakın veya REST için TripStatus'a gidin.

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

Hizmetiniz, CANCELED seyahatini bu durumların herhangi birinden güncelleyebilir. Hizmetiniz bir gezi oluşturduğunda motor, durumu NEW olarak ayarlar. CEVAP vehicle_id isteğe bağlıdır. Araçlarda olduğu gibi, hizmetler atanmamış gezileri otomatik olarak siler haber almadan yedi gün sonra. Hizmetiniz bir seyahat planı oluşturmaya çalışırsa kimliği zaten mevcut, hata döndürülür. Bir gezi aşağıdaki durumlarda "etkin" olarak kabul edilir: COMPLETE veya CANCELED dışında bir durumda. Bu ayrım Araç varlığındaki active_trips ve SearchTripsRequest alanında önemli.

Hizmetiniz bir geziye atanan vehicle_id öğesini yalnızca seyahat sırasında değiştirebilir etkin. Örneğin, bu işlemi, sürücünün araç kullanırken ve seyahat farklı bir araca yeniden atanır.

Arka arkaya uygulanırken durum önemlidir seyahat desteği. Bu destek, Sağlayıcı'nın bir Araca yeni bir seyahat ataması yapabilmesini sağlar. Araç aktif bir Seyahatteyken. Kod art arda yapılan geziler, tek bir geziyle aynıdır ve her bir seyahat için araç kimliği. Fleet Engine, yeni seyahatin kalkış ve varış noktalarını ara işaretler. Art arda yapılan geziler hakkında daha fazla bilgi için Çok noktalı geziler oluşturun.

Gezinin kalan ara noktaları

Seyahat varlığı, yinelenen bir TripWaypoint alanı (RPC | REST) içeriyor. remainingWaypoints(RPC | REST) olarak adlandırılır. Bu alan, aracın sırayla gitmesi gereken tüm ara noktaları içerir gitmeden önce gidelim. Şunun hesaplamasında: Aracın kalan ara noktaları. Arka arkaya ve Araba Paylaşımı kullanım durumlarında bu liste, bu geziden önce geçilecek ancak ara noktaların dahil olmadığı diğer geziler bu seyahatten sonra. Listedeki ara nokta, TripId ile tanımlanabilir ve WaypointType.

Yolculuk durumu ile Araçta kalan ara noktalar arasındaki ilişki

Aracın kalan ara noktaları (RPC | REST), Fleet Engine bir seyahat durumu değişikliği isteği aldığında güncellenir. İlgili içeriği oluşturmak için kullanılan önceki ara nokta, aracın kalan ara noktaları listesinden kaldırılır: tripStatus(RPC | REST) diğer durum ENROUTE_TO_XXX olarak değiştirildi. Yani, ENROUTE_TO_PICKUP olan seyahat durumu ARRIVED_AT_PICKUP, seyahatin teslim alma noktası yine de aracın kalan ara nokta listesinde yer alır, ancak yolculuk sırasında durum ENROUTE_TO_INTERMEDIATE_ROAS veya ENROUTE_TO_DROPOFF olarak değiştirilirse başlangıç noktası aracın kalan ara noktalarından kaldırılır.

Bu, ARRIVED_AT_INTERMEDIATE_ROAS ve ENROUTE_TO_INTERMDEDIATE_DESTINATION. ARRIVED_AT_INTERMEDIATE_ROAS olduğunda, Mevcut ara hedef, aracın geri kalanından kaldırılmayacak araç, bir sonraki ara noktaya yönlendirildiğini bildirene kadar ara nokta listesini çıkarır.

Yolculuk durumu COMPLETED olarak değiştirildiğinde, bu geziye ait hiçbir ara nokta görünmez aracın kalan ara nokta listesindedir.

NASIL YAPILIR?: Gezi oluşturun

Her gezi isteğinin izlenebilmesi için bir Trip varlığı oluşturulmalıdır ve filodaki Araçlarla eşleştirildi. CreateTrip uç noktasını CreateTripRequest ile kullanın tıklayın.

Gezi oluşturmak için aşağıdaki özellikler gereklidir:

  • parent - Google Cloud projesi oluşturuldu.
  • trip_id - Araç Paylaşımı Sağlayıcısı tarafından oluşturulan bir dize.
  • trip: Geziyi açıklayan temel meta verileri içeren kapsayıcı.
    • trip_type - Gezide başka yolcuların olup olmadığını temsil eden sıralama aynı araçta farklı bir kalkış ve varış noktasından (SHARED) veya yalnızca tek taraflı (EXCLUSIVE).
    • pickup_point - Verinin başlangıç noktasını temsil eden TerminalLocation hayal edin. RPC referansına bakın veya REST referansı

Gezi oluştururken number_of_passengers, dropoff_point sağlayabilirsiniz ve vehicle_id. Bu alanlar zorunlu olmamakla birlikte, sağladığınızda bu veriler saklanır. Diğer tüm Seyahat alanları yoksayılır. Örneğin, tüm seyahatler trip_status NEW puanla geçseniz bile trip_status ile NEW CANCELED (oluşturma isteğinde).

Örnek

Aşağıdaki örnekte Grand Indonesia East Mall'a bir gezi oluşturulmaktadır. Gezi ve özeldir. Trip için provider_id özelliği şu şekilde olmalıdır: proje kimliği ile aynıdır. Örnekte Araç Paylaşma Sağlayıcısı Google Cloud Projesi, project-id. Bu proje, Fleet Engine'i çağırmak için kullanılan Hizmet Hesapları. Gezinin durumu: NEW.

Daha sonra servis, seyahati bir araçla eşleştirdikten sonra UpdateTrip ve gezi bir araca atandığında vehicle_id değerini değiştirin.

kabuk

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

Görüntüleyin providers.trips.create bir referans noktası olarak kabul edilir.

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;
}

Seyahat Oluşturma için Google Cloud platform günlükleri

Bir CreateTrip uç noktasına çağrı alınır. Günlük girişi CreateTrip isteğindeki değerlerle ilgili bilgiler. Arama başarılı olursa döndürülen Trip ile ilgili bilgileri de içerir.

NASIL YAPILIR?: Gezi güncelleme

Gezi varlığı, hizmet tarafından izlemeyi etkinleştiren ve ve üçüncü tarafın Tüketici SDK'sı. Özellikleri güncellemek için UpdateTripRequest işlevini kullanın. mesajını alırsınız. Bu işlem, Seyahat alanlarını isteğin field_mask doğrultusunda günceller. UpdateTripRequest konusuna bakın.

Araç Paylaşımı Sağlayıcısı, aşağıdaki özelliklerin güncellenmesinden sorumludur:

  • Gezi durumu.
  • Araç kimliği. Oluşturulma sırasında veya aracı bir araçla eşleştirdikten sonra hayal edin.
  • Teslim alma, bırakma veya ara noktalarla ilgili değişiklikler.

Fleet Engine, Sürücü SDK'sı veya Tüketici SDK'sı aracılığıyla yolculuk paylaşımı özelliği:

  • Rotalar
  • TVS
  • Kalan mesafe
  • Araç konumu
  • Kalan ara noktalar

TripRPC'deki bölümüne bakın veya REST'te Resource.Trip.

Seyahat Güncellemeleri için Google Cloud platform günlükleri

Bir UpdateTrip uç noktasına çağrı alınır. Günlük girişi UpdateTrip isteğindeki değerlerle ilgili bilgiler. Arama başarılı olursa ayrıca, döndürülen Trip ile ilgili bilgileri de içerir.

Nasıl yapılır? Gezi arama

Fleet Engine, gezi aramayı destekler. Daha önce de belirtildiği gibi, Gezi yedi gün sonra otomatik olarak silinir. Dolayısıyla SearchTrips tüm Seyahat geçmişinin eksiksiz bir şekilde gösterilmesini sağlar.

SearchTrips esnek bir API olsa da aşağıdaki listede iki kullanım alanı sunulmuştur.

  • Bir Aracın Aktif Seyahatlerini Belirleme -- Sağlayıcı, bir aracın o anda aktif olan gezileri belirleyebilir. SearchTripsRequest içinde, vehicle_id, değerlendirilen araca ve active_trips_only olarak ayarlandı true olarak ayarlanmalıdır.

  • Sağlayıcı ile Filo Motoru Durumunu Uzlaştırma -- Sağlayıcı, SearchTrips ile Fleet Engine'in Seyahat durumu durumunun eşleştiğinden emin olun. Bu, özellikle TripStatus için önemlidir. Bir seyahatin durumu değeri COMPLETE veya CANCELED olarak doğru şekilde ayarlanmadıysa Araç SearchVehicles tarafından dahil edilmez.

SearchTrips öğesini bu şekilde kullanmak için vehicle_id alanını boş bırakıp active_trips_only olarak ayarlayın true olarak ve minimum_staleness değerini çoğu seyahat süresinden daha uzun bir süreye ayarlayın. Örneğin, bir saat değerini kullanabilirsiniz. Sonuçlar arasında TAMAMLANDI veya İPTAL EDİLDİ ve bir saatten uzun süredir güncellenmedi. Sağlayıcı bu Seyahatleri inceleyerek, Fleet Engine'deki durumlarının düzgün bir şekilde güncellendi.

Sorun giderme

DEADLINE_EXCEEDED hatası durumunda Fleet Engine'in durumu: bilinmiyor. Sağlayıcı CreateTrip işlemini tekrar yapmalıdır. Bu durumda, 201 (CREATED) veya 409 (CONFLICT). İkinci durumda ise önceki istek başarılı oldu. DEADLINE_EXCEEDED tarihinden önce. Daha fazla bilgi için Consumer API kılavuzlarına göz atın. Seyahat hatalarını ele alma hakkında: Android veya iOS'ten seçin.

Ortak araba kullanımı desteği

TripType.SHARED destekleyen bir araca birden fazla SHARED seyahati atayabilirsiniz. Şuna atanan tüm Seyahatler için geçilmeyen tüm ara noktaların sırasını belirtmeniz gerekir: Bu paylaşılan yolculuktaki Araç (Trip.vehicle_waypoints) Paylaşılan seyahat için vehicle_id (CreateTrip veya UpdateTrip isteğinde). RPC için vehicle_waypoints konusuna bakın veya REST için vehicleWaypoints.

Birden çok hedef desteği

Ara hedef belirleme

intermediateDestinations alanı ve intermediateDestinationIndex alanı Yolculuk (RPC | REST) birlikte kullanılması gerekir.

Ara hedefi güncelleyin

Ara hedefleri UpdateTrip üzerinden güncelleyebilirsiniz. Güncellenirken ara hedeflerin tam bir listesini sağlamalısınız, yalnızca yeni gelenleri değil, ziyaret edilenleri herhangi bir değişiklik yapılmaması gerekir. intermediateDestinationIndex, yeni eklenen/değiştirilmiş ara hedef, yeni/güncellenen ara hedef hedef, Aracın waypoints veya Seyahatin remainingWaypoints öğesine eklenmez. Bunun nedeni, intermediateDestinationIndex öncesindeki tüm ara hedeflerdir önceden ziyaret edilmiş gibi ele alınır.

Gezi durumu değişiklikleri

(RPC | REST) içindeki intermediateDestinationsVersion alanı Fleet Engine'e gönderilen Seyahat durumu güncelleme isteğinde, bir ara hedef geçildi. Hedeflenen ara hedef intermediateDestinationIndex alanı aracılığıyla belirtilir. tripStatus (RPC | REST), ENROUTE_TO_INTERMEDIATE_VAR olduğunda, [0..N-1] aracın geçeceği ara hedefi belirtir. tripStatus ARRIVED_AT_INTERMEDIATE_ROAS olduğunda, [0..N-1] aracın hangi ara hedefte olduğunu gösterir.

Örnek

Aşağıdaki kod örneğinde, yol boyunca bir gezi durumunun nasıl güncelleneceği ilk ara hedefine ulaşılırsa, o hedef için bir dönüşüm hacmi ve seyahat, başlangıç noktasından geçtiğinden emin olun.

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;
}

NASIL YAPILIR?: Fleet Engine API'sinden bildirim mesajlarına abone olma

Fleet Engine API, Google Cloud Pub/Sub'ı kullanır Google Cloud'un tüketici sürümü tarafından oluşturulan konuyla ilgili bildirimler yayınlamak Proje. Google Cloud'unuzda Fleet Engine için Pub/Sub varsayılan olarak etkin değil belirler. Pub/Sub'ı etkinleştirmek için lütfen bir destek kaydı oluşturun veya Müşteri Mühendisinizle iletişime geçin.

Cloud projenizde konu oluşturmak için bu talimatları uygulayın. Konu kimliği "fleet_engine_notifications" olmalıdır.

Konu, Fleet Engine'i çağıran Cloud projesinde oluşturulmalıdır. API'ler.

Konu oluşturulduktan sonra Fleet Engine API'ye izin vermeniz gerekir konusunda yayınlama izni olur. Bunu yapmak için, ilgilendiğiniz konuyu az önce oluşturuldu ve yeni bir izin ekleyin. İzin düzenleyiciyi açmak için BİLGİ PANELİNİ GÖSTER'i tıklamanız gerekebilir. Ana hesap, geo-fleet-engine@system.gserviceaccount.com olmalıdır ve rol Pub/Sub publisher olmalıdır.

Bildirimlere abone olmak amacıyla Cloud Projenizi ayarlamak için bu talimatları uygulayın

Fleet Engine API, her bildirimi iki farklı veride yayınlar biçimleri, protobuf ve json. Her bildirimin veri biçimi şurada belirtilmiştir: PubsubMessage özellikleri data_format olarak anahtar ve protobuf veya json olarak değer girin.

Bildirim şeması:

Protokol Arabelleği

// 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"
    }
  }
}