Fleet Engine Deliveries API ile teslimatların ilk ve son aşaması için filo faaliyetlerinizi modelleyin. Bu API'yi Android ve iOS için Sürücü SDK'sını kullanarak veya doğrudan HTTP REST ya da gRPC çağrılarını kullanarak kullanabilirsiniz.
İlk kurulum
Fleet Engine Deliveries API'yi Google Cloud Console'da yapılandırırsınız.
Konsolda uygulanması gereken adımlar ve yetkilendirme için JSON Web Jetonu oluşturma hakkında bilgi edinmek için Kimlik doğrulama ve yetkilendirme bölümüne bakın.
Konsolu kullanmayla ilgili ayrıntılı bilgi için Google Cloud Console belgelerini inceleyin.
Ayarlarınızı doğrulama
Servis hesapları oluşturduktan sonra kurulumunuzun tamamlandığını doğrulayın ve teslimat aracı oluşturabilirsiniz. Kurulumunuzu hemen doğrulamak, projenizi oluştururken ortaya çıkabilecek yaygın yetkilendirme sorunlarını gidermiş olmanızı sağlar. Ayarlarınızı doğrulamanın iki yolu vardır:
Kurulumunuzun iki önemli bölümünü test edin:
gcloud
komut satırı yardımcı programıyla yetkilendirme jetonu imzalama ve deneme teslimatı aracı oluşturma. Ayrıntılar için Kurulumunuzu doğrulama kılavuzuna bakın.Fleet Engine Auth Sample Scripts (Filo Yetkilendirme Örnek Komut Dosyaları) ile kurulumunuzu test edin.
İstemci Kitaplıkları
Ham gRPC veya REST üzerinde daha iyi bir geliştirici deneyimi için birkaç yaygın programlama dilindeki istemci kitaplıklarını kullanın. Sunucu uygulamanız için istemci kitaplıklarını nasıl edineceğinizle ilgili talimatlar için İstemci Kitaplıkları bölümüne bakın.
Bu belgedeki Java örneklerinde gRPC hakkında bilgi sahibi olduğunuz varsayılmıştır.
Veri yapıları
Fleet Engine Deliveries API, gönderilerin teslim alma ve teslim sürecini modellemek için iki veri yapısı kullanır:
- Gönderiyi taşımak için kullanılan teslimat aracı.
- Sevkiyatın teslim alma ve teslimat görevleri.
Gün boyunca sürücü molalarını ve planlanan durakları modellemek için de görevleri kullanırsınız.
Teslimat araçları
Teslimat araçları, gönderileri bir depodan teslimat konumuna ve bir teslim alma konumundan depoya taşır. Bazı durumlarda bir gönderiyi doğrudan teslim alma konumundan teslimat konumuna da taşıyabilirler.
Fleet Engine'de DeliveryVehicle
nesnesi oluşturmak ve gönderim ile filo takibi amacıyla konum güncellemeleri göndermek için Driver SDK'sını kullanın.
DeliveryVehicle
nesnesine en fazla 500 görev ve 300 kalan araç yolculuğu segmenti atayabilirsiniz.
Görevler
Bir aracın gün içinde yaptığı işlemler için görevleri işlem türüne göre atarsınız:
- Teslim alma ve teslimatlar için Gönderim görevleri atayın.
- Sürücülerin gerekli molalar gibi müsait olmadığı zamanlar için Kullanılamayan mola görevleri atayın.
- Açılır kutularda veya müşteri konumlarında sürüş yapılmayan görevler için Planlanmış durdurma görevleri atayın.
Atadığınız her görevin benzersiz bir görev kimliği olmalıdır ancak görevler aynı izleme kimliğini paylaşabilir. Fleet Engine her görev için GMR aralıklarını hesaplarken tahminlerde bulunmak için tüm görevleri ve planlandıkları sırayı kullanır. Görev kimlikleri hakkında daha fazla bilgi için Görev kimliği yönergeleri bölümüne bakın.
Fleet Engine'de görev oluşturmak için Driver SDK'sı Görev Yöneticisi'ni kullanın.
Gönderim görevleri
Bir gönderinin hem teslim alınması hem de teslim edilmesi için gönderim görevleri oluşturun ve aşağıdaki bilgileri ekleyin:
- Teslim alma veya teslimat konumu.
- Takip numarası veya kimliği.
- Görevi tamamlamak, park yeri aramak veya teslimat konumuna yürümek için gereken ek süreyi hesaba katmak üzere bekleme süresi.
- Benzersiz bir görev kimliği. Görev kimliği yönergeleri başlıklı makaleyi inceleyin.
Daha fazla bilgi için aşağıdaki konulara bakın:
Android
iOS
Görevlerin kullanılamaması
Kullanılamayan görevler, bir aracın teslim alma veya teslimat için uygun olmadığı zamanları (ör. araca yakıt doldurma molaları veya sürücü molaları) dahil eder.
Aşağıdaki bilgilerle bir kullanılamazlık görevi oluşturun:
- Aranın uzunluğu.
- İsteğe bağlı olarak, aranın konumu. Belirli bir konum sağlamanız gerekmez, ancak bunu yapmanız gün boyunca daha doğru TVS aralıkları sağlar.
Daha fazla bilgi için aşağıdaki konulara bakın:
Android
iOS
Planlanmış durdurma görevleri
Teslimat aracının yapması gereken durakları modellemek için planlı durdurma görevleri oluşturun. Örneğin, aynı konumdaki diğer teslimatlardan veya teslim alma işlemlerinden bağımsız olarak belirli bir konumdaki günlük planlanmış bir toplama durağı için planlanmış bir durdurma görevi oluşturun. Ayrıca açılır kutulardan gelen tahsilatlar için veya hizmet merkezleri ve hizmet noktalarındaki besleyici-araç aktarımlarını ya da duraklarını modellemek üzere planlı durdurma görevleri de oluşturabilirsiniz.
Daha fazla bilgi için aşağıdaki konulara bakın:
Android
iOS
Görev kimliği yönergeleri
Görev kimlikleri oluştururken aşağıdaki içerik ve biçim yönergelerini izleyin:
- Benzersiz görev kimlikleri oluşturma
- Kimliği tanımlayabilecek bilgiler (PII) veya net metin verileri açığa çıkarmayın.
- Geçerli Unicode dizeleri kullanın.
- En fazla 64 karakter kullanın.
- Şu ASCII karakterlerini eklemeyin: "/", ":", "\", "?" veya "#".
- Unicode Normalleştirme Formu C'ye göre normalleştirin.
Aşağıda, uygun Görev Kimliği örnekleri verilmiştir:
- 566c33d9-2a31-4b6a-9cd4-80ba1a0c643b
- e4708eabcfa39bf2767c9546c9273f747b4626e8cc44e9630d50f6d129013d38
- NTA1YTliYWNkYmViMTI0ZmMzMWFmOWY2NzNkM2Jk
Aşağıdaki tabloda desteklenmeyen Görev Kimliği örnekleri gösterilmektedir:
Desteklenmeyen Görev Kimlikleri | Neden |
---|---|
8/31/2019-20:48-46.70746,-130.10807,-85.17909,61.33680 | Kimliği tanımlayabilecek bilgiler (PII) ve karakter gereksinimlerini (virgül, nokta, iki nokta üst üste ve eğik çizgi) ihlal ediyor. |
JohnDoe-577b484da26f-Cupertino-SantaCruz | Kimliği tanımlayabilecek bilgiler (PII) gereksinimlerini ihlal ediyor. |
4R0oXLToF"112 Yaz Dr. East Hartford, CT06118"577b484da26f8a | Kimliği tanımlayabilecek bilgiler (PII) ve karakter gereksinimlerini (boşluk, virgül ve tırnak işareti) ihlal ediyor. 64 karakterden uzun |
Daha fazla kaynak
Her bir veri yapısında yer alan belirli alanları görmek için DeliveryVehicle
(gRPC, REST) ve Task
(gRPC, REST) API Referans belgelerini inceleyin.
Bir aracın ömrü
DeliveryVehicle
nesnesi, bir ilk veya son kilometre teslimat aracını temsil eder.
Şunu kullanarak bir DeliveryVehicle
nesnesi oluşturabilirsiniz:
- Fleet Engine API'lerini çağırmak için kullanılan hizmet hesabını içeren Google Cloud projesinin proje kimliği.
- Müşteriye ait araç kimliği.
Her araç için benzersiz araç kimlikleri kullanın. Orijinal araç için aktif görev yoksa araç kimliğini yeniden kullanmayın.
Fleet Engine, UpdateDeliveryVehicle
kullanılarak güncellenmemiş DeliveryVehicle
nesneyi yedi gün sonra otomatik olarak siler. Bir aracın olup olmadığını öğrenmek için:
UpdateDeliveryVehicle
numaralı telefonu arayın.- NOT_FOUND hatası alırsanız aracı yeniden oluşturmak için
CreateDeliveryVehicle
numaralı telefonu arayın. Çağrı bir araç döndürürse araç yine de güncellenebilir.
Araç özellikleri
DeliveryVehicle
varlığı, tekrarlanan bir DeliveryVehicleAttribute
alanı içeriyor. ListDeliveryVehicles
API, döndürülen DeliveryVehicle
varlıklarını belirtilen özelliklere sahip olanlarla sınırlayabilen bir filter
alanı içerir. DeliveryVehicleAttribute
, Fleet Engine yönlendirme davranışını etkilemez.
Özelliklere kimlik bilgileri (PII) veya hassas bilgiler eklemeyin; çünkü bu alan kullanıcılar tarafından görülebilecektir.
Bir görevin ömrü
Deliveries API gRPC veya REST arayüzlerini kullanarak Fleet Engine'de görev oluşturabilir, güncelleyebilir ve sorgulayabilirsiniz.
Bir Task
nesnesinin, yaşam döngüsü boyunca ilerlemesini izlemek için kullanabileceği bir durum alanı vardır. Değerler OPEN'dan CLOSED'a taşınır. Yeni görevler AÇIK durumunda oluşturulur. Bu durum şunlardan birini gösterir:
- Görev henüz bir teslimat aracına atanmadı.
- Teslimat aracı, görevin atanmış araç durağını henüz geçmedi.
Görev yönergeleri
Bir araca yalnızca AÇIK durumunda olan görev atayabilirsiniz.
Bir görevi, araç durakları listesinden kaldırarak iptal edersiniz ve görev durumu otomatik olarak KAPATILDI'ya ayarlanır.
Görevin aracı görevin araç durdurma işlemini tamamladığında:
Görevin sonuç alanını BAŞARILI veya BAŞARISIZ olarak güncelleyin.
Etkinliğin zaman damgasını belirtin.
JavaScript Filo İzleme kitaplığı, görevin sonucunu belirtir ve görev durumu otomatik olarak KAPATILDI olarak ayarlanır. Daha fazla bilgi edinmek için JavaScript Filo İzleme kitaplığıyla Filonuzu İzleme bölümüne göz atın.
Araçlarda olduğu gibi, Fleet Engine yedi gün sonra güncellenmemiş görevleri siler ve zaten mevcut olan bir kimliğe sahip bir görev oluşturmaya çalışırsanız hata döndürür.
Not: Fleet Engine, görevlerin açıkça silinmesini desteklemez. Hizmet, görevleri güncelleme olmadan yedi gün sonra otomatik olarak siler. Görev verilerini yedi günden daha uzun süre saklamak istiyorsanız bu yeteneği kendiniz uygulamanız gerekir.
Görev özellikleri
Task
varlığı, şu 3 türden birinden bir değere sahip olabilen tekrarlanan bir TaskAttribute
alanı içeriyor: dize, sayı ve bool. ListTasks
API, döndürülen Task
varlıklarını belirtilen özelliklere sahip öğelerle sınırlandırabilen bir filter
alanı içerir. Görev özellikleri, Fleet Engine yönlendirme davranışını etkilemez.
Bu özellikler kullanıcılar tarafından görülebileceğinden, özelliklere kimliği tanımlayabilecek bilgiler (PII) veya diğer hassas bilgiler eklemeyin.
Araçları ve görevlerin yaşam döngüsünü yönetin
Hatırlatma: Dahili sisteminiz, Fleet Engine Deliveries API'nin sizin adınıza artırdığı verilerin güvenilir kaynağı olarak görev yapar.
Sisteminizdeki araç ve görev yaşam döngülerini yönetmek amacıyla, araçlarınızı ve ilgili görevleri oluşturmak, güncellemek ve takip etmek için Fleet Engine Deliveries API'yi kullanın.
Sürücü uygulaması aynı zamanda cihaz konumu ve rota bilgilerini güncellemek için doğrudan Fleet Engine ile iletişim kurar. Bu model, Fleet Engine'in gerçek zamanlı konumu verimli bir şekilde yönetmesine olanak tanır. Konumu doğrudan izleme kitaplığına gönderir. Daha sonra bunu tüketicilere siparişlerinin durumu hakkında güncellemek için kullanabilirsiniz.
Örneğin, aşağıdaki senaryonuzun olduğunu varsayalım:
- Teslimat durağına yaklaşan bir sürücü. Sürücü uygulaması, konumunu Fleet Engine'e gönderir.
- Fleet Engine, cihaz konumunu izleme kitaplığına gönderir. İzleme kitaplığı, tüketici uygulamanızın bu kitaplığı kullanarak tüketiciyi paketlerinin yakınlığıyla ilgili olarak uyarması için kullanılır.
- Sürücü, gönderimi tamamladıktan sonra sürücü uygulamasındaki "Gönderim teslim edildi" düğmesini tıklar.
- "Gönderim teslim edildi" işlemi, bilgileri arka uç sisteminize gönderir ve bu sistemde gerekli işletme doğrulaması ve doğrulama adımlarını gerçekleştirir.
- Sisteminiz, görevi SUCCEEDED olarak onaylar ve Deliveryies API'yi kullanarak Fleet Engine'i günceller.
Aşağıdaki diyagramda bu işlemler genel bir düzeyde gösterilmiştir. Ayrıca sisteminiz, istemciniz ve Fleet Engine arasındaki standart ilişkiyi de gösterir.
Müşteri jetonlarını yönet
Sürücü uygulamasından gelen ve doğrudan Fleet Engine'e gönderilen konum güncellemeleri, yetkilendirme jetonları gerektirir. İstemciden Fleet Engine'e gelen güncellemeleri ele almak için önerilen yaklaşım aşağıda verilmiştir:
Fleet Engine Delivery Untrusted Driver User (Fleet Motoru Teslimatı Güvenilmeyen Sürücü Kullanıcısı) hizmet hesabı rolünü kullanarak jetonu oluşturun.
Sürücü uygulamasına sınırlı kapsamlı bir jeton sağlayın. Bu kapsam, yalnızca Fleet Engine'de cihaz konumunu güncellemesine izin verir.
Bu yaklaşım, mobil cihazlardan (düşük güven düzeyine sahip olarak değerlendirilen ortamlar) gelen çağrıların en az ayrıcalık ilkesine uymasını sağlar.
Diğer hizmet hesabı rolleri
Sürücü uygulamalarına, Güvenilmeyen Sürücü rolüyle sınırlı olanların dışında, doğrudan Fleet Motoru güncellemeleri yapma yetkisi vermek isterseniz (örneğin, belirli görev güncellemeleri için), Güvenilir Sürücü rolünü kullanabilirsiniz. Güvenilir Sürücü rolünü kullanan bir model hakkında bilgi için Güvenilir Sürücü modeli'ne bakın.
Güvenilmeyen ve güvenilir sürücü rollerinin kullanımları hakkında daha fazla bilgi için Cloud projesi kurulumu başlıklı makaleyi inceleyin.
Bir iş günü modeli oluşturun
Aşağıdaki tabloda, bir teslimat ve lojistik şirketinde ilk veya son kilometre sürücüleri için bir iş gününün nasıl göründüğü açıklanmaktadır. Şirketiniz ayrıntılarda farklılık gösterebilir ancak bir iş günü için model oluşturmayı görebilirsiniz.
Saat | Etkinlik | Modelleme |
---|---|---|
Günün başlangıcından itibaren 24 saat içinde | Sevk görevlisi, gönderileri teslimat araçlarına veya rotalarına atar. | Fleet Engine'de gönderi teslimatları, teslim alma, ara verme ve diğer görevleri önceden belirleyebilirsiniz. Örneğin, bir gönderim teslim alma görevi,
gönderim teslim görevi,
planlanmış stok durumu bilgisi veya
zamanlanmış durdurma oluşturabilirsiniz.
Teslimat paketi grubu ve bunların teslim edilme sırası tamamlandığında araca görevler atayın. |
Gün başlangıcı | Sürücü, Sürücü uygulamasına giriş yaparak güne depoda başlar. | Delivery Driver API'yi ilk kullanıma hazırlayın. Gerektiğinde Fleet Engine'de teslimat aracını oluşturun. |
Sürücü, sevkiyatları tarayarak teslimat aracına yüklüyor. | Gönderim teslimat görevleri önceden oluşturulmamışsa tarama sırasında gönderim teslimat görevleri oluşturun. | |
Sürücü, gerçekleştirilecek görevlerin sırasını onaylıyor. | Önceden oluşturulmamışsa gönderim teslim görevleri, planlı stok durumu özelliği ve planlanmış duraklar oluşturun. | |
Sürücü depodan ayrılır ve tamamlanacak sonraki görev sayısına başlar. | Tamamlama sırasını taahhüt ederek araca tüm görevleri veya bir görev alt kümesini atayın. | |
Sürücü bir gönderi teslim ediyor. | Teslimat durağına vardıktan sonra durağa ulaşan bir araç ile ilgili işlemler yapın. Gönderimi teslim ettikten sonra teslimat görevini kapatın ve isteğe bağlı olarak mağaza gönderim durumu ile diğer meta bilgileri ekleyin. Duraktaki tüm görevleri tamamladıktan sonra, bir sonraki durağa doğru yola çıkmadan önce araç durağı tamamlama ve araç bir sonraki durağa giden yolda ilerleme ile ilgili işlemler yapın. | |
Sürücü, ek sevkiyatları teslimat aracına aktarmak için besleyici araçla buluşuyor. | Besleyici ile teslimat araçları arasındaki aktarım için buluşma noktası, planlanmış durak olarak modellenmelidir.
Gönderimleri aktarıp taradıktan sonra daha önce oluşturulmamışsa teslimat görevleri oluşturun. Ardından görevleri bir araca atayarak ve görev sıralamasını güncelleyerek görev tamamlama sırasını güncelleyin. |
|
Sürücü, bir teslim alma isteğiyle ilgili bildirim alır. | Teslim alma isteğini kabul ettikten sonra bir gönderim teslim alma görevi oluşturun. Ardından görevleri bir araca atayarak ve görev sıralamasını güncelleyerek görev yürütme sırasını güncelleyin. | |
Öğle | Sürücü öğle molası veriyor. | Bir konum, kullanılamama göreviyle ilişkilendirilmişse bunu diğer görevler gibi ele alın. Durağa gelen, araç durağı tamamlayan ve araç bir sonraki durağa giden araçla ilgili işlemleri gerçekleştirin.
Aksi takdirde, aranın sonuna kadar başka bir işlem yapmanız gerekmez. Sonraki ve kalan görevleri onaylayıp görev sıralamasını güncelleyerek görevi kaldırın. |
Sürücü bir gönderiyi alıyor. | Bu, tıpkı bir teslimat durağı gibi modellenir. Durağa gelen bir araç, bir görevi kapatma ve isteğe bağlı olarak gönderim durumunu ve diğer meta bilgileri saklama ile ilgili işlemler gerçekleştirin. Duraktaki tüm görevleri tamamladıktan sonra ve bir sonraki durağa doğru yola çıkmadan önce araç bir durak tamamlar ve araç bir sonraki durağa giden yolda ile ilgili işlemler yapın. Not: Faturalandırmanın doğru olmasını sağlamak için tüm teslim alma işlemleriyle ilgili bir teslimat görevi olmalıdır. Teslim alma, o gün sürücüyle aynı rotadaki başka bir konuma teslim edilecekse bu teslimat görevinin rotadaki diğer herhangi bir teslimat göreviyle aynı şekilde modellenmesini öneririz. Sürücü, teslim alma işlemini tekrar depoya getiriyorsa depo hedefinde bir teslimat görevi oluşturmanızı öneririz. | |
Sürücü, gönderimleri bir teslim alma kutusundan almak için planlı bir duraklama yapıyor. | Bu, tıpkı diğer teslim alma durakları gibi modellenir. durağa gelen bir araç ve bir görevi kapatma ile ilgili işlemler gerçekleştirin. Duraktaki tüm görevleri tamamlayıp bir sonraki durağa doğru sürmeye başladıktan sonra, araç bir durak tamamladığında ve araç bir sonraki durağa gidene kadar ile ilgili işlemler gerçekleştirin. | |
Sürücü, kargonun alternatif bir konuma yönlendirildiğine dair bildirim alır. | Orijinal gönderim teslimat görevi durumunu TAMAMLANDI olarak ayarlayın ve yeni teslimat konumu için yeni bir gönderim teslimat görevi oluşturun. Daha fazla bilgi için Bir gönderimi yeniden yönlendirme bölümünü inceleyin. | |
Sürücü bir paket teslim etmeye çalıştı, ancak başaramadı. | Bu, başarılı bir teslimat durağına benzer şekilde modellenir ve teslimat görevi tamamlandı olarak işaretlenir. Durağa gelen bir araç ile ilgili işlemler gerçekleştirin. Gönderimi teslim edemediyseniz görevi kapatın ve isteğe bağlı olarak mağaza gönderim durumu ile diğer meta bilgileri kapatın. Duraktaki tüm görevleri tamamladıktan sonra ve bir sonraki durağa doğru yola çıkmadan önce araç bir durak tamamlar ve araç bir sonraki durağa giden yolda ile ilgili işlemler yapın. | |
Sürücüye bir gönderiyi bekletmesi (teslim etmemesi) bildirildi. | Bildirim alınıp onaylandıktan sonra görev durumunu TAMAMLANDI olarak ayarlayın. | |
Sürücüye, taahhüt edilen teslimat siparişinde değişiklik yapılması için bir sonraki gönderiyi teslim etmesi gerektiği bildirildi. | Görev sıralamasını güncelleyin. | |
Sıra dışı bir gönderi teslim etmeyi seçen sürücü. | Görev sıralamasını güncelleyin ve ardından normal şekilde devam edin. | |
Sürücü, tek bir konuma birden fazla gönderim teslim ediyor. | Bu, tek bir gönderim teslimat durağına benzer şekilde modellenir. Durağa vardıktan sonra, durağa ulaşan bir araç ile ilgili işlemler yapın. Her gönderimi teslim ettikten sonra her görevi kapatın ve isteğe bağlı olarak mağaza gönderim durumu ile diğer meta bilgileri kapatın. Duraktaki tüm görevleri tamamladıktan sonra ve bir sonraki durağa doğru yola çıkmadan önce araç bir durak tamamlar ve araç bir sonraki durağa giden yolda ile ilgili işlemler yapın. | |
Gün sonu | Sürücü depoya geri dönüyor. | Sürücü, rotası sırasında teslim alınan gönderimlerle depoya geri dönerse doğru faturalandırma sağlamak için her paketi teslimat görevi olarak oluşturup kapatmanız gerekir. Bunu, depoyu diğer teslimat durakları gibi modelleyerek yapabilirsiniz. Depo, teslimat durağı olarak kullanılmıyorsa isteğe bağlı olarak depoyu planlanan durak olarak modelleyebilirsiniz. Durağın modellenmesi, sürücülerinizin depoya geri giden rotayı ve tahmini varış sürelerini görebilmelerini sağlar. |
Konum güncellemelerinin işleyiş şekli
Fleet Engine ile en iyi performansı elde etmek için sisteme araç konumu güncellemeleri akışı sağlayın. Bu güncellemeleri sağlamak için aşağıdaki yöntemlerden birini kullanın:
- Sürücü SDK'sını (Android, iOS) kullanın.
- Özel kod kullanın. Konumlar arka ucunuz üzerinden aktarılıyorsa veya Android ya da iOS dışında cihazlar kullanıyorsanız kullanışlıdır.
Araç konum güncellemelerini nasıl sağladığınızdan bağımsız olarak arka ucunuz, bir teslimat aracı durağa doğru yola çıktığında (depo dahil) ve durağa geldiğinde Fleet Engine'i güncellemekten sorumludur. Fleet Engine bu olayları otomatik olarak algılamaz.
Araç durakları ve teslimat konumları
Araç durağı, teslimat aracının bir gönderim görevini veya başka bir görevi tamamladığı yerdir. Bu, yükleme yuvası veya yola yerleştirilmiş bir konum gibi bir erişim noktasıdır.
Teslimat konumu, kargonun teslim edildiği veya teslim alındığı yerdir. Teslimat konumuna giderken araç durağından yürüyerek ulaşmak gerekebilir.
Örneğin, bir sürücü alışveriş merkezindeki bir mağazaya ürün teslim ederken teslimat aracı, alışveriş merkezinin en yakın girişinin yakınındaki park yerinde durur. Burası araç durağı. Sürücü, daha sonra araç durağından mağazanın bulunduğu alışveriş merkezi konumuna doğru yürür. Bu, teslimat konumudur.
Kullanıcılarınıza en iyi kargo takibi deneyimini sunmak için, sevkiyat görevlerinin araç duraklarına nasıl atandığını düşünün ve gönderim görevlerinde kalan araç duraklarının sayısının kullanıcıya bildirildiğini unutmayın. Bu sayede, gönderimin ilerleme durumunu görüntüleyebilir.
Örneğin, bir sürücü tek bir ofis binasına çok sayıda teslimat yapıyorsa tüm teslimat görevlerini tek bir araç durağına atamak iyi bir fikir olabilir. Her teslimat görevi kendi araç durağına atanmışsa kargo takibi deneyiminiz kullanıcılarınız için daha az faydalı olur. Bunun nedeni, aracın varış noktasına başlamadan önce sınırlı sayıda durakta bulunması durumunda takip edilebilmesidir. Kısa süre içinde çok sayıda araç durağının tamamlanması, kullanıcıya teslimatın ilerleme durumunu izlemek için fazla zaman vermez.
Mobil SDK'ları kullanın
Sürücü SDK'sına herhangi bir çağrı yapmadan önce onu başlattığınızdan emin olun.
Delivery Driver API'yi ilk kullanıma hazırlama
Sürücü SDK'sında Delivery Driver API'yi başlatmadan önce Navigasyon SDK'sını başlattığınızdan emin olun. Ardından Delivery Driver API'yi aşağıdaki örnekte gösterildiği gibi başlatın:
static final String PROVIDER_ID = "provider-1234";
static final String VEHICLE_ID = "vehicle-8241890";
NavigationApi.getNavigator(
this, // Activity.
new NavigatorListener() {
@Override
public void onNavigatorReady(Navigator navigator) {
DeliveryDriverApi.createInstance(DriverContext.builder(getApplication())
.setNavigator(navigator)
.setProviderId(PROVIDER_ID)
.setVehicleId(VEHICLE_ID)
.setAuthTokenFactory((context) -> "JWT") // AuthTokenFactory returns JWT for call context.
.setRoadSnappedLocationProvider(NavigationApi.getRoadSnappedLocationProvider(getApplication()))
.setNavigationTransactionRecorder(NavigationApi.getNavigationTransactionRecorder(getApplication()))
.setStatusListener((statusLevel,statusCode,statusMsg) -> // Optional, surfaces polling errors.
Log.d("TAG", String.format("New status update. %s, %s, %s", statusLevel, statusCode, statusMsg)))
.build));
}
@Override
public void onError(int errorCode) {
Log.e("TAG", String.format("Error loading Navigator instance: %s", errorCode));
}
});
Kullanım alanları
Bu bölümde, yaygın kullanım alanlarını modellemek için Deliveries API'nin nasıl kullanılacağı açıklanmaktadır.
Benzersiz varlık tanımlayıcıları
REST çağrılarında kullanılan benzersiz varlık tanımlayıcılarının biçimi ve değeri Fleet Engine için opaktır. Otomatik olarak artan kimlikler kullanmaktan kaçının ve tanımlayıcının sürücünün telefon numarası gibi kimliği tanımlayabilecek bilgiler (PII) içermediğinden emin olun.
Araç oluşturma
Sürücü SDK'sından veya gRPC ya da REST kullanarak bir sunucu ortamından araç oluşturabilirsiniz.
gRPC
Yeni bir araç oluşturmak için Fleet Engine'e CreateDeliveryVehicle
çağrısı yaparsınız.
Yeni teslimat aracının özelliklerini tanımlamak için CreateDeliveryVehicleRequest
nesnesini kullanın. Name
alanı için belirtilen tüm değerlerin, kullanıcı tarafından belirtilen kimlikler için API kılavuzu uyarınca yok sayılacağını unutmayın.
Aracın kimliğini ayarlamak için DeliveryVehicleId
alanını kullanmalısınız.
İsteğe bağlı olarak, DeliveryVehicle
oluştururken şu alanları belirtebilirsiniz:
- Özellikler
- LastLocation
- Tür
Başka alan ayarlamayın. Bunu yaparsanız Fleet Engine bir hata döndürür, çünkü bu alanlar salt okunur olur veya yalnızca UpdateDeliveryVehicle
çağrısıyla güncellenebilir.
İsteğe bağlı alan ayarlamadan araç oluşturmak için CreateDeliveryVehicleRequest
içerisinde DeliveryVehicle
alanını ayarlanmamış olarak bırakabilirsiniz.
Aşağıdaki örnekte, araç oluşturmak için Java gRPC kitaplığının nasıl kullanılacağı gösterilmektedir:
static final String PROJECT_ID = "my-delivery-co-gcp-project";
static final String VEHICLE_ID = "vehicle-8241890"; // Avoid auto-incrementing IDs.
DeliveryServiceBlockingStub deliveryService =
DeliveryServiceGrpc.newBlockingStub(channel);
// Vehicle settings
String parent = "providers/" + PROJECT_ID;
DeliveryVehicle vehicle = DeliveryVehicle.newBuilder()
.addAttributes(DeliveryVehicleAttribute.newBuilder()
.setKey("route_number").setValue("1")) // Opaque to the Fleet Engine
.build();
// Vehicle request
CreateDeliveryVehicleRequest createVehicleRequest =
CreateDeliveryVehicleRequest.newBuilder() // No need for the header
.setParent(parent)
.setDeliveryVehicleId(VEHICLE_ID) // Vehicle ID assigned by the Provider
.setDeliveryVehicle(vehicle)
.build();
// Error handling
// If Fleet Engine does not have vehicle with that ID and the credentials of the
// requestor pass, the service creates the vehicle successfully.
try {
DeliveryVehicle createdVehicle =
deliveryService.createDeliveryVehicle(createVehicleRequest);
} catch (StatusRuntimeException e) {
Status s = e.getStatus();
switch (s.getCode()) {
case ALREADY_EXISTS:
break;
case PERMISSION_DENIED:
break;
}
return;
}
REST
Sunucu ortamından araç oluşturmak için CreateDeliveryVehicle
öğesine HTTP REST çağrısı yapın:
POST https://fleetengine.googleapis.com/v1/providers/<project_id>/deliveryVehicles?deliveryVehicleId=<id>
<id>, filonuzdaki bir teslimat aracının benzersiz tanımlayıcısıdır.
İstek başlığı, Hamiline ait <jeton> değerine sahip bir Yetkilendirme alanı içermelidir. Buradaki <jeton>, bir Fleet Engine jeton fabrikası tarafından verilen bir jetondur.
POST gövdesi, oluşturulacak DeliveryVehicle
varlığını temsil eder. Aşağıdaki isteğe bağlı alanları belirtebilirsiniz:
- attributes
- lastLocation
- tür
Örnek curl
komutu:
# Set $JWT, $PROJECT_ID, and $VEHICLE_ID in the local
# environment
curl -X POST "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/deliveryVehicles?deliveryVehicleId=${VEHICLE_ID}" \
-H "Content-type: application/json" \
-H "Authorization: Bearer ${JWT}" \
--data-binary @- << EOM
{
"attributes": [{"key": "model", "value": "sedan"}],
"lastLocation": {"location": {"latitude": 12.1, "longitude": 14.5}}
}
EOM
Fleet Engine, kullanıcı tarafından belirtilen kimlikler için API kılavuzu başına DeliveryVehicle
varlığının name
alanını yoksayar.
Başka alan ayarlamayın. Bunu yaparsanız Fleet Engine bir hata döndürür, çünkü bu alanlar salt okunur olur veya yalnızca UpdateDeliveryVehicle
çağrısı kullanılarak güncellenebilir.
Herhangi bir alan ayarlamadan araç oluşturmak için POST isteğinin gövdesini boş bırakın. Daha sonra yeni oluşturulan araç, POST URL'sindeki deliveryVehicleId
parametresinden bir araç kimliği çıkarır.
Örnek curl
komutu:
# Set $JWT, $PROJECT_ID, and $VEHICLE_ID in the local
# environment
curl -X POST "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/deliveryVehicles?deliveryVehicleId=${VEHICLE_ID}" \
-H "Content-type: application/json" \
-H "Authorization: Bearer ${JWT}"
Gönderim teslim alma görevi oluşturma
Sürücü SDK'sından veya gRPC ya da REST kullanan bir sunucu ortamından bir gönderi teslim alma görevi oluşturabilirsiniz.
gRPC
Aşağıdaki örnekte, bir gönderim teslim alma görevi oluşturmak için Java gRPC kitaplığının nasıl kullanılacağı gösterilmektedir:
static final String PROJECT_ID = "my-delivery-co-gcp-project";
DeliveryServiceBlockingStub deliveryService =
DeliveryServiceGrpc.newBlockingStub(channel);
// Task settings
String parent = "providers/" + PROJECT_ID;
Task task = Task.newBuilder()
.setType(Task.Type.PICKUP)
.setState(Task.State.OPEN)
.setTrackingId("my-tracking-id")
.setPlannedLocation( // Grand Indonesia East Mall
LocationInfo.newBuilder().setPoint(
LatLng.newBuilder().setLatitude(-6.195139).setLongitude(106.820826)))
.setTaskDuration(
Duration.newBuilder().setSeconds(2 * 60))
.setTargetTimeWindow(
TimeWindow.newBuilder()
.setStartTime(Timestamp.newBuilder().setSeconds(1680123600))
.setEndTime(Timestamp.newBuilder().setSeconds(1680130800)))
.addAttributes(TaskAttribute.newBuilder().setKey("foo").setStringValue("value"))
.addAttributes(TaskAttribute.newBuilder().setKey("bar").setNumberValue(10))
.addAttributes(TaskAttribute.newBuilder().setKey("baz").setBoolValue(false))
.build();
// Task request
CreateTaskRequest createTaskRequest =
CreateTaskRequest.newBuilder() // No need for the header
.setParent(parent) // Avoid using auto-incrementing IDs for the taskId
.setTaskId("task-8241890") // Task ID assigned by the Provider
.setTask(task) // Initial state
.build();
// Error handling
// If Fleet Engine does not have a task with that ID and the credentials of the
// requestor pass, the service creates the task successfully.
try {
Task createdTask = deliveryService.createTask(createTaskRequest);
} catch (StatusRuntimeException e) {
Status s = e.getStatus();
switch (s.getCode()) {
case ALREADY_EXISTS:
break;
case PERMISSION_DENIED:
break;
}
return;
}
REST
Sunucu ortamından gönderi teslim alma görevi oluşturmak için CreateTask
öğesine HTTP REST çağrısı yapın:
`POST https://fleetengine.googleapis.com/v1/providers/<project_id>/tasks?taskId=<id>`
<id>, görev için benzersiz bir tanımlayıcıdır. Bu, gönderimin takip numarası olmamalıdır. Sisteminizde görev kimlikleri yoksa evrensel olarak benzersiz bir tanımlayıcı (UUID) oluşturabilirsiniz.
İstek başlığı, Hamiline ait <jeton> değerine sahip bir Yetkilendirme alanı içermelidir. Buradaki <jeton>, bir Fleet Engine jeton fabrikası tarafından verilen bir jetondur.
İsteğin gövdesinde bir Task
varlığı bulunmalıdır:
Zorunlu alanlar:
Alan Değer tür Type.PICKUP state State.OPEN trackingId Bir gönderimi takip etmek için kullandığınız numara veya tanımlayıcı. plannedLocation Görevin tamamlanacağı konum (bu örnekte, gönderimin teslim alınacağı konum). taskDuration Gönderimi teslim alma konumunda teslim almak için geçen saniye cinsinden beklenen süre. İsteğe bağlı alanlar:
Alan Değer targetTimeWindow Görevin tamamlanması gereken zaman aralığı. Bu durum, yönlendirme davranışını etkilemez. attributes Özel Görev özelliklerinin listesi. Her özelliğin benzersiz bir anahtarı olmalıdır.
Varlıktaki diğer tüm alanlar, oluşturma işlemi için yoksayılır. İstek atanmış bir deliveryVehicleId
içeriyorsa Fleet Engine bir istisna atar. Görevleri UpdateDeliveryVehicleRequest
kullanarak atarsınız. Daha fazla bilgi için Bir araca görev atama ve UpdateDeliveryVehicleRequest'i inceleyin.
Örnek curl
komutu:
# Set $JWT, $PROJECT_ID, $TRACKING_ID, and $TASK_ID in the local
# environment
curl -X POST "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/tasks?taskId=${TASK_ID}" \
-H "Content-type: application/json" \
-H "Authorization: Bearer ${JWT}" \
--data-binary @- << EOM
{
"type": "PICKUP",
"state": "OPEN",
"trackingId": "${TRACKING_ID}",
"plannedLocation": {
"point": {
"latitude": -6.195139,
"longitude": 106.820826
}
},
"taskDuration": "90s",
"targetTimeWindow": {
"startTime": "2023-03-29T21:00:00Z",
"endTime": "2023-03-29T23:00:00Z"
}
}
EOM
Gönderim teslimat görevi oluşturma
Sürücü SDK'sından veya gRPC ya da REST kullanan bir sunucu ortamından bir gönderim teslim görevi oluşturun.
gRPC
Aşağıdaki örnekte, gönderim teslim görevi oluşturmak için Java gRPC kitaplığının nasıl kullanılacağı gösterilmektedir:
static final String PROJECT_ID = "my-delivery-co-gcp-project";
DeliveryServiceBlockingStub deliveryService =
DeliveryServiceGrpc.newBlockingStub(channel);
// Task settings
String parent = "providers/" + PROJECT_ID;
Task task = Task.newBuilder()
.setType(Task.Type.DELIVERY)
.setState(Task.State.OPEN)
.setTrackingId("my-tracking-id")
.setPlannedLocation( // Grand Indonesia East Mall
LocationInfo.newBuilder().setPoint(
LatLng.newBuilder().setLatitude(-6.195139).setLongitude(106.820826)))
.setTaskDuration(
Duration.newBuilder().setSeconds(2 * 60))
.setTargetTimeWindow(
TimeWindow.newBuilder()
.setStartTime(Timestamp.newBuilder().setSeconds(1680123600))
.setEndTime(Timestamp.newBuilder().setSeconds(1680130800)))
.addAttributes(TaskAttribute.newBuilder().setKey("foo").setStringValue("value"))
.addAttributes(TaskAttribute.newBuilder().setKey("bar").setNumberValue(10))
.addAttributes(TaskAttribute.newBuilder().setKey("baz").setBoolValue(false))
.build();
// Task request
CreateTaskRequest createTaskRequest =
CreateTaskRequest.newBuilder() // No need for the header
.setParent(parent) // Avoid using auto-incrementing IDs for the taskId
.setTaskId("task-8241890") // Task ID assigned by the Provider
.setTask(task) // Initial state
.build();
// Error handling
// If Fleet Engine does not have task with that ID and the credentials of the
// requestor pass, the service creates the task successfully.
try {
Task createdTask = deliveryService.createTask(createTaskRequest);
} catch (StatusRuntimeException e) {
Status s = e.getStatus();
switch (s.getCode()) {
case ALREADY_EXISTS:
break;
case PERMISSION_DENIED:
break;
}
return;
}
REST
gRPC veya REST kullanarak bir sunucu ortamından gönderim teslim görevi oluşturmak için CreateTask
öğesine bir HTTP REST çağrısı yapın:
`POST https://fleetengine.googleapis.com/v1/providers/<project_id>/tasks?taskId=<id>`
<id>, görev için benzersiz bir tanımlayıcıdır. Bu, gönderimin takip numarası olmamalıdır. Sisteminizde görev kimlikleri yoksa evrensel olarak benzersiz bir tanımlayıcı (UUID) oluşturabilirsiniz.
İstek başlığı, Hamiline ait <jeton> değerine sahip bir Yetkilendirme alanı içermelidir. Buradaki <jeton>, bir Fleet Engine jeton fabrikası tarafından verilen bir jetondur.
İsteğin gövdesinde bir Task
varlığı bulunmalıdır:
Zorunlu alanlar:
Alan Değer tür Type.DELIVERY state State.OPEN trackingId Bir gönderimi takip etmek için kullandığınız numara veya tanımlayıcı. plannedLocation Görevin tamamlanacağı konum, bu durumda bu gönderimin teslimat konumu. taskDuration Gönderinin teslimat konumunda bırakılması için gereken tahmini süre (saniye cinsinden). İsteğe bağlı alanlar:
Alan Değer targetTimeWindow Görevin tamamlanması gereken zaman aralığı. Bu durum, yönlendirme davranışını etkilemez. attributes Özel Görev özelliklerinin listesi. Her özelliğin benzersiz bir anahtarı olmalıdır.
Varlıktaki diğer tüm alanlar, oluşturma işlemi için yoksayılır. İstekte atanmış bir deliveryVehicleId varsa Fleet Engine bir istisna oluşturur. Görevleri UpdateDeliveryVehicleRequest
kullanarak atarsınız. Daha fazla bilgi için Bir araca görev atama ve UpdateDeliveryVehicleRequest'i inceleyin.
Örnek curl
komutu:
# Set $JWT, $PROJECT_ID, $TRACKING_ID, and $TASK_ID in the local
# environment
curl -X POST "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/tasks?taskId=${TASK_ID}" \
-H "Content-type: application/json" \
-H "Authorization: Bearer ${JWT}" \
--data-binary @- << EOM
{
"type": "DELIVERY",
"state": "OPEN",
"trackingId": "${TRACKING_ID}",
"plannedLocation": {
"point": {
"latitude": -6.195139,
"longitude": 106.820826
}
},
"taskDuration": "90s",
"targetTimeWindow": {
"startTime": "2023-03-29T21:00:00Z",
"endTime": "2023-03-29T23:00:00Z"
}
}
EOM
Toplu Görev Oluşturma
gRPC veya REST kullanarak bir sunucu ortamından toplu görev oluşturabilirsiniz.
gRPC
Aşağıdaki örnekte, biri teslimat diğeri de aynı yerden teslim alma için olmak üzere iki görev oluşturmak üzere Java gRPC kitaplığının nasıl kullanılacağı gösterilmektedir:
static final String PROJECT_ID = "my-delivery-co-gcp-project"; DeliveryServiceBlockingStub deliveryService = DeliveryServiceGrpc.newBlockingStub(channel); // Delivery Task settings Task deliveryTask = Task.newBuilder() .setType(Task.Type.DELIVERY) .setState(Task.State.OPEN) .setTrackingId("delivery-tracking-id") .setPlannedLocation( // Grand Indonesia East Mall LocationInfo.newBuilder().setPoint( LatLng.newBuilder().setLatitude(-6.195139).setLongitude(106.820826))) .setTaskDuration( Duration.newBuilder().setSeconds(2 * 60)) .build(); // Delivery Task request CreateTaskRequest createDeliveryTaskRequest = CreateTaskRequest.newBuilder() // No need for the header or parent fields .setTaskId("task-8312508") // Task ID assigned by the Provider .setTask(deliveryTask) // Initial state .build(); // Pickup Task settings Task pickupTask = Task.newBuilder() .setType(Task.Type.PICKUP) .setState(Task.State.OPEN) .setTrackingId("pickup-tracking-id") .setPlannedLocation( // Grand Indonesia East Mall LocationInfo.newBuilder().setPoint( LatLng.newBuilder().setLatitude(-6.195139).setLongitude(106.820826))) .setTaskDuration( Duration.newBuilder().setSeconds(2 * 60)) .build(); // Pickup Task request CreateTaskRequest createPickupTaskRequest = CreateTaskRequest.newBuilder() // No need for the header or parent fields .setTaskId("task-8241890") // Task ID assigned by the Provider .setTask(pickupTask) // Initial state .build(); // Batch Create Tasks settings String parent = "providers/" + PROJECT_ID; // Batch Create Tasks request BatchCreateTasksRequest batchCreateTasksRequest = BatchCreateTasksRequest.newBuilder() .setParent(parent) .addRequests(createDeliveryTaskRequest) .addRequests(createPickupTaskRequest) .build(); // Error handling // If Fleet Engine does not have any task(s) with these task ID(s) and the // credentials of the requestor pass, the service creates the task(s) // successfully. try { BatchCreateTasksResponse createdTasks = deliveryService.batchCreateTasks( batchCreateTasksRequest); } catch (StatusRuntimeException e) { Status s = e.getStatus(); switch (s.getCode()) { case ALREADY_EXISTS: break; case PERMISSION_DENIED: break; } return; }
REST
Sunucu ortamından teslimat ve teslim alma görevi oluşturmak için BatchCreateTasks
öğesine HTTP REST çağrısı yapın:
POST https://fleetengine.googleapis.com/v1/providers/<project_id>/tasks:batchCreate
İstek başlığı, Hamiline ait <jeton> değerine sahip bir Yetkilendirme alanı içermelidir. Buradaki <jeton>, Fleet Engine jeton fabrikası tarafından verilen bir jetondur.
İsteğin gövdesinde bir BatchCreateTasksRequest
varlığı bulunmalıdır:
Zorunlu alanlar:
Alan Değer istek Dizi< CreateTasksRequest
>İsteğe bağlı alanlar:
Alan Değer başlık "deliveryRequestHeader"
parent
ve header
alanlarının isteğe bağlı olması dışında requests
içindeki her CreateTasksRequest
öğesi, bir CreateTask
isteğiyle aynı doğrulama kurallarını geçmelidir. Ayarlanırsa üst düzeydeki BatchCreateTasksRequest
ilgili alanlarıyla aynı olmalıdırlar. Her birine özel doğrulama kuralları için gönderim teslim alma görevi oluşturma ve gönderim teslimatı görevi oluşturma konularına bakın.
Daha fazla bilgi için BatchCreateTasks
API Referansı belgelerine (gRPC, REST) bakın.
Örnek curl
komutu:
# Set $JWT, $PROJECT_ID, $DELIVERY_TRACKING_ID, $DELIVERY_TASK_ID,
# $PICKUP_TRACKING_ID, and $PICKUP_TASK_ID in the local environment
curl -X POST "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/tasks:batchCreate" \
-H "Content-type: application/json" \
-H "Authorization: Bearer ${JWT}" \
--data-binary @- << EOM
{
"requests" : [
{
"taskId": "${DELIVERY_TASK_ID}",
"task" : {
"type": "DELIVERY",
"state": "OPEN",
"trackingId": "${DELIVERY_TRACKING_ID}",
"plannedLocation": {
"point": {
"latitude": -6.195139,
"longitude": 106.820826
}
},
"taskDuration": "90s"
}
},
{
"taskId": "${PICKUP_TASK_ID}",
"task" : {
"type": "PICKUP",
"state": "OPEN",
"trackingId": "${PICKUP_TRACKING_ID}",
"plannedLocation": {
"point": {
"latitude": -6.195139,
"longitude": 106.820826
}
},
"taskDuration": "90s"
}
}
]
}
EOM
Planlanan kullanım dışı kalma
Sürücü SDK'sından veya gRPC ya da REST kullanan bir sunucu ortamından, kullanılabilir olmadığını belirten bir görev (örneğin, sürücü kırılmaları veya araçta yakıt doldurma) oluşturabilirsiniz. Planlanmış bir kullanılamama görevi, izleme kimliği içermemelidir. İsteğe bağlı olarak bir yer de girebilirsiniz.
gRPC
Aşağıdaki örnekte, kullanılamayan bir görev oluşturmak için Java gRPC kitaplığının nasıl kullanılacağı gösterilmektedir:
static final String PROJECT_ID = "my-delivery-co-gcp-project";
DeliveryServiceBlockingStub deliveryService =
DeliveryServiceGrpc.newBlockingStub(channel);
// Task settings
String parent = "providers/" + PROJECT_ID;
Task task = Task.newBuilder()
.setType(Task.Type.UNAVAILABLE)
.setState(Task.State.OPEN)
.setTaskDuration(
Duration.newBuilder().setSeconds(60 * 60)) // 1hr break
.build();
// Task request
CreateTaskRequest createTaskRequest =
CreateTaskRequest.newBuilder() // No need for the header
.setParent(parent) // Avoid using auto-incrementing IDs for the taskId
.setTaskId("task-8241890") // Task ID assigned by the Provider
.setTask(task) // Initial state
.build();
// Error handling
// If Fleet Engine does not have task with that ID and the credentials of the
// requestor pass, the service creates the task successfully.
try {
Task createdTask = deliveryService.createTask(createTaskRequest);
} catch (StatusRuntimeException e) {
Status s = e.getStatus();
switch (s.getCode()) {
case ALREADY_EXISTS:
break;
case PERMISSION_DENIED:
break;
}
return;
}
REST
Bir sunucu ortamından kullanılamaz hale gelme görevi oluşturmak için CreateTask
hedefine HTTP REST çağrısı yapın:
`POST https://fleetengine.googleapis.com/v1/providers/<project_id>/tasks?taskId=<id>`
<id>, görev için benzersiz bir tanımlayıcıdır. Sisteminizde görev kimlikleri yoksa evrensel olarak benzersiz bir tanımlayıcı (UUID) oluşturabilirsiniz.
İstek başlığı, Hamiline ait <jeton> değerine sahip bir Yetkilendirme alanı içermelidir. Buradaki <jeton>, bir Fleet Engine jeton fabrikası tarafından verilen bir jetondur.
İsteğin gövdesinde bir Task
varlığı bulunmalıdır:
Zorunlu alanlar:
Alan Değer tür Type.UNAVAILABLE state State.OPEN taskDuration Saniye cinsinden ara uzunluğu. İsteğe bağlı alanlar:
Alan Değer plannedLocation Belirli bir konumda alınması gerekiyorsa aranın bulunduğu yer.
Varlıktaki diğer tüm alanlar, oluşturma işlemi için yoksayılır. İstekte atanmış bir deliveryVehicleId varsa Fleet Engine bir istisna oluşturur. Görevleri UpdateDeliveryVehicleRequest
kullanarak atarsınız. Daha fazla bilgi için Bir araca görev atama ve UpdateDeliveryVehicleRequest'i inceleyin.
Örnek curl
komutu:
# Set $JWT, $PROJECT_ID, and $TASK_ID in the local environment
curl -X POST "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/tasks?taskId=${TASK_ID}" \
-H "Content-type: application/json" \
-H "Authorization: Bearer ${JWT}" \
--data-binary @- << EOM
{
"type": "UNAVAILABLE",
"state": "OPEN",
"plannedLocation": {
"point": {
"latitude": -6.195139,
"longitude": 106.820826
}
},
"taskDuration": "300s"
}
EOM
Planlanan aktarmalar
Sürücü SDK'sından veya gRPC ya da REST kullanan bir sunucu ortamından zamanlanmış bir durdurma görevi oluşturabilirsiniz. Zamanlanmış bir durdurma görevi izleme kimliği içermeyebilir.
gRPC
Aşağıdaki örnekte, zamanlanmış bir durdurma görevi oluşturmak için Java gRPC kitaplığının nasıl kullanılacağı gösterilmektedir:
static final String PROJECT_ID = "my-delivery-co-gcp-project";
DeliveryServiceBlockingStub deliveryService =
DeliveryServiceGrpc.newBlockingStub(channel);
// Task settings
String parent = "providers/" + PROJECT_ID;
Task task = Task.newBuilder()
.setType(Task.Type.SCHEDULED_STOP)
.setState(Task.State.OPEN)
.setPlannedLocation( // Grand Indonesia East Mall
LocationInfo.newBuilder().setPoint(
LatLng.newBuilder().setLatitude(-6.195139).setLongitude(106.820826)))
.setTaskDuration(
Duration.newBuilder().setSeconds(2 * 60))
.build();
// Task request
CreateTaskRequest createTaskRequest =
CreateTaskRequest.newBuilder() // No need for the header
.setParent(parent)
.setTaskId("task-8241890") // Task ID assigned by the Provider
.setTrip(task) // Initial state
.build();
// Error handling
// If Fleet Engine does not have task with that ID and the credentials of the
// requestor pass, the service creates the task successfully.
try {
Task createdTask = deliveryService.createTask(createTaskRequest);
} catch (StatusRuntimeException e) {
Status s = e.getStatus();
switch (s.getCode()) {
case ALREADY_EXISTS:
break;
case PERMISSION_DENIED:
break;
}
return;
}
REST
Bir sunucu ortamından zamanlanmış durdurma görevi oluşturmak için CreateTask
hedefine bir HTTP REST çağrısı yapın:
`POST https://fleetengine.googleapis.com/v1/providers/<project_id>/tasks?taskId=<id>`
<id>, görev için benzersiz bir tanımlayıcıdır. Sisteminizde görev kimlikleri yoksa evrensel olarak benzersiz bir tanımlayıcı (UUID) oluşturabilirsiniz.
İstek başlığı, Hamiline ait <jeton> değerine sahip bir Yetkilendirme alanı içermelidir. Buradaki <jeton>, bir Fleet Engine jeton fabrikası tarafından verilen bir jetondur.
İsteğin gövdesinde bir Task
varlığı bulunmalıdır:
Zorunlu alanlar:
Alan Değer tür Type.SCHEDULED_STOP state State.OPEN plannedLocation Durağın konumu. taskDuration Saniye cinsinden tahmini durak süresi. İsteğe bağlı alanlar:
- Yok
Varlıktaki diğer tüm alanlar, oluşturma işlemi için yoksayılır. İstekte atanmış bir deliveryVehicleId varsa Fleet Engine bir istisna oluşturur. Görevleri UpdateDeliveryVehicleRequest
kullanarak atarsınız. Daha fazla bilgi için Bir araca görev atama ve UpdateDeliveryVehicleRequest'i inceleyin.
Örnek curl
komutu:
# Set $JWT, $PROJECT_ID, and $TASK_ID in the local environment
curl -X POST "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/tasks?taskId=${TASK_ID}" \
-H "Content-type: application/json" \
-H "Authorization: Bearer ${JWT}" \
--data-binary @- << EOM
{
"type": "SCHEDULED_STOP",
"state": "OPEN",
"plannedLocation": {
"point": {
"latitude": -6.195139,
"longitude": 106.820826
}
},
"taskDuration": "600s"
}
EOM
Hedef zaman aralığı ayarlayın
Hedef zaman aralığı, görevin tamamlanması gereken TimeWindow'dur. Örneğin, teslimat alıcılarına bir teslimat süresi aralığı bildirirseniz bu zaman aralığını yakalamak ve uyarılar oluşturmak veya alanı kullanarak gezi sonrası performansı analiz etmek için görev hedef zaman aralığını kullanabilirsiniz.
Hedef zaman aralığı, bir başlangıç ve bitiş zamanından oluşur ve herhangi bir görev türü için ayarlanabilir. Hedef zaman aralığı, yönlendirme davranışını etkilemez.
gRPC
Aşağıdaki örnekte, görev süresi aralığı belirlemek için Java gRPC kitaplığının nasıl kullanılacağı gösterilmektedir:
static final String PROJECT_ID = "my-delivery-co-gcp-project";
static final String TASK_ID = "task-8241890";
DeliveryServiceBlockingStub deliveryService =
DeliveryServiceGrpc.newBlockingStub(channel);
// Task settings
String taskName = "providers/" + PROJECT_ID + "/tasks/" + TASK_ID;
Task task = Task.newBuilder()
.setName(taskName)
.setTargetTimeWindow(
TimeWindow.newBuilder()
.setStartTime(Timestamp.newBuilder().setSeconds(1680123600))
.setEndTime(Timestamp.newBuilder().setSeconds(1680130800)))
.build();
// Task request
UpdateTaskRequest updateTaskRequest =
UpdateTaskRequest.newBuilder() // No need for the header
.setTask(task)
.setUpdateMask(FieldMask.newBuilder().addPaths("targetTimeWindow"))
.build();
try {
Task updatedTask = deliveryService.updateTask(updateTaskRequest);
} catch (StatusRuntimeException e) {
Status s = e.getStatus();
switch (s.getCode()) {
case NOT_FOUND:
break;
case PERMISSION_DENIED:
break;
}
return;
}
REST
HTTP kullanarak görev süresi ayarlamak için UpdateTask
çağrısı yapın:
`PATCH https://fleetengine.googleapis.com/v1/providers/<project_id>/tasks/<id>?updateMask=targetTimeWindow`
<id>, görev için benzersiz bir tanımlayıcıdır.
İstek başlığı, Hamiline ait <jeton> değerine sahip bir Yetkilendirme alanı içermelidir. Buradaki <jeton>, bir Fleet Engine jeton fabrikası tarafından verilen bir jetondur.
İsteğin gövdesinde bir Task
varlığı bulunmalıdır:
Zorunlu alanlar:
Alan Değer targetTimeWindow Görevin tamamlanması gereken zaman aralığı. Bu ayar, yönlendirme davranışını etkilemez İsteğe bağlı alanlar:
- Yok
Varlıktaki diğer tüm alanlar, güncelleme için yoksayılır.
Örnek curl
komutu:
# Set JWT, PROJECT_ID, and TASK_ID in the local environment
curl -X PATCH "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/tasks/${TASK_ID}?updateMask=targetTimeWindow" \
-H "Content-type: application/json" \
-H "Authorization: Bearer ${JWT}" \
--data-binary @- << EOM
{
"targetTimeWindow": {
"startTime": "2023-03-29T21:00:00Z",
"endTime": "2023-03-29T23:00:00Z"
}
}
EOM
Görev izleme görünürlük yapılandırmasını ayarla
Kargo Takibi kitaplığındaki verilerin ve GetTaskTrackingInfo
çağrısından döndürülen verilerin görünürlüğü, görev için TaskTrackingViewConfig
ayarlanarak görev bazında kontrol edilebilir. Daha fazla bilgi için Etkin araç görevleri bölümüne bakın. Bunu görev oluştururken veya güncellerken yapabilirsiniz. Aşağıda, görevi bu yapılandırmayla güncellemeyle ilgili bir örnek verilmiştir:
gRPC
Aşağıdaki örnekte, görev izleme görünümü yapılandırmasını ayarlamak için Java gRPC kitaplığının nasıl kullanılacağı gösterilmektedir:
static final String PROJECT_ID = "my-delivery-co-gcp-project";
static final String TASK_ID = "task-8241890";
DeliveryServiceBlockingStub deliveryService =
DeliveryServiceGrpc.newBlockingStub(channel);
// Task settings
String taskName = "providers/" + PROJECT_ID + "/tasks/" + TASK_ID;
Task task = Task.newBuilder()
.setName(taskName)
.setTaskTrackingViewConfig(
TaskTrackingViewConfig.newBuilder()
.setRoutePolylinePointsVisibility(
VisibilityOption.newBuilder().setRemainingStopCountThreshold(3))
.setEstimatedArrivalTimeVisibility(
VisibilityOption.newBuilder().remainingDrivingDistanceMetersThreshold(5000))
.setRemainingStopCountVisibility(
VisibilityOption.newBuilder().setNever(true)))
.build();
// Task request
UpdateTaskRequest updateTaskRequest =
UpdateTaskRequest.newBuilder() // No need for the header
.setTask(task)
.setUpdateMask(FieldMask.newBuilder().addPaths("taskTrackingViewConfig"))
.build();
try {
Task updatedTask = deliveryService.updateTask(updateTaskRequest);
} catch (StatusRuntimeException e) {
Status s = e.getStatus();
switch (s.getCode()) {
case NOT_FOUND:
break;
case PERMISSION_DENIED:
break;
}
return;
}
REST
Görev izleme görünümünün yapılandırma penceresini HTTP kullanarak ayarlamak için UpdateTask
çağrısı yapın:
`PATCH https://fleetengine.googleapis.com/v1/providers/<project_id>/tasks/<id>?updateMask=taskTrackingViewConfig`
<id>, görev için benzersiz bir tanımlayıcıdır.
İstek başlığı, Hamiline ait <jeton> değerine sahip bir Yetkilendirme alanı içermelidir. Buradaki <jeton>, bir Fleet Engine jeton fabrikası tarafından verilen bir jetondur.
İsteğin gövdesinde bir Task
varlığı bulunmalıdır:
Zorunlu alanlar:
Alan Değer taskTrackingViewConfig Son kullanıcılara hangi veri öğelerinin hangi koşullarda görünür olacağını belirten görev izleme yapılandırmasıdır. İsteğe bağlı alanlar:
- Yok
Varlıktaki diğer tüm alanlar, güncelleme için yoksayılır.
Örnek curl
komutu:
# Set JWT, PROJECT_ID, and TASK_ID in the local environment
curl -X PATCH "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/tasks/${TASK_ID}?updateMask=taskTrackingViewConfig" \
-H "Content-type: application/json" \
-H "Authorization: Bearer ${JWT}" \
--data-binary @- << EOM
{
"taskTrackingViewConfig": {
"routePolylinePointsVisibility": {
"remainingStopCountThreshold": 3
},
"estimatedArrivalTimeVisibility": {
"remainingDrivingDistanceMetersThreshold": 5000
},
"remainingStopCountVisibility": {
"never": true
}
}
}
EOM
Bir araca görev atama
Bir araç için görev sıralamasını güncelleyerek görevleri bir teslimat aracına atarsınız. Bir aracın görev sıralaması, teslimat aracı için araç duraklarının listesine göre belirlenir ve her araç durağına bir veya daha fazla görev atayabilirsiniz. Ayrıntılar için Görev sıralamasını güncelleme bölümünü inceleyin.
Bir gönderiyi bir araçtan diğerine taşımak için orijinal görevi kapatın ve yeni araca atamadan önce görevi yeniden oluşturun. Halihazırda farklı bir araca atanmış bir görev için görev sıralamasını güncellerseniz bir hata alırsınız.
Görev sıralamasını güncelleme
Bir araca atanan sipariş görevlerini, Sürücü SDK'sından veya sunucu ortamından güncelleyebilirsiniz. Irk koşullarından kaçınmak ve tek bilgi kaynağı sağlamak için her iki yöntemi de kullanmayın.
Bir araç için görev sıralamasını güncellediğinizde, araç şunları da yapar:
- Araç için yeni görevler atanır.
- Araca daha önce atanmış ancak güncel sıralamada olmayan tüm görevleri kapatır.
Bir gönderiyi bir araçtan diğerine geçirmek için orijinal görevi kapatın ve yeni araca atamadan önce görevi yeniden oluşturun. Halihazırda farklı bir araca atanmış bir görev için görev sıralamasını güncellerseniz bir hata alırsınız.
Görev sıralamasını istediğiniz zaman güncelleyebilirsiniz.
gRPC
Aşağıdaki örnekte, aracın görev sıralamasını güncellemek için Java gRPC kitaplığının nasıl kullanılacağı gösterilmektedir:
static final String PROJECT_ID = "my-delivery-co-gcp-project";
static final String VEHICLE_ID = "vehicle-8241890";
static final String TASK1_ID = "task-756390";
static final String TASK2_ID = "task-849263";
DeliveryServiceBlockingStub deliveryService =
DeliveryServiceGrpc.newBlockingStub(channel);
// Vehicle settings
String vehicleName = "providers/" + PROJECT_ID + "/deliveryVehicles/" + VEHICLE_ID;
DeliveryVehicle deliveryVehicle = DeliveryVehicle.newBuilder()
.addRemainingVehicleJourneySegments(VehicleJourneySegment.newBuilder() // 1st stop
.setStop(VehicleStop.newBuilder()
.setPlannedLocation(LocationInfo.newBuilder()
.setPoint(LatLng.newBuilder()
.setLatitude(37.7749)
.setLongitude(122.4194)))
.addTasks(TaskInfo.newBuilder().setTaskId(TASK1_ID))
.setState(VehicleStop.State.NEW)))
.addRemainingVehicleJourneySegments(VehicleJourneySegment.newBuilder() // 2nd stop
.setStop(VehicleStop.newBuilder()
.setPlannedLocation(LocationInfo.newBuilder()
.setPoint(LatLng.newBuilder()
.setLatitude(37.3382)
.setLongitude(121.8863)))
.addTasks(TaskInfo.newBuilder().setTaskId(TASK2_ID))
.setState(VehicleStop.State.NEW)))
.build();
// DeliveryVehicle request
UpdateDeliveryVehicleRequest updateDeliveryRequest =
UpdateDeliveryVehicleRequest.newBuilder() // No need for the header
.setName(vehicleName)
.setDeliveryVehicle(deliveryVehicle)
.setUpdateMask(FieldMask.newBuilder().addPaths("remaining_vehicle_journey_segments"))
.build();
try {
DeliveryVehicle updatedDeliveryVehicle =
deliveryService.updateDeliveryVehicle(updateDeliveryVehicleRequest);
} catch (StatusRuntimeException e) {
Status s = e.getStatus();
switch (s.getCode()) {
case NOT_FOUND:
break;
case PERMISSION_DENIED:
break;
}
return;
}
REST
Sunucu ortamından bir araç için görev sıralamasını güncellemek üzere UpdateDeliveryVehicle
öğesine HTTP REST çağrısı yapın:
`PATCH https://fleetengine.googleapis.com/v1/providers/<project_id>/deliveryVehicles/<id>?updateMask=remainingVehicleJourneySegments`
<id>, filonuzdaki bir teslimat aracının görev sıralamasını güncellemeyi düşündüğünüz benzersiz bir tanımlayıcıdır. Aracı oluştururken belirttiğiniz tanımlayıcıdır.
İstek başlığı, Hamiline ait <jeton> değerine sahip bir Yetkilendirme alanı içermelidir. Buradaki <jeton>, bir Fleet Engine jeton fabrikası tarafından verilen bir jetondur.
İsteğin gövdesinde bir DeliveryVehicle
varlığı bulunmalıdır:
Zorunlu alanlar:
Alan Değer remainingVehicleJourneySegments Görevlere ilişkin yolculuk segmentlerinin, yürütülmeleri gereken sırayla listesi. Önce listedeki ilk görev yürütülür. kalanAraçYolculuğuSegmentleri[i].durdurma Listedeki i görevinin durağı. kalanAraçJourneySegmentleri[i].stop.plannedLocation Durak için planlanan konum. kalanAraçJourneySegmentleri[i].durdurma.görevleri Bu araç durağında gerçekleştirilecek görevlerin listesi. remainingVehicleJourneySegments[i].stop.state State.NEW İsteğe bağlı alanlar:
- Yok
Varlıktaki diğer tüm alanlar, güncelleme için yoksayılır.
Örnek curl
komutu:
# Set JWT, PROJECT_ID, VEHICLE_ID, TASK1_ID, and TASK2_ID in the local
# environment
curl -X PATCH "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/deliveryVehicles/${VEHICLE_ID}?updateMask=remainingVehicleJourneySegments" \
-H "Content-type: application/json" \
-H "Authorization: Bearer ${JWT}" \
--data-binary @- << EOM
{
"remainingVehicleJourneySegments": [
{
"stop": {
"state": "NEW",
"plannedLocation": {
"point": {
"latitude": 37.7749,
"longitude": -122.084061
}
},
"tasks": [
{
"taskId": "${TASK1_ID}"
}
]
}
},
{
"stop": {
"state": "NEW",
"plannedLocation": {
"point": {
"latitude": 37.3382,
"longitude": 121.8863
}
},
"tasks": [
{
"taskId": "${TASK2_ID}"
}
]
}
}
]
}
EOM
Araç bir sonraki durağa gidiyor
Araç bir duraktan ayrıldığında veya navigasyona başladığında Fleet Engine bilgilendirilmelidir. Fleet Engine'e Sürücü SDK'sından veya gRPC ya da REST kullanarak bir sunucu ortamından bildirim gönderebilirsiniz. Irkların çatışmalardan kaçınmak ve tek bilgi kaynağını tutmak için her iki yöntemi de kullanmayın.
gRPC
Aşağıdaki örnekte, bir aracın bir sonraki durağına gitmek üzere yola çıktığını Fleet Engine'e bildirmek için Java gRPC kitaplığının nasıl kullanılacağı gösterilmektedir.
static final String PROJECT_ID = "my-delivery-co-gcp-project";
static final String VEHICLE_ID = "vehicle-8241890";
DeliveryServiceBlockingStub deliveryService =
DeliveryServiceGrpc.newBlockingStub(channel);
// Vehicle settings
DeliveryVehicle deliveryVehicle = DeliveryVehicle.newBuilder()
// Next stop marked as ENROUTE
.addRemainingVehicleJourneySegments(VehicleJourneySegment.newBuilder() // 1st stop
.setStop(VehicleStop.newBuilder()
.setPlannedLocation(LocationInfo.newBuilder()
.setPoint(LatLng.newBuilder()
.setLatitude(37.7749)
.setLongitude(122.4194)))
.addTasks(TaskInfo.newBuilder().setTaskId(TASK1_ID))
.setState(VehicleStop.State.ENROUTE)))
// All other stops marked as NEW
.addRemainingVehicleJourneySegments(VehicleJourneySegment.newBuilder() // 2nd stop
.setStop(VehicleStop.newBuilder()
.setPlannedLocation(LocationInfo.newBuilder()
.setPoint(LatLng.newBuilder()
.setLatitude(37.3382)
.setLongitude(121.8863)))
.addTasks(TaskInfo.newBuilder().setTaskId(TASK2_ID))
.setState(VehicleStop.State.NEW)))
.build();
// DeliveryVehicle request
UpdateDeliveryVehicleRequest updateDeliveryVehicleRequest =
UpdateDeliveryVehicleRequest.newBuilder() // No need for the header
.setName(vehicleName)
.setDeliveryVehicle(deliveryVehicle)
.setUpdateMask(FieldMask.newBuilder().addPaths("remaining_vehicle_journey_segments"))
.build();
try {
DeliveryVehicle updatedDeliveryVehicle =
deliveryService.updateDeliveryVehicle(updateDeliveryVehicleRequest);
} catch (StatusRuntimeException e) {
Status s = e.getStatus();
switch (s.getCode()) {
case NOT_FOUND:
break;
case PERMISSION_DENIED:
break;
}
return;
}
REST
Fleet Engine'e bir aracın sunucu ortamından gelen bir sonraki durağın yolunda olduğunu bildirmek için UpdateDeliveryVehicle
öğesine HTTP REST çağrısı yapın:
`PATCH https://fleetengine.googleapis.com/v1/providers/<project_id>/deliveryVehicles/<id>?updateMask=remainingVehicleJourneySegments`
<id>, filonuzdaki görev sıralamasını güncellemeyi düşündüğünüz teslimat aracının benzersiz bir tanımlayıcısıdır. Aracı oluştururken belirttiğiniz tanımlayıcıdır.
İstek başlığı, Hamiline ait <jeton> değerine sahip bir Yetkilendirme alanı içermelidir. Buradaki <jeton>, bir Fleet Engine jeton fabrikası tarafından verilen bir jetondur.
İsteğin gövdesinde bir DeliveryVehicle
varlığı bulunmalıdır:
Zorunlu alan:
Alan Değer remainingVehicleJourneySegments Durumları Eyalet.YENİ olarak işaretlenmiş kalan araç duraklarının listesi. Listedeki ilk durağın durumu State.ENROUTE olarak işaretlenmiş olmalıdır. İsteğe bağlı alanlar:
- Yok
Varlıktaki diğer tüm alanlar bildirim için yoksayılır.
Örnek curl
komutu:
# Set JWT, PROJECT_ID, VEHICLE_ID, TASK1_ID, and TASK2_ID in the local
# environment
curl -X PATCH "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/deliveryVehicles/${VEHICLE_ID}?updateMask=remainingVehicleJourneySegments" \
-H "Content-type: application/json" \
-H "Authorization: Bearer ${JWT}" \
--data-binary @- << EOM
{
"remainingVehicleJourneySegments": [
{
"stop": {
"state": "ENROUTE",
"plannedLocation": {
"point": {
"latitude": 37.7749,
"longitude": -122.084061
}
},
"tasks": [
{
"taskId": "${TASK1_ID}"
}
]
}
},
{
"stop": {
"state": "NEW",
"plannedLocation": {
"point": {
"latitude": 37.3382,
"longitude": 121.8863
}
},
"tasks": [
{
"taskId": "${TASK2_ID}"
}
]
}
}
]
}
EOM
Aracın konumunu güncelleyin
Aracın konumunu güncellemek için Sürücü SDK'sını kullanmıyorsanız aracın konumuyla Fleet Engine'e doğrudan çağrı yapabilirsiniz. Fleet Engine, etkin araçlar için en az dakikada bir, en fazla 5 saniyede bir konum güncellemesi yapılmasını bekler.
gRPC
Aşağıdaki örnekte, Fleet Engine'de bir aracın konumunu güncellemek için Java gRPC kitaplığının nasıl kullanılacağı gösterilmektedir:
static final String PROJECT_ID = "my-delivery-co-gcp-project";
static final String VEHICLE_ID = "vehicle-8241890";
DeliveryServiceBlockingStub deliveryService =
DeliveryServiceGrpc.newBlockingStub(channel);
// Vehicle settings
String vehicleName = "providers/" + PROJECT_ID + "/deliveryVehicles/" + VEHICLE_ID;
DeliveryVehicle myDeliveryVehicle = DeliveryVehicle.newBuilder()
.setLastLocation(DeliveryVehicleLocation.newBuilder()
.setSupplementalLocation(LatLng.newBuilder()
.setLatitude(37.3382)
.setLongitude(121.8863))
.setSupplementalLocationTime(now())
.setSupplementalLocationSensor(DeliveryVehicleLocationSensor.CUSTOMER_SUPPLIED_LOCATION)
.setSupplementalLocationAccuracy(DoubleValue.of(15.0))) // Optional
.build();
// DeliveryVehicle request
UpdateDeliveryVehicleRequest updateDeliveryVehicleRequest =
UpdateDeliveryVehicleRequest.newBuilder() // No need for the header
.setName(vehicleName)
.setDeliveryVehicle(myDeliveryVehicle)
.setUpdateMask(FieldMask.newBuilder()
.addPaths("last_location"))
.build();
try {
DeliveryVehicle updatedDeliveryVehicle =
deliveryService.updateDeliveryVehicle(updateDeliveryVehicleRequest);
} catch (StatusRuntimeException e) {
Status s = e.getStatus();
switch (s.getCode()) {
case NOT_FOUND:
break;
case PERMISSION_DENIED:
break;
}
return;
}
REST
HTTP REST'i kullanarak Fleet Engine'de bir aracın konumunu güncellemek için UpdateDeliveryVehicle
numaralı telefona çağrı yapın:
`PATCH https://fleetengine.googleapis.com/v1/providers/<project_id>/deliveryVehicles/<id>?updateMask=last_location`
<id>, filonuzdaki veya konumu güncellemeyi düşündüğünüz teslimat aracının benzersiz bir tanımlayıcısıdır. Aracı oluştururken belirttiğiniz tanımlayıcıdır.
İstek başlığı, Hamiline ait <jeton> değerine sahip bir Yetkilendirme alanı içermelidir. Buradaki <jeton>, bir Fleet Engine jeton fabrikası tarafından verilen bir jetondur.
İsteğin gövdesinde bir DeliveryVehicle
varlığı bulunmalıdır:
Zorunlu alan:
Alan Değer lastLocation.supplementalLocation Aracın konumu. lastLocation.supplementalLocationTime Aracın bu konumda olduğu bilinen son zaman damgası. lastLocation.supplementalLocationSensor CUSTOMER_SUPPLIED_LOCATION ile doldurulmalıdır. İsteğe bağlı alanlar:
Alan Değer lastLocation.supplementalLocationAccuracy Sağlanan konumun metre cinsinden doğruluğu.
Örnek curl
komutu:
# Set JWT, PROJECT_ID, VEHICLE_ID, TASK1_ID, and TASK2_ID in the local
# environment
curl -X PATCH "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/deliveryVehicles/${VEHICLE_ID}?updateMask=remainingVehicleJourneySegments" \
-H "Content-type: application/json" \
-H "Authorization: Bearer ${JWT}" \
--data-binary @- << EOM
{
"lastLocation": {
"supplementalLocation": {"latitude": 12.1, "longitude": 14.5},
"supplementalLocationTime": "$(date -u --iso-8601=seconds)",
"supplementalLocationSensor": "CUSTOMER_SUPPLIED_LOCATION",
"supplementalLocationAccuracy": 15
}
}
EOM
Araç durağa iniyor
Araç durağa geldiğinde Fleet Engine'e bildirilmelidir. Fleet Engine'e Sürücü SDK'sından veya gRPC ya da REST kullanan bir sunucu ortamından bildirim gönderebilirsiniz. Irkların çatışmalardan kaçınmak ve tek bilgi kaynağını tutmak için her iki yöntemi de kullanmayın.
gRPC
Aşağıdaki örnekte, bir aracın durağa geldiği konusunda Fleet Engine'e bildirimde bulunmak için Java gRPC kitaplığının nasıl kullanılacağı gösterilmektedir:
static final String PROJECT_ID = "my-delivery-co-gcp-project";
static final String VEHICLE_ID = "vehicle-8241890";
DeliveryServiceBlockingStub deliveryService =
DeliveryServiceGrpc.newBlockingStub(channel);
// Vehicle settings
String vehicleName = "providers/" + PROJECT_ID + "/deliveryVehicles/" + VEHICLE_ID;
DeliveryVehicle deliveryVehicle = DeliveryVehicle.newBuilder()
// Marking the arrival at stop.
.addRemainingVehicleJourneySegments(VehicleJourneySegment.newBuilder()
.setStop(VehicleStop.newBuilder()
.setPlannedLocation(LocationInfo.newBuilder()
.setPoint(LatLng.newBuilder()
.setLatitude(37.7749)
.setLongitude(122.4194)))
.addTasks(TaskInfo.newBuilder().setTaskId(TASK1_ID))
.setState(VehicleStop.State.ARRIVED)))
// All other remaining stops marked as NEW.
.addRemainingVehicleJourneySegments(VehicleJourneySegment.newBuilder() // 2nd stop
.setStop(VehicleStop.newBuilder()
.setPlannedLocation(LocationInfo.newBuilder()
.setPoint(LatLng.newBuilder()
.setLatitude(37.3382)
.setLongitude(121.8863)))
.addTasks(TaskInfo.newBuilder().setTaskId(TASK2_ID))
.setState(VehicleStop.State.NEW))) // Remaining stops must be NEW.
.build();
// DeliveryVehicle request
UpdateDeliveryVehicleRequest updateDeliveryVehicleRequest =
UpdateDeliveryVehicleRequest.newBuilder() // No need for the header
.setName(vehicleName)
.setDeliveryVehicle(deliveryVehicle)
.setUpdateMask(FieldMask.newBuilder()
.addPaths("remaining_vehicle_journey_segments"))
.build();
try {
DeliveryVehicle updatedDeliveryVehicle =
deliveryService.updateDeliveryVehicle(updateDeliveryVehicleRequest);
} catch (StatusRuntimeException e) {
Status s = e.getStatus();
switch (s.getCode()) {
case NOT_FOUND:
break;
case PERMISSION_DENIED:
break;
}
return;
}
REST
Fleet Engine'e bir aracın sunucu ortamındaki bir duraktan indiğini bildirmek için UpdateDeliveryVehicle
öğesine HTTP REST çağrısı yapın:
`PATCH https://fleetengine.googleapis.com/v1/providers/<project_id>/deliveryVehicles/<id>?updateMask=remainingVehicleJourneySegments`
<id>, filonuzdaki görev sıralamasını güncellemeyi düşündüğünüz teslimat aracının benzersiz bir tanımlayıcısıdır. Aracı oluştururken belirttiğiniz tanımlayıcıdır.
İstek başlığı, Hamiline ait <jeton> değerine sahip bir Yetkilendirme alanı içermelidir. Buradaki <jeton>, bir Fleet Engine jeton fabrikası tarafından verilen bir jetondur.
İsteğin gövdesinde bir DeliveryVehicle
varlığı bulunmalıdır:
Zorunlu alanlar:
Alan Değer remainingVehicleJourneySegments Durumu State.ARRIVED olarak ayarlanmış halde vardığınız durak ve ardından, durumu Eyalet olarak işaretlenmiş kalan araç duraklarının listesi. İsteğe bağlı alanlar:
- Yok
Varlıktaki diğer tüm alanlar, güncelleme için yoksayılır.
Örnek curl
komutu:
# Set JWT, PROJECT_ID, VEHICLE_ID, TASK1_ID, and TASK2_ID in the local
# environment
curl -X PATCH "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/deliveryVehicles/${VEHICLE_ID}?updateMask=remainingVehicleJourneySegments" \
-H "Content-type: application/json" \
-H "Authorization: Bearer ${JWT}" \
--data-binary @- << EOM
{
"remainingVehicleJourneySegments": [
{
"stop": {
"state": "ARRIVED",
"plannedLocation": {
"point": {
"latitude": 37.7749,
"longitude": -122.084061
}
},
"tasks": [
{
"taskId": "${TASK1_ID}"
}
]
}
},
{
"stop": {
"state": "NEW",
"plannedLocation": {
"point": {
"latitude": 37.3382,
"longitude": 121.8863
}
},
"tasks": [
{
"taskId": "${TASK2_ID}"
}
]
}
}
]
}
EOM
Araç bir durağı tamamlar
Bir araç durağı tamamladığında Fleet Engine'e bildirilmelidir. Bu, durakla ilişkili tüm görevlerin KAPALI durumuna ayarlanmasına neden olur. Fleet Engine'e Sürücü SDK'sından veya gRPC ya da REST kullanan bir sunucu ortamından bildirim gönderebilirsiniz. Irk koşullarından kaçınmak ve tek bilgi kaynağını korumak için her iki yöntemi de kullanmayın.
gRPC
Aşağıdaki örnekte, bir aracın durdurma işlemini tamamladığını Fleet Engine'e bildirmek için Java gRPC kitaplığının nasıl kullanılacağı gösterilmektedir.
static final String PROJECT_ID = "my-delivery-co-gcp-project";
static final String VEHICLE_ID = "vehicle-8241890";
DeliveryServiceBlockingStub deliveryService =
DeliveryServiceGrpc.newBlockingStub(channel);
// Vehicle settings
String vehicleName = "providers/" + PROJECT_ID + "/deliveryVehicles/" + VEHICLE_ID;
DeliveryVehicle deliveryVehicle = DeliveryVehicle.newBuilder()
// This stop has been completed and is commented out to indicate it
// should be removed from the list of vehicle journey segments.
// .addRemainingVehicleJourneySegments(VehicleJourneySegment.newBuilder()
// .setStop(VehicleStop.newBuilder()
// .setPlannedLocation(LocationInfo.newBuilder()
// .setPoint(LatLng.newBuilder()
// .setLatitude(37.7749)
// .setLongitude(122.4194)))
// .addTasks(TaskInfo.newBuilder().setTaskId(TASK1_ID))
// .setState(VehicleStop.State.ARRIVED)))
// All other remaining stops marked as NEW.
// The next stop could be marked as ENROUTE if the vehicle has begun
// its journey to the next stop.
.addRemainingVehicleJourneySegments(VehicleJourneySegment.newBuilder() // Next stop
.setStop(VehicleStop.newBuilder()
.setPlannedLocation(LocationInfo.newBuilder()
.setPoint(LatLng.newBuilder()
.setLatitude(37.3382)
.setLongitude(121.8863)))
.addTasks(TaskInfo.newBuilder().setTaskId(TASK2_ID))
.setState(VehicleStop.State.NEW)))
.build();
// DeliveryVehicle request
UpdateDeliveryVehicleRequest updateDeliveryVehicleRequest =
UpdateDeliveryVehicleRequest.newBuilder() // no need for the header
.setName(vehicleName)
.setDeliveryVehicle(deliveryVehicle)
.setUpdateMask(FieldMask.newBuilder()
.addPaths("remaining_vehicle_journey_segments"))
.build();
try {
DeliveryVehicle updatedDeliveryVehicle =
deliveryService.updateDeliveryVehicle(updateDeliveryVehicleRequest);
} catch (StatusRuntimeException e) {
Status s = e.getStatus();
switch (s.getCode()) {
case NOT_FOUND:
break;
case PERMISSION_DENIED:
break;
}
return;
}
REST
Fleet Engine'e, sunucu ortamından bir durdurma işleminin tamamlandığını bildirmek için UpdateDeliveryVehicle
hedefine HTTP REST çağrısı yapın:
`PATCH https://fleetengine.googleapis.com/v1/providers/<project_id>/deliveryVehicles/<id>?updateMask=remaining_vehicle_journey_segments`
<id>, filonuzdaki görev sıralamasını güncellemeyi düşündüğünüz teslimat aracının benzersiz bir tanımlayıcısıdır. Aracı oluştururken belirttiğiniz tanımlayıcıdır.
İstek başlığı, Hamiline ait <jeton> değerine sahip bir Yetkilendirme alanı içermelidir. Buradaki <jeton>, bir Fleet Engine jeton fabrikası tarafından verilen bir jetondur.
İsteğin gövdesinde bir DeliveryVehicle
varlığı bulunmalıdır:
Zorunlu alanlar:
Alan Değer remaining_vehicle_journey_segments Tamamladığınız durak, artık kalan araç durakları listesinde yer almamalıdır. İsteğe bağlı alanlar:
- Yok
Varlıktaki diğer tüm alanlar, güncelleme için yoksayılır.
Örnek curl
komutu:
# Set JWT, PROJECT_ID, VEHICLE_ID, TASK1_ID, and TASK2_ID in the local
# environment
curl -X PATCH "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/deliveryVehicles/${VEHICLE_ID}?updateMask=remainingVehicleJourneySegments" \
-H "Content-type: application/json" \
-H "Authorization: Bearer ${JWT}" \
--data-binary @- << EOM
{
"remainingVehicleJourneySegments": [
{
"stop": {
"state": "NEW",
"plannedLocation": {
"point": {
"latitude": 37.3382,
"longitude": 121.8863
}
},
"tasks": [
{
"taskId": "${TASK2_ID}"
}
]
}
}
]
}
EOM
Görev güncelleme
Çoğu görev alanı sabittir. Bununla birlikte, görev varlığını doğrudan güncelleyerek durumu, görev sonucunu, görev sonuç süresini, görev sonuç konumunu ve özellikleri değiştirebilirsiniz. Örneğin, bir araca görevin atanmadığı durumlarda, durumu doğrudan güncelleyerek görevi kapatabilirsiniz.
gRPC
Bu, gRPC aracılığıyla bir görev güncelleme örneğidir.
REST
Bu, görevleri REST üzerinden güncelleme örneğidir.
Görevi kapatma
Bir araca atanmış bir görevi kapatmak için Fileet Engine'e görevin gerçekleştiği yerde aracın durağını tamamladığını bildirin veya aracı durak listesinden kaldırın. Bunu yapmak için, bir araç için görev sıralamasını güncellerken olduğu gibi kalan araç duraklarının listesini de ayarlayabilirsiniz.
Bir görev için henüz araç atanmamışsa ve kapatılması gerekiyorsa görevi KAPAT olarak güncelleyin. Ancak KAPATILDI bir görevi yeniden açamazsınız.
Bir görevin kapatılması, başarılı ya da başarısız olduğunu göstermez. Görevin artık devam eden olmadığını belirtir. Filo takibinde, teslimatın sonucunun gösterilebilmesi için bir görevin gerçek sonucunu belirtmek önemlidir.
gRPC
static final String PROJECT_ID = "my-delivery-co-gcp-project";
static final String TASK_ID = "task-8241890";
DeliveryServiceBlockingStub deliveryService =
DeliveryServiceGrpc.newBlockingStub(channel);
// Task settings
String taskName = "providers/" + PROJECT_ID + "/tasks/" + TASK_ID;
Task task = Task.newBuilder()
.setName(taskName)
.setState(Task.State.CLOSED) // You can only directly CLOSE a
.build(); // task that is NOT assigned to a vehicle.
// Task request
UpdateTaskRequest updateTaskRequest =
UpdateTaskRequest.newBuilder() // No need for the header
.setTask(task)
.setUpdateMask(FieldMask.newBuilder().addPaths("state"))
.build();
try {
Task updatedTask = deliveryService.updateTask(updateTaskRequest);
} catch (StatusRuntimeException e) {
Status s = e.getStatus();
switch (s.getCode()) {
case NOT_FOUND:
break;
case PERMISSION_DENIED:
break;
}
return;
}
REST
Bir görevi sunucu ortamından kapalı olarak işaretlemek için UpdateTask
hedefine HTTP REST çağrısı yapın:
`PATCH https://fleetengine.googleapis.com/v1/providers/<project_id>/tasks/<id>?updateMask=state`
<id>, görev için benzersiz bir tanımlayıcıdır.
İstek başlığınız, Hamiline ait <jeton> değerine sahip bir Yetkilendirme alanı içermelidir. Buradaki <jeton>, bir Fleet Engine jeton fabrikası tarafından verilen bir jetondur.
İstek gövdesine bir Task
varlığı eklemeniz gerekir:
Zorunlu alanlar:
Alan Değer state State.CLOSED İsteğe bağlı alanlar:
Alan Değer taskOutcome Sonuç.SUCCEEDED veya Sonuç.BAŞARISIZ taskOutcomeTime Görevin tamamlandığı zaman. taskOutcomeLocation Görevin tamamlandığı konum. Fleet Engine, sağlayıcı tarafından manuel olarak geçersiz kılınmadığı sürece bu alanı varsayılan olarak son araç konumuna ayarlar.
Varlıktaki diğer tüm alanlar, güncelleme için yoksayılır.
Örnek curl
komutu:
# Set JWT, PROJECT_ID, and TASK_ID in the local environment curl -X PATCH "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/tasks/${TASK_ID}?updateMask=state,taskOutcome,taskOutcomeTime" \ -H "Content-type: application/json" \ -H "Authorization: Bearer ${JWT}" \ --data-binary @- << EOM { "state": "CLOSED", "taskOutcome": "SUCCEEDED", "taskOutcomeTime": "$(date -u --iso-8601=seconds)" } EOM
Görevin sonucunu ve sonucun konumunu belirleme
Bir görevin kapatılmasının başarılı ya da başarısız olduğunu değil, görevin artık devam eden olarak kabul edilmediğini belirtir. Filo takibi için bir görevin gerçek sonucunu belirtmek önemlidir. Böylece teslimat sonucu görüntülenebilir ve hizmetler için uygun faturalandırma olur. Ayarlandıktan sonra görev sonucunu değiştiremezsiniz. Bununla birlikte, görev sonuç zamanını ve görev sonucu konumunu, belirlendikten sonra değiştirebilirsiniz.
KAPALI durumdaki görevlerin sonucu BAŞARILI veya BAŞARISIZ olarak ayarlanabilir. Fleet Engine, yalnızca SUCCEEDED durumundaki teslimat görevleri için ücret alır.
Fleet Engine, bir görevin sonucu işaretlerken görev sonucu konumunu, bilinen son araç konumuyla otomatik olarak doldurur. Bu davranışı geçersiz kılabilirsiniz.
gRPC
Sonucu ortaya çıkardığınızda görevin sonucunu görevi belirleyebilirsiniz. Konumun ayarlanması, Fleet Engine'in konumu son araç konumu olarak varsayılan değere ayarlamasını engeller. Daha sonra, Fleet Engine'in belirlediği görev sonucu konumunun üzerine de yazabilirsiniz. Fleet Engine, sağladığınız görev sonucu konumunun üzerine hiçbir zaman yazmaz. Bir görev sonucu belirlenmemiş bir görev için görev sonucu konumu belirleyemezsiniz. Aynı istek içinde hem görev hem de görev sonucu konumunu belirleyebilirsiniz.
Aşağıdaki örnekte, SUCCEEDED olarak bir görev sonucu ayarlamak ve görevin tamamlandığı konumu ayarlamak için Java gRPC kitaplığının nasıl kullanılacağı gösterilmektedir:
static final String PROJECT_ID = "my-delivery-co-gcp-project";
static final String TASK_ID = "task-8241890";
DeliveryServiceBlockingStub deliveryService =
DeliveryServiceGrpc.newBlockingStub(channel);
// Task settings
String taskName = "providers/" + PROJECT_ID + "/tasks/" + TASK_ID;
Task task = Task.newBuilder()
.setName(taskName)
.setTaskOutcome(TaskOutcome.SUCCEEDED)
.setTaskOutcomeTime(now())
.setTaskOutcomeLocation( // Grand Indonesia East Mall
LocationInfo.newBuilder().setPoint(
LatLng.newBuilder().setLatitude(-6.195139).setLongitude(106.820826)))
.build();
// Task request
UpdateTaskRequest updateTaskRequest =
UpdateTaskRequest.newBuilder() // No need for the header
.setTask(task)
.setUpdateMask(FieldMask.newBuilder().addPaths("task_outcome", "task_outcome_time", "task_outcome_location"))
.build();
try {
Task updatedTask = deliveryService.updateTask(updateTaskRequest);
} catch (StatusRuntimeException e) {
Status s = e.getStatus();
switch (s.getCode()) {
case NOT_FOUND:
break;
case PERMISSION_DENIED:
break;
}
return;
}
REST
Bir görevi sunucu ortamından tamamlandı olarak işaretlemek için UpdateTask
sitesine HTTP REST çağrısı yapın:
`PATCH https://fleetengine.googleapis.com/v1/providers/<project_id>/tasks/<id>?updateMask=taskOutcome,taskOutcomeTime,taskOutcomeLocation`
<id>, görev için benzersiz bir tanımlayıcıdır.
İstek başlığı, Hamiline ait <jeton> değerine sahip bir Yetkilendirme alanı içermelidir. Buradaki <jeton>, bir Fleet Engine jeton fabrikası tarafından verilen bir jetondur.
İsteğin gövdesinde bir Task
varlığı bulunmalıdır:
Zorunlu alanlar:
Alan Değer taskOutcome Sonuç.SUCCEEDED veya Sonuç.BAŞARISIZ İsteğe bağlı alanlar:
Alan Değer taskOutcomeLocation Görevin tamamlandığı konum. Politika ayarlanmazsa Fleet Engine, bu konumu varsayılan olarak son araç konumuna ayarlar. taskOutcomeTime Görevin tamamlandığı anı belirten zaman damgası.
Varlıktaki diğer tüm alanlar, güncelleme için yoksayılır.
Örnek curl
komutu:
# Set JWT, PROJECT_ID, and TASK_ID in the local environment
curl -X PATCH "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/tasks/${TASK_ID}?updateMask=taskOutcome,taskOutcomeTime,taskOutcomeLocation" \
-H "Content-type: application/json" \
-H "Authorization: Bearer ${JWT}" \
--data-binary @- << EOM
{
"taskOutcome": "SUCCEEDED",
"taskOutcomeTime": "$(date -u --iso-8601=seconds)",
"taskOutcomeLocation": {
"point": {
"latitude": -6.195139,
"longitude": 106.820826
}
}
}
EOM
Gönderimi yeniden yönlendirme
Gönderim görevi oluşturulduktan sonra planlanan konumu değiştirilemez. Bir gönderiyi yeniden yönlendirmek için bir sonuç belirlemeden gönderim görevini kapatın ve ardından güncellenmiş planlanan konumla yeni bir görev oluşturun. Yeni görevi oluşturduktan sonra aynı araca atayın. Daha fazla bilgi için gönderim görevini kapatma ve görevi atama bölümünü inceleyin.
Besleyici ve teslimat araçlarını kullanın
Gönderileri gün boyunca teslimat araçlarına taşımak için besleyici araçlar kullanıyorsanız sevkiyatların transferini teslimat aracı için planlanmış bir duraklama görevi olarak modelleyin. Doğru konum takibini sağlamak için yalnızca teslimat aracına yüklendikten sonra aktarılan bir gönderime gönderim teslimat görevi atayın. Daha fazla bilgi edinmek için zamanlanmış duraklama bölümünü inceleyin.
Mağaza gönderim durumu ve diğer meta bilgiler
Bir sevkiyat görevi tamamlandığında görev durumu ve sonucu göreve kaydedilir. Ancak, gönderime özel diğer meta bilgileri güncellemek isteyebilirsiniz. Fleet Engine hizmetinin dışında başvurabileceğiniz diğer meta bilgileri depolamak için görevle ilişkilendirilen tracking_id değerini harici bir tabloda anahtar olarak kullanın.
Daha fazla bilgi için Bir görevin ömrü bölümüne bakın.
Araç arama
Sürücü SDK'sından veya gRPC ya da REST kullanarak bir sunucu ortamından araç arayabilirsiniz.
gRPC
Aşağıdaki örnekte, araç aramak için Java gRPC kitaplığının nasıl kullanılacağı gösterilmektedir:
static final String PROJECT_ID = "my-delivery-co-gcp-project";
static final String VEHICLE_ID = "vehicle-8241890";
DeliveryServiceBlockingStub deliveryService =
DeliveryServiceGrpc.newBlockingStub(channel);
// Vehicle request
String name = "providers/" + PROJECT_ID + "/deliveryVehicles/" + VEHICLE_ID;
GetDeliveryVehicleRequest getVehicleRequest = GetDeliveryVehicleRequest.newBuilder() // No need for the header
.setName(name)
.build();
try {
DeliveryVehicle vehicle = deliveryService.getDeliveryVehicle(getVehicleRequest);
} catch (StatusRuntimeException e) {
Status s = e.getStatus();
switch (s.getCode()) {
case NOT_FOUND:
break;
case PERMISSION_DENIED:
break;
}
return;
}
REST
Sunucu ortamından araç aramak için GetVehicle
öğesine HTTP REST çağrısı yapın:
`GET https://fleetengine.googleapis.com/v1/providers/<project_id>/deliveryVehicles/<vehicleId>`
<id>, görev için benzersiz bir tanımlayıcıdır.
<vehicleId>, aranacak aracın kimliğidir.
İstek başlığı, Hamiline ait <jeton> değerine sahip bir Yetkilendirme alanı içermelidir. Buradaki <jeton>, bir Fleet Engine jeton fabrikası tarafından verilen bir jetondur.
İstek metni boş olmalıdır.
Arama başarılı olursa yanıt gövdesi, bir araç varlığı içerir.
Örnek curl
komutu:
# Set JWT, PROJECT_ID, and VEHICLE_ID in the local environment
curl -H "Authorization: Bearer ${JWT}" \
"https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/deliveryVehicles/${VEHICLE_ID}"
Görev arama
gRPC veya REST kullanarak bir sunucu ortamından görev arayabilirsiniz. Sürücü SDK'sı görev aramayı desteklemez.
gRPC
Aşağıdaki örnekte, görev aramak için Java gRPC kitaplığının nasıl kullanılacağı gösterilmektedir:
static final String PROJECT_ID = "my-delivery-co-gcp-project";
static final String TASK_ID = "task-8597549";
DeliveryServiceBlockingStub deliveryService =
DeliveryServiceGrpc.newBlockingStub(channel);
// Task request
String taskName = "providers/" + PROJECT_ID + "/tasks/" + TASK_ID;
GetTaskRequest getTaskRequest = GetTaskRequest.newBuilder() // No need for the header
.setName(taskName)
.build();
try {
Task task = deliveryService.getTask(getTaskRequest);
} catch (StatusRuntimeException e) {
Status s = e.getStatus();
switch (s.getCode()) {
case NOT_FOUND:
break;
case PERMISSION_DENIED:
break;
}
return;
}
REST
Sunucu ortamından görev aramak için GetTask
öğesine HTTP REST çağrısı yapın:
`GET https://fleetengine.googleapis.com/v1/providers/<project_id>/tasks/<taskId>`
<id>, görev için benzersiz bir tanımlayıcıdır.
<taskId>, aranacak görevin kimliğidir.
İstek başlığı, Hamiline ait <jeton> değerine sahip bir Yetkilendirme alanı içermelidir. Buradaki <jeton>, bir Fleet Engine jeton fabrikası tarafından verilen bir jetondur.
İstek metni boş olmalıdır.
Arama başarılı olursa yanıt gövdesi, bir görev varlığı içerir.
Örnek curl
komutu:
# Set JWT, PROJECT_ID, and TASK_ID in the local environment
curl -H "Authorization: Bearer ${JWT}" \
"https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/tasks/${TASK_ID}"
Gönderim görevi bilgilerini izleme kimliğine göre ara
Filo görevi bilgilerini aşağıdaki şekillerde arayabilirsiniz. Bu yöntemlerin her birinin ayrı bir amacı vardır:
- görev kimliğiyle: görev verilerinin tam görünümüne erişimi olan filo operatörleri gibi kullanıcılar tarafından kullanılır.
- izleme kimliğiyle: İstemci yazılımınız tarafından son kullanıcıya sınırlı bilgi sağlamak için (örneğin, evinde bir paket olması gerektiği zaman) kullanılır.
Bu bölümde, görev bilgilerini izleme kimliğine göre arama konusu ele alınmaktadır. Bir görevi görev kimliğine göre aramak istiyorsanız Görev arama bölümüne gidin.
Bilgileri izleme kimliğine göre aramak için aşağıdakilerden birini kullanabilirsiniz:
Arama gereksinimleri
Takip kimliği ile sağlanan gönderim bilgileri, Takip edilen konumların görünürlüğünü kontrol etme bölümünde belirtilen görünürlük kurallarına uyar.
Gönderim bilgilerini izleme kimliğine göre aramak için Fleet Engine'i kullanın. Sürücü SDK'sı, izleme kimliğine dayalı bilgi aramalarını desteklemez. Fleet Engine ile bunu yapmak için bir sunucu veya tarayıcı ortamı kullanırsınız.
Güvenlik risklerini sınırlandırmak için mümkün olan en küçük jetonu kullanın. Örneğin, Delivery Consumer Token kullanıyorsanız tüm Fleet Engine Deliveries API çağrıları yalnızca son kullanıcıyla alakalı bilgileri (ör. kargo şirketi veya kargonun alıcısı) döndürür. Yanıtlardaki diğer tüm bilgiler çıkartılır. Jetonlar hakkında daha fazla bilgi edinmek için Yetkilendirme için JSON Web Jetonu (JWT) oluşturma bölümüne bakın.
gRPC kullanarak Java ile aramalar
Aşağıdaki örnekte, bir gönderim göreviyle ilgili bilgileri izleme kimliğine göre aramak için Java gRPC kitaplığının nasıl kullanılacağı gösterilmektedir.
static final String PROJECT_ID = "my-delivery-co-gcp-project";
static final String TRACKING_ID = "TID-7449w087464x5";
DeliveryServiceBlockingStub deliveryService =
DeliveryServiceGrpc.newBlockingStub(channel);
// Tasks request
String parent = "providers/" + PROJECT_ID;
GetTaskTrackingInfoRequest getTaskTrackingInfoRequest = GetTaskTrackingInfoRequest.newBuilder() // No need for the header
.setParent(parent)
.setTrackingId(TRACKING_ID)
.build();
try {
TaskTrackingInfo taskTrackingInfo = deliveryService.getTaskTrackingInfo(getTaskTrackingInfoRequest);
} catch (StatusRuntimeException e) {
Status s = e.getStatus();
switch (s.getCode()) {
case NOT_FOUND:
break;
case PERMISSION_DENIED:
break;
}
return;
}
HTTP kullanarak aramalar
Tarayıcıdan gönderim görevi aramak için GetTaskTrackingInfo
öğesine HTTP REST çağrısı yapın:
`GET https://fleetengine.googleapis.com/v1/providers/<project_id>/taskTrackingInfo/<tracking_id>`
<tracking_id>, görevle ilişkilendirilen izleme kimliğidir.
İstek başlığı, hamiline ait <jeton> değerine sahip bir Yetkilendirme alanı içermelidir. Buradaki <jeton>, Fire Engine jeton fabrikası tarafından verilen bir jetondur.
Arama başarılı olursa yanıt gövdesi bir taskTrackingInfo varlığı içerir.
Örnek curl
komutu:
# Set JWT, PROJECT_ID, and TRACKING_ID in the local environment
curl -H "Authorization: Bearer ${JWT}" \
"https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/taskTrackingInfo/${TRACKING_ID}"
Görevleri listeleyin
Bir sunucu veya tarayıcı ortamındaki görevleri listeleyebilirsiniz. Sürücü SDK'sı, görevleri listelemeyi desteklemez.
Görevleri listelemek, görevlere geniş kapsamlı erişim gerektirir. Görevleri listelemek yalnızca güvenilir kullanıcılara yöneliktir. Liste görevleri isteğinde bulunurken Teslimat Filo Okuyucu veya Teslimat Süper Kullanıcı Kimlik Doğrulama Jetonları kullanın.
Listedeki görevlerde aşağıdaki alanlar çıkartılır:
- VehicleStop.planned_location
- VehicleStop.state
- VehicleStop.TaskInfo.taskId
Listedeki görevler, çoğu görev özelliğine göre filtrelenebilir. Filtre sorgusu söz dizimi için AIP-160 sayfasına bakın. Aşağıdaki listede filtreleme için kullanabileceğiniz geçerli görev özellikleri gösterilmektedir:
- attributes
- delivery_vehicle_id
- state
- planned_location
- task_duration
- task_outcome
- task_outcome_location
- task_outcome_location_source
- task_outcome_time
- tracking_id
- tür
Google API İyileştirme Tekliflerine dayalı olarak aşağıdaki alan biçimlerini kullanın:
Alan Türü | Biçim | Örnek |
---|---|---|
Zaman damgası | RFC-3339 | task_outcome_time = 2022-03-01T11:30:00-08:00 |
Süre | Saniye sayısı ve ardından s |
task_duration = 120s |
Enum | Dize | state = CLOSED AND type = PICKUP |
Konum | point.latitude ve point.longitude |
planned_location.point.latitude > 36.1 AND planned_location.point.longitude < -122.0 |
Filtre sorgu operatörlerinin tam listesi için AIP-160 sayfasına bakın.
Herhangi bir filtre sorgusu belirtilmezse tüm görevler listelenir.
Görev listeleri sayfalara ayrılır. Sayfa boyutu, liste görevleri isteklerinde belirtilebilir. Sayfa boyutu belirtilirse döndürülen görevlerin sayısı belirtilen sayfa boyutundan büyük olmaz. Hiçbir sayfa boyutu yoksa makul bir varsayılan kullanılır. İstenen sayfa boyutu dahili bir maksimum değeri aşarsa dahili maksimum değer kullanılır.
Bir görev listesi, sonraki sonuç sayfasını okumak için bir jeton içerebilir. Sonraki görev sayfasını almak için, önceki istekle aynı olan bir istekle sayfa jetonunu kullanın. Döndürülen sayfa jetonu boş olduğunda, almak için başka görev kullanılamaz.
gRPC
Aşağıdaki örnekte deliveryVehicleId ve görev özelliklerinin listelenmesi için Java gRPC kitaplığının nasıl kullanılacağı gösterilmektedir. Başarılı bir yanıt hâlâ boş olabilir. Boş yanıt, sağlanan deliveryVehicleId ile herhangi bir görevin ilişkilendirilmediğini gösterir.
static final String PROJECT_ID = "my-delivery-co-gcp-project";
static final String TRACKING_ID = "TID-7449w087464x5";
DeliveryServiceBlockingStub deliveryService =
DeliveryServiceGrpc.newBlockingStub(channel);
// Tasks request
String parent = "providers/" + PROJECT_ID;
ListTasksRequest listTasksRequest = ListTasksRequest.newBuilder() // No need for the header
.setParent(parent)
.setFilter("delivery_vehicle_id = 123 AND attributes.foo = true")
.build();
try {
ListTasksResponse listTasksResponse = deliveryService.listTasks(listTasksRequest);
} catch (StatusRuntimeException e) {
Status s = e.getStatus();
switch (s.getCode()) {
case NOT_FOUND:
break;
case PERMISSION_DENIED:
break;
}
return;
}
REST
Tarayıcıdan görevleri listelemek için ListTasks
öğesine HTTP REST çağrısı yapın:
`GET https://fleetengine.googleapis.com/v1/providers/<project_id>/tasks`
Listelenen görevlere filtre uygulamak için değeri olarak URL çıkışlı filtre sorgusu içeren bir "filter" URL parametresi ekleyin.
İstek başlığı, Hamiline ait <jeton> değerine sahip bir Yetkilendirme alanı içermelidir. Buradaki <jeton>, bir Fleet Engine jeton fabrikası tarafından verilen bir jetondur.
Arama başarılı olursa yanıt gövdesi, aşağıdaki yapıyla birlikte verileri içerir:
// JSON representation
{
"tasks": [
{
object (Task)
}
],
"nextPageToken": string,
"totalSize": integer
}
Başarılı bir yanıt hâlâ boş olabilir. Boş yanıt, belirtilen filtre kriterlerini karşılayan hiçbir görevin bulunamadığını gösterir.
Örnek curl
komutu:
# Set JWT, PROJECT_ID, and VEHICLE_ID in the local environment
curl -H "Authorization: Bearer ${JWT}" \
"https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/tasks?filter=state%20%3D%20OPEN%20AND%20delivery_vehicle_id%20%3D%20${VEHICLE_ID}"
Teslim araçlarını listeleme
Teslim araçlarını bir sunucu veya tarayıcı ortamından listeleyebilirsiniz. Sürücü SDK'sı, teslimat araçlarının listelenmesini desteklemez.
Teslimat araçlarının listelenmesi, teslimat araçlarına geniş kapsamlı erişim gerektirir ve yalnızca güvenilir kullanıcılara yöneliktir. Teslimat araçları listesini gönderirken Filo Okuyucu veya Teslimat Süper Kullanıcı Kimlik Doğrulama Jetonları kullanın.
Listelenen teslimat araçları, yanıt boyutu üzerindeki etkileri nedeniyle aşağıdaki alanlar çıkartılır:
- CurrentRouteSegment
- RemainingVehicleJourneySegments
Teslimat araçlarını attributes
mülklerine göre filtreleyebilirsiniz. Örneğin, my_key
anahtarı ve my_value
değerine sahip bir özelliği sorgulamak için attributes.my_key = my_value
değerini kullanın. Birden çok özelliği sorgulamak için sorguları attributes.key1 = value1 AND
attributes.key2 = value2
'teki gibi mantıksal AND
ve OR
operatörlerini kullanarak birleştirin. Filtre sorgusu söz diziminin tam açıklaması için AIP-160 sayfasına bakın.
Listelenen teslimat araçlarını viewport
istek parametresini kullanarak konuma göre filtreleyebilirsiniz. viewport
istek parametresi, görüntü alanlarını iki sınır koordinatı kullanarak tanımlar: high
(kuzeydoğu) ve low
(güneybatı) enlem ve boylam koordinat çifti. Coğrafi olarak düşük enlemden daha aşağıda olan bir yüksek enlemi içeren istekler reddedilir.
Yayınlama aracı listeleri, varsayılan olarak makul bir sayfa boyutu kullanılarak sayfalara ayrılır. Bir sayfa boyutu belirtirseniz istek, yalnızca sınır tarafından belirtilen araç sayısını veya daha azını döndürür. İstenen sayfa boyutu dahili bir maksimum değeri aşarsa dahili maksimum değer kullanılır. Varsayılan ve maksimum sayfa boyutları 100 araçtır.
Teslimat araçları listesi, sonuçların sonraki sayfasını okumak için bir jeton içerebilir. Sayfa jetonu yalnızca, daha fazla teslimat aracı sayfası alınmaya hazır olduğunda yanıtta mevcut olur. Sonraki görev sayfasını almak için sayfa jetonunu önceki istekle aynı olan bir istekle kullanın.
gRPC
Aşağıdaki örnekte, belirli bir bölgedeki teslimat araçlarını belirli bir özelliğe sahip listelemek için Java gRPC kitaplığının nasıl kullanılacağı gösterilmektedir. Başarılı bir yanıt yine de boş olabilir. Bu durum, belirtilen özelliğe sahip araçların zaten belirtilen görüntü alanında bulunmadığı anlamına gelir.
static final String PROJECT_ID = "my-delivery-co-gcp-project";
DeliveryServiceBlockingStub deliveryService =
DeliveryServiceGrpc.newBlockingStub(channel);
// Tasks request
String parent = "providers/" + PROJECT_ID;
ListDeliveryVehiclesRequest listDeliveryVehiclesRequest =
ListDeliveryVehiclesRequest.newBuilder() // No need for the header
.setParent(parent)
.setViewport(
Viewport.newBuilder()
.setHigh(LatLng.newBuilder()
.setLatitude(37.45)
.setLongitude(-122.06)
.build())
.setLow(LatLng.newBuilder()
.setLatitude(37.41)
.setLongitude(-122.11)
.build())
.setFilter("attributes.my_key = my_value")
.build();
try {
ListDeliveryVehiclesResponse listDeliveryVehiclesResponse =
deliveryService.listDeliveryVehicles(listDeliveryVehiclesRequest);
} catch (StatusRuntimeException e) {
Status s = e.getStatus();
switch (s.getCode()) {
case NOT_FOUND:
break;
case PERMISSION_DENIED:
break;
}
return;
}
REST
Tarayıcıdan görevleri listelemek için ListDeliveryVehicles
öğesine HTTP REST çağrısı yapın:
`GET https://fleetengine.googleapis.com/v1/providers/<project_id>/deliveryVehicles`
Listelenen görevlere filtre uygulamak için değeri olarak URL çıkışlı filtre sorgusu içeren bir "filtre" URL parametresi ekleyin.
İstek başlığı, Hamiline ait <jeton> değerine sahip bir Yetkilendirme alanı içermelidir. Buradaki <jeton>, bir Fleet Engine jeton fabrikası tarafından verilen bir jetondur.
Arama başarılı olursa yanıt gövdesi, aşağıdaki yapıyla birlikte verileri içerir:
// JSON representation
{
"deliveryVehicles": [
{
object (DeliveryVehicle)
}
],
"nextPageToken": string,
"totalSize": integer
}
Başarılı bir yanıt hâlâ boş olabilir. Bu durum, belirtilen filtre sorgusu ve görüntü alanını karşılayan yayınlama araçlarının bulunmadığı anlamına gelir.
Örnek curl
komutu:
# Set JWT, PROJECT_ID, and VEHICLE_ID in the local environment
curl -H "Authorization: Bearer ${JWT}" \
"https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/deliveryVehicles?filter=attributes.my_key%20%3D%20my_value%20&viewport.high.latitude=37.45&viewport.high.longitude=-122.06&viewport.low.latitude=37.41&viewport.low.longitude=-122.11"
Filo takibi
Filo izlemeyi etkinleştirmek için Fleet Engine Deliveries API'yi iki şekilde kullanabilirsiniz:
Tercih Edilen: JavaScript Filo İzleme kitaplığını kullanın. Kitaplık, Fleet Engine'de takip edilen araçların konumunu ve önemli konumları görselleştirmenize olanak tanır. Standart bir google.maps.Map nesnesinin yerine kullanılabilen JavaScript harita bileşeni ve Fleet Engine'e bağlanacak veri bileşenleri içerir. Bu bileşen, web veya mobil uygulamanızdan özelleştirilebilir, animasyonlu bir filo izleme deneyimi sunmanıza olanak tanır.
Fleet Engine Deliveries API'ye ek olarak kendi filo izleme uygulamanızı uygulayın.
Önemli olan, filo görevlerini izleme kimliğine göre aramaktır.
Günlük Kaydı
Fleet Engine'i, RPC günlüklerini Cloud Logging'e gönderecek şekilde ayarlayabilirsiniz. Daha fazla bilgi için Günlük Kaydı bölümüne bakın.
Yetkilendirme Rolleri ve Jetonları
Araç ve görev yaşam döngüsünü yönetme bölümünde ve bireysel kullanım alanları ile ilgili yetkilendirme notlarında açıklandığı gibi, Fleet Engine'e çağrı yapmak için hizmet hesabı kimlik bilgileri kullanılarak imzalanmış JSON Web Jetonları ile kimlik doğrulama gerekir. Bu jetonları yayınlamak için kullanılan hizmet hesapları, her bir rol farklı bir izin grubu veren bir veya daha fazla role sahip olabilir.
Daha fazla bilgi için Kimlik Doğrulama ve Yetkilendirme bölümüne bakın.
Sık karşılaşılan sorunları giderme
Herhangi bir sorun yaşarsanız yardım için aşağıdaki bölümleri kontrol edin.
Esneklik
Fleet Engine, bilgi kaynağı olarak kabul edilmez. Gerekirse sisteminizin durumunu Fleet Engine'e güvenmeden geri yüklemek sizin sorumluluğunuzdadır.
Fleet Engine'de kayıp durum
Fleet Engine ile çalışırken istemcileri uygulayarak hata olması durumunda sistemin kendi kendini iyileştirmesini sağlayın. Örneğin, Fleet Engine bir aracı güncellemeye çalıştığında aracın mevcut olmadığını belirten bir hata mesajı verebilir. Ardından istemci, aracı yeni durumuna getirmelidir. Bu sorun nadiren yaşansa da sisteminizin bunu kaldırabilecek kadar dayanıklı olduğundan emin olun.
Fleet Engine'in ciddi ölçüde başarısız olduğu son derece düşük bir senaryoda, araçların ve görevlerin çoğunu veya tümünü yeniden oluşturmanız gerekebilir. Hizmet reddi (DOS) saldırılarından kaçınmak için kota kontrolleri yapıldığından, oluşturma hızı çok yükselirse kota sorunları nedeniyle bazı istekler tekrar başarısız olabilir. Bu durumda, yeniden denemeler için bir geri yükleme stratejisi kullanarak yeniden oluşturma oranını yavaşlatın.
Sürücü uygulamasında kayıp durumu
Sürücü uygulaması kilitlenirse uygulamanın, Sürücü SDK'sı içinde geçerli durumu yeniden oluşturması gerekir. Uygulama, görevlerin var olduğundan emin olmak ve mevcut durumlarını geri yüklemek için görevleri yeniden oluşturmaya çalışmalıdır. Uygulama ayrıca Sürücü SDK'sı için durak listesini yeniden oluşturmalı ve açıkça ayarlamalıdır.
SSS
Bir sürücü belli bir işi tamamlamak için durursa ne olur?
Bu durumda önce görevlerin sırasını güncelleyin, sonra normal şekilde devam edin. Durağa varışı, görevin tamamlanmasını ve diğer ayrıntıları işaretleyin. Bunu yapmazsanız sistem tutarsız hale gelebilir, GMR'ler hatalı olabilir ve beklenmedik hatalar raporlanabilir.