ফ্লিট ইঞ্জিন দিয়ে শুরু করা

ফ্লিট ইঞ্জিন অন-ডিমান্ড রাইডস এবং ডেলিভারি API আপনাকে আপনার ট্রিপ এবং অর্ডার অগ্রগতির অ্যাপ্লিকেশনগুলির জন্য ট্রিপ এবং গাড়ির অবস্থা পরিচালনা করতে দেয়। এটি ড্রাইভার SDK, উপভোক্তা SDK, এবং আপনার ব্যাকএন্ড পরিষেবার মধ্যে লেনদেন পরিচালনা করে -- যা gRPC বা REST কল করে ফ্লিট ইঞ্জিনের সাথে যোগাযোগ করতে পারে৷

পূর্বশর্ত

বিকাশের জন্য, নিশ্চিত করুন যে আপনি ক্লাউড SDK (gcloud) ইনস্টল করেছেন এবং আপনার প্রকল্পে প্রমাণীকৃত।

শেল

gcloud auth login

আপনার একটি সফল বার্তা দেখতে হবে যেমন:

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

অন-ডিমান্ড রাইডস এবং ডেলিভারি সলিউশন ফ্লিট ইঞ্জিন APIগুলি যথাযথভাবে কনফিগার করা হয়েছে কিনা তা পরীক্ষা করুন৷

শেল

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

এই কমান্ডের ফলে কোনো ত্রুটি দেখা দিলে, অ্যাক্সেস পেতে আপনার প্রজেক্ট অ্যাডমিনিস্ট্রেটর এবং আপনার Google সহায়তা প্রতিনিধির সাথে যোগাযোগ করুন।

লগিং

ফ্লিট ইঞ্জিন Google ক্লাউড প্ল্যাটফর্ম লগগুলিতে প্রাপ্ত API কলগুলি সম্পর্কে লগ বার্তা লিখতে পারে৷ লগগুলি কীভাবে পড়তে এবং বিশ্লেষণ করতে হয় তার একটি ওভারভিউয়ের জন্য ক্লাউড লগিং ডকুমেন্টেশন দেখুন।

10 ফেব্রুয়ারী, 2022 এর আগে তৈরি করা প্রকল্পগুলির জন্য লগিং ডিফল্টরূপে সক্ষম নাও হতে পারে৷ আরও বিশদ বিবরণের জন্য লগিং ডকুমেন্টেশন দেখুন৷

ক্লায়েন্ট লাইব্রেরি

আমরা বিভিন্ন সাধারণ প্রোগ্রামিং ভাষায় ক্লায়েন্ট লাইব্রেরি প্রকাশ করি। এই লাইব্রেরিগুলি কাঁচা REST বা gRPC-এর তুলনায় উন্নত বিকাশকারী অভিজ্ঞতা প্রদান করতে সাহায্য করবে। আপনার সার্ভার অ্যাপ্লিকেশনের জন্য ক্লায়েন্ট লাইব্রেরিগুলি কীভাবে পেতে হয় তার নির্দেশাবলীর জন্য, ক্লায়েন্ট লাইব্রেরি দেখুন।

এই ডকুমেন্টেশনের জাভা উদাহরণগুলি gRPC এর সাথে পরিচিতি অনুমান করে।

প্রমাণীকরণ এবং অনুমোদন

আপনি Google ক্লাউড কনসোলের মাধ্যমে ট্রিপ এবং অর্ডার অগ্রগতির দ্বারা প্রদত্ত ক্ষমতাগুলি কনফিগার করতে পারেন৷ এই API এবং SDKগুলির জন্য JSON ওয়েব টোকেনগুলির ব্যবহার প্রয়োজন যা ক্লাউড কনসোল থেকে তৈরি পরিষেবা অ্যাকাউন্টগুলি ব্যবহার করে স্বাক্ষর করা হয়েছে৷

ক্লাউড প্রকল্প সেটআপ

আপনার ক্লাউড প্রকল্প সেট আপ করতে, প্রথমে আপনার প্রকল্প তৈরি করুন এবং তারপর পরিষেবা অ্যাকাউন্ট তৈরি করুন৷

আপনার Google ক্লাউড প্রকল্প তৈরি করতে:

  1. Google ক্লাউড কনসোল ব্যবহার করে একটি Google ক্লাউড প্রকল্প তৈরি করুন।
  2. API এবং পরিষেবা ড্যাশবোর্ড ব্যবহার করে, স্থানীয় রাইডস এবং ডেলিভারি API সক্ষম করুন৷

পরিষেবা অ্যাকাউন্টগুলি এক বা একাধিক ভূমিকার সাথে যুক্ত। এগুলি JSON ওয়েব টোকেন তৈরি করতে ব্যবহৃত হয় যা ভূমিকাগুলির উপর নির্ভর করে বিভিন্ন সেটের অনুমতি দেয়। সাধারণত, অপব্যবহারের সম্ভাবনা কমাতে আপনি একাধিক পরিষেবা অ্যাকাউন্ট তৈরি করতে পারেন, প্রতিটিতে ন্যূনতম ভূমিকার প্রয়োজন।

ট্রিপ এবং অর্ডার অগ্রগতি নিম্নলিখিত ভূমিকা ব্যবহার করে:

ভূমিকা বর্ণনা
ফ্লিট ইঞ্জিন গ্রাহক SDK ব্যবহারকারী

roles/fleetengine.consumerSdkUser
যানবাহন অনুসন্ধান এবং যানবাহন এবং ভ্রমণ সম্পর্কে তথ্য পুনরুদ্ধার করার অনুমতি দেয়। এই ভূমিকা সহ একটি পরিষেবা অ্যাকাউন্ট দ্বারা তৈরি টোকেনগুলি সাধারণত আপনার রাইড শেয়ারিং বা ডেলিভারি গ্রাহক অ্যাপ মোবাইল ডিভাইস থেকে ব্যবহার করা হয়।
ফ্লিট ইঞ্জিন ড্রাইভার SDK ব্যবহারকারী

roles/fleetengine.driverSdkUser
যানবাহনের অবস্থান এবং রুট আপডেট করার এবং যানবাহন এবং ট্রিপ সম্পর্কে তথ্য পুনরুদ্ধার করার অনুমতি দেয়। এই ভূমিকা সহ একটি পরিষেবা অ্যাকাউন্ট দ্বারা তৈরি টোকেনগুলি সাধারণত আপনার রাইড শেয়ারিং বা ডেলিভারি ড্রাইভার অ্যাপ মোবাইল ডিভাইস থেকে ব্যবহার করা হয়।
ফ্লিট ইঞ্জিন সার্ভিস সুপার ইউজার

roles/fleetengine.serviceSuperUser
সমস্ত যানবাহন এবং ট্রিপ API-কে অনুমতি দেয়। এই ভূমিকা সহ একটি পরিষেবা অ্যাকাউন্ট দ্বারা তৈরি টোকেনগুলি সাধারণত আপনার ব্যাকএন্ড সার্ভার থেকে ব্যবহৃত হয়।

উদাহরণস্বরূপ, তিনটি ভূমিকার প্রতিটির জন্য একটি পরিষেবা অ্যাকাউন্ট তৈরি করুন এবং তাদের নিজ নিজ ভূমিকা বরাদ্দ করুন৷

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

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

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

ড্রাইভার এবং কনজিউমার SDK এই স্ট্যান্ডার্ড ভূমিকাগুলির চারপাশে তৈরি করা হয়।

বিকল্পভাবে, কাস্টম রোল তৈরি করা সম্ভব যা অনুমতির একটি নির্বিচারে সেট একসাথে বান্ডিল করার অনুমতি দেয়। যখনই একটি প্রয়োজনীয় অনুমতি অনুপস্থিত থাকে তখনই ড্রাইভার এবং ভোক্তা SDK ত্রুটির বার্তাগুলি দেখাবে৷ ফলস্বরূপ, আমরা দৃঢ়ভাবে উপরে উপস্থাপিত ভূমিকাগুলির আদর্শ সেট ব্যবহার করার এবং কাস্টম ভূমিকাগুলি ব্যবহার না করার পরামর্শ দিই৷

সুবিধার জন্য, আপনার যদি অবিশ্বস্ত ক্লায়েন্টদের জন্য JWT টোকেন তৈরি করতে হয়, পরিষেবা অ্যাকাউন্ট টোকেন ক্রিয়েটর রোলে ব্যবহারকারীদের যোগ করার ফলে তারা gcloud কমান্ড লাইন টুলের সাহায্যে টোকেন তৈরি করতে দেয়।

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

যেখানে my-user@example.com হল gcloud ( gcloud auth list --format='value(account)' ) দিয়ে প্রমাণীকরণ করতে ব্যবহৃত ইমেল।

ফ্লিট ইঞ্জিন প্রমাণীকরণ লাইব্রেরি

ফ্লিট ইঞ্জিন ফ্লিট ইঞ্জিন API-এ অ্যাক্সেস সীমাবদ্ধ করতে JSON ওয়েব টোকেন (JWTs) ব্যবহার করে। Github-এ উপলব্ধ নতুন Fleet Engine Auth Library, Fleet Engine JWT-এর নির্মাণকে সহজ করে এবং নিরাপদে স্বাক্ষর করে।

লাইব্রেরি নিম্নলিখিত সুবিধা প্রদান করে:

  • ফ্লিট ইঞ্জিন টোকেন তৈরির প্রক্রিয়া সহজ করে।
  • শংসাপত্রের ফাইলগুলি ব্যবহার করা ছাড়া টোকেন স্বাক্ষর করার পদ্ধতি প্রদান করে (যেমন একটি পরিষেবা অ্যাকাউন্টের ছদ্মবেশীকরণ।)
  • একটি gRPC স্টাব বা GAPIC ক্লায়েন্ট থেকে করা আউটবাউন্ড অনুরোধে স্বাক্ষরিত টোকেন সংযুক্ত করে।

অনুমোদনের জন্য একটি JSON ওয়েব টোকেন (JWT) তৈরি করা

Fleet Engine Auth Library ব্যবহার না করার সময়, JSON ওয়েব টোকেন (JWTs) সরাসরি আপনার কোডবেসের মধ্যে তৈরি করতে হবে। এর জন্য আপনাকে JWTs এবং ফ্লিট ইঞ্জিনের সাথে কীভাবে সম্পর্কযুক্ত তা সম্পর্কে গভীর ধারণা থাকতে হবে। এই কারণেই আমরা ফ্লিট ইঞ্জিন প্রমাণীকরণ লাইব্রেরির সুবিধা নেওয়ার সুপারিশ করছি।

ফ্লিট ইঞ্জিনের মধ্যে, JSON ওয়েব টোকেন (JWTs) স্বল্প-কালীন প্রমাণীকরণ প্রদান করে এবং নিশ্চিত করে যে ডিভাইসগুলি শুধুমাত্র যানবাহন, ট্রিপ বা কাজগুলি পরিবর্তন করতে পারে যার জন্য তারা অনুমোদিত। JWT-এ একটি শিরোনাম এবং একটি দাবি বিভাগ থাকে। হেডার বিভাগে তথ্য রয়েছে যেমন ব্যবহার করার জন্য ব্যক্তিগত কী (পরিষেবা অ্যাকাউন্ট থেকে প্রাপ্ত) এবং এনক্রিপশন অ্যালগরিদম। দাবি বিভাগে তথ্য রয়েছে যেমন টোকেনের তৈরির সময়, টোকেন থাকার সময়, এটি যে পরিষেবাগুলিতে অ্যাক্সেস দাবি করছে এবং অ্যাক্সেস ডাউন অ্যাক্সেসের জন্য অন্যান্য অনুমোদনের তথ্য; উদাহরণস্বরূপ, গাড়ির আইডি।

একটি JWT হেডার বিভাগে নিম্নলিখিত ক্ষেত্র রয়েছে:

মাঠ বর্ণনা
alg ব্যবহার করার জন্য অ্যালগরিদম। `RS256`।
টাইপ টোকেনের ধরন। `JWT`।
বাচ্চা আপনার পরিষেবা অ্যাকাউন্টের ব্যক্তিগত কী আইডি। আপনি আপনার পরিষেবা অ্যাকাউন্ট JSON ফাইলের `private_key_id` ক্ষেত্রে এই মানটি খুঁজে পেতে পারেন। সঠিক স্তরের অনুমতি সহ একটি পরিষেবা অ্যাকাউন্ট থেকে একটি কী ব্যবহার করা নিশ্চিত করুন৷

একটি JWT দাবি বিভাগে নিম্নলিখিত ক্ষেত্র রয়েছে:

মাঠ বর্ণনা
iss আপনার পরিষেবা অ্যাকাউন্টের ইমেল ঠিকানা।
উপ আপনার পরিষেবা অ্যাকাউন্টের ইমেল ঠিকানা।
aud আপনার পরিষেবা অ্যাকাউন্টের SERVICE_NAME, এই ক্ষেত্রে https://fleetengine.googleapis.com/
iat টোকেন তৈরি করার সময় টাইমস্ট্যাম্প, 00:00:00 UTC, জানুয়ারী 1, 1970 থেকে অতিবাহিত সেকেন্ডের মধ্যে নির্দিষ্ট করা হয়েছে। স্কুয়ের জন্য 10 মিনিটের অনুমতি দিন। যদি টাইমস্ট্যাম্প অতীতে বা ভবিষ্যতে অনেক দূরে হয়, সার্ভার একটি ত্রুটি রিপোর্ট করতে পারে।
exp টোকেনের মেয়াদ শেষ হওয়ার সময় টাইমস্ট্যাম্প, 00:00:00 UTC, জানুয়ারী 1, 1970 থেকে অতিবাহিত সেকেন্ডের মধ্যে নির্দিষ্ট করা হয়। ভবিষ্যতে টাইমস্ট্যাম্প এক ঘণ্টার বেশি হলে অনুরোধ ব্যর্থ হয়।
অনুমোদন ব্যবহারের ক্ষেত্রের উপর নির্ভর করে, 'গাড়িবাহী' বা 'ট্রিপিড' থাকতে পারে।

একটি JWT টোকেন তৈরি করা মানে এটি স্বাক্ষর করা। JWT তৈরি এবং স্বাক্ষর করার জন্য নির্দেশাবলী এবং কোড নমুনার জন্য, OAuth ছাড়া পরিষেবা অ্যাকাউন্ট অনুমোদন দেখুন। তারপর আপনি gRPC কল বা ফ্লিট ইঞ্জিন অ্যাক্সেস করতে ব্যবহৃত অন্যান্য পদ্ধতিতে একটি স্বাক্ষরিত টোকেন সংযুক্ত করতে পারেন।

JWT দাবি

JWT পেলোড তৈরি করার সময়, যে গাড়ির আইডি বা ট্রিপ আইডির জন্য কল করা হচ্ছে তার মূল্যের সাথে কী vehicleid বা tripid সেট করে অনুমোদন বিভাগে একটি অতিরিক্ত দাবি যোগ করুন।

ড্রাইভার SDK সর্বদা vehicleid দাবি ব্যবহার করে, তা ভ্রমণে বা যানবাহনে পরিচালনা করা হোক না কেন। ফ্লিট ইঞ্জিন ব্যাকএন্ড নিশ্চিত করে যে পরিবর্তন করার আগে গাড়িটি অনুরোধ করা ট্রিপের সাথে যুক্ত।

ভোক্তা SDK সর্বদা tripid দাবি ব্যবহার করে।

রাইডশেয়ার বা ডেলিভারি প্রদানকারীর উচিত সমস্ত যানবাহন এবং ট্রিপের সাথে মেলানোর জন্য "*" সহ vehicleid বা tripid ব্যবহার করা। মনে রাখবেন যে JWT উভয় টোকেন ধারণ করতে পারে, এমনকি প্রয়োজন না হলেও, যা টোকেন স্বাক্ষর বাস্তবায়নকে সহজ করতে পারে।

JWT ব্যবহারের ক্ষেত্রে

নিম্নলিখিত প্রদানকারী সার্ভারের জন্য একটি উদাহরণ টোকেন দেখায়:

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

নিম্নলিখিত উপভোক্তা অ্যাপের জন্য একটি উদাহরণ টোকেন দেখায়:

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

নিম্নলিখিতটি ড্রাইভার অ্যাপের জন্য একটি উদাহরণ টোকেন দেখায়:

{
  "alg": "RS256",
  "typ": "JWT",
  "kid": "private_key_id_of_driver_service_account"
}
.
{
  "iss": "driver@yourgcpproject.iam.gserviceaccount.com",
  "sub": "driver@yourgcpproject.iam.gserviceaccount.com",
  "aud": "https://fleetengine.googleapis.com/",
  "iat": 1511900000,
  "exp": 1511903600,
  "authorization": {
     "vehicleid": "driver_12345"
   }
}
  • শিরোনামে kid ক্ষেত্রের জন্য, আপনার পরিষেবা অ্যাকাউন্টের ব্যক্তিগত কী আইডি নির্দিষ্ট করুন। আপনি আপনার পরিষেবা অ্যাকাউন্ট JSON ফাইলের private_key_id ক্ষেত্রে এই মানটি খুঁজে পেতে পারেন।
  • iss এবং sub ক্ষেত্রগুলির জন্য, আপনার পরিষেবা অ্যাকাউন্টের ইমেল ঠিকানা উল্লেখ করুন। আপনি আপনার পরিষেবা অ্যাকাউন্ট JSON ফাইলের client_email ক্ষেত্রে এই মানটি খুঁজে পেতে পারেন।
  • aud ফিল্ডের জন্য, https://SERVICE_NAME/ নির্দিষ্ট করুন।
  • iat ক্ষেত্রের জন্য, টোকেন তৈরি করার সময় টাইমস্ট্যাম্প ব্যবহার করুন, 00:00:00 UTC, জানুয়ারী 1, 1970 থেকে অতিবাহিত সেকেন্ড হিসাবে উল্লেখ করা হয়েছে। স্কুয়ের জন্য 10 মিনিটের অনুমতি দিন। যদি টাইমস্ট্যাম্প অতীতে বা ভবিষ্যতে অনেক দূরে হয়, সার্ভার একটি ত্রুটি রিপোর্ট করতে পারে।
  • exp ক্ষেত্রের জন্য, টোকেনের মেয়াদ শেষ হলে টাইমস্ট্যাম্প ব্যবহার করুন, 00:00:00 UTC, 1 জানুয়ারি, 1970 থেকে সেকেন্ড হিসাবে নির্দিষ্ট করা হয়েছে। সর্বাধিক অনুমোদিত মান হল iat + 3600।

একটি মোবাইল ডিভাইসে পাস করার জন্য JWT স্বাক্ষর করার সময়, ড্রাইভার বা গ্রাহক SDK ভূমিকার জন্য পরিষেবা অ্যাকাউন্টটি ব্যবহার করতে ভুলবেন না। অন্যথায়, মোবাইল ডিভাইসের অবস্থা পরিবর্তন করার ক্ষমতা থাকবে যা থাকা উচিত নয়।

একইভাবে, বিশেষ সুবিধাপ্রাপ্ত কলের জন্য ব্যবহার করার জন্য JWT-তে স্বাক্ষর করার সময়, সুপার ব্যবহারকারীর ভূমিকার সাথে পরিষেবা অ্যাকাউন্টটি ব্যবহার করা নিশ্চিত করুন। অন্যথায়, অপারেশন ব্যর্থ হবে।

পরীক্ষার জন্য একটি JWT তৈরি করা হচ্ছে

পরীক্ষার সময় টার্মিনাল থেকে টোকেন তৈরি করা সহায়ক হতে পারে।

এই পদক্ষেপগুলি অনুসরণ করার জন্য, আপনার ব্যবহারকারীর অ্যাকাউন্টে অবশ্যই পরিষেবা অ্যাকাউন্ট টোকেন নির্মাতার ভূমিকা থাকতে হবে:

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

নিচের বিষয়বস্তু সহ unsigned_token.json নামে একটি নতুন ফাইল তৈরি করুন। iat বৈশিষ্ট্য হল যুগের পর সেকেন্ডের সংখ্যার বর্তমান সময়, যা আপনার টার্মিনালে date +%s চালিয়ে পুনরুদ্ধার করা যেতে পারে। exp বৈশিষ্ট্য হল যুগের পর সেকেন্ডের সংখ্যায় মেয়াদ শেষ হওয়ার সময়, যা iat এ 3600 যোগ করে গণনা করা যেতে পারে। মেয়াদ শেষ হওয়ার সময় ভবিষ্যতে এক ঘণ্টার বেশি হতে পারে না।

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

তারপরে আপনার সুপার ব্যবহারকারী পরিষেবা অ্যাকাউন্টের পক্ষে টোকেন সাইন করতে নিম্নলিখিত gcloud কমান্ডটি চালান:

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

একটি স্বাক্ষরিত Base64-এনকোড করা JWT এখন signed_token.jwt ফাইলের মধ্যে সংরক্ষণ করা উচিত। টোকেন পরবর্তী ঘন্টার জন্য বৈধ।

আপনি এখন List Vehicles REST এন্ডপয়েন্টের বিরুদ্ধে একটি curl কমান্ড চালিয়ে টোকেন পরীক্ষা করতে পারেন:

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

যানবাহন এবং তাদের জীবনচক্র

যানবাহন হল একটি চালক-যান জুটির প্রতিনিধিত্বকারী সত্তা। বর্তমানে, একজন ড্রাইভার এবং যানবাহন আলাদাভাবে ট্র্যাক করা যায় না। রাইডশেয়ার বা ডেলিভারি প্রদানকারী একটি প্রোভাইডার আইডি ব্যবহার করে একটি যানবাহন তৈরি করে (যা Google ক্লাউড প্রজেক্টের প্রোজেক্ট আইডির মতো হতে হবে যাতে ফ্লিট ইঞ্জিন API কল করার জন্য ব্যবহৃত পরিষেবা অ্যাকাউন্ট থাকে) এবং একটি রাইডশেয়ার বা ডেলিভারি প্রদানকারীর মালিকানাধীন যানবাহন আইডি। .

সাত দিন পর UpdateVehicle এর মাধ্যমে আপডেট করা হয়নি এমন যানবাহন স্বয়ংক্রিয়ভাবে মুছে ফেলা হবে। এটি ইতিমধ্যেই বিদ্যমান একটি প্রোভাইডার আইডি/যানবাহন আইডি জোড়া দিয়ে CreateVehicle কল করা একটি ত্রুটি৷ ঘন ঘন আপডেট না হওয়া যানবাহনের ক্ষেত্রে দুটি উপায়ে মোকাবিলা করা যেতে পারে: একটি প্রত্যাশিত প্রোভাইডার আইডি/ভেহিক্যাল আইডি পেয়ারের সাথে CreateVehicle ঘন ঘন কল করা এবং গাড়িটি আগে থেকেই বিদ্যমান থাকলে ত্রুটিটি বাতিল করা; অথবা, একটি UpdateVehicle একটি NOT_FOUND ত্রুটির সাথে ফিরে আসার পরে CreateVehicle কল করা।

যানবাহনের অবস্থান আপডেট

ফ্লিট ইঞ্জিনের সাথে সেরা পারফরম্যান্সের জন্য, এটিকে গাড়ির অবস্থান আপডেটের একটি স্ট্রীম সরবরাহ করুন৷ এই আপডেটগুলি প্রদান করার জন্য নিম্নলিখিত উপায়গুলির মধ্যে একটি ব্যবহার করুন:

  1. ড্রাইভার SDK - Android , iOS - সহজ বিকল্পটি ব্যবহার করুন৷
  2. কাস্টম কোড ব্যবহার করুন -- যদি অবস্থানগুলি আপনার ব্যাকএন্ডের মাধ্যমে রিলে করা হয়, অথবা আপনি যদি Android বা iOS ছাড়া অন্য ডিভাইসগুলি ব্যবহার করেন তাহলে দরকারী৷

যানবাহনের প্রকার

যানবাহন সত্তাটিতে VehicleType এর একটি প্রয়োজনীয় ক্ষেত্র রয়েছে, যেটিতে একটি Category enum রয়েছে যা AUTO , TAXI , TRUCK , TWO_WHEELER , BICYCLE , বা PEDESTRIAN হিসাবে নির্দিষ্ট করা যেতে পারে। যানবাহনের ধরন SearchVehicles এবং ListVehicles একটি ফিল্টার মানদণ্ড হিসাবে কাজ করতে পারে৷

যদি বিভাগটি AUTO , TWO_WHEELER , BICYCLE , বা PEDESTRIAN সেট করা থাকে তবে যানবাহনের জন্য সমস্ত রাউটিং সংশ্লিষ্ট RouteTravelMode ব্যবহার করবে৷ যদি বিভাগটি TAXI বা TRUCK তে সেট করা হয়, রাউটিংটি AUTO মোডের মতোই বিবেচিত হয়৷

যানবাহনের বৈশিষ্ট্য

যানবাহন সত্তাটিতে VehicleAttribute এর পুনরাবৃত্ত ক্ষেত্র রয়েছে। এই বৈশিষ্ট্যগুলি ফ্লিট ইঞ্জিন দ্বারা ব্যাখ্যা করা হয় না। SearchVehicles API-তে একটি ক্ষেত্র অন্তর্ভুক্ত রয়েছে যাতে মিলিত Vehicles নির্দিষ্ট মান সেট করা সমস্ত অন্তর্ভুক্ত বৈশিষ্ট্য থাকতে হবে।

মনে রাখবেন যে অ্যাট্রিবিউট ক্ষেত্রটি Vehicle বার্তার অন্যান্য সমর্থিত ক্ষেত্রগুলির পাশাপাশি রয়েছে, যেমন vehicle_type এবং supported_trip_types

যানবাহন বাকি পথ পয়েন্ট

যানবাহন সত্তায় TripWaypoint ( RPC | REST ) ​​এর একটি পুনরাবৃত্ত ক্ষেত্র রয়েছে, যাকে বলা হয় waypoints ( RPC | REST )। এই ক্ষেত্রটি ভ্রমণের অবশিষ্ট ওয়েপয়েন্টগুলিকে অন্তর্ভুক্ত করে, যাতে গাড়িটি তাদের কাছে পৌঁছায়৷ ফ্লিট ইঞ্জিন এই ক্ষেত্রটি গণনা করে যেহেতু গাড়িতে ট্রিপগুলি বরাদ্দ করা হয় এবং ট্রিপগুলি তাদের অবস্থা পরিবর্তন করার সাথে সাথে এটি আপডেট করে৷ এই ওয়েপয়েন্টগুলি TripId ক্ষেত্র এবং WaypointType ক্ষেত্র দ্বারা চিহ্নিত করা যেতে পারে।

ম্যাচের জন্য গাড়ির যোগ্যতা প্রসারিত করা

সাধারণত, রাইডশেয়ার বা ডেলিভারি প্রদানকারীর পরিষেবাগুলি যানবাহনের সাথে ট্রিপের অনুরোধগুলি মেলানোর জন্য দায়ী৷ পরিষেবাটি গাড়ির বৈশিষ্ট্যগুলি ব্যবহার করে একটি বৃহত্তর সংখ্যক অনুসন্ধানে গাড়ি অন্তর্ভুক্ত করতে পারে। উদাহরণস্বরূপ, প্রদানকারী একটি গাড়ির দ্বারা প্রদত্ত সুবিধা বা ক্ষমতার স্তরের সাথে সম্পর্কিত বৈশিষ্ট্যগুলির একটি সেট প্রয়োগ করতে পারে৷ উদাহরণস্বরূপ, তিনটি স্তর বুলিয়ান মান সহ বৈশিষ্ট্যগুলির একটি সেট হতে পারে: is_bronze_level , is_silver_level , এবং is_gold_level । একটি গাড়ি তিনটির জন্যই যোগ্য হতে পারে। যখন ফ্লিট ইঞ্জিন একটি ট্রিপের জন্য অনুরোধ পায় যার জন্য সিলভার লেভেল ক্ষমতার প্রয়োজন হয়, অনুসন্ধানে সেই যানটি অন্তর্ভুক্ত থাকে। এইভাবে গুণাবলী ব্যবহার করা যানবাহনগুলিকে অন্তর্ভুক্ত করে যা বিভিন্ন ধরনের ক্ষমতা প্রদান করে।

গাড়ির বৈশিষ্ট্যগুলি আপডেট করার দুটি উপায় রয়েছে। একটি হল UpdateVehicle API। এই API ব্যবহার করার সময়, যানবাহন বৈশিষ্ট্যের সম্পূর্ণ সেট মান সেট করা হয়। শুধুমাত্র একটি বৈশিষ্ট্য আপডেট করা সম্ভব নয়। অন্য পদ্ধতিটি হল UpdateVehicleAttributes API। এই পদ্ধতিটি আপডেট করার জন্য কেবলমাত্র বৈশিষ্ট্যগুলি লাগে। অনুরোধে অন্তর্ভুক্ত বৈশিষ্ট্যগুলি নতুন মান সেট করা হবে বা যোগ করা হবে; অনির্দিষ্ট গুণাবলী পরিবর্তন করা হবে না.

কিভাবে করতে হবে: একটি যানবাহন তৈরি করুন

বহরে ট্র্যাক করা প্রতিটি যানের জন্য একটি Vehicle সত্তা তৈরি করতে হবে।

একটি যান তৈরি করতে CreateVehicleRequest এর সাথে CreateVehicle এন্ডপয়েন্ট ব্যবহার করুন।

Vehicle provider_id অবশ্যই Google ক্লাউড প্রজেক্টের প্রজেক্ট আইডি (যেমন আমার-অন-ডিমান্ড-প্রকল্প) হতে হবে যাতে পরিষেবা অ্যাকাউন্ট থাকে যা ফ্লিট ইঞ্জিনকে কল করার জন্য ব্যবহার করা হবে। মনে রাখবেন যে একাধিক পরিষেবা অ্যাকাউন্ট একই রাইডশেয়ার বা ডেলিভারি প্রদানকারীর জন্য ফ্লিট ইঞ্জিন অ্যাক্সেস করতে পারে, ফ্লিট ইঞ্জিন বর্তমানে একই Vehicles অ্যাক্সেস করার একাধিক Google ক্লাউড প্রকল্পের পরিষেবা অ্যাকাউন্টগুলিকে সমর্থন করে না৷

Vehicle OFFLINE বা ONLINE অবস্থায় তৈরি করা যেতে পারে। যদি ONLINE তৈরি করা হয় তবে SearchVehicles প্রশ্নের উত্তরে তা অবিলম্বে ফেরত দেওয়া হতে পারে।

CreateVehicle কলে একটি প্রাথমিক last_location অন্তর্ভুক্ত করা যেতে পারে। অনুমতি থাকা অবস্থায়, last_location ছাড়া ONLINE অবস্থায় একটি Vehicle তৈরি করা উচিত নয়।

যানবাহনের ধরন ক্ষেত্রের বিশদ বিবরণের জন্য যানবাহনের প্রকার দেখুন।

বৈশিষ্ট্য ক্ষেত্রের বিশদ বিবরণের জন্য যানবাহনের বৈশিষ্ট্যগুলি দেখুন৷

CreateVehicle থেকে প্রত্যাবর্তিত মানটি তৈরি করা Vehicle সত্তা।

উদাহরণ

শেল

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

providers.vehicles.create রেফারেন্স দেখুন।

জাভা

static final String PROJECT_ID = "project-id";

VehicleServiceBlockingStub vehicleService =
    VehicleService.newBlockingStub(channel);

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

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

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

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

Google ক্লাউড প্ল্যাটফর্ম যানবাহন তৈরির জন্য লগ

যখন CreateVehicle এন্ডপয়েন্টে একটি কল আসে তখন ফ্লিট ইঞ্জিন API Google ক্লাউড প্ল্যাটফর্ম লগের মাধ্যমে একটি লগ এন্ট্রি লিখে। লগ এন্ট্রিতে CreateVehicle অনুরোধের মান সম্পর্কে তথ্য অন্তর্ভুক্ত থাকে। কলটি সফল হলে, এতে ফেরত আসা Vehicle তথ্যও অন্তর্ভুক্ত থাকবে।

শেল

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

নিম্নলিখিত অনুরূপ একটি রেকর্ড মুদ্রণ করা উচিত:

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

যানবাহন তৈরির জন্য ক্লাউড পাব/সাব বিজ্ঞপ্তি

ফ্লিট ইঞ্জিন API ক্লাউড পাব/সাবের মাধ্যমে একটি বিজ্ঞপ্তি প্রকাশ করে যখন একটি নতুন গাড়ি তৈরি হয়। এই বিজ্ঞপ্তিগুলি পেতে, অনুগ্রহ করে এখানে নির্দেশাবলী অনুসরণ করুন।

কিভাবে করতে হবে: একটি যানবাহনের অবস্থান আপডেট করুন

গাড়ির অবস্থান আপডেট করার জন্য ড্রাইভার SDK ব্যবহার না করলে, আপনি গাড়ির অবস্থান সহ ফ্লিট ইঞ্জিনে সরাসরি কল করতে পারেন। যেকোনো সক্রিয় গাড়ির জন্য, ফ্লিট ইঞ্জিন প্রতি মিনিটে অন্তত একবার এবং প্রতি 5 সেকেন্ডে সর্বোচ্চ একবার একটি অবস্থান আপডেট আশা করে। এই আপডেটগুলির জন্য শুধুমাত্র ফ্লিট ইঞ্জিন ড্রাইভার SDK ব্যবহারকারীর বিশেষাধিকার প্রয়োজন৷

উদাহরণ

শেল

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

providers.vehicles.update রেফারেন্স দেখুন।

জাভা

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

VehicleServiceBlockingStub vehicleService = VehicleService.newBlockingStub(channel);

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

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

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

কিভাবে: অন্যান্য যানবাহনের ক্ষেত্র আপডেট করুন

যানবাহনের অবস্থার অন্যান্য বৈশিষ্ট্যের আপডেটগুলি অবস্থান আপডেটের তুলনায় কম ঘন ঘন ঘটে। last_location ব্যতীত অন্যান্য বৈশিষ্ট্যের আপডেটের জন্য Fleet Engine Super User-এর বিশেষাধিকার প্রয়োজন।

UpdateVehicleRequest কোন ক্ষেত্রগুলিকে আপডেট করতে হবে তা নির্দেশ করার জন্য একটি update_mask অন্তর্ভুক্ত রয়েছে। ক্ষেত্রের আচরণ ফিল্ড মাস্কগুলির জন্য প্রোটোবাফ ডকুমেন্টেশনের মতো।

যানবাহন বৈশিষ্ট্যগুলিতে উল্লিখিত হিসাবে, attributes ক্ষেত্রটি আপডেট করার জন্য সমস্ত বৈশিষ্ট্যগুলি সংরক্ষণ করা প্রয়োজন। একটি UpdateVehicle কলে শুধুমাত্র একটি কী-মানের জোড়ার মান আপডেট করা সম্ভব নয়। নির্দিষ্ট বৈশিষ্ট্যের মান আপডেট করতে, UpdateVehicleAttributes API ব্যবহার করা যেতে পারে।

উদাহরণ

এই উদাহরণ back_to_back সক্ষম করে।

শেল

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

providers.vehicles.update রেফারেন্স দেখুন।

জাভা

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

VehicleServiceBlockingStub vehicleService = VehicleService.newBlockingStub(channel);

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

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

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

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

Google ক্লাউড প্ল্যাটফর্ম যানবাহন আপডেটের জন্য লগ করে

যখন UpdateVehicle এন্ডপয়েন্টে একটি কল আসে তখন Fleet Engine API Google ক্লাউড প্ল্যাটফর্ম লগের মাধ্যমে একটি লগ এন্ট্রি লিখে। লগ এন্ট্রিতে UpdateVehicle অনুরোধের মান সম্পর্কে তথ্য অন্তর্ভুক্ত থাকে। কলটি সফল হলে, এতে ফেরত আসা Vehicle তথ্যও অন্তর্ভুক্ত থাকবে।

শেল

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

যানবাহন আপডেটের জন্য ক্লাউড পাব/সাব বিজ্ঞপ্তি

ফ্লিট ইঞ্জিন API ক্লাউড পাব/সাবের মাধ্যমে একটি বিজ্ঞপ্তি প্রকাশ করে যখন একটি বিদ্যমান গাড়ি আপডেট করা হয়। এই বিজ্ঞপ্তিগুলি পেতে, অনুগ্রহ করে এখানে নির্দেশাবলী অনুসরণ করুন।

কিভাবে: যানবাহন অনুসন্ধান করুন

ফ্লিট ইঞ্জিন যানবাহন অনুসন্ধান সমর্থন করে। SearchVehicles API আপনাকে উপলব্ধ আশেপাশের ড্রাইভারদের খুঁজে পেতে দেয় যারা রাইড সার্ভিসিং বা ডেলিভারির অনুরোধের মতো একটি কাজের জন্য সবচেয়ে উপযুক্ত। SearchVehicles API আপনার বহরে থাকা যানবাহনের বৈশিষ্ট্যগুলির সাথে টাস্ক অ্যাট্রিবিউটের সাথে মিলে যাওয়া ড্রাইভারগুলির একটি র‌্যাঙ্ক করা তালিকা প্রদান করে৷ আরও তথ্যের জন্য, কাছাকাছি ড্রাইভার খোঁজা দেখুন।

উদাহরণ

উপলব্ধ যানবাহন অনুসন্ধান করার সময়, ফ্লিট ইঞ্জিন ডিফল্টরূপে সক্রিয় ট্রিপে যানবাহনগুলিকে বাদ দেয়। রাইডশেয়ার বা ডেলিভারি প্রদানকারীর পরিষেবাগুলিকে তাদের অনুসন্ধানের অনুরোধে স্পষ্টভাবে অন্তর্ভুক্ত করতে হবে। গ্র্যান্ড ইন্দোনেশিয়া ইস্ট মল থেকে বালাই সিডাং জাকার্তা কনভেনশন সেন্টারে ভ্রমণের সাথে মিলে যাওয়া যানবাহনগুলির অনুসন্ধানে কীভাবে সেই যানগুলিকে অন্তর্ভুক্ত করতে হয় তা নিম্নলিখিত উদাহরণটি দেখায়৷

শেল

প্রথমে আমরা পূর্বের ধাপে তৈরি গাড়ির অবস্থান আপডেট করুন যাতে এটি যোগ্য হয়। বাস্তব জগতে, এটি গাড়ির একটি Android বা iOS ডিভাইসে চালিত ড্রাইভার SDK দ্বারা করা হবে৷

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

অনুসন্ধান সঞ্চালন অন্তত যে যানবাহন ফলন করা উচিত.

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

providers.vehicles.search রেফারেন্স দেখুন।

জাভা

static final String PROJECT_ID = "project-id";

VehicleServiceBlockingStub vehicleService = VehicleService.newBlockingStub(channel);

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

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

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

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

যানবাহন ফিল্টারিং প্রশ্ন

SearchVehicles এবং ListVehicles ফিল্টার ক্যোয়ারী ব্যবহার করে যানবাহনের বৈশিষ্ট্যগুলিতে ফিল্টারিং সমর্থন করে। ফিল্টার ক্যোয়ারী সিনট্যাক্সের জন্য, উদাহরণের জন্য AIP-160 দেখুন।

নোট করুন যে ফিল্টার প্রশ্নগুলি শুধুমাত্র গাড়ির বৈশিষ্ট্যগুলিতে ফিল্টারিং সমর্থন করে এবং অন্যান্য ক্ষেত্রের জন্য ব্যবহার করা যাবে না। ফিল্টার ক্যোয়ারী অন্যান্য সীমাবদ্ধতার সাথে একটি AND ক্লজ হিসাবে কাজ করে, যেমন SearchVehiclesRequestminimum_capacity বা vehicle_types

কিভাবে: তালিকা যানবাহন

SearchVehicles খুব দ্রুত র‌্যাঙ্ক করা ক্রমে অল্প সংখ্যক যানবাহন খুঁজে পাওয়ার জন্য অপ্টিমাইজ করা হয়েছে এবং প্রধানত কোনও কাজের জন্য সবচেয়ে উপযুক্ত আশেপাশের ড্রাইভারদের খুঁজে পেতে ব্যবহৃত হয়। যাইহোক, কখনও কখনও আপনি এমন সমস্ত যানবাহন খুঁজে পেতে চান যা কিছু মানদণ্ড পূরণ করে এমনকি যদি ফলাফলের মাধ্যমে পেজিং করা প্রয়োজন হয়। ListVehicles যে ব্যবহারের ক্ষেত্রে ডিজাইন করা হয়েছে.

ListVehicles API আপনাকে কিছু নির্দিষ্ট অনুরোধের বিকল্পগুলিকে সন্তুষ্ট করে এমন সমস্ত যানবাহন খুঁজে পেতে দেয়। ListVehicles API প্রকল্পে যানবাহনের একটি পৃষ্ঠাযুক্ত তালিকা প্রদান করে যা কিছু প্রয়োজনীয়তার সাথে মেলে।

যানবাহনের বৈশিষ্ট্যগুলিতে ফিল্টার করতে, অনুগ্রহ করে যানবাহন ফিল্টারিং ক্যোয়ারী পড়ুন।

উদাহরণ

এই উদাহরণ filter স্ট্রিং ব্যবহার করে vehicle_type এবং বৈশিষ্ট্যগুলিতে ফিল্টারিং সঞ্চালন করে।

শেল

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

providers.vehicles.list রেফারেন্স দেখুন।

জাভা

static final String PROJECT_ID = "project-id";

VehicleServiceBlockingStub vehicleService = VehicleService.newBlockingStub(channel);

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

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

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

ভ্রমণ এবং তাদের জীবনচক্র

ট্রিপ API এবং জীবনচক্র যানবাহন API এবং জীবনচক্রের অনুরূপ। রাইডশেয়ার প্রদানকারী ফ্লিট ইঞ্জিন ইন্টারফেস ব্যবহার করে ট্রিপ তৈরি করার জন্য দায়ী। ফ্লিট ইঞ্জিন একটি RPC পরিষেবা, TripService এবং REST সংস্থান প্রদান করে, provider.trips । এই ইন্টারফেসগুলি ট্রিপ সত্তা তৈরি, তথ্য অনুরোধ, অনুসন্ধান কার্যকারিতা এবং আপডেট করার ক্ষমতা সক্ষম করে।

একটি Trip জীবনচক্রের মাধ্যমে তার অগ্রগতি ট্র্যাক করার জন্য একটি স্থিতি ক্ষেত্র রয়েছে। মানগুলি NEW থেকে COMPLETE প্লাস CANCELED এবং UNKNOWN_TRIP_STATUS চলে যায়৷ RPC এর জন্য trip_status বা REST এর জন্য TripStatus পড়ুন।

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

আপনার পরিষেবা এই স্ট্যাটাসগুলির যেকোনো একটি থেকে CANCELED ট্রিপ আপডেট করতে পারে। যখন আপনার পরিষেবা একটি ট্রিপ তৈরি করে, তখন ইঞ্জিনটি NEW হিসাবে স্থিতি সেট করে। একটি vehicle_id ঐচ্ছিক। যানবাহনের মতো, পরিষেবাগুলি আপডেট ছাড়াই সাত দিন পরে স্বয়ংক্রিয়ভাবে ট্রিপগুলি মুছে দেয়৷ আপনার পরিষেবা যদি আগে থেকেই বিদ্যমান আইডি দিয়ে একটি ট্রিপ তৈরি করার চেষ্টা করে, তাহলে একটি ত্রুটি ফেরত দেওয়া হয়। একটি ট্রিপ 'সক্রিয়' বলে বিবেচিত হয় যদি এটি COMPLETE বা CANCELED ছাড়া অন্য কোনো অবস্থায় থাকে। যানবাহন সত্তা এবং SearchTripsRequest active_trips ক্ষেত্রে এই পার্থক্যটি গুরুত্বপূর্ণ।

পরিষেবাটি শুধুমাত্র ট্রিপে বরাদ্দ করা vehicle_id পরিবর্তন করতে পারে যখন স্ট্যাটাসটি NEW বা CANCELED হয়। পথ চলাকালীন কোনো ড্রাইভার যদি কোনো ট্রিপ বাতিল করে, তাহলে vehicle_id পরিবর্তন বা সাফ করার আগে ট্রিপ স্ট্যাটাসটি অবশ্যই NEW বা CANCELED করতে হবে।

ব্যাক-টু-ব্যাক ট্রিপ সমর্থন বাস্তবায়ন করার সময় স্ট্যাটাস গুরুত্বপূর্ণ। এই সমর্থনটি প্রদানকারীকে একটি যানবাহনে একটি নতুন ট্রিপ বরাদ্দ করতে সক্ষম করে যখন সেই যানটি একটি সক্রিয় ট্রিপে থাকে। ব্যাক-টু-ব্যাক ট্রিপ তৈরির কোডটি একক ট্রিপের মতোই এবং একই গাড়ির আইডি ব্যবহার করে। ফ্লিট ইঞ্জিন গাড়ির ওয়েপয়েন্টগুলিতে নতুন ভ্রমণের উত্স এবং গন্তব্য যোগ করে। ব্যাক-টু-ব্যাক ট্রিপ সম্পর্কে আরও তথ্যের জন্য, মাল্টি-ওয়েপয়েন্ট ট্রিপ তৈরি করুন দেখুন।

ট্রিপ বাকি পথপয়েন্ট

ট্রিপ এন্টিটিতে TripWaypoint ( RPC | REST ) ​​এর একটি পুনরাবৃত্ত ক্ষেত্র রয়েছে, যাকে বলা হয় remainingWaypoints ( RPC | REST )। এই ক্ষেত্রটিতে সমস্ত ওয়েপয়েন্ট অন্তর্ভুক্ত রয়েছে যা এই ট্রিপের চূড়ান্ত ড্রপ অফ পয়েন্টের আগে গাড়িটিকে ক্রমানুসারে ভ্রমণ করতে হবে। এটি যানবাহনের অবশিষ্ট ওয়েপয়েন্ট থেকে গণনা করে। ব্যাক-টু-ব্যাক এবং কারপুল ব্যবহারের ক্ষেত্রে, এই তালিকায় অন্যান্য ট্রিপের ওয়েপয়েন্ট রয়েছে যা এই ট্রিপের আগে অতিক্রম করা হবে, কিন্তু এই ট্রিপের পরে যেকোনও ওয়েপয়েন্ট বাদ দেওয়া হয়। তালিকার ওয়েপয়েন্টটি এর TripId এবং WaypointType দ্বারা চিহ্নিত করা যেতে পারে।

ট্রিপ স্ট্যাটাস এবং যানবাহন অবশিষ্ট ওয়েপয়েন্টের মধ্যে সম্পর্ক

যখন ফ্লিট ইঞ্জিন ট্রিপ স্ট্যাটাস পরিবর্তনের অনুরোধ পাবে তখন গাড়ির অবশিষ্ট ওয়েপয়েন্ট ( RPC | REST ) ​​আপডেট করা হবে। tripStatus ( RPC | REST ) অন্য স্ট্যাটাস থেকে ENROUTE_TO_XXX এ পরিবর্তিত হলে গাড়ির অবশিষ্ট ওয়েপয়েন্ট তালিকা থেকে আগের ওয়েপয়েন্টটি সরিয়ে দেওয়া হবে। অর্থাৎ, যখন ট্রিপ স্ট্যাটাস ENROUTE_TO_PICKUP থেকে ARRIVED_AT_PICKUP এ পরিবর্তিত হয়, তখনও ট্রিপের পিকআপ পয়েন্টটি যানবাহনের অবশিষ্ট ওয়েপয়েন্ট তালিকায় থাকবে, কিন্তু যখন ট্রিপ স্ট্যাটাসকে ENROUTE_TO_INTERMEDIATE_DESTINATION বা ENROUTE_TO_DROPFF থেকে সরিয়ে দেওয়া হয়, তখন গাড়ির পিকআপ পয়েন্ট রয়ে যাবে।

এটি ARRIVED_AT_INTERMEDIATE_DESTINATION এবং ENROUTE_TO_INTERMDEDIATE_DESTINATION-এর জন্য একই। যখন ARRIVED_AT_INTERMEDIATE_DESTINATION, তখন গাড়ির অবশিষ্ট ওয়েপয়েন্ট তালিকা থেকে বর্তমান মধ্যবর্তী গন্তব্যটি সরানো হবে না যতক্ষণ না গাড়িটি পরবর্তী ওয়েপয়েন্টে যাওয়ার কথা জানায়।

যখন ট্রিপ স্ট্যাটাস COMPLETED এ পরিবর্তিত হয়, তখন এই ট্রিপের কোনো ওয়েপয়েন্ট গাড়ির অবশিষ্ট ওয়েপয়েন্ট তালিকায় থাকবে না।

কিভাবে করবেন: একটি ট্রিপ তৈরি করুন

প্রতিটি ট্রিপের অনুরোধ ট্র্যাক করা এবং বহরের যানবাহনের সাথে মিলে যাওয়ার জন্য একটি Trip সত্তা তৈরি করতে হবে। একটি ট্রিপ তৈরি করতে CreateTripRequest সহ CreateTrip এন্ডপয়েন্ট ব্যবহার করুন।

একটি ট্রিপ তৈরি করতে নিম্নলিখিত বৈশিষ্ট্যগুলি প্রয়োজন:

  • parent - একটি স্ট্রিং যা Google ক্লাউড প্রকল্প তৈরি করার সময় তৈরি করা প্রদানকারী আইডি অন্তর্ভুক্ত করে৷
  • trip_id - রাইডশেয়ার প্রদানকারী দ্বারা তৈরি একটি স্ট্রিং।
  • trip - ট্রিপ বর্ণনা করে বেসিক মেটাডেটা সহ ধারক।
    • trip_type - এনাম প্রতিনিধিত্ব করে যে ট্রিপে একই গাড়িতে ভিন্ন উৎস এবং গন্তব্যের অন্য রাইডার থাকতে পারে ( SHARED ) বা শুধুমাত্র একক পক্ষ ( EXCLUSIVE )।
    • pickup_point - টার্মিনাল অবস্থান যা ভ্রমণের মূল বিন্দুকে প্রতিনিধিত্ব করে। RPC রেফারেন্স বা REST রেফারেন্স দেখুন

যখন আপনি একটি ট্রিপ তৈরি করেন, আপনি number_of_passengers , dropoff_point এবং vehicle_id প্রদান করতে পারেন। যদিও এই ক্ষেত্রগুলির প্রয়োজন নেই, আপনি যদি সেগুলি প্রদান করেন তবে সেগুলি ধরে রাখা হয়৷ অন্য সব ট্রিপ ক্ষেত্র উপেক্ষা করা হয়. উদাহরণ স্বরূপ, সমস্ত ট্রিপ NEW trip_status দিয়ে শুরু হয় এমনকি আপনি যদি তৈরির অনুরোধে CANCELED trip_status পাস করেন।

উদাহরণ

নিম্নলিখিত উদাহরণ গ্র্যান্ড ইন্দোনেশিয়া ইস্ট মলে একটি ট্রিপ তৈরি করে। ট্রিপ দুই যাত্রীর জন্য এবং একচেটিয়া। Trip provider_id অবশ্যই প্রজেক্ট আইডির মতোই হতে হবে। উদাহরণে, রাইডশেয়ার প্রদানকারী গুগল ক্লাউড প্রজেক্ট, project-id তৈরি করেছে। এই প্রকল্পে ফ্লিট ইঞ্জিন কল করার জন্য ব্যবহৃত পরিষেবা অ্যাকাউন্ট থাকতে হবে। ট্রিপের অবস্থা NEW

পরে, পরিষেবাটি একটি গাড়িতে ভ্রমণের সাথে মিলে যাওয়ার পরে, পরিষেবাটি UpdateTrip কল করতে পারে এবং গাড়ির জন্য ট্রিপ বরাদ্দ করা হলে vehicle_id পরিবর্তন করতে পারে৷

শেল

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

providers.trips.create রেফারেন্স দেখুন।

জাভা

static final String PROJECT_ID = "project-id";

TripServiceBlockingStub tripService = TripService.newBlockingStub(channel);

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

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

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

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

Google ক্লাউড প্ল্যাটফর্ম ট্রিপ তৈরির জন্য লগ করে

যখন CreateTrip এন্ডপয়েন্টে একটি কল আসে তখন ফ্লিট ইঞ্জিন API Google ক্লাউড প্ল্যাটফর্ম লগ ব্যবহার করে একটি লগ এন্ট্রি লিখে। লগ এন্ট্রিতে CreateTrip অনুরোধের মান সম্পর্কে তথ্য অন্তর্ভুক্ত থাকে। কলটি সফল হলে, এতে ফেরত আসা Trip তথ্যও অন্তর্ভুক্ত থাকবে।

কিভাবে করবেন: একটি ট্রিপ আপডেট করুন

ট্রিপ সত্তায় এমন ক্ষেত্র রয়েছে যা পরিষেবা দ্বারা ট্র্যাকিং সক্ষম করে এবং ড্রাইভার SDK এবং গ্রাহক SDK-এর দ্বারা ট্রিপের অগ্রগতি রিপোর্ট করার জন্য। বৈশিষ্ট্য আপডেট করতে, UpdateTripRequest বার্তা ব্যবহার করুন। এটি অনুরোধের field_mask অনুযায়ী ট্রিপ ক্ষেত্র আপডেট করে। UpdateTripRequest পড়ুন।

রাইডশেয়ার প্রদানকারী নিম্নলিখিত বৈশিষ্ট্যগুলি আপডেট করার জন্য দায়ী:

  • ট্রিপ স্ট্যাটাস।
  • যানবাহন আইডি। হয় সৃষ্টির সময়, নয়তো গাড়ির সাথে মিলে যাওয়ার পর।
  • পিকআপ, ড্রপঅফ বা ওয়েপয়েন্টে পরিবর্তন।

ড্রাইভার SDK বা Consumer SDK-এর মাধ্যমে জার্নি শেয়ারিং বৈশিষ্ট্য ব্যবহার করার সময় ফ্লিট ইঞ্জিন স্বয়ংক্রিয়ভাবে নিম্নলিখিত ক্ষেত্রগুলি আপডেট করে:

  • রুট
  • ETA
  • বাকি দূরত্ব
  • গাড়ির অবস্থান
  • বাকি পথপয়েন্ট

RPC-এ Trip অথবা REST-এ Resource.Trip পড়ুন।

Google ক্লাউড প্ল্যাটফর্ম ট্রিপ আপডেটের জন্য লগ করে

যখন UpdateTrip এন্ডপয়েন্টে একটি কল আসে তখন Fleet Engine API Google ক্লাউড প্ল্যাটফর্ম লগ ব্যবহার করে একটি লগ এন্ট্রি লিখে। লগ এন্ট্রিতে UpdateTrip অনুরোধের মান সম্পর্কে তথ্য অন্তর্ভুক্ত থাকে। কলটি সফল হলে, এতে ফেরত আসা Trip তথ্যও অন্তর্ভুক্ত থাকবে।

কিভাবে করতে হবে: অনুসন্ধান ট্রিপ

ফ্লিট ইঞ্জিন ভ্রমণের জন্য অনুসন্ধান সমর্থন করে। পূর্বে উল্লেখ করা হয়েছে, সাত দিন পর একটি ট্রিপ স্বয়ংক্রিয়ভাবে মুছে ফেলা হয়, তাই SearchTrips সমস্ত ট্রিপের সম্পূর্ণ ইতিহাস প্রকাশ করে না।

যদিও SearchTrips একটি নমনীয় API, নীচের তালিকাটি দুটি ব্যবহারের ক্ষেত্রে বিবেচনা করে।

  • একটি যানবাহনের সক্রিয় ট্রিপ নির্ধারণ - প্রদানকারী একটি যানবাহনের বর্তমানে সক্রিয় ট্রিপ নির্ধারণ করতে পারে। SearchTripsRequest এর মধ্যে, vehicle_id বিবেচনাধীন গাড়িতে সেট করা আছে এবং active_trips_only true সেট করা উচিত।

  • প্রদানকারী এবং ফ্লিট ইঞ্জিনের অবস্থার সমন্বয় করা -- প্রদানকারী তাদের ট্রিপ অবস্থা এবং ফ্লিট ইঞ্জিনের মিল নিশ্চিত করতে SearchTrips ব্যবহার করতে পারে। এটি TripStatus এর জন্য বিশেষভাবে গুরুত্বপূর্ণ। যদি একটি যানবাহনের জন্য নির্ধারিত ট্রিপের অবস্থা সঠিকভাবে COMPLETE বা CANCELED না করা হয়, তাহলে যানটি SearchVehicles দ্বারা অন্তর্ভুক্ত করা হয় না।

এইভাবে SearchTrips ব্যবহার করতে, vehicle_id খালি ছেড়ে দিন, active_trips_only true সেট করুন এবং minimum_staleness বেশিরভাগ ট্রিপের সময়কালের চেয়ে বেশি সময়ে সেট করুন। উদাহরণস্বরূপ, আপনি এক ঘন্টা ব্যবহার করতে পারেন। ফলাফলের মধ্যে এমন ট্রিপগুলি অন্তর্ভুক্ত রয়েছে যা সম্পূর্ণ নয় বা বাতিল করা হয়নি এবং এক ঘণ্টার মধ্যে আপডেট করা হয়নি৷ ফ্লিট ইঞ্জিনে তাদের স্থিতি সঠিকভাবে আপডেট করা হয়েছে তা নিশ্চিত করতে প্রদানকারীর এই ট্রিপগুলি পরীক্ষা করা উচিত।

সমস্যা সমাধান

একটি DEADLINE_EXCEEDED ত্রুটির ক্ষেত্রে, ফ্লিট ইঞ্জিনের অবস্থা অজানা। প্রদানকারীর আবার CreateTrip কল করা উচিত, যা হয় একটি 201 (তৈরি করা) বা 409 (সংঘর্ষ) প্রদান করে। পরবর্তী ক্ষেত্রে, পূর্ববর্তী অনুরোধটি DEADLINE_EXCEEDED এর আগে সফল হয়েছিল। ট্রিপ ত্রুটিগুলি পরিচালনার বিষয়ে আরও তথ্যের জন্য উপভোক্তা API নির্দেশিকা দেখুন: Android বা iOS

কারপুল রাইড সমর্থন

আপনি TripType.SHARED সমর্থন করে এমন একটি গাড়িতে একাধিক SHARED ট্রিপ বরাদ্দ করতে পারেন। আপনি যখন একটি শেয়ার্ড ট্রিপের জন্য (একটি CreateTrip বা UpdateTrip অনুরোধে) vehicle_id বরাদ্দ করেন তখন আপনাকে Trip.vehicle_waypoints এর মাধ্যমে এই শেয়ার্ড রাইডে যানবাহনের জন্য নির্ধারিত সমস্ত ট্রিপের জন্য সমস্ত আনপাসড ওয়েপয়েন্টের ক্রম উল্লেখ করতে হবে। RPC-এর জন্য vehicle_waypoints অথবা REST-এর জন্য vehicleWaypoints পড়ুন।

একাধিক গন্তব্য সমর্থন

একটি মধ্যবর্তী গন্তব্য চিহ্নিত করুন

ফিল্ড intermediateDestinations এবং ফিল্ড intermediateDestinationIndex ইন ট্রিপ ( RPC | REST ) গন্তব্য নির্দেশ করতে ব্যবহার করা হয়।

মধ্যবর্তী গন্তব্য আপডেট করুন

আপনি UpdateTrip এর মাধ্যমে মধ্যবর্তী গন্তব্যগুলি আপডেট করতে পারেন। মধ্যবর্তী গন্তব্যগুলি আপডেট করার সময়, আপনাকে অবশ্যই মধ্যবর্তী গন্তব্যগুলির একটি সম্পূর্ণ তালিকা প্রদান করতে হবে, যেগুলি পরিদর্শন করা হয়েছে, শুধুমাত্র নতুন যোগ করা বা পরিবর্তিত হতে হবে এমন নয়৷ যখন intermediateDestinationIndex নতুন যুক্ত/পরিবর্তিত মধ্যবর্তী গন্তব্যের অবস্থানের পরে একটি সূচকের দিকে নির্দেশ করে, তখন নতুন/আপডেট করা মধ্যবর্তী গন্তব্যটি যানবাহনের waypoints বা ট্রিপের remainingWaypoints যোগ করা হবে না। কারণ হল intermediateDestinationIndex পূর্ববর্তী যেকোনো মধ্যবর্তী গন্তব্যকে ইতিমধ্যেই পরিদর্শন করা হয়েছে বলে ধরা হয়।

ট্রিপ স্ট্যাটাস পরিবর্তন

একটি মধ্যবর্তী গন্তব্য পাস হয়েছে নির্দেশ করতে ফ্লিট ইঞ্জিনে পাঠানো ট্রিপ স্ট্যাটাস আপডেটের অনুরোধে ( RPC | REST ) ফিল্ড intermediateDestinationsVersion প্রয়োজন। টার্গেট করা মধ্যবর্তী গন্তব্যটি ক্ষেত্র intermediateDestinationIndex মাধ্যমে নির্দিষ্ট করা হয়। যখন tripStatus ( RPC | REST ) ENROUTE_TO_INTERMEDIATE_DESTINATION হয়, তখন [0..N-1] এর মধ্যে একটি সংখ্যা নির্দেশ করে যে গাড়িটি পরবর্তী কোন মধ্যবর্তী গন্তব্যটি অতিক্রম করবে৷ tripStatus যখন আগত_এটি_ইন্টারমিডিয়েট_ডেস্টিনেশন হয়, তখন [0..N-1] এর মধ্যে একটি সংখ্যা নির্দেশ করে যে যানবাহনটি কোন মধ্যবর্তী গন্তব্যে রয়েছে।

উদাহরণ

নিম্নলিখিত কোড উদাহরণটি দেখায় যে কীভাবে কোনও ট্রিপের স্থিতি তার প্রথম মধ্যবর্তী গন্তব্যে উত্সাহিত করার জন্য আপডেট করবেন, ধরে নিই যে আপনি একটি মাল্টি-ডেস্টিনেশন ট্রিপ তৈরি করেছেন এবং ট্রিপটি তার পিকআপ পয়েন্টটি পেরিয়ে গেছে।

জাভা

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

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

TripServiceBlockingStub tripService = TripService.newBlockingStub(channel);

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

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

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

কীভাবে: ফ্লিট ইঞ্জিন এপিআই থেকে বিজ্ঞপ্তি বার্তাগুলিতে সাবস্ক্রাইব করুন

ফ্লিট ইঞ্জিন এপিআই গ্রাহক গুগল ক্লাউড প্রকল্প দ্বারা নির্মিত বিষয়টিতে বিজ্ঞপ্তিগুলি প্রকাশ করতে গুগল ক্লাউড পাব/সাব ব্যবহার করে। আপনার গুগল ক্লাউড প্রকল্পে ফ্লিট ইঞ্জিনের জন্য ডিফল্টরূপে পাব/সাব সক্ষম করা নেই। দয়া করে একটি সমর্থন কেস ফাইল করুন বা পাব/সাব সক্ষম করতে আপনার গ্রাহক ইঞ্জিনিয়ারের সাথে যোগাযোগ করুন।

আপনার ক্লাউড প্রকল্পে একটি বিষয় তৈরি করতে, এই নির্দেশাবলী অনুসরণ করুন। টপিক আইডি অবশ্যই 'ফ্লিট_জাইন_নোটাইফিকেশনস' হতে হবে।

বিষয়টি একই ক্লাউড প্রকল্পে তৈরি করতে হবে যা ফ্লিট ইঞ্জিন এপিআইকে কল করছে।

বিষয়টি তৈরি হয়ে গেলে, আপনাকে এই বিষয়টিতে প্রকাশের জন্য ফ্লিট ইঞ্জিন এপিআই অনুমতি দিতে হবে। এটি করার জন্য, আপনি সবেমাত্র তৈরি করা বিষয়টিতে ক্লিক করুন এবং একটি নতুন অনুমতি যুক্ত করুন। অনুমতি সম্পাদকটি খুলতে আপনাকে শো তথ্য প্যানেলে ক্লিক করতে হতে পারে। প্রিন্সিপালটি geo-fleet-engine@system.gserviceaccount.com হতে হবে এবং ভূমিকাটি Pub/Sub publisher হওয়া উচিত।

বিজ্ঞপ্তিগুলিতে সাবস্ক্রাইব করতে আপনার ক্লাউড প্রকল্পটি সেটআপ করার জন্য, এই নির্দেশাবলী অনুসরণ করুন

ফ্লিট ইঞ্জিন এপিআই প্রতিটি প্রজ্ঞাপন দুটি পৃথক ডেটা ফর্ম্যাট, protobuf এবং json প্রকাশ করবে। প্রতিটি বিজ্ঞপ্তির জন্য ডেটা ফর্ম্যাটটি Pubsubmessage বৈশিষ্ট্যগুলিতে data_format হিসাবে কী এবং protobuf বা json হিসাবে মান হিসাবে চিহ্নিত করা হয়।

বিজ্ঞপ্তি স্কিমা:

প্রোটোবাফ

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

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

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

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

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

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

JSON

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

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

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

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

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

ফ্লিট ইঞ্জিন অন-ডিমান্ডে চড়ে এবং বিতরণ এপিআই আপনাকে আপনার ভ্রমণের জন্য ট্রিপস এবং যানবাহনের অবস্থা পরিচালনা করতে দেয় এবং অগ্রগতি অ্যাপ্লিকেশনগুলির অর্ডার দেয়। এটি ড্রাইভার এসডিকে, কনজিউমার এসডিকে এবং আপনার ব্যাকএন্ড পরিষেবার মধ্যে লেনদেন পরিচালনা করে - যা জিআরপিসি বা বিশ্রাম কলগুলি তৈরি করে বহর ইঞ্জিনের সাথে যোগাযোগ করতে পারে।

পূর্বশর্ত

বিকাশের জন্য, আপনি ক্লাউড এসডিকে (জিসিএলউড) ইনস্টল করেছেন এবং আপনার প্রকল্পে প্রমাণীকরণ করেছেন তা নিশ্চিত করুন।

শেল

gcloud auth login

আপনার একটি সাফল্যের বার্তা যেমন দেখতে হবে:

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

অন-ডিমান্ড রাইডস এবং ডেলিভারি সলিউশন ফ্লিট ইঞ্জিন এপিআই যথাযথভাবে কনফিগার করা হয়েছে তা পরীক্ষা করে দেখুন।

শেল

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

যদি এই কমান্ডটি কোনও ত্রুটি দেখা দেয় তবে অ্যাক্সেস পেতে আপনার প্রকল্প প্রশাসক এবং আপনার গুগল সমর্থন প্রতিনিধিদের সাথে চেক করুন।

লগিং

ফ্লিট ইঞ্জিনটি এপিআই কলগুলি সম্পর্কে লগ বার্তা লিখতে পারে এটি গুগল ক্লাউড প্ল্যাটফর্ম লগগুলিতে প্রাপ্ত। লগগুলি কীভাবে পড়তে এবং বিশ্লেষণ করতে হয় তার একটি ওভারভিউয়ের জন্য ক্লাউড লগিং ডকুমেন্টেশন দেখুন।

লগিং 10 ফেব্রুয়ারী, 2022 এর আগে তৈরি প্রকল্পগুলির জন্য ডিফল্টরূপে সক্ষম করা যাবে না। আরও তথ্যের জন্য লগিং ডকুমেন্টেশন দেখুন।

ক্লায়েন্ট লাইব্রেরি

আমরা বেশ কয়েকটি সাধারণ প্রোগ্রামিং ভাষায় ক্লায়েন্ট লাইব্রেরি প্রকাশ করি। এই গ্রন্থাগারগুলি কাঁচা বিশ্রাম বা জিআরপিসির চেয়ে আরও ভাল বিকাশকারীদের অভিজ্ঞতা সরবরাহ করতে সহায়তা করবে। আপনার সার্ভার অ্যাপ্লিকেশনটির জন্য কীভাবে ক্লায়েন্ট লাইব্রেরিগুলি পাবেন সে সম্পর্কে নির্দেশাবলীর জন্য, ক্লায়েন্ট লাইব্রেরিগুলি দেখুন।

এই ডকুমেন্টেশনের জাভা উদাহরণগুলি জিআরপিসির সাথে পরিচিতি ধরে নিয়েছে।

প্রমাণীকরণ এবং অনুমোদন

আপনি গুগল ক্লাউড কনসোলের মাধ্যমে ট্রিপ এবং অর্ডার অগ্রগতি দ্বারা সরবরাহিত ক্ষমতাগুলি কনফিগার করতে পারেন। এই এপিআই এবং এসডিকেগুলি ক্লাউড কনসোল থেকে তৈরি পরিষেবা অ্যাকাউন্টগুলি ব্যবহার করে স্বাক্ষরিত জেএসএন ওয়েব টোকেনগুলির ব্যবহার প্রয়োজন।

ক্লাউড প্রকল্প সেটআপ

আপনার ক্লাউড প্রকল্পটি সেট আপ করতে প্রথমে আপনার প্রকল্প তৈরি করুন এবং তারপরে পরিষেবা অ্যাকাউন্ট তৈরি করুন।

আপনার গুগল ক্লাউড প্রকল্প তৈরি করতে:

  1. গুগল ক্লাউড কনসোল ব্যবহার করে একটি গুগল ক্লাউড প্রকল্প তৈরি করুন।
  2. এপিআই এবং পরিষেবাদি ড্যাশবোর্ড ব্যবহার করে, স্থানীয় রাইডগুলি সক্ষম করুন এবং এপিআই সরবরাহ করুন।

পরিষেবা অ্যাকাউন্টগুলি এক বা একাধিক ভূমিকার সাথে যুক্ত। এগুলি জেএসএন ওয়েব টোকেন তৈরি করতে ব্যবহৃত হয় যা ভূমিকার উপর নির্ভর করে বিভিন্ন সেট অনুমতি দেয়। সাধারণত, অপব্যবহারের সম্ভাবনা হ্রাস করার জন্য আপনি একাধিক পরিষেবা অ্যাকাউন্ট তৈরি করতে পারেন, প্রতিটি প্রয়োজনীয় ন্যূনতম ভূমিকা সহ প্রয়োজনীয়।

ট্রিপ এবং অর্ডার অগ্রগতি নিম্নলিখিত ভূমিকাগুলি ব্যবহার করে:

ভূমিকা বর্ণনা
ফ্লিট ইঞ্জিন গ্রাহক এসডিকে ব্যবহারকারী

roles/fleetengine.consumerSdkUser
যানবাহন অনুসন্ধান এবং যানবাহন এবং ভ্রমণের বিষয়ে তথ্য পুনরুদ্ধার করার অনুমতি দেয়। এই ভূমিকা সহ একটি পরিষেবা অ্যাকাউন্ট দ্বারা তৈরি টোকেনগুলি সাধারণত আপনার রাইডশেয়ারিং বা বিতরণ গ্রাহক অ্যাপ মোবাইল ডিভাইসগুলি থেকে ব্যবহৃত হয়।
ফ্লিট ইঞ্জিন ড্রাইভার এসডিকে ব্যবহারকারী

roles/fleetengine.driverSdkUser
গাড়ির অবস্থান এবং রুটগুলি আপডেট করার এবং যানবাহন এবং ভ্রমণের বিষয়ে তথ্য পুনরুদ্ধার করার অনুমতি দেয়। এই ভূমিকা সহ একটি পরিষেবা অ্যাকাউন্ট দ্বারা তৈরি টোকেনগুলি সাধারণত আপনার রাইডশেয়ারিং বা ডেলিভারি ড্রাইভার অ্যাপ মোবাইল ডিভাইসগুলি থেকে ব্যবহৃত হয়।
ফ্লিট ইঞ্জিন পরিষেবা সুপার ব্যবহারকারী

roles/fleetengine.serviceSuperUser
সমস্ত যানবাহনকে অনুমতি দেয় এবং এপিআইগুলিকে ট্রিপ করে। এই ভূমিকা সহ একটি পরিষেবা অ্যাকাউন্ট দ্বারা তৈরি টোকেনগুলি সাধারণত আপনার ব্যাকএন্ড সার্ভারগুলি থেকে ব্যবহৃত হয়।

উদাহরণস্বরূপ, তিনটি ভূমিকার প্রত্যেকটির জন্য একটি পরিষেবা অ্যাকাউন্ট তৈরি করুন এবং তাদের নিজ নিজ ভূমিকা নির্ধারণ করুন।

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

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

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

ড্রাইভার এবং গ্রাহক এসডিকে এই স্ট্যান্ডার্ড ভূমিকার চারপাশে নির্মিত।

বিকল্পভাবে, কাস্টম ভূমিকা তৈরি করা সম্ভব যা অনুমতিগুলির একটি স্বেচ্ছাসেবী সেটকে একসাথে বান্ডিল করার অনুমতি দেয়। ড্রাইভার এবং গ্রাহক এসডিকে যখনই কোনও প্রয়োজনীয় অনুমতি অনুপস্থিত থাকে তখন ত্রুটি বার্তাগুলি প্রদর্শন করবে। ফলস্বরূপ, আমরা উপরে উপস্থাপিত ভূমিকার স্ট্যান্ডার্ড সেটটি দৃ strongly ়ভাবে ব্যবহার করার পরামর্শ দিই এবং কাস্টম রোলগুলি ব্যবহার না করে।

সুবিধার জন্য, যদি আপনাকে অবিশ্বস্ত ক্লায়েন্টদের জন্য জেডব্লিউটি টোকেন তৈরি করতে হয় তবে পরিষেবা অ্যাকাউন্টে ব্যবহারকারীদের যুক্ত করে স্রষ্টার ভূমিকা তাদের জিসিএলউড কমান্ড লাইন সরঞ্জামগুলির সাথে টোকেন তৈরি করতে দেয়।

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

যেখানে my-user@example.com হ'ল ইমেলটি GCLAUD ( gcloud auth list --format='value(account)' ) এর সাথে প্রমাণীকরণের জন্য ব্যবহৃত হয়।

বহর ইঞ্জিন আথ লাইব্রেরি

ফ্লিট ইঞ্জিন ফ্লিট ইঞ্জিন এপিআইগুলিতে অ্যাক্সেস সীমাবদ্ধ করতে JSON ওয়েব টোকেন (জেডব্লিউটিএস) ব্যবহার করে। গিটহাবের উপর উপলব্ধ নতুন ফ্লিট ইঞ্জিন আথ লাইব্রেরি, ফ্লিট ইঞ্জিন জেডব্লিউটিএস নির্মাণকে সহজতর করে এবং তাদের সুরক্ষিতভাবে স্বাক্ষর করে।

গ্রন্থাগারটি নিম্নলিখিত সুবিধাগুলি সরবরাহ করে:

  • ফ্লিট ইঞ্জিন টোকেন তৈরির প্রক্রিয়াটিকে সহজতর করে।
  • শংসাপত্রের ফাইলগুলি ব্যবহার ব্যতীত টোকেন স্বাক্ষর প্রক্রিয়া সরবরাহ করে (যেমন কোনও পরিষেবা অ্যাকাউন্টের ছদ্মবেশে))
  • জিআরপিসি স্টাব বা গ্যাপিক ক্লায়েন্ট থেকে তৈরি আউটবাউন্ড অনুরোধগুলিতে স্বাক্ষরযুক্ত টোকেন সংযুক্ত করে।

অনুমোদনের জন্য একটি জেএসএন ওয়েব টোকেন (জেডাব্লুটি) তৈরি করা

ফ্লিট ইঞ্জিন এথ লাইব্রেরি ব্যবহার না করার সময়, জেএসএন ওয়েব টোকেনস (জেডব্লিউটিএস) আপনার কোডবেসের মধ্যে সরাসরি তৈরি করা দরকার। এর জন্য আপনার উভয়ই জেডব্লিউটিগুলির গভীর উপলব্ধি এবং কীভাবে তারা ফ্লিট ইঞ্জিনের সাথে সম্পর্কিত। এই কারণেই আমরা ফ্লিট ইঞ্জিন আথ লাইব্রেরির সুবিধা নেওয়ার পরামর্শ দিই।

ফ্লিট ইঞ্জিনের মধ্যে, জেএসএন ওয়েব টোকেনস (জেডব্লিউটিএস) স্বল্প-কালীন প্রমাণীকরণ সরবরাহ করে এবং নিশ্চিত করে যে ডিভাইসগুলি কেবল যানবাহন, ট্রিপস বা যে কাজগুলির জন্য সেগুলি অনুমোদিত তা সংশোধন করতে পারে। জেডব্লিউটিএসে একটি শিরোনাম এবং একটি দাবি বিভাগ রয়েছে। শিরোনাম বিভাগে ব্যবহার করার জন্য ব্যক্তিগত কী (পরিষেবা অ্যাকাউন্ট থেকে প্রাপ্ত) এবং এনক্রিপশন অ্যালগরিদম হিসাবে তথ্য রয়েছে। দাবী বিভাগে টোকেনের তৈরি সময়, লাইভ করার সময় টোকেন সময়, যে পরিষেবাগুলিতে অ্যাক্সেস দাবি করছে সেগুলির মতো তথ্য রয়েছে এবং অ্যাক্সেসের সুযোগ দেওয়ার জন্য অন্যান্য অনুমোদনের তথ্য রয়েছে; উদাহরণস্বরূপ, যানবাহন আইডি।

একটি জেডব্লিউটি শিরোনাম বিভাগে নিম্নলিখিত ক্ষেত্রগুলি রয়েছে:

মাঠ বর্ণনা
alg অ্যালগরিদম ব্যবহার করতে। `RS256`।
টাইপ টোকেনের ধরন। `Jwt`।
বাচ্চা আপনার পরিষেবা অ্যাকাউন্টের ব্যক্তিগত কী আইডি। আপনি আপনার পরিষেবা অ্যাকাউন্ট json ফাইলের `বেসরকারী_কি_আইডি` ক্ষেত্রে এই মানটি খুঁজে পেতে পারেন। অনুমতিগুলির সঠিক স্তরের সাথে কোনও পরিষেবা অ্যাকাউন্ট থেকে কোনও কী ব্যবহার করার বিষয়টি নিশ্চিত করুন।

একটি জেডাব্লুটি দাবি বিভাগে নিম্নলিখিত ক্ষেত্রগুলি রয়েছে:

মাঠ বর্ণনা
iss আপনার পরিষেবা অ্যাকাউন্টের ইমেল ঠিকানা।
উপ আপনার পরিষেবা অ্যাকাউন্টের ইমেল ঠিকানা।
aud আপনার পরিষেবা অ্যাকাউন্টের পরিষেবা_নাম, এক্ষেত্রে https://fleetengine.googleapis.com/
iat টাইমস্ট্যাম্প যখন টোকেন তৈরি করা হয়েছিল, তখন সেকেন্ডে নির্দিষ্ট করা হয়েছে 00:00:00 ইউটিসি, 1 জানুয়ারী, 1970 সাল থেকে। যদি টাইমস্ট্যাম্প অতীতে খুব বেশি দূরে থাকে বা ভবিষ্যতে, সার্ভারটি কোনও ত্রুটির প্রতিবেদন করতে পারে।
exp টাইমস্ট্যাম্প যখন টোকেনের মেয়াদ শেষ হবে, সেকেন্ডে নির্দিষ্ট করা হয়েছে 00:00:00 ইউটিসি, 1 জানুয়ারী, 1970 এর পরে।
অনুমোদন ব্যবহারের ক্ষেত্রে নির্ভর করে, `যানবাহনআইডি` বা` ট্রাইপিড` থাকতে পারে `

একটি জেডব্লিউটি টোকেন তৈরি করা এটি স্বাক্ষর করতে বোঝায়। জেডব্লিউটি তৈরি এবং স্বাক্ষর করার জন্য নির্দেশাবলী এবং কোড নমুনার জন্য, ওআউথ ছাড়াই পরিষেবা অ্যাকাউন্টের অনুমোদন দেখুন। তারপরে আপনি জিআরপিসি কল বা ফ্লিট ইঞ্জিন অ্যাক্সেস করতে ব্যবহৃত অন্যান্য পদ্ধতিতে একটি স্বাক্ষরযুক্ত টোকেন সংযুক্ত করতে পারেন।

জেডব্লিউটি দাবি করেছে

জেডব্লিউটি পে -লোড তৈরি করার সময়, মূল vehicleid আইডি বা tripid সেট সহ অনুমোদনের বিভাগে একটি অতিরিক্ত দাবি যুক্ত করুন যার জন্য কলটি করা হচ্ছে।

ড্রাইভার এসডিকে সর্বদা vehicleid দাবিটি ব্যবহার করে, ট্রিপ বা যানবাহনে কাজ করে কিনা। ফ্লিট ইঞ্জিন ব্যাকএন্ড আশ্বাস দেয় যে গাড়িটি পরিবর্তনটি করার আগে অনুরোধ করা ভ্রমণের সাথে যুক্ত।

গ্রাহক এসডিকে সর্বদা tripid দাবি ব্যবহার করে।

রাইডশেয়ার বা ডেলিভারি সরবরাহকারীর সমস্ত যানবাহন এবং ভ্রমণের সাথে মেলে "*" সহ vehicleid বা tripid ব্যবহার করা উচিত। নোট করুন যে জেডব্লিউটি উভয় টোকেন থাকতে পারে, এমনকি প্রয়োজন না হলেও, যা টোকেন স্বাক্ষর বাস্তবায়নকে সহজ করতে পারে।

JWT ব্যবহারের ক্ষেত্রে

নিম্নলিখিতগুলি সরবরাহকারী সার্ভারের জন্য একটি উদাহরণ টোকেন দেখায়:

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

নিম্নলিখিতগুলি গ্রাহক অ্যাপের জন্য একটি উদাহরণ টোকেন দেখায়:

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

নিম্নলিখিতগুলি ড্রাইভার অ্যাপের জন্য একটি উদাহরণ টোকেন দেখায়:

{
  "alg": "RS256",
  "typ": "JWT",
  "kid": "private_key_id_of_driver_service_account"
}
.
{
  "iss": "driver@yourgcpproject.iam.gserviceaccount.com",
  "sub": "driver@yourgcpproject.iam.gserviceaccount.com",
  "aud": "https://fleetengine.googleapis.com/",
  "iat": 1511900000,
  "exp": 1511903600,
  "authorization": {
     "vehicleid": "driver_12345"
   }
}
  • শিরোনামে kid ক্ষেত্রের জন্য, আপনার পরিষেবা অ্যাকাউন্টের ব্যক্তিগত কী আইডি নির্দিষ্ট করুন। আপনি আপনার পরিষেবা অ্যাকাউন্ট json ফাইলের private_key_id ক্ষেত্রে এই মানটি খুঁজে পেতে পারেন।
  • iss এবং sub ক্ষেত্রগুলির জন্য, আপনার পরিষেবা অ্যাকাউন্টের ইমেল ঠিকানা নির্দিষ্ট করুন। আপনি আপনার পরিষেবা অ্যাকাউন্ট JSON ফাইলের client_email ক্ষেত্রে এই মানটি খুঁজে পেতে পারেন।
  • aud ক্ষেত্রের জন্য, https: // পরিষেবা_নাম/ নির্দিষ্ট করুন।
  • iat ক্ষেত্রের জন্য, টোকেন তৈরি হওয়ার সময় টাইমস্ট্যাম্পটি ব্যবহার করুন, 00:00:00 ইউটিসি, 1 জানুয়ারী, 1970 এর পরে সেকেন্ড হিসাবে নির্দিষ্ট করা হয়েছে। স্কিউয়ের জন্য 10 মিনিটের অনুমতি দিন। যদি টাইমস্ট্যাম্প অতীতে খুব বেশি দূরে থাকে বা ভবিষ্যতে, সার্ভারটি কোনও ত্রুটির প্রতিবেদন করতে পারে।
  • exp ক্ষেত্রের জন্য, টোকেনটির মেয়াদ শেষ হয়ে গেলে টাইমস্ট্যাম্পটি ব্যবহার করুন, 00:00:00 ইউটিসি, জানুয়ারী 1, 1970 এর পরে সেকেন্ড হিসাবে নির্দিষ্ট করা হয়েছে। সর্বাধিক অনুমোদিত মান iat + 3600।

কোনও মোবাইল ডিভাইসে পাস করার জন্য জেডব্লিউটি স্বাক্ষর করার সময়, ড্রাইভার বা গ্রাহক এসডিকে ভূমিকার জন্য পরিষেবা অ্যাকাউন্টটি ব্যবহার করার বিষয়টি নিশ্চিত করুন। অন্যথায়, মোবাইল ডিভাইসে এটি থাকা উচিত নয় এমনটি পরিবর্তন করার ক্ষমতা থাকবে।

তেমনিভাবে, সুবিধাপ্রাপ্ত কলগুলির জন্য জেডব্লিউটি ব্যবহার করার জন্য স্বাক্ষর করার সময়, সুপার ব্যবহারকারীর ভূমিকার সাথে পরিষেবা অ্যাকাউন্টটি ব্যবহার করার বিষয়টি নিশ্চিত করুন। অন্যথায়, অপারেশন ব্যর্থ হবে।

পরীক্ষার জন্য একটি জেডাব্লুটি তৈরি করা

টার্মিনাল থেকে টোকেন তৈরি করা পরীক্ষা করার সময় সহায়ক হতে পারে।

এই পদক্ষেপগুলি অনুসরণ করার জন্য, আপনার ব্যবহারকারীর অ্যাকাউন্টে অবশ্যই পরিষেবা অ্যাকাউন্টের টোকেন স্রষ্টার ভূমিকা থাকতে হবে:

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

নীচের সামগ্রী সহ unsigned_token.json নামে একটি নতুন ফাইল তৈরি করুন। iat সম্পত্তিটি যুগের পরে সেকেন্ডের সংখ্যায় বর্তমান সময়, যা আপনার টার্মিনালে date +%s চালানোর মাধ্যমে পুনরুদ্ধার করা যেতে পারে। exp সম্পত্তি হ'ল যুগের পরে সেকেন্ডের সংখ্যায় মেয়াদোত্তীর্ণ সময়, যা iat -তে 3600 যুক্ত করে গণনা করা যায়। মেয়াদোত্তীর্ণ সময় ভবিষ্যতে এক ঘণ্টার বেশি হতে পারে না।

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

তারপরে আপনার সুপার ব্যবহারকারী পরিষেবা অ্যাকাউন্টের পক্ষে টোকেনটিতে স্বাক্ষর করতে নিম্নলিখিত জিসিএলউড কমান্ডটি চালান:

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

একটি স্বাক্ষরিত বেস 64-এনকোডেড জেডব্লিউটি এখন signed_token.jwt ফাইলের মধ্যে সংরক্ষণ করা উচিত। টোকেনটি পরবর্তী ঘন্টাটির জন্য বৈধ।

আপনি এখন তালিকার বিরুদ্ধে curl কমান্ড চালিয়ে টোকেনটি পরীক্ষা করতে পারেন যানবাহনের বিশ্রামের শেষ পয়েন্ট:

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

যানবাহন এবং তাদের জীবনচক্র

যানবাহনটি হ'ল সত্তা যা ড্রাইভার-যানবাহনের জোড়ের প্রতিনিধিত্ব করে। বর্তমানে, একটি ড্রাইভার এবং যানবাহন আলাদাভাবে ট্র্যাক করা যায় না। রাইডশেয়ার বা বিতরণ সরবরাহকারী একটি সরবরাহকারী আইডি ব্যবহার করে একটি যান তৈরি করে (যা অবশ্যই গুগল ক্লাউড প্রকল্পের প্রকল্প আইডি হিসাবে একই হতে হবে যা ফ্লিট ইঞ্জিন এপিআইগুলিকে কল করতে ব্যবহৃত পরিষেবা অ্যাকাউন্ট রয়েছে) এবং একটি রাইডশেয়ার বা বিতরণ সরবরাহকারীর মালিকানাধীন যানবাহন আইডি .

সাত দিন পরে UpdateVehicle মাধ্যমে আপডেট করা হয়নি এমন একটি গাড়ি স্বয়ংক্রিয়ভাবে মুছে ফেলা হবে। ইতিমধ্যে বিদ্যমান যা সরবরাহকারী আইডি/যানবাহন আইডি জোড়ের সাথে CreateVehicle কল করা একটি ত্রুটি। ঘন ঘন আপডেট না হওয়া যানবাহনের ক্ষেত্রে দুটি উপায়ে মোকাবেলা করা যেতে পারে: প্রায়শই প্রত্যাশিত সরবরাহকারী আইডি/যানবাহন আইডি জোড়ের সাথে CreateVehicle কল করা এবং যানবাহনটি ইতিমধ্যে উপস্থিত থাকলে ত্রুটিটি বাতিল করে দেওয়া; অথবা, একটি UpdateVehicle পরে একটি NOT_FOUND ত্রুটি সহ ফিরে আসার পরে CreateVehicle কল করা।

গাড়ির অবস্থান আপডেট

ফ্লিট ইঞ্জিনের সাথে সেরা পারফরম্যান্সের জন্য, এটি গাড়ির অবস্থান আপডেটের একটি স্ট্রিম সরবরাহ করুন। এই আপডেটগুলি সরবরাহ করতে নিম্নলিখিত যে কোনও উপায় ব্যবহার করুন:

  1. ড্রাইভার এসডিকে - অ্যান্ড্রয়েড , আইওএস - সহজ বিকল্পটি ব্যবহার করুন।
  2. কাস্টম কোড ব্যবহার করুন - যদি আপনার ব্যাকএন্ডের মাধ্যমে অবস্থানগুলি রিলে করা হয় বা আপনি যদি অ্যান্ড্রয়েড বা আইওএস ব্যতীত অন্য ডিভাইস ব্যবহার করেন তবে দরকারী।

যানবাহনের প্রকার

যানবাহন সত্তায় VehicleType একটি প্রয়োজনীয় ক্ষেত্র রয়েছে, এতে একটি Category এনাম রয়েছে যা AUTO , TAXI , TRUCK , TWO_WHEELER , BICYCLE বা PEDESTRIAN হিসাবে নির্দিষ্ট করা যেতে পারে। গাড়ির ধরণটি SearchVehicles এবং ListVehicles ফিল্টার মানদণ্ড হিসাবে পরিবেশন করতে পারে।

বিভাগটি AUTO , TWO_WHEELER , BICYCLE বা PEDESTRIAN মধ্যে সেট করা থাকলে যানবাহনের জন্য সমস্ত রাউটিং সংশ্লিষ্ট RouteTravelMode ব্যবহার করবে। যদি বিভাগটি TAXI বা TRUCK সেট করা থাকে তবে রাউটিংটি AUTO মোডের মতোই চিকিত্সা করা হয়।

যানবাহনের বৈশিষ্ট্য

যানবাহন সত্তায় VehicleAttribute একটি পুনরাবৃত্তি ক্ষেত্র রয়েছে। এই বৈশিষ্ট্যগুলি বহর ইঞ্জিন দ্বারা ব্যাখ্যা করা হয় না। SearchVehicles এপিআই -তে একটি ক্ষেত্র অন্তর্ভুক্ত রয়েছে যে ম্যাচ করা Vehicles অবশ্যই নির্দিষ্ট মানের সাথে সেট করা সমস্ত অন্তর্ভুক্ত বৈশিষ্ট্য থাকতে হবে।

নোট করুন যে অ্যাট্রিবিউট ফিল্ডটি Vehicle বার্তায় অন্যান্য বেশ কয়েকটি সমর্থিত ক্ষেত্রগুলি ছাড়াও যেমন vehicle_type এবং supported_trip_types

যানবাহন অবশিষ্ট পথ

যানবাহন সত্তায় TripWaypoint ( আরপিসি | রেস্ট ) এর একটি পুনরাবৃত্তি ক্ষেত্র রয়েছে, যাকে waypoints ( আরপিসি | রেস্ট ) বলা হয়। এই ক্ষেত্রটিতে যানবাহনটি পৌঁছানোর ক্রমে ভ্রমণের অবশিষ্ট পথগুলি অন্তর্ভুক্ত করে। ট্রিপগুলি গাড়িতে বরাদ্দ করা হওয়ায় ফ্লিট ইঞ্জিন এই ক্ষেত্রটিকে গণনা করে এবং ট্রিপগুলি তাদের স্থিতি পরিবর্তন করার সাথে সাথে এটি আপডেট করে। এই ওয়েপপয়েন্টগুলি TripId ফিল্ড এবং WaypointType ক্ষেত্র দ্বারা চিহ্নিত করা যেতে পারে।

ম্যাচগুলির জন্য একটি গাড়ির যোগ্যতা প্রসারিত করা

সাধারণত, রাইডশেয়ার বা বিতরণ সরবরাহকারীর পরিষেবাগুলি যানবাহনের সাথে ট্রিপ অনুরোধের সাথে মিলে যাওয়ার জন্য দায়বদ্ধ। পরিষেবাটি যানবাহন বৈশিষ্ট্যগুলি বৃহত সংখ্যক অনুসন্ধানে একটি যানবাহন অন্তর্ভুক্ত করতে ব্যবহার করতে পারে। উদাহরণস্বরূপ, সরবরাহকারী কোনও যানবাহন দ্বারা সরবরাহিত পার্ক বা সক্ষমতার স্তরের সাথে সম্পর্কিত বৈশিষ্ট্যগুলিতে একটি সেট প্রয়োগ করতে পারে। উদাহরণস্বরূপ, তিনটি স্তর বুলিয়ান মানগুলির সাথে বৈশিষ্ট্যের একটি সেট হতে পারে: is_bronze_level , is_silver_level , এবং is_gold_level । একটি যানবাহন তিনজনের জন্য যোগ্য হতে পারে। যখন ফ্লিট ইঞ্জিনটি এমন একটি ভ্রমণের জন্য একটি অনুরোধ গ্রহণ করে যাতে রৌপ্য স্তরের ক্ষমতা প্রয়োজন হয়, অনুসন্ধানে সেই যানবাহন অন্তর্ভুক্ত থাকে। এইভাবে বৈশিষ্ট্যগুলি ব্যবহার করে এমন যানবাহন অন্তর্ভুক্ত রয়েছে যা বিভিন্ন ক্ষমতা সরবরাহ করে।

গাড়ির বৈশিষ্ট্য আপডেট করার দুটি উপায় রয়েছে। একটি হ'ল UpdateVehicle এপিআই। এই এপিআই ব্যবহার করার সময়, যানবাহনের বৈশিষ্ট্যগুলির পুরো সেটটি মানটিতে সেট করা থাকে। কেবল একটি একক বৈশিষ্ট্য আপডেট করা সম্ভব নয়। অন্য পদ্ধতিটি হ'ল UpdateVehicleAttributes এপিআই। এই পদ্ধতিটি আপডেট করার জন্য কেবল বৈশিষ্ট্যগুলি নেয়। অনুরোধে অন্তর্ভুক্ত বৈশিষ্ট্যগুলি নতুন মানতে সেট করা হবে বা যুক্ত করা হবে; অনির্ধারিত বৈশিষ্ট্যগুলি পরিবর্তন করা হবে না।

কীভাবে: একটি যানবাহন তৈরি করুন

বহরে ট্র্যাক করার জন্য প্রতিটি যানবাহনের জন্য একটি Vehicle সত্তা তৈরি করতে হবে।

একটি গাড়ি তৈরি করতে CreateVehicleRequest সাথে CreateVehicle এন্ডপয়েন্টটি ব্যবহার করুন।

Vehicle provider_id অবশ্যই গুগল ক্লাউড প্রকল্পের প্রজেক্ট আইডি (যেমন মাই-অন-ডিমান্ড-প্রকল্প) হতে হবে যাতে পরিষেবা অ্যাকাউন্ট রয়েছে যা ফ্লিট ইঞ্জিনকে কল করতে ব্যবহৃত হবে। মনে রাখবেন যে একাধিক পরিষেবা অ্যাকাউন্টগুলি একই রাইডশেয়ার বা বিতরণ সরবরাহকারীর জন্য ফ্লিট ইঞ্জিনটি অ্যাক্সেস করতে পারে, তবে ফ্লিট ইঞ্জিনটি বর্তমানে একই Vehicles অ্যাক্সেসকারী একাধিক গুগল ক্লাউড প্রকল্পগুলি থেকে পরিষেবা অ্যাকাউন্টগুলিকে সমর্থন করে না।

Vehicle OFFLINE বা ONLINE অবস্থায় তৈরি করা যেতে পারে। যদি ONLINE তৈরি করা হয় তবে এটি SearchVehicles প্রশ্নের জবাবে তাত্ক্ষণিকভাবে ফিরে আসতে পারে।

একটি প্রাথমিক last_location CreateVehicle কলটিতে অন্তর্ভুক্ত করা যেতে পারে। অনুমতি দেওয়ার সময়, কোনও Vehicle last_location ছাড়াই ONLINE রাজ্যে তৈরি করা উচিত নয়।

গাড়ির ধরণের ক্ষেত্রের বিশদগুলির জন্য গাড়ির ধরণগুলি দেখুন।

বৈশিষ্ট্য ক্ষেত্রের বিশদগুলির জন্য যানবাহনের বৈশিষ্ট্যগুলি দেখুন।

CreateVehicle থেকে ফিরে আসা মানটি হ'ল তৈরি Vehicle সত্তা।

উদাহরণ

শেল

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

সরবরাহকারী.ভিক্যালস। ক্রিয়েট রেফারেন্স দেখুন।

জাভা

static final String PROJECT_ID = "project-id";

VehicleServiceBlockingStub vehicleService =
    VehicleService.newBlockingStub(channel);

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

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

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

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

গুগল ক্লাউড প্ল্যাটফর্ম যানবাহন তৈরির জন্য লগ

ফ্লিট ইঞ্জিন এপিআই গুগল ক্লাউড প্ল্যাটফর্ম লগগুলির মাধ্যমে একটি লগ এন্ট্রি লিখেছে যখন CreateVehicle এন্ডপয়েন্টে কল পাওয়া যায়। লগ এন্ট্রিটিতে CreateVehicle অনুরোধের মানগুলি সম্পর্কে তথ্য অন্তর্ভুক্ত রয়েছে। যদি কলটি সফল হয়, তবে এতে ফিরে আসা Vehicle সম্পর্কে তথ্যও অন্তর্ভুক্ত করা হবে।

শেল

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

নিম্নলিখিতগুলির অনুরূপ একটি রেকর্ড মুদ্রণ করা উচিত:

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

যানবাহন তৈরির জন্য ক্লাউড পাব/সাব বিজ্ঞপ্তি

ফ্লিট ইঞ্জিন এপিআই ক্লাউড পাব/সাব এর মাধ্যমে একটি নতুন যানবাহন তৈরি করার সময় একটি বিজ্ঞপ্তি প্রকাশ করে। এই বিজ্ঞপ্তিগুলি পাওয়ার জন্য, দয়া করে এখানে নির্দেশাবলী অনুসরণ করুন।

কীভাবে: একটি গাড়ির অবস্থান আপডেট করুন

যদি গাড়ির অবস্থান আপডেট করতে ড্রাইভার এসডিকে ব্যবহার না করে, আপনি গাড়ির অবস্থান সহ ফ্লিট ইঞ্জিনে সরাসরি কল করতে পারেন। যে কোনও সক্রিয় গাড়ির জন্য, ফ্লিট ইঞ্জিন কমপক্ষে প্রতি মিনিটে একবার এবং সর্বাধিক প্রতি 5 সেকেন্ডে একবারে একটি লোকেশন আপডেটের প্রত্যাশা করে। এই আপডেটগুলির জন্য কেবলমাত্র ফ্লিট ইঞ্জিন ড্রাইভার এসডিকে ব্যবহারকারীর সুবিধাগুলি প্রয়োজন।

উদাহরণ

শেল

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

সরবরাহকারী.ভিক্যালস.পিডেট রেফারেন্স দেখুন।

জাভা

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

VehicleServiceBlockingStub vehicleService = VehicleService.newBlockingStub(channel);

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

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

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

কীভাবে: অন্যান্য যানবাহন ক্ষেত্র আপডেট করুন

যানবাহনের রাজ্যের অন্যান্য বৈশিষ্ট্যের আপডেটগুলি অবস্থানের আপডেটের চেয়ে কম ঘন ঘন ঘটে। last_location ব্যতীত অন্য বৈশিষ্ট্যের আপডেটগুলির জন্য ফ্লিট ইঞ্জিন সুপার ব্যবহারকারীর সুবিধাগুলি প্রয়োজন।

কোন ক্ষেত্রগুলি আপডেট করতে হবে তা নির্দেশ করার জন্য UpdateVehicleRequest একটি update_mask অন্তর্ভুক্ত রয়েছে। ক্ষেত্রের আচরণটি ক্ষেত্রের মুখোশগুলির জন্য প্রোটোবুফ ডকুমেন্টেশনের মতো।

গাড়ির বৈশিষ্ট্যগুলিতে উল্লিখিত হিসাবে, attributes ক্ষেত্র আপডেট করার জন্য সমস্ত বৈশিষ্ট্য সংরক্ষণের জন্য লেখার প্রয়োজন। একটি UpdateVehicle কলটিতে কেবল একটি কী-মান জুটির মান আপডেট করা সম্ভব নয়। নির্দিষ্ট বৈশিষ্ট্যের মানগুলি আপডেট করতে, UpdateVehicleAttributes এপিআই ব্যবহার করা যেতে পারে।

উদাহরণ

এই উদাহরণটি back_to_back সক্ষম করে।

শেল

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

সরবরাহকারী.ভিক্যালস.পিডেট রেফারেন্স দেখুন।

জাভা

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

VehicleServiceBlockingStub vehicleService = VehicleService.newBlockingStub(channel);

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

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

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

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

যানবাহন আপডেটের জন্য গুগল ক্লাউড প্ল্যাটফর্ম লগ

ফ্লিট ইঞ্জিন এপিআই গুগল ক্লাউড প্ল্যাটফর্ম লগগুলির মাধ্যমে একটি লগ এন্ট্রি লিখেছে যখন UpdateVehicle এন্ডপয়েন্টে কল পাওয়া যায়। লগ এন্ট্রি UpdateVehicle অনুরোধের মানগুলি সম্পর্কে তথ্য অন্তর্ভুক্ত করে। যদি কলটি সফল হয়, তবে এতে ফিরে আসা Vehicle সম্পর্কে তথ্যও অন্তর্ভুক্ত করা হবে।

শেল

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

যানবাহন আপডেটের জন্য ক্লাউড পাব/সাব বিজ্ঞপ্তি

ফ্লিট ইঞ্জিন এপিআই ক্লাউড পাব/সাব এর মাধ্যমে একটি বিজ্ঞপ্তি প্রকাশ করে যখন কোনও বিদ্যমান যান আপডেট করা হয়। এই বিজ্ঞপ্তিগুলি পাওয়ার জন্য, দয়া করে এখানে নির্দেশাবলী অনুসরণ করুন।

কীভাবে: যানবাহন অনুসন্ধান করুন

ফ্লিট ইঞ্জিন যানবাহন অনুসন্ধান সমর্থন করে। SearchVehicles এপিআই আপনাকে এমন কাছাকাছি ড্রাইভারদের উপলব্ধ করতে দেয় যারা কোনও রাইড বা ডেলিভারি অনুরোধের মতো কোনও কাজের জন্য সবচেয়ে উপযুক্ত। SearchVehicles এপিআই আপনার বহরে যানবাহনের বৈশিষ্ট্যের সাথে ড্রাইভার ম্যাচিং টাস্ক অ্যাট্রিবিউটগুলির একটি র‌্যাঙ্কড তালিকা প্রদান করে। আরও তথ্যের জন্য, নিকটবর্তী ড্রাইভারগুলি সন্ধান করুন।

উদাহরণ

উপলভ্য যানবাহন অনুসন্ধান করার সময়, ফ্লিট ইঞ্জিনটি ডিফল্টরূপে সক্রিয় ভ্রমণের যানবাহনগুলি বাদ দেয়। রাইডশেয়ার বা বিতরণ সরবরাহকারীর পরিষেবাগুলিকে অনুসন্ধানের অনুরোধগুলিতে স্পষ্টভাবে তাদের অন্তর্ভুক্ত করতে হবে। নিম্নলিখিত উদাহরণটি দেখায় যে কীভাবে এই যানবাহনগুলিকে গ্র্যান্ড ইন্দোনেশিয়া ইস্ট মল থেকে বালাই সিদাং জাকার্তা কনভেনশন সেন্টারে ভ্রমণের সাথে মিলে যানবাহনের সন্ধানে অন্তর্ভুক্ত করা যায়।

শেল

প্রথমে আমরা পূর্বের পদক্ষেপগুলিতে তৈরি গাড়ির অবস্থানটি আপডেট করুন যাতে এটি যোগ্য হয়। বাস্তব বিশ্বে, এটি গাড়িতে অ্যান্ড্রয়েড বা আইওএস ডিভাইসে চলমান ড্রাইভার এসডিকে দ্বারা করা হবে।

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

অনুসন্ধান সম্পাদন করা কমপক্ষে সেই গাড়িটি পাওয়া উচিত।

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

সরবরাহকারী.ভিকেলস। অনুসন্ধান রেফারেন্স দেখুন।

জাভা

static final String PROJECT_ID = "project-id";

VehicleServiceBlockingStub vehicleService = VehicleService.newBlockingStub(channel);

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

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

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

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

যানবাহন ফিল্টারিং ক্যোয়ারী

SearchVehicles এবং ListVehicles ফিল্টার ক্যোয়ারী ব্যবহার করে যানবাহনের বৈশিষ্ট্যগুলিতে ফিল্টারিং সমর্থন করে। ফিল্টার ক্যোয়ারী সিনট্যাক্সের জন্য, উদাহরণগুলির জন্য এআইপি -160 দেখুন।

নোট করুন যে ফিল্টার কোয়েরিগুলি কেবল যানবাহনের বৈশিষ্ট্যগুলিতে ফিল্টারিং সমর্থন করে এবং অন্যান্য ক্ষেত্রগুলির জন্য ব্যবহার করা যায় না। ফিল্টার ক্যোয়ারী অন্যান্য সীমাবদ্ধতার সাথে যেমন minimum_capacity বা SearchVehiclesRequest vehicle_types AND ধারা হিসাবে কাজ করে।

কীভাবে: যানবাহন তালিকা

SearchVehicles খুব দ্রুত র‌্যাঙ্কড ক্রমে অল্প সংখ্যক যানবাহন সন্ধানের জন্য অনুকূলিত এবং মূলত কোনও কাজের জন্য সবচেয়ে উপযুক্ত উপযুক্ত নিকটবর্তী ড্রাইভারগুলি খুঁজে পেতে ব্যবহৃত হয়। তবে, কখনও কখনও আপনি এমন সমস্ত যানবাহন সন্ধান করতে চান যা ফলাফলের মাধ্যমে পেজিং প্রয়োজনীয় হলেও কিছু মানদণ্ড পূরণ করে। ListVehicles সেই ব্যবহারের ক্ষেত্রে ডিজাইন করা হয়েছে।

ListVehicles এপিআই আপনাকে এমন সমস্ত যানবাহন সন্ধান করতে দেয় যা কিছু নির্দিষ্ট অনুরোধের বিকল্পগুলি পূরণ করে। ListVehicles এপিআই প্রকল্পের যানবাহনের একটি প্যাগিনেটেড তালিকা প্রদান করে যা কিছু প্রয়োজনীয়তার সাথে মেলে।

গাড়ির বৈশিষ্ট্যগুলিতে ফিল্টার করতে, দয়া করে যানবাহন ফিল্টারিং ক্যোয়ারী দেখুন।

উদাহরণ

এই উদাহরণটি filter স্ট্রিং ব্যবহার করে vehicle_type এবং বৈশিষ্ট্যগুলিতে ফিল্টারিং সম্পাদন করে।

শেল

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

সরবরাহকারী.ভিক্যালস.লিস্ট রেফারেন্স দেখুন।

জাভা

static final String PROJECT_ID = "project-id";

VehicleServiceBlockingStub vehicleService = VehicleService.newBlockingStub(channel);

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

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

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

ট্রিপস এবং তাদের জীবনচক্র

ট্রিপ এপিআই এবং লাইফসাইকেলটি যানবাহন এপিআই এবং লাইফসাইকেলের অনুরূপ। রাইডশেয়ার সরবরাহকারী ফ্লিট ইঞ্জিন ইন্টারফেস ব্যবহার করে ট্রিপ তৈরির জন্য দায়বদ্ধ। ফ্লিট ইঞ্জিন উভয়ই একটি আরপিসি পরিষেবা, TripService এবং বিশ্রাম সংস্থান, provider.trips সরবরাহ করে। এই ইন্টারফেসগুলি ট্রিপ সত্তা তৈরি, তথ্য অনুরোধগুলি, অনুসন্ধানের কার্যকারিতা এবং আপডেট সক্ষমতা সক্ষম করে।

একটি Trip জীবনচক্রের মাধ্যমে এর অগ্রগতি ট্র্যাক করার জন্য একটি স্থিতি ক্ষেত্র রয়েছে। মানগুলি NEW থেকে COMPLETE প্লাস CANCELED এবং UNKNOWN_TRIP_STATUS চলে যায়। আরপিসির জন্য trip_status বা বিশ্রামের জন্য ট্রিপস্ট্যাটাস দেখুন।

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

আপনার পরিষেবাটি এই স্ট্যাটাসগুলির যে কোনও থেকে CANCELED ট্রিপ আপডেট করতে পারে। যখন আপনার পরিষেবাটি একটি ট্রিপ তৈরি করে, ইঞ্জিনটি স্থিতিটিকে NEW হিসাবে সেট করে। একটি vehicle_id al চ্ছিক। যানবাহনের মতো, পরিষেবাগুলি কোনও আপডেট ছাড়াই সাত দিন পরে স্বয়ংক্রিয়ভাবে ট্রিপগুলি মুছবে। যদি আপনার পরিষেবাটি ইতিমধ্যে বিদ্যমান আইডি দিয়ে একটি ট্রিপ তৈরি করার চেষ্টা করে তবে একটি ত্রুটি ফিরে আসে। যদি এটি COMPLETE বা CANCELED ব্যতীত অন্য কোনও স্থিতিতে থাকে তবে একটি ট্রিপকে 'সক্রিয়' হিসাবে বিবেচনা করা হয়। এই পার্থক্যটি যানবাহনের সত্তা এবং SearchTripsRequest active_trips ক্ষেত্রে গুরুত্বপূর্ণ।

পরিষেবাটি কেবল যখন স্ট্যাটাসটি NEW বা CANCELED হয়ে যায় তখন কোনও ট্রিপে নির্ধারিত vehicle_id পরিবর্তন করতে পারে। যদি কোনও ড্রাইভার রুটের সময় কোনও ট্রিপ বাতিল করে দেয় তবে ট্রিপের স্থিতি অবশ্যই NEW সেট করতে হবে বা vehicle_id পরিবর্তন বা সাফ করার আগে CANCELED

ব্যাক-টু-ব্যাক ট্রিপ সমর্থন বাস্তবায়নের সময় স্থিতি গুরুত্বপূর্ণ। এই সমর্থনটি সরবরাহকারীকে একটি গাড়ীতে নতুন ট্রিপ বরাদ্দ করতে সক্ষম করে যখন সেই গাড়িটি সক্রিয় ট্রিপে থাকে। ব্যাক-টু-ব্যাক ট্রিপ তৈরির কোডটি একক ট্রিপের সমান এবং একই যানবাহন আইডি ব্যবহার করে। ফ্লিট ইঞ্জিনটি গাড়ির ওয়েপপয়েন্টগুলিতে নতুন ভ্রমণের উত্স এবং গন্তব্য যুক্ত করে। ব্যাক-টু-ব্যাক ট্রিপ সম্পর্কে আরও তথ্যের জন্য, মাল্টি-ওয়ে পয়েন্ট ট্রিপগুলি তৈরি করুন দেখুন।

ট্রিপ অবশিষ্ট ওয়ে পয়েন্টস

ট্রিপ সত্তায় TripWaypoint ( আরপিসি | রেস্ট ) এর একটি পুনরাবৃত্তি ক্ষেত্র রয়েছে, যাকে remainingWaypoints ( আরপিসি | বিশ্রাম ) বলা হয়। এই ক্ষেত্রটিতে এই ট্রিপের চূড়ান্ত ড্রপ অফ পয়েন্টের আগে যানবাহনটি ক্রমে ভ্রমণ করতে হবে এমন সমস্ত পথ রয়েছে। এটি গাড়ির অবশিষ্ট ওয়ে পয়েন্টগুলি থেকে গণনা করে। ব্যাক-টু-ব্যাক এবং কার্পুল ব্যবহারের ক্ষেত্রে, এই তালিকায় অন্যান্য ভ্রমণের পথ রয়েছে যা এই ভ্রমণের আগে অনুসরণ করা হবে, তবে এই ভ্রমণের পরে কোনও পথিক পয়েন্ট বাদ দেয়। তালিকার ওয়েপপয়েন্টটি এর TripId এবং WaypointType দ্বারা চিহ্নিত করা যেতে পারে।

ট্রিপ স্ট্যাটাস এবং যানবাহন অবশিষ্ট পথের মধ্যে সম্পর্ক

ফ্লিট ইঞ্জিন যখন ট্রিপ স্ট্যাটাস পরিবর্তনের অনুরোধ পাবে তখন গাড়ির অবশিষ্ট ওয়েপয়েন্টস ( আরপিসি | আরইএসটি ) আপডেট করা হবে। tripStatus ( আরপিসি | আরইএসটি ) অন্য স্থিতি থেকে enroute_to_xxx এ পরিবর্তন করা হলে পূর্ববর্তী ওয়েপয়েন্টটি গাড়ির অবশিষ্ট ওয়েপয়েন্টস তালিকা থেকে সরানো হবে। এটি হ'ল, যখন ট্রিপের স্থিতি enreoute_to_pickup থেকে আগত_এট_পিকআপে পরিবর্তন করা হয়, তখন ট্রিপের পিকআপ পয়েন্টটি এখনও গাড়ির অবশিষ্ট ওয়েপপয়েন্ট তালিকায় থাকবে, তবে যখন ট্রিপের স্থিতি enroute_to_intermediate_destination বা enreoute_to_dropoff এ পরিবর্তন করা হয়, তখন এর পিকআপ পয়েন্টটি তখন যানবাহনের রেটপয়েন্টগুলি থেকে সরানো হবে।

এটি আগত_এটি_ইন্টারমিডিয়েট_ডেস্টিনেশন এবং এনআরউইট_টো_আইন্টারমেডিয়েট_ডেস্টিশন এর জন্য একই। যখন আগত_এটি_আইন্টারমিডিয়েট_ডেস্টিনেশন, বর্তমান মধ্যবর্তী গন্তব্যটি গাড়ির অবশিষ্ট ওয়েপয়েন্ট তালিকা থেকে সরানো হবে না যতক্ষণ না যানবাহনটি পরবর্তী ওয়ে পয়েন্টে প্রবেশ করে না।

যখন ট্রিপের স্থিতি COMPLETED করা হয়, তখন এই ট্রিপ থেকে কোনও ওয়েপপয়েন্টগুলি যানবাহনের অবশিষ্ট ওয়েপপয়েন্ট তালিকায় থাকবে না।

কীভাবে: একটি ট্রিপ তৈরি করুন

বহরের যানবাহনের সাথে ট্র্যাক এবং মেলে প্রতিটি ট্রিপ অনুরোধের জন্য একটি Trip সত্তা তৈরি করতে হবে। ট্রিপ তৈরি করতে CreateTripRequest সাথে CreateTrip এন্ডপয়েন্টটি ব্যবহার করুন।

একটি ট্রিপ তৈরি করতে নিম্নলিখিত বৈশিষ্ট্যগুলি প্রয়োজন:

  • parent - একটি স্ট্রিং যা গুগল ক্লাউড প্রকল্প তৈরি করার সময় তৈরি করা সরবরাহকারী আইডি অন্তর্ভুক্ত করে।
  • trip_id - রাইডশেয়ার সরবরাহকারী দ্বারা নির্মিত একটি স্ট্রিং।
  • trip - ট্রিপটি বর্ণনা করে বেসিক মেটাডেটা সহ ধারক।
    • trip_type - এনুম প্রতিনিধিত্ব করে যে ট্রিপটিতে একই গাড়িতে ( SHARED ) বা কেবল একক পার্টিতে আলাদা উত্স এবং গন্তব্য থেকে অন্য রাইডার থাকতে পারে কিনা ( EXCLUSIVE )।
    • pickup_point - ভ্রমণের মূল বিন্দুটি উপস্থাপন করে টার্মিনালোকেশন। আরপিসি রেফারেন্স বা বিশ্রাম রেফারেন্স দেখুন

আপনি যখন কোনও ট্রিপ তৈরি করেন, আপনি number_of_passengers , dropoff_point এবং vehicle_id সরবরাহ করতে পারেন। যদিও এই ক্ষেত্রগুলির প্রয়োজন হয় না, আপনি যদি সেগুলি সরবরাহ করেন তবে সেগুলি ধরে রাখা হয়। অন্যান্য সমস্ত ট্রিপ ক্ষেত্রগুলি উপেক্ষা করা হয়। উদাহরণস্বরূপ, সমস্ত ট্রিপগুলি NEW একটি trip_status দিয়ে শুরু হয় এমনকি যদি আপনি সৃষ্টির অনুরোধে CANCELED trip_status পাস করেন।

উদাহরণ

নিম্নলিখিত উদাহরণটি গ্র্যান্ড ইন্দোনেশিয়া পূর্ব মলে ভ্রমণ তৈরি করে। ট্রিপটি দুটি যাত্রীর জন্য এবং একচেটিয়া। Trip provider_id অবশ্যই প্রজেক্ট আইডির মতো হতে হবে। উদাহরণস্বরূপ, রাইডশেয়ার সরবরাহকারী গুগল ক্লাউড প্রকল্প, project-id তৈরি করেছে। এই প্রকল্পের অবশ্যই ফ্লিট ইঞ্জিনে কল করার জন্য পরিষেবা অ্যাকাউন্ট থাকতে হবে। ভ্রমণের স্থিতি NEW

পরে, পরিষেবাটি কোনও গাড়িতে ভ্রমণের সাথে মেলে, পরিষেবাটি যখন কোনও গাড়ীতে ট্রিপ বরাদ্দ করা হয় তখন UpdateTrip কল করতে এবং vehicle_id পরিবর্তন করতে পারে।

শেল

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

সরবরাহকারী.ট্রিপস। ক্রিয়েট রেফারেন্স দেখুন।

জাভা

static final String PROJECT_ID = "project-id";

TripServiceBlockingStub tripService = TripService.newBlockingStub(channel);

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

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

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

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

গুগল ক্লাউড প্ল্যাটফর্ম ট্রিপ তৈরির জন্য লগ

ফ্লিট ইঞ্জিন এপিআই যখন CreateTrip এন্ডপয়েন্টে কল পাওয়া যায় তখন গুগল ক্লাউড প্ল্যাটফর্ম লগগুলি ব্যবহার করে একটি লগ এন্ট্রি লিখে। লগ এন্ট্রি CreateTrip অনুরোধের মানগুলি সম্পর্কে তথ্য অন্তর্ভুক্ত করে। যদি কলটি সফল হয় তবে এতে ফিরে আসা Trip সম্পর্কে তথ্যও অন্তর্ভুক্ত করা হবে।

কীভাবে: একটি ট্রিপ আপডেট করুন

ট্রিপ সত্তায় এমন ক্ষেত্র রয়েছে যা পরিষেবা দ্বারা ট্র্যাকিং সক্ষম করে এবং ড্রাইভার এসডিকে এবং কনজিউমার এসডিকে দ্বারা ট্রিপের অগ্রগতির প্রতিবেদন করার জন্য। বৈশিষ্ট্যগুলি আপডেট করতে, UpdateTripRequest বার্তা ব্যবহার করুন। এটি অনুরোধের field_mask অনুযায়ী ট্রিপ ক্ষেত্রগুলি আপডেট করে। আপডেটট্রিপ্রেকুয়েস্ট দেখুন।

রাইডশেয়ার সরবরাহকারী নিম্নলিখিত বৈশিষ্ট্যগুলি আপডেট করার জন্য দায়বদ্ধ:

  • ট্রিপ স্ট্যাটাস।
  • যানবাহন আইডি। হয় সৃষ্টির সময়, বা যানবাহনটি ভ্রমণের সাথে মিলে যাওয়ার পরে।
  • পিকআপ, ড্রপ অফ বা ওয়েপয়েন্টগুলিতে পরিবর্তন।

ড্রাইভার এসডিকে বা কনজিউমার এসডিকে মাধ্যমে জার্নি ভাগ করে নেওয়ার বৈশিষ্ট্যটি ব্যবহার করার সময় ফ্লিট ইঞ্জিনটি স্বয়ংক্রিয়ভাবে নিম্নলিখিত ক্ষেত্রগুলি আপডেট করে:

  • রুট
  • ETA
  • বাকি দূরত্ব
  • গাড়ির অবস্থান
  • অবশিষ্ট পথ

আরপিসিতে Trip বা Resource.Trip ট্রিপ দেখুন।

ট্রিপ আপডেটের জন্য গুগল ক্লাউড প্ল্যাটফর্ম লগ

ফ্লিট ইঞ্জিন এপিআই যখন UpdateTrip এন্ডপয়েন্টে কল পাওয়া যায় তখন গুগল ক্লাউড প্ল্যাটফর্ম লগগুলি ব্যবহার করে একটি লগ এন্ট্রি লিখে। লগ এন্ট্রি UpdateTrip অনুরোধের মানগুলি সম্পর্কে তথ্য অন্তর্ভুক্ত করে। যদি কলটি সফল হয় তবে এতে ফিরে আসা Trip সম্পর্কে তথ্যও অন্তর্ভুক্ত করা হবে।

কীভাবে: অনুসন্ধান ট্রিপস

ফ্লিট ইঞ্জিন ভ্রমণের জন্য অনুসন্ধান সমর্থন করে। পূর্বে উল্লিখিত হিসাবে, একটি ট্রিপ সাত দিন পরে স্বয়ংক্রিয়ভাবে মুছে ফেলা হয়, তাই SearchTrips সমস্ত ভ্রমণের সম্পূর্ণ ইতিহাস প্রকাশ করে না।

যদিও SearchTrips একটি নমনীয় এপিআই, নীচের তালিকাটি দুটি ব্যবহারের ক্ষেত্রে বিবেচনা করে।

  • একটি গাড়ির সক্রিয় ট্রিপগুলি নির্ধারণ করা - সরবরাহকারী কোনও গাড়ির বর্তমানে সক্রিয় ট্রিপগুলি নির্ধারণ করতে পারে। SearchTripsRequest মধ্যে, vehicle_id বিবেচনাধীন যানবাহনে সেট করা আছে এবং active_trips_only true সেট করা উচিত।

  • সরবরাহকারী এবং ফ্লিট ইঞ্জিন স্টেটের পুনর্মিলন - সরবরাহকারী তাদের ট্রিপ স্টেট এবং ফ্লিট ইঞ্জিন ম্যাচটি নিশ্চিত করতে SearchTrips ব্যবহার করতে পারে। এটি ট্রিপস্ট্যাটাসের জন্য বিশেষত গুরুত্বপূর্ণ। যদি কোনও যানবাহনে নির্ধারিত ট্রিপের অবস্থা সঠিকভাবে COMPLETE বা CANCELED জন্য সেট না করা হয় তবে যানবাহনটি SearchVehicles মাধ্যমে অন্তর্ভুক্ত করা হয় না।

এইভাবে SearchTrips ব্যবহার করতে, vehicle_id খালি রেখে দিন, active_trips_only কেবলমাত্র true সেট করুন এবং বেশিরভাগ ট্রিপের সময়কালের চেয়ে বেশি সময়ে minimum_staleness সেট করুন। উদাহরণস্বরূপ, আপনি এক ঘন্টা ব্যবহার করতে পারেন। ফলাফলগুলির মধ্যে এমন ট্রিপগুলি অন্তর্ভুক্ত রয়েছে যা সম্পূর্ণ বা বাতিল নয় এবং এক ঘন্টারও বেশি সময় আপডেট করা হয়নি। বহর ইঞ্জিনে তাদের স্থিতি সঠিকভাবে আপডেট হয়েছে তা নিশ্চিত করার জন্য সরবরাহকারীর এই ট্রিপগুলি পরীক্ষা করা উচিত।

সমস্যা সমাধান

একটি DEADLINE_EXCEEDED ত্রুটির ক্ষেত্রে, বহর ইঞ্জিনের অবস্থা অজানা। সরবরাহকারীর আবার CreateTrip কল করা উচিত, যা হয় একটি 201 (তৈরি) বা 409 (সংঘাত) প্রদান করে। পরবর্তী ক্ষেত্রে, পূর্ববর্তী অনুরোধটি DEADLINE_EXCEEDED আগে সফল হয়েছিল। ট্রিপ ত্রুটিগুলি পরিচালনা করার বিষয়ে আরও তথ্যের জন্য গ্রাহক এপিআই গাইডগুলি দেখুন: অ্যান্ড্রয়েড বা আইওএস

কার্পুল রাইড সমর্থন

আপনি TripType.SHARED সমর্থন করে এমন কোনও যানবাহনে একাধিক SHARED ট্রিপগুলি বরাদ্দ করতে পারেন। আপনি যখন ভাগ করে নেওয়া ভ্রমণের জন্য vehicle_id (একটি CreateTrip বা UpdateTrip অনুরোধে) বরাদ্দ Trip.vehicle_waypoints তখন আপনাকে এই ভাগ করে নেওয়া যাত্রায় যানবাহনের জন্য নির্ধারিত সমস্ত ট্রিপের জন্য সমস্ত আনপাসড ওয়েপপয়েন্টগুলির ক্রম নির্দিষ্ট করতে হবে। আরপিসির জন্য vehicle_waypoints বা বিশ্রামের জন্য vehicleWaypoints দেখুন।

Multiple destinations support

Identify an intermediate destination

The field intermediateDestinations and field intermediateDestinationIndex in Trip ( RPC | REST ) are combined to be used to indicate the destination.

Update intermediate destination

You can update the intermediate destinations via UpdateTrip . When updating intermediate destinations, you must provide a complete list of intermediate destinations, including those that have been visited, not just the one newly added or to-be-modified. When the intermediateDestinationIndex points to an index after the position of newly added/modified intermediate destination, the new/updated intermediate destination will not be added to Vehicle's waypoints or Trip's remainingWaypoints . The reason is that any intermediate destinations before intermediateDestinationIndex are treated as already visited.

Trip status changes

The field intermediateDestinationsVersion in ( RPC | REST ) is required in the Trip status update request sent to Fleet Engine to indicate an intermediate destination has passed. The targeted intermediate destination is specified via the field intermediateDestinationIndex . When tripStatus ( RPC | REST ) is ENROUTE_TO_INTERMEDIATE_DESTINATION, a number between [0..N-1] indicates which intermediate destination the vehicle will cross next. When tripStatus is ARRIVED_AT_INTERMEDIATE_DESTINATION, a number between [0..N-1] indicates which intermediate destination the vehicle is at.

উদাহরণ

The following code example demonstrates how to update a trip's status to enroute to its first intermediate destination, assuming that you have created a multi-destination trip and the trip has passed its pickup point.

জাভা

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

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

TripServiceBlockingStub tripService = TripService.newBlockingStub(channel);

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

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

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

HOW-TO: Subscribe to notification messages from the Fleet Engine API

The Fleet Engine API uses Google Cloud Pub/Sub to publish notifications on the topic created by the consumer Google Cloud Project. Pub/Sub is not enabled by default for Fleet Engine on your Google Cloud project. Please file a support case or contact your Customer Engineer to enable Pub/Sub.

In order to create a topic on your Cloud Project, follow these instructions. The topic ID must be 'fleet_engine_notifications'.

The topic must be created in the same Cloud project that is calling Fleet Engine APIs.

Once the topic is created, you will need to grant the Fleet Engine API permission to publish on the topic. In order to do so, click on the topic you just created and add a new permission. You might have to click on SHOW INFO PANEL to open the permissions editor. The principal should be geo-fleet-engine@system.gserviceaccount.com and the role should be Pub/Sub publisher .

In order to setup your Cloud Project to subscribe to notifications, follow these instructions

The Fleet Engine API will publish each notification in two different data formats, protobuf and json . The data format for each notification is denoted in the PubsubMessage attributes with the key as data_format and value as protobuf or json .

Notification schema:

প্রোটোবাফ

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

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

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

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

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

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

JSON

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

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

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

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

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