ওয়াই-ফাই সচেতন ওভারভিউ

Wi-Fi সচেতন ক্ষমতাগুলি Android 8.0 (API স্তর 26) এবং উচ্চতর চলমান ডিভাইসগুলিকে তাদের মধ্যে অন্য কোনো ধরনের সংযোগ ছাড়াই একে অপরের সাথে সরাসরি সংযোগ করতে এবং আবিষ্কার করতে সক্ষম করে৷ ওয়াই-ফাই অ্যাওয়ার নেবার অ্যাওয়ারনেস নেটওয়ার্কিং (NAN) নামেও পরিচিত।

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

Wi-Fi সচেতন API অ্যাপগুলিকে নিম্নলিখিত ক্রিয়াকলাপগুলি সম্পাদন করতে দেয়:

  • অন্যান্য ডিভাইসগুলি আবিষ্কার করুন: API-এর কাছে অন্যান্য আশেপাশের ডিভাইসগুলি খোঁজার জন্য একটি প্রক্রিয়া রয়েছে৷ প্রক্রিয়াটি শুরু হয় যখন একটি ডিভাইস এক বা একাধিক আবিষ্কারযোগ্য পরিষেবা প্রকাশ করে । তারপর, যখন একটি ডিভাইস এক বা একাধিক পরিষেবার সদস্যতা নেয় এবং প্রকাশকের Wi-Fi পরিসরে প্রবেশ করে, তখন গ্রাহক একটি বিজ্ঞপ্তি পায় যে একটি মিল প্রকাশক আবিষ্কৃত হয়েছে৷ গ্রাহক প্রকাশককে আবিষ্কার করার পরে, গ্রাহক হয় একটি সংক্ষিপ্ত বার্তা পাঠাতে বা আবিষ্কৃত ডিভাইসের সাথে একটি নেটওয়ার্ক সংযোগ স্থাপন করতে পারে। ডিভাইসগুলি একই সাথে প্রকাশক এবং গ্রাহক উভয়ই হতে পারে৷

  • একটি নেটওয়ার্ক সংযোগ তৈরি করুন: দুটি ডিভাইস একে অপরকে আবিষ্কার করার পরে তারা একটি অ্যাক্সেস পয়েন্ট ছাড়াই একটি দ্বি-নির্দেশিক Wi-Fi সচেতন নেটওয়ার্ক সংযোগ তৈরি করতে পারে।

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

Android 13 (API লেভেল 33) বর্ধিতকরণ

অ্যান্ড্রয়েড 13 (API স্তর 33) এবং উচ্চতর যে ডিভাইসগুলি তাত্ক্ষণিক যোগাযোগ মোড সমর্থন করে, সেগুলিতে অ্যাপগুলি PublishConfig.Builder.setInstantCommunicationModeEnabled() এবং SubscribeConfig.Builder.setInstantCommunicationModeEnabled() ব্যবহার করতে পারে যোগাযোগের মোডে সক্রিয় বা সাবস্ক্রাইব করার জন্য যোগাযোগযোগ্য পদ্ধতিগুলি আবিষ্কার সেশন। তাত্ক্ষণিক যোগাযোগ মোড বার্তা বিনিময়, পরিষেবা আবিষ্কার, এবং প্রকাশক বা গ্রাহক আবিষ্কার সেশনের অংশ হিসাবে সেট আপ করা যেকোন ডেটা-পাথকে গতি দেয়৷ একটি ডিভাইস তাৎক্ষণিক যোগাযোগ মোড সমর্থন করে কিনা তা নির্ধারণ করতে, isInstantCommunicationModeSupported() পদ্ধতি ব্যবহার করুন।

Android 12 (API লেভেল 31) বর্ধিতকরণ

