Nav SDK-এর মাধ্যমে মোবাইল সম্পদ ট্র্যাক করতে জিওফেন্সেস ক্লায়েন্ট-সাইড ট্রিগার করুন

এই ডকুমেন্টটিতে বর্ণনা করা হয়েছে যে ক্লায়েন্ট-সাইড জিওফেন্সিং কী, কখন এটি ব্যবহার করতে হয় এবং একটি মোবাইল অ্যাপ্লিকেশনের বিভিন্ন ক্ষেত্রে কীভাবে এটি প্রয়োগ করতে হয়। এছাড়াও, গুগল নেভিগেশন এসডিকে (Google Navigation SDK) ব্যবহার করে অ্যান্ড্রয়েডে একটি উদাহরণ কীভাবে বাস্তবায়ন করতে হয়, তাও এতে দেখানো হয়েছে।

জিওফেন্স সনাক্তকরণ সহ নেভ এসডিকে
জিওফেন্স সনাক্তকরণ সহ নেভ এসডিকে

কোনো মোবাইল ডিভাইস কখন একটি নির্দিষ্ট এলাকায় প্রবেশ করে বা এলাকাটি ছেড়ে যায়, তা কোম্পানিগুলোর প্রায়শই জানার প্রয়োজন হয়। ভার্চুয়াল ভৌগোলিক সীমানা বা জিওফেন্স বজায় রাখার মাধ্যমে এটি সম্পন্ন করা হয়, যা কোনো ডিভাইস সীমানা অতিক্রম করলে সফটওয়্যারকে ইভেন্ট ট্রিগার করতে সক্ষম করে।

কোনো নির্দিষ্ট যানবাহন কখন একটি সীমানা অতিক্রম করে, তা বোঝা বিভিন্ন ক্ষেত্রে গুরুত্বপূর্ণ, যেমন:

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

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

পরিধি

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

  1. লঙ্ঘনের জন্য যে বহুভুজগুলো পরীক্ষা করা প্রয়োজন;
  2. ব্যবহারকারীর রিয়েল-টাইম অবস্থান
  3. বর্তমান অবস্থানটি কোনো বহুভুজের ভিতরে বা বাইরে আছে কিনা তা যাচাই করার যুক্তি।

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

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

  • যে অ্যাপটি এটি চালাচ্ছে, সেখান থেকে রাস্তার অবস্থান সংগ্রহ করা হয়। এটি অ্যান্ড্রয়েডের FusedLocationProvider (FLP)-এর চেয়ে বেশি নির্ভুল, কারণ এটি গুগলের সড়ক নেটওয়ার্ক ব্যবহার করে নিকটতম সড়ক অংশে অবস্থান শনাক্ত করে, যা ETA (আনুমানিক পৌঁছানোর সময়)-কে অনেক বেশি সঠিক করে তোলে এবং FLP থেকে অন্যান্য তথ্যও গ্রহণ করে।
  • ধাপে ধাপে দিকনির্দেশনার অভিজ্ঞতা, যা চালকদের রিয়েল-টাইম ট্র্যাফিক এবং পথের অন্যান্য সীমাবদ্ধতা বিবেচনা করে দক্ষতার সাথে এক স্থান থেকে অন্য স্থানে পৌঁছাতে সাহায্য করে।
  • ইভেন্ট লিসেনার এবং রেজিস্টার্ড কলব্যাকের মাধ্যমে ইভেন্ট ফায়ার করা।

শ্রোতারা

নেভিগেশন এসডিকে-তে অনেকগুলো লিসেনার আছে যা আপনি ব্যবহার করতে পারেন। কয়েকটি হলো:

  • RoadSnappedLocation প্রদানকারীর মাধ্যমে অবস্থান পরিবর্তন করা যায়।
  • ReroutingListener-এর মাধ্যমে বিভিন্ন ঘটনা (যেমন ব্যবহারকারী ইউ-টার্ন, বাম মোড় ইত্যাদি মিস করলে এবং প্রস্তাবিত রুট থেকে বিচ্যুত হলে) রিরুট করুন।
  • ArrivalListener-এর মাধ্যমে আগমন ইভেন্ট (ব্যবহারকারী পরিকল্পিত গন্তব্যে পৌঁছালে)।
  • অবশিষ্ট দূরত্ব এবং আনুমানিক পৌঁছানোর সময় (ETA) ইভেন্ট (ড্রাইভার যখন গন্তব্যে পৌঁছানোর কাছাকাছি আসে - মিটারের উপর ভিত্তি করে, ড্রাইভার যখন গন্তব্যে পৌঁছানোর কাছাকাছি আসে - সময়ের উপর ভিত্তি করে) উভয়ই .RemainingTimeOrDistanceChangedListener- এর মাধ্যমে উপলব্ধ।

এই নির্দেশিকায় শুধুমাত্র RoadSnappedLocation Provider এবং এর LocationListener ব্যবহার করা হয়েছে।

