Wi-Fi Aware এক নজরে

Wi-Fi Aware-এর ক্ষমতা Android 8.0 (API লেভেল ২৬) এবং তার পরবর্তী ভার্সনে চলা ডিভাইসকে অন্য কোনও ধরনের কানেক্টিভিটি ছাড়াই একে অপরের সাথে সরাসরি কানেক্ট করতে সাহায্য করে। Wi-Fi Aware-কে নেইবার অ্যাওয়ারনেস নেটওয়ার্কিং (NAN) নামেও ডাকা হয়।

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

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

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

  • নেটওয়ার্ক কানেকশন তৈরি করা: দুটি ডিভাইস একে অপরকে খুঁজে পাওয়ার পরে, তারা অ্যাক্সেস পয়েন্ট ছাড়াই দ্বিমুখী Wi-Fi Aware নেটওয়ার্ক কানেকশন তৈরি করতে পারে।

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

Android 13 (API লেভেল 33) সংক্রান্ত উন্নতি

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

Android 12 (API লেভেল 31) সংক্রান্ত উন্নতি

Android 12 (API লেভেল ৩১) Wi-Fi Aware-এ কিছু উন্নতি যোগ করে:

  • Android 12 (API লেভেল 31) বা তার পরবর্তী যেকোনও ভার্সনে রান করা ডিভাইসে, আপনি onServiceLost() কলব্যাক ব্যবহার করতে পারবেন যাতে পরিষেবা বন্ধ হয়ে যাওয়া বা রেঞ্জের বাইরে চলে যাওয়ার কারণে আপনার অ্যাপ কোনও খুঁজে পাওয়া পরিষেবা হারিয়ে ফেললে আপনাকে সতর্ক করা যায়।
  • Wi-Fi Aware ডেটা পাথের সেট-আপ আরও সহজ করা হয়েছে। আগের ভার্সনে ইনিশিয়েটরের MAC অ্যাড্রেস প্রদান করার জন্য L2 মেসেজিং ব্যবহার করা হত, যার ফলে দেরি হত। Android 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-এর সাথে কাজ করে কিনা তা চেক করুন:

    Kotlin

    context.packageManager.hasSystemFeature(PackageManager.FEATURE_WIFI_AWARE)

    জাভা

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

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

    Kotlin

    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 Aware হার্ডওয়্যার চালু করে।
  • Wi-Fi Aware ক্লাস্টারে যোগ দেয় বা তৈরি করে।
  • একটি অনন্য নেমস্পেস সহ একটি Wi-Fi Aware সেশন তৈরি করে যা এর মধ্যে তৈরি সমস্ত ডিসকভারি সেশনের জন্য একটি কন্টেনার হিসাবে কাজ করে।

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

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

পরিষেবা প্রকাশ করা

কোনও পরিষেবা খুঁজে পাওয়ার যোগ্য করে তুলতে, publish() পদ্ধতি কল করুন, যা নিম্নলিখিত প্যারামিটার গ্রহণ করে:

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

এখানে একটি উদাহরণ দেওয়া হল:

Kotlin

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 ইভেন্ট ঘটলে কোন অ্যাকশন নিতে হবে তা নির্দিষ্ট করে, যেমন কোনও প্রকাশক খুঁজে পাওয়া গেলে।

এখানে একটি উদাহরণ দেওয়া হল:

Kotlin

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 পায়।
    • আপনার অ্যাপ কোনও পরিষেবা সাবস্ক্রাইব করে। তারপর, এটি যখন কোনও ম্যাচিং প্রকাশক খুঁজে পায়, আপনার অ্যাপ প্রকাশকের PeerHandle onServiceDiscovered() কলব্যাক থেকে পায়।

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

  • মেসেজটি পিয়ারের কাছে সফলভাবে পৌঁছে গেলে, সিস্টেম প্রেরক অ্যাপে onMessageSendSucceeded() কলব্যাক কল করে।
  • পিয়ার কোনও মেসেজ পেলে, সিস্টেম onMessageReceived() কলব্যাক রিসিভ করা অ্যাপে কল করে।

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

মেসেজে শনাক্তকারী এম্বেড করার অর্থ হল, মেসেজ বাইট অ্যারেতে পরিবর্তন করে শনাক্তকারী যোগ করা (যেমন, প্রথম কয়েকটি বাইট হিসেবে)।

কানেকশন তৈরি করুন

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

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

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

  2. সাবস্ক্রাইবার প্রকাশককে খুঁজে পেলে, সাবস্ক্রাইবারের থেকে প্রকাশককে একটি মেসেজ পাঠান।

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

    Kotlin

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

    জাভা

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

    Kotlin

    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 Aware নেটওয়ার্কের জন্য অনুরোধ করুন। NetworkSpecifier তৈরি করার সময় কোনও পোর্ট নির্দিষ্ট করবেন না। নেটওয়ার্ক কানেকশন উপলভ্য হলে, পরিবর্তিত হলে বা হারিয়ে গেলে উপযুক্ত কলব্যাক পদ্ধতি কল করা হয়।

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

    Kotlin

    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 Aware পরিষেবা আবিষ্কারকে সীমাবদ্ধ করতে এই তথ্য ব্যবহার করতে পারে।

Wi-Fi RTT API, Wi-Fi Aware পিয়ারের MAC অ্যাড্রেস বা PeerHandle ব্যবহার করে সরাসরি রেঞ্জিংয়ের সুবিধা দেয়।

Wi-Fi Aware ডিসকভারি শুধুমাত্র একটি নির্দিষ্ট জিওফেন্সের মধ্যে পরিষেবাগুলি আবিষ্কার করার জন্য সীমাবদ্ধ করা যেতে পারে। যেমন, আপনি এমন একটি জিওফেন্স সেট-আপ করতে পারেন যা এমন একটি ডিভাইসকে খুঁজে পেতে সাহায্য করে যেটি "Aware_File_Share_Service_Name" পরিষেবা প্রকাশ করছে এবং যা ৩ মিটারের (৩,০০০ মিমি হিসেবে উল্লেখ করা হয়েছে) থেকে কাছে এবং ১০ মিটারের (১০,০০০ মিমি হিসেবে উল্লেখ করা হয়েছে) থেকে দূরে নয়।

জিওফেন্সিং চালু করতে, প্রকাশক ও সাবস্ক্রাইবার, দুজনকেই অ্যাকশন নিতে হবে:

  • প্রকাশককে অবশ্যই setRangingEnabled(true) ব্যবহার করে প্রকাশিত পরিষেবায় রেঞ্জিং চালু করতে হবে।

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

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

    যেকোনও ভ্যালুর ক্ষেত্রে, নির্দিষ্ট না করা দূরত্বের অর্থ হল কোনও সীমা নেই। শুধুমাত্র সর্বাধিক দূরত্ব উল্লেখ করার অর্থ হল সর্বনিম্ন দূরত্ব ০। শুধুমাত্র ন্যূনতম দূরত্ব উল্লেখ করার অর্থ হল কোনও সর্বাধিক দূরত্ব নেই।

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