অ্যান্ড্রয়েড 12 (এপিআই স্তর 31) Wi-Fi সচেতনতায় কিছু বর্ধন যোগ করে:

  • Android 12 (API লেভেল 31) বা উচ্চতর চলমান ডিভাইসগুলিতে, পরিষেবা বন্ধ বা পরিসরের বাইরে চলে যাওয়ার কারণে আপনার অ্যাপ যখন একটি আবিষ্কৃত পরিষেবা হারিয়েছে তখন সতর্ক করার জন্য আপনি onServiceLost() কলব্যাক ব্যবহার করতে পারেন।
  • Wi-Fi সচেতন ডেটা পাথের সেটআপ সরলীকৃত করা হয়েছে। পূর্ববর্তী সংস্করণগুলি সূচনাকারীর MAC ঠিকানা প্রদান করতে L2 মেসেজিং ব্যবহার করত, যা লেটেন্সি প্রবর্তন করেছিল। অ্যান্ড্রয়েড 12 এবং উচ্চতর চলমান ডিভাইসগুলিতে, উত্তরদাতা (সার্ভার) যেকোন পিয়ারকে গ্রহণ করার জন্য কনফিগার করা যেতে পারে—অর্থাৎ, এটিকে অগ্রিম সূচনাকারীর MAC ঠিকানা জানার প্রয়োজন নেই৷ এটি ডেটাপথ আনার গতি বাড়ায় এবং শুধুমাত্র একটি নেটওয়ার্ক অনুরোধের সাথে একাধিক পয়েন্ট-টু-পয়েন্ট লিঙ্ক সক্ষম করে।
  • Android 12 বা উচ্চতর সংস্করণে চলমান অ্যাপগুলি বর্তমানে উপলব্ধ ডেটা পাথের সংখ্যা পেতে, সেশনগুলি প্রকাশ করতে এবং সদস্যতা নেওয়ার জন্য WifiAwareManager.getAvailableAwareResources() পদ্ধতি ব্যবহার করতে পারে৷ এটি অ্যাপটিকে তাদের পছন্দসই কার্যকারিতা চালানোর জন্য যথেষ্ট উপলব্ধ সংস্থান আছে কিনা তা নির্ধারণ করতে সহায়তা করতে পারে।

প্রাথমিক সেটআপ

Wi-Fi Aware আবিষ্কার এবং নেটওয়ার্কিং ব্যবহার করার জন্য আপনার অ্যাপ সেট আপ করতে, নিম্নলিখিত পদক্ষেপগুলি সম্পাদন করুন:

  1. আপনার অ্যাপের ম্যানিফেস্টে নিম্নলিখিত অনুমতিগুলির জন্য অনুরোধ করুন:

    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <!-- If your app targets Android 13 (API level 33)
         or higher, you must declare the NEARBY_WIFI_DEVICES permission. -->
    <uses-permission android:name="android.permission.NEARBY_WIFI_DEVICES"
                     <!-- If your app derives location information from
                          Wi-Fi APIs, don't include the "usesPermissionFlags"
                          attribute. -->
                     android:usesPermissionFlags="neverForLocation" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"
                     <!-- If any feature in your app relies on precise location
                          information, don't include the "maxSdkVersion"
                          attribute. -->
                     android:maxSdkVersion="32" />
    
  2. ডিভাইসটি PackageManager API এর সাথে Wi-Fi Aware সমর্থন করে কিনা তা পরীক্ষা করুন, নীচে দেখানো হয়েছে:

    কোটলিন

    context.packageManager.hasSystemFeature(PackageManager.FEATURE_WIFI_AWARE)
    

    জাভা

    context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_WIFI_AWARE);
    
  3. Wi-Fi Aware বর্তমানে উপলব্ধ কিনা তা পরীক্ষা করুন৷ Wi-Fi Aware ডিভাইসে বিদ্যমান থাকতে পারে, কিন্তু বর্তমানে উপলব্ধ নাও হতে পারে কারণ ব্যবহারকারী Wi-Fi বা অবস্থান নিষ্ক্রিয় করেছে৷ তাদের হার্ডওয়্যার এবং ফার্মওয়্যার ক্ষমতার উপর নির্ভর করে, Wi-Fi Direct, SoftAP বা টিথারিং ব্যবহার করা হলে কিছু ডিভাইস Wi-Fi Aware সমর্থন নাও করতে পারে। Wi-Fi Aware বর্তমানে উপলব্ধ কিনা তা পরীক্ষা করতে, isAvailable() কল করুন।

    Wi-Fi Aware-এর উপলব্ধতা যেকোনো সময় পরিবর্তিত হতে পারে। ACTION_WIFI_AWARE_STATE_CHANGED পাওয়ার জন্য আপনার অ্যাপের একটি BroadcastReceiver রেজিস্টার করা উচিত, যা যখনই উপলব্ধতা পরিবর্তন হয় তখন পাঠানো হয়। যখন আপনার অ্যাপটি সম্প্রচারের অভিপ্রায় গ্রহণ করে, তখন এটিকে বিদ্যমান সমস্ত সেশন বাতিল করা উচিত (ধরে নিন যে Wi-Fi সচেতন পরিষেবা ব্যাহত হয়েছে), তারপরে উপলব্ধতার বর্তমান অবস্থা পরীক্ষা করুন এবং সেই অনুযায়ী এর আচরণ সামঞ্জস্য করুন। যেমন:

    কোটলিন

    val wifiAwareManager = context.getSystemService(Context.WIFI_AWARE_SERVICE) as WifiAwareManager?
    val filter = IntentFilter(WifiAwareManager.ACTION_WIFI_AWARE_STATE_CHANGED)
    val myReceiver = object : BroadcastReceiver() {
    
        override fun onReceive(context: Context, intent: Intent) {
            // discard current sessions
            if (wifiAwareManager?.isAvailable) {
                ...
            } else {
                ...
            }
        }
    }
    context.registerReceiver(myReceiver, filter)
    

    জাভা

    WifiAwareManager wifiAwareManager = 
            (WifiAwareManager)context.getSystemService(Context.WIFI_AWARE_SERVICE)
    IntentFilter filter =
            new IntentFilter(WifiAwareManager.ACTION_WIFI_AWARE_STATE_CHANGED);
    BroadcastReceiver myReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            // discard current sessions
            if (wifiAwareManager.isAvailable()) {
                ...
            } else {
                ...
            }
        }
    };
    context.registerReceiver(myReceiver, filter);
    

আরও তথ্যের জন্য, সম্প্রচার দেখুন।

একটি অধিবেশন প্রাপ্ত

Wi-Fi Aware ব্যবহার করা শুরু করতে, আপনার অ্যাপটিকে attach() কল করে একটি WifiAwareSession পেতে হবে। এই পদ্ধতি নিম্নলিখিত কাজ করে:

  • Wi-Fi সচেতন হার্ডওয়্যার চালু করে।
  • যোগদান বা একটি Wi-Fi সচেতন ক্লাস্টার গঠন করে৷
  • একটি অনন্য নামস্থান সহ একটি Wi-Fi সচেতন সেশন তৈরি করে যা এটির মধ্যে তৈরি সমস্ত আবিষ্কারের সেশনের জন্য একটি ধারক হিসাবে কাজ করে৷

অ্যাপটি সফলভাবে সংযুক্ত হলে, সিস্টেম onAttached() কলব্যাক চালায়। এই কলব্যাকটি একটি WifiAwareSession অবজেক্ট প্রদান করে যা আপনার অ্যাপকে পরবর্তী সমস্ত সেশন অপারেশনের জন্য ব্যবহার করা উচিত। একটি অ্যাপ একটি পরিষেবা প্রকাশ করতে বা একটি পরিষেবাতে সদস্যতা নিতে সেশনটি ব্যবহার করতে পারে৷

আপনার অ্যাপটি শুধুমাত্র একবার attach() কল করা উচিত। আপনার অ্যাপ কল attach() একাধিকবার করলে, অ্যাপ প্রতিটি কলের জন্য আলাদা সেশন পায়, প্রতিটির নিজস্ব নামস্থান। এটি জটিল পরিস্থিতিতে কার্যকর হতে পারে, তবে সাধারণত এড়ানো উচিত।

একটি পরিষেবা প্রকাশ করুন

একটি পরিষেবা আবিষ্কারযোগ্য করতে, publish() পদ্ধতিতে কল করুন, যা নিম্নলিখিত পরামিতিগুলি নেয়:

  • PublishConfig পরিষেবার নাম এবং অন্যান্য কনফিগারেশন বৈশিষ্ট্য যেমন ম্যাচ ফিল্টার নির্দিষ্ট করে।
  • DiscoverySessionCallback ইভেন্টগুলি ঘটলে চালানোর জন্য ক্রিয়াগুলি নির্দিষ্ট করে, যেমন যখন গ্রাহক একটি বার্তা পায়।

এখানে একটি উদাহরণ:

কোটলিন

val config: PublishConfig = PublishConfig.Builder()
        .setServiceName(AWARE_FILE_SHARE_SERVICE_NAME)
        .build()