ক্লায়েন্ট সাইড জিওফেন্সিং সমাধান

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

কার্যকরী চিত্র
কার্যকরী চিত্র

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

যানবাহনটি পথ ধরে চলার সময়, অ্যাপটি নিয়মিতভাবে পরীক্ষা করে দেখে যে পলিগনটি লঙ্ঘিত হয়েছে কি না। যখন অ্যাপটি শনাক্ত করে যে এটি একটি জিওফেন্স অতিক্রম করেছে, তখন UI-তে একটি বার্তা প্রদর্শিত হয়, যেখানে লেখা থাকে: জিওফেন্স লঙ্ঘিত হয়েছে

Android-Maps-Utils-এর জন্য নির্ভরতা কনফিগার করুন

এই সমাধানে Android-Maps-Utils ব্যবহার করা হয়েছে, যা একটি ওপেন-সোর্স লাইব্রেরি এবং এতে এমন সব ইউটিলিটি রয়েছে যা গুগল ম্যাপস অ্যান্ড্রয়েড এপিআই ব্যবহার করে বিভিন্ন ধরনের অ্যাপ্লিকেশনের জন্য উপযোগী।

এই লাইব্রেরিটি পাবলিক এবং গিটহাবে হোস্ট করা আছে এবং এটি এখানে অ্যাক্সেস করা যাবে:

  • অ্যান্ড্রয়েড : https://github.com/googlemaps/android-maps-utils
  • iOS : https://github.com/googlemaps/google-maps-ios-utils

আপনার অ্যান্ড্রয়েড অ্যাপে (এই ডকুমেন্টের আওতাভুক্ত) এই লাইব্রেরিটি অন্তর্ভুক্ত করতে, আপনাকে আপনার build.gradle ফাইলটি পরিবর্তন করে এটি যুক্ত করতে হবে। মনে রাখবেন যে এই build.gradle ফাইলটি প্রজেক্ট লেভেলের জন্য নয়, বরং আপনি যে মডিউলটি (অ্যাপ) বিল্ড করছেন তার জন্য।

dependencies {
   ...
   // Utilities for Maps SDK for Android (requires Google Play Services)
   implementation 'com.google.maps.android:android-maps-utils:2.3.0'
}

তারপর, আপনার সর্বশেষ build.gradle ফাইলের সাথে Gradle সিঙ্ক করার পরে, আপনি আপনার Java ফাইলে com.google.maps.android.PolyUtil ইম্পোর্ট করতে পারেন:

import com.google.android.gms.maps.model.PolygonOptions;
import com.google.maps.android.PolyUtil;

আপনার ভূ-বেড়া সংজ্ঞায়িত করুন

লক্ষ্য করুন, এখানেও PolygonOptions ইম্পোর্ট করা হচ্ছে। এর কারণ হলো, পলিগনকে উপস্থাপন করার জন্য এটিই ব্যবহৃত হচ্ছে:

mPolygonOptions = new PolygonOptions()
       .add(new LatLng(29.4264525,-98.4948758))
       .add(new LatLng(29.4267029,-98.4948758))
       .add(new LatLng(29.4273742,-98.4945822))
       .add(new LatLng(29.4264562,-98.4943592))
       .fillColor(0x0000ff36)
       .strokePattern(Arrays.asList(new Dash(45.0f), new Gap(10.0f)))
       .strokeColor(Color.BLUE)
       .strokeWidth(5);

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

PolygonOptions এ কী কী নির্দিষ্ট করা যায় সে সম্পর্কে আরও বিস্তারিত জানতে এখানে দেখুন।

আপনার Fragment বা Activity তৈরি করার সময়ই বহুভুজটি (polygon) নির্ধারণ করে নেওয়া উচিত। উদাহরণস্বরূপ:

protected void onCreate(Bundle savedInstanceState) {
   ...
   mPolygonOptions = new PolygonOptions()
           .add(new LatLng(29.4264525,-98.4948758))
           .add(new LatLng(29.4267029,-98.4948758))
           .add(new LatLng(29.4273742,-98.4945822))
           .add(new LatLng(29.4264562,-98.4943592))
           .fillColor(0x0000ff36)
           .strokePattern(Arrays.asList(new Dash(45.0f), new Gap(10.0f)))
           .strokeColor(Color.BLUE)
           .strokeWidth(5);

   ...// more code here
}

অবস্থানের আপডেটের জন্য শুনুন

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

mLocListener = new RoadSnappedLocationProvider.LocationListener() {
   @Override
   public void onLocationChanged(Location snapped) {
       LatLng snappedL = new LatLng(snapped.getLatitude(), snapped.getLongitude());
       if(PolyUtil.containsLocation(snappedL, mPolygonOptions.getPoints(), true) && !mGeofenceBreached){
           Log.d("Geofence", "Vehicle has breached the polygon");
       }
   }
   @Override
   public void onRawLocationUpdate(Location location) {
   }
};

Android-Maps-Utils ব্যবহার করে আপনি PolyUtil.containsLocation মাধ্যমে যাচাই করতে পারেন যে প্রাপ্ত অবস্থানটি পূর্বনির্ধারিত বহুভুজের ভিতরে আছে কিনা। নীচের উদাহরণে, জিওফেন্সকে প্রতিনিধিত্বকারী পূর্বনির্ধারিত বহুভুজটি ব্যবহার করা হয়েছে, কিন্তু বাস্তবে আপনার একাধিক বহুভুজ থাকতে পারে এবং সেক্ষেত্রে একটি লুপের প্রয়োজন হবে।

একটি বিকল্প পদ্ধতি

এই ডকুমেন্টটি একটি ক্লায়েন্ট-ফেসিং অ্যাপ্লিকেশনের উপর আলোকপাত করে, যা একটি কাস্টম জিওফেন্স (পলিগন) লঙ্ঘনের বিষয়টি পরীক্ষা করে। তবে এমন পরিস্থিতিও থাকতে পারে যেখানে আপনি আপনার ব্যাকএন্ডে এই ধরনের পরীক্ষা করতে চাইতে পারেন।

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

একটি সম্ভাব্য সমাধান নিম্নরূপ হবে:

[কার্যক্রম পরিবেশ] সার্ভার সাইড জিওফেন্সিং আর্কিটেকচার

জিওফেন্সিংয়ের জন্য একটি সার্ভার-সাইড পদ্ধতি প্রদর্শনকারী একটি উদাহরণ আর্কিটেকচার।

সার্ভার-সাইড সমাধান
সার্ভার-সাইড সমাধান

  1. ড্রাইভার অ্যাপটি ড্রাইভার এসডিকে ব্যবহার করে ফ্লিট ইঞ্জিনে অবস্থানের আপডেট পাঠায়। অবস্থানের আপডেট এবং অ্যাপের ভেতরের নেভিগেশন নেভিগেশন এসডিকে-এর মাধ্যমে সম্পন্ন হয়।
  2. ফ্লিট ইঞ্জিন সেই আপডেটগুলো ক্লাউড লগিং বা পাব/সাব-এ আউটপুট করে।
  3. ব্যাকএন্ড সেই অবস্থান সংকেতগুলো সংগ্রহ করে।
  4. ব্যাকএন্ডে বিশ্লেষণের জন্য জিওফেন্সগুলো বিগ কোয়েরিতে সংরক্ষণ করা হয়।
  5. জিওফেন্সটি সক্রিয় করা হলে ড্রাইভার অ্যাপে অ্যালার্ট পাঠানো হয়।

এই আর্কিটেকচারে ড্রাইভার এসডিকে এবং ফ্লিট ইঞ্জিন ব্যবহার করা হয়। ফ্লিট ইঞ্জিন পাবসাব আপডেট পাঠাতে এবং ক্লাউড লগিং-এ লগ এন্ট্রি তৈরি করতে পারে। উভয় ক্ষেত্রেই গাড়ির অবস্থান সংগ্রহ করা যায়।

এরপর ব্যাকএন্ডটি পাবসাব কিউ (PubSub queue) পর্যবেক্ষণ করতে পারে অথবা লগ পড়তে এবং গাড়ির আপডেটের দিকে নজর রাখতে পারে। তারপর, যখনই কোনো আপডেট হয় (অথবা এর গুরুত্বের ওপর নির্ভর করে প্রতি কয়েক সেকেন্ড বা মিনিটে), ব্যাকএন্ডটি কোনো নির্দিষ্ট গাড়ি জিওফেন্সের ভেতরে আছে নাকি বাইরে, তা নির্ধারণ করার জন্য বিগকোয়েরি জিআইএস (BigQuery GIS) ফাংশন কল করতে পারে। যদি এক বা একাধিক জিওফেন্স লঙ্ঘিত হয়, তবে ব্যাকএন্ডটি ব্যবস্থা নিতে পারে এবং অভ্যন্তরীণ পাইপলাইন বা অন্যান্য প্রাসঙ্গিক ওয়ার্কফ্লো চালু করতে পারে।

উপসংহার

জিওফেন্সিং একটি শক্তিশালী টুল যা বিভিন্ন উদ্দেশ্যে ব্যবহার করা যেতে পারে। ব্যবসা প্রতিষ্ঠানগুলো প্রাসঙ্গিক বিজ্ঞাপন ও প্রচারণার মাধ্যমে ব্যবহারকারীদের কাছে পৌঁছাতে, অবস্থান-ভিত্তিক পরিষেবা প্রদান করতে এবং নিরাপত্তা ও সুরক্ষা উন্নত করতে জিওফেন্সিং ব্যবহার করতে পারে।

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

পরবর্তী পদক্ষেপ

আরও পড়ার জন্য পরামর্শ: