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

ফ্লিট ইঞ্জিন অন-ডিমান্ড রাইডস এবং ডেলিভারি 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.ondemandAdmin
সমস্ত যানবাহন এবং ভ্রমণ সংস্থানগুলির জন্য পড়ার এবং লেখার অনুমতি দেয়। এই ভূমিকার অধ্যক্ষদের JWT ব্যবহার করার প্রয়োজন নেই এবং পরিবর্তে তাদের অ্যাপ্লিকেশন ডিফল্ট শংসাপত্র ব্যবহার করা উচিত। কাস্টম JWT দাবি উপেক্ষা করা হয়. এই ভূমিকা বিশ্বস্ত পরিবেশে সীমাবদ্ধ করা উচিত (গ্রাহক ব্যাকএন্ড)।
FleetEngine পরিষেবা সুপার ব্যবহারকারী **(অপ্রচলিত)**

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

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

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 পরিবর্তন করতে পারে। উদাহরণ স্বরূপ, আপনি এটি করবেন যখন একজন চালক রুটে চলাকালীন একটি ট্রিপ বাতিল করেন এবং ট্রিপটি অন্য যানবাহনে পুনরায় নিয়োগ করা হয়।

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

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

ট্রিপ এন্টিটিতে 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 ARRIVED_AT_INTERMEDIATE_DESTINATION হয়, তখন [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;
}

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

Fleet Engine API ব্যবহারকারী Google ক্লাউড প্রকল্প দ্বারা তৈরি বিষয়ের উপর বিজ্ঞপ্তি প্রকাশ করতে Google Cloud Pub/Sub ব্যবহার করে। আপনার Google ক্লাউড প্রজেক্টে ফ্লিট ইঞ্জিনের জন্য Pub/Sub ডিফল্টরূপে সক্ষম করা নেই। অনুগ্রহ করে একটি সমর্থন মামলা দায়ের করুন বা পাব/সাব সক্ষম করতে আপনার গ্রাহক প্রকৌশলীর সাথে যোগাযোগ করুন৷

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

বিষয়টি অবশ্যই একই ক্লাউড প্রকল্পে তৈরি করা উচিত যা ফ্লিট ইঞ্জিন APIs কল করছে৷

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

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

Fleet Engine API প্রতিটি বিজ্ঞপ্তি দুটি ভিন্ন ডেটা ফরম্যাটে, 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"
    }
  }
}