awareSession.publish(config, object : DiscoverySessionCallback() {

    override fun onPublishStarted(session: PublishDiscoverySession) {
        ...
    }

    override fun onMessageReceived(peerHandle: PeerHandle, message: ByteArray) {
        ...
    }
})

জাভা

PublishConfig config = new PublishConfig.Builder()
    .setServiceName(“Aware_File_Share_Service_Name”)
    .build();

awareSession.publish(config, new DiscoverySessionCallback() {
    @Override
    public void onPublishStarted(PublishDiscoverySession session) {
        ...
    }
    @Override
    public void onMessageReceived(PeerHandle peerHandle, byte[] message) {
        ...
    }
}, null);

যদি প্রকাশনা সফল হয়, তাহলে onPublishStarted() কলব্যাক পদ্ধতি বলা হয়।

প্রকাশের পরে, যখন মিলিত গ্রাহক অ্যাপ্লিকেশনগুলি চলমান ডিভাইসগুলি প্রকাশনা ডিভাইসের Wi-Fi পরিসরে চলে যায়, তখন গ্রাহকরা পরিষেবাটি আবিষ্কার করেন। যখন একজন গ্রাহক একজন প্রকাশককে আবিষ্কার করেন, তখন প্রকাশক কোনো বিজ্ঞপ্তি পান না; যদি গ্রাহক প্রকাশককে একটি বার্তা পাঠান, তবে, প্রকাশক একটি বিজ্ঞপ্তি পাবেন। যখন এটি ঘটে, onMessageReceived() কলব্যাক পদ্ধতি বলা হয়। আপনি গ্রাহকের কাছে একটি বার্তা পাঠাতে বা এটির সাথে একটি সংযোগ তৈরি করতে এই পদ্ধতি থেকে PeerHandle যুক্তি ব্যবহার করতে পারেন।

পরিষেবাটি প্রকাশ করা বন্ধ করতে, DiscoverySession.close() এ কল করুন। ডিসকভারি সেশনগুলি তাদের প্যারেন্ট WifiAwareSession এর সাথে যুক্ত। অভিভাবক অধিবেশন বন্ধ থাকলে, এর সাথে সম্পর্কিত আবিষ্কার সেশনগুলিও বন্ধ থাকে৷ যখন বাতিল করা বস্তুগুলিও বন্ধ থাকে, সিস্টেমটি গ্যারান্টি দেয় না কখন সুযোগের বাইরের সেশনগুলি বন্ধ থাকে, তাই আমরা সুপারিশ করি যে আপনি স্পষ্টভাবে close() পদ্ধতিগুলিকে কল করুন৷

একটি পরিষেবাতে সদস্যতা নিন

একটি পরিষেবাতে সদস্যতা নিতে, subscribe() পদ্ধতিতে কল করুন, যা নিম্নলিখিত পরামিতিগুলি নেয়:

  • SubscribeConfig সাবস্ক্রাইব করার জন্য পরিষেবার নাম এবং অন্যান্য কনফিগারেশন বৈশিষ্ট্য, যেমন ম্যাচ ফিল্টার উল্লেখ করে।
  • DiscoverySessionCallback ইভেন্টগুলি ঘটলে চালানোর ক্রিয়াগুলি নির্দিষ্ট করে, যেমন যখন একজন প্রকাশককে আবিষ্কার করা হয়।

এখানে একটি উদাহরণ:

কোটলিন

val config: SubscribeConfig = SubscribeConfig.Builder()
        .setServiceName(AWARE_FILE_SHARE_SERVICE_NAME)
        .build()
awareSession.subscribe(config, object : DiscoverySessionCallback() {

    override fun onSubscribeStarted(session: SubscribeDiscoverySession) {
        ...
    }

    override fun onServiceDiscovered(
            peerHandle: PeerHandle,
            serviceSpecificInfo: ByteArray,
            matchFilter: List<ByteArray>
    ) {
        ...
    }
}, null)

জাভা

SubscribeConfig config = new SubscribeConfig.Builder()
    .setServiceName("Aware_File_Share_Service_Name")
    .build();

awareSession.subscribe(config, new DiscoverySessionCallback() {
    @Override
    public void onSubscribeStarted(SubscribeDiscoverySession session) {
        ...
    }

    @Override
    public void onServiceDiscovered(PeerHandle peerHandle,
            byte[] serviceSpecificInfo, List<byte[]> matchFilter) {
        ...
    }
}, null);

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

এই মুহুর্তে, আপনার সদস্যতা মিলিত প্রকাশকদের ওয়াই-ফাই পরিসরে আসার জন্য অপেক্ষা করে। যখন এটি ঘটে, সিস্টেমটি onServiceDiscovered() কলব্যাক পদ্ধতিটি চালায়। আপনি একটি বার্তা পাঠাতে বা সেই প্রকাশকের সাথে একটি সংযোগ তৈরি করতে এই কলব্যাক থেকে PeerHandle আর্গুমেন্ট ব্যবহার করতে পারেন৷

একটি পরিষেবার সদস্যতা বন্ধ করতে, DiscoverySession.close() কল করুন। ডিসকভারি সেশনগুলি তাদের প্যারেন্ট WifiAwareSession এর সাথে যুক্ত। অভিভাবক অধিবেশন বন্ধ থাকলে, এর সাথে সম্পর্কিত আবিষ্কার সেশনগুলিও বন্ধ থাকে৷ যখন বাতিল করা বস্তুগুলিও বন্ধ থাকে, সিস্টেমটি গ্যারান্টি দেয় না কখন সুযোগের বাইরের সেশনগুলি বন্ধ থাকে, তাই আমরা সুপারিশ করি যে আপনি স্পষ্টভাবে close() পদ্ধতিগুলিকে কল করুন৷

একটি বার্তা পাঠান

অন্য ডিভাইসে একটি বার্তা পাঠাতে, আপনার নিম্নলিখিত বস্তুর প্রয়োজন:

  • একটি DiscoverySession । এই বস্তুটি আপনাকে sendMessage() কল করতে দেয়। আপনার অ্যাপটি একটি পরিষেবা প্রকাশ করে বা কোনও পরিষেবাতে সদস্যতা নিয়ে একটি DiscoverySession পায়৷

  • অন্য ডিভাইসের PeerHandle , বার্তাটি রুট করতে। আপনার অ্যাপটি দুটি উপায়ের একটিতে অন্য ডিভাইসের PeerHandle পায়:

    • আপনার অ্যাপ একটি পরিষেবা প্রকাশ করে এবং একজন গ্রাহকের কাছ থেকে একটি বার্তা পায়। আপনার অ্যাপটি onMessageReceived() কলব্যাক থেকে গ্রাহকের PeerHandle পায়।
    • আপনার অ্যাপ একটি পরিষেবার সদস্যতা নিয়েছে৷ তারপর, যখন এটি একটি মিল প্রকাশককে আবিষ্কার করে, তখন আপনার অ্যাপটি onServiceDiscovered() কলব্যাক থেকে প্রকাশকের PeerHandle পায়।

একটি বার্তা পাঠাতে, sendMessage() কল করুন। নিম্নলিখিত কলব্যাকগুলি তখন ঘটতে পারে:

  • পিয়ারের দ্বারা বার্তাটি সফলভাবে প্রাপ্ত হলে, সিস্টেমটি প্রেরণ অ্যাপে onMessageSendSucceeded() কলব্যাককে কল করে৷
  • যখন পিয়ার একটি বার্তা পায়, সিস্টেমটি গ্রহনকারী অ্যাপে onMessageReceived() কলব্যাক কল করে।

যদিও সমবয়সীদের সাথে যোগাযোগ করার জন্য PeerHandle প্রয়োজন হয়, আপনার সহকর্মীদের স্থায়ী সনাক্তকারী হিসাবে এটির উপর নির্ভর করা উচিত নয়। উচ্চ-স্তরের শনাক্তকারী অ্যাপ্লিকেশন দ্বারা ব্যবহার করা যেতে পারে--এম্বেড করা আবিষ্কার পরিষেবাতে বা পরবর্তী বার্তাগুলিতে। আপনি PublishConfig বা SubscribeConfig এর setMatchFilter() বা setServiceSpecificInfo() পদ্ধতির মাধ্যমে আবিষ্কার পরিষেবাতে একটি শনাক্তকারী এম্বেড করতে পারেন। setMatchFilter() পদ্ধতি আবিষ্কারকে প্রভাবিত করে, যেখানে setServiceSpecificInfo() পদ্ধতি আবিষ্কারকে প্রভাবিত করে না।

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

একটি সংযোগ তৈরি করুন

Wi-Fi Aware দুটি Wi-Fi Aware ডিভাইসের মধ্যে ক্লায়েন্ট-সার্ভার নেটওয়ার্কিং সমর্থন করে।

ক্লায়েন্ট-সার্ভার সংযোগ সেট আপ করতে:

  1. একটি পরিষেবা (সার্ভারে) প্রকাশ করতে এবং একটি পরিষেবাতে (ক্লায়েন্টে) সদস্যতা নিতে Wi-Fi সচেতন আবিষ্কার ব্যবহার করুন।

  2. একবার গ্রাহক প্রকাশককে আবিষ্কার করলে, গ্রাহকের কাছ থেকে প্রকাশকের কাছে একটি বার্তা পাঠান

  3. প্রকাশক ডিভাইসে একটি ServerSocket শুরু করুন এবং হয় এর পোর্ট সেট করুন বা প্রাপ্ত করুন:

    কোটলিন

    val ss = ServerSocket(0)
    val port = ss.localPort
    

    জাভা

    ServerSocket ss = new ServerSocket(0);
    int port = ss.getLocalPort();
    
  4. একটি WifiAwareNetworkSpecifier ব্যবহার করে প্রকাশকের একটি Wi-Fi সচেতন নেটওয়ার্কের অনুরোধ করতে ConnectivityManager ব্যবহার করুন, আবিষ্কারের সেশন এবং গ্রাহকের PeerHandle উল্লেখ করে, যা আপনি গ্রাহকের দ্বারা প্রেরিত বার্তা থেকে পেয়েছেন:

    কোটলিন

    val networkSpecifier = WifiAwareNetworkSpecifier.Builder(discoverySession, peerHandle)
        .setPskPassphrase("somePassword")
        .setPort(port)
        .build()
    val myNetworkRequest = NetworkRequest.Builder()
        .addTransportType(NetworkCapabilities.TRANSPORT_WIFI_AWARE)
        .setNetworkSpecifier(networkSpecifier)
        .build()
    val callback = object : ConnectivityManager.NetworkCallback() {
        override fun onAvailable(network: Network) {
            ...
        }
    
        override fun onCapabilitiesChanged(network: Network, networkCapabilities: NetworkCapabilities) {
            ...
        }
    
        override fun onLost(network: Network) {
            ...
        }
    }
    
    connMgr.requestNetwork(myNetworkRequest, callback);
    

    জাভা

    NetworkSpecifier networkSpecifier = new WifiAwareNetworkSpecifier.Builder(discoverySession, peerHandle)
        .setPskPassphrase("somePassword")
        .setPort(port)
        .build();
    NetworkRequest myNetworkRequest = new NetworkRequest.Builder()
        .addTransportType(NetworkCapabilities.TRANSPORT_WIFI_AWARE)
        .setNetworkSpecifier(networkSpecifier)
        .build();
    ConnectivityManager.NetworkCallback callback = new ConnectivityManager.NetworkCallback() {
        @Override
        public void onAvailable(Network network) {
            ...
        }
    
        @Override
        public void onCapabilitiesChanged(Network network, NetworkCapabilities networkCapabilities) {
            ...
        }
    
        @Override
        public void onLost(Network network) {
            ...
        }
    };
    
    ConnectivityManager connMgr.requestNetwork(myNetworkRequest, callback);
    
  5. একবার প্রকাশক একটি নেটওয়ার্কের অনুরোধ করলে এটি গ্রাহককে একটি বার্তা পাঠাতে হবে।

  6. একবার গ্রাহক প্রকাশকের কাছ থেকে বার্তাটি পেয়ে গেলে, প্রকাশকের মতো একই পদ্ধতি ব্যবহার করে গ্রাহকের কাছে একটি Wi-Fi সচেতন নেটওয়ার্কের অনুরোধ করুন৷ NetworkSpecifier তৈরি করার সময় একটি পোর্ট নির্দিষ্ট করবেন না। নেটওয়ার্ক সংযোগ উপলব্ধ, পরিবর্তিত বা হারিয়ে গেলে উপযুক্ত কলব্যাক পদ্ধতিগুলি বলা হয়৷

  7. একবার গ্রাহকের উপর onAvailable() পদ্ধতিটি কল করা হলে, একটি Network অবজেক্ট উপলব্ধ থাকে যার সাহায্যে আপনি প্রকাশকের ServerSocket সাথে যোগাযোগ করার জন্য একটি Socket খুলতে পারেন, তবে আপনাকে ServerSocket IPv6 ঠিকানা এবং পোর্ট জানতে হবে। আপনি onCapabilitiesChanged() কলব্যাকে সরবরাহ করা NetworkCapabilities অবজেক্ট থেকে এগুলি পাবেন:

    কোটলিন

    val peerAwareInfo = networkCapabilities.transportInfo as WifiAwareNetworkInfo
    val peerIpv6 = peerAwareInfo.peerIpv6Addr
    val peerPort = peerAwareInfo.port
    ...
    val socket = network.getSocketFactory().createSocket(peerIpv6, peerPort)
    

    জাভা

    WifiAwareNetworkInfo peerAwareInfo = (WifiAwareNetworkInfo) networkCapabilities.getTransportInfo();
    Inet6Address peerIpv6 = peerAwareInfo.getPeerIpv6Addr();
    int peerPort = peerAwareInfo.getPort();
    ...
    Socket socket = network.getSocketFactory().createSocket(peerIpv6, peerPort);
    
  8. আপনার নেটওয়ার্ক সংযোগ শেষ হলে, unregisterNetworkCallback() কল করুন।

রেঞ্জিং সহকর্মী এবং অবস্থান-সচেতন আবিষ্কার

Wi-Fi RTT অবস্থান ক্ষমতা সহ একটি ডিভাইস সরাসরি সহকর্মীদের দূরত্ব পরিমাপ করতে পারে এবং Wi-Fi সচেতন পরিষেবা আবিষ্কারকে সীমাবদ্ধ করতে এই তথ্য ব্যবহার করতে পারে।

Wi-Fi RTT API এর MAC ঠিকানা বা এর PeerHandle ব্যবহার করে Wi-Fi সচেতন সমকক্ষের সাথে সরাসরি রেঞ্জিং করার অনুমতি দেয়৷

Wi-Fi সচেতন আবিষ্কার শুধুমাত্র একটি নির্দিষ্ট জিওফেন্সের মধ্যে পরিষেবাগুলি আবিষ্কার করার জন্য সীমাবদ্ধ হতে পারে। উদাহরণস্বরূপ, আপনি একটি জিওফেন্স সেট আপ করতে পারেন যা একটি "Aware_File_Share_Service_Name" পরিষেবা প্রকাশ করে এমন একটি ডিভাইস আবিষ্কার করতে দেয় যা 3 মিটারের বেশি (3,000 মিমি হিসাবে নির্দিষ্ট) এবং 10 মিটারের বেশি নয় (10,000 মিমি হিসাবে নির্দিষ্ট)৷

জিওফেন্সিং সক্ষম করতে, প্রকাশক এবং গ্রাহক উভয়কেই পদক্ষেপ নিতে হবে:

  • প্রকাশককে অবশ্যই setRangingEnabled(true) ব্যবহার করে প্রকাশিত পরিষেবাতে পরিসর সক্ষম করতে হবে।

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

  • গ্রাহককে setMinDistanceMm এবং setMaxDistanceMm এর কিছু সমন্বয় ব্যবহার করে একটি জিওফেন্স নির্দিষ্ট করতে হবে।

    উভয় মানের জন্য, একটি অনির্দিষ্ট দূরত্ব কোন সীমা বোঝায় না। শুধুমাত্র সর্বোচ্চ দূরত্ব নির্দিষ্ট করা মানে ন্যূনতম দূরত্ব 0। শুধুমাত্র ন্যূনতম দূরত্ব নির্দিষ্ট করা মানে সর্বোচ্চ নয়।

যখন একটি জিওফেন্সের মধ্যে একটি পিয়ার পরিষেবা আবিষ্কৃত হয়, তখন onServiceDiscoveredWithinRange কলব্যাকটি ট্রিগার হয়, যা পিয়ারকে পরিমাপ করা দূরত্ব প্রদান করে। পরবর্তী সময়ে দূরত্ব পরিমাপের জন্য প্রয়োজনীয় হিসাবে সরাসরি Wi-Fi RTT API কল করা যেতে পারে।