Wi-Fi Aware ক্ষমতাগুলি Android 8.0 (API লেভেল 26) এবং উচ্চতর ভার্সনগুলিতে চলমান ডিভাইসগুলিকে অন্য কোনও ধরণের সংযোগ ছাড়াই একে অপরকে আবিষ্কার করতে এবং সরাসরি সংযোগ করতে সক্ষম করে। 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 পরিসরে প্রবেশ করে, তখন গ্রাহক একটি বিজ্ঞপ্তি পান যে একটি মিলিত প্রকাশককে আবিষ্কার করা হয়েছে। গ্রাহক একজন প্রকাশককে আবিষ্কার করার পরে, গ্রাহক হয় একটি সংক্ষিপ্ত বার্তা পাঠাতে পারেন অথবা আবিষ্কৃত ডিভাইসের সাথে একটি নেটওয়ার্ক সংযোগ স্থাপন করতে পারেন। ডিভাইসগুলি একই সাথে প্রকাশক এবং গ্রাহক উভয়ই হতে পারে।
একটি নেটওয়ার্ক সংযোগ তৈরি করুন: দুটি ডিভাইস একে অপরকে আবিষ্কার করার পরে তারা অ্যাক্সেস পয়েন্ট ছাড়াই একটি দ্বি-মুখী Wi-Fi Aware নেটওয়ার্ক সংযোগ তৈরি করতে পারে।
ওয়াই-ফাই অ্যাওয়্যার নেটওয়ার্ক সংযোগগুলি ব্লুটুথ সংযোগের তুলনায় দীর্ঘ দূরত্বে উচ্চতর থ্রুপুট হার সমর্থন করে। এই ধরণের সংযোগগুলি এমন অ্যাপগুলির জন্য কার্যকর যা ব্যবহারকারীদের মধ্যে প্রচুর পরিমাণে ডেটা ভাগ করে, যেমন ফটো-শেয়ারিং অ্যাপ।
অ্যান্ড্রয়েড ১৩ (এপিআই লেভেল ৩৩) এর বর্ধিতকরণ
Android 13 (API লেভেল 33) এবং তার উপরে চলমান ডিভাইসগুলিতে যা তাৎক্ষণিক যোগাযোগ মোড সমর্থন করে, অ্যাপগুলি PublishConfig.Builder.setInstantCommunicationModeEnabled() এবং SubscribeConfig.Builder.setInstantCommunicationModeEnabled() পদ্ধতি ব্যবহার করে প্রকাশক বা গ্রাহক আবিষ্কার সেশনের জন্য তাৎক্ষণিক যোগাযোগ মোড সক্ষম বা অক্ষম করতে পারে। তাৎক্ষণিক যোগাযোগ মোড বার্তা বিনিময়, পরিষেবা আবিষ্কার এবং প্রকাশক বা গ্রাহক আবিষ্কার সেশনের অংশ হিসাবে সেট আপ করা যেকোনো ডেটা-পাথকে গতি দেয়। একটি ডিভাইস তাৎক্ষণিক যোগাযোগ মোড সমর্থন করে কিনা তা নির্ধারণ করতে, isInstantCommunicationModeSupported() পদ্ধতি ব্যবহার করুন।
অ্যান্ড্রয়েড ১২ (এপিআই লেভেল ৩১) এর বর্ধিতকরণ
অ্যান্ড্রয়েড ১২ (এপিআই লেভেল ৩১) ওয়াই-ফাই অ্যাওয়ারে কিছু বর্ধিতকরণ যোগ করেছে:
- Android 12 (API লেভেল 31) বা তার বেশি চলমান ডিভাইসগুলিতে, পরিষেবা বন্ধ হয়ে যাওয়ার বা সীমার বাইরে চলে যাওয়ার কারণে আপনার অ্যাপটি কোনও আবিষ্কৃত পরিষেবা হারিয়ে ফেললে সতর্ক হওয়ার জন্য আপনি
onServiceLost()কলব্যাক ব্যবহার করতে পারেন। - Wi-Fi Aware ডেটা পাথের সেটআপ সহজ করা হয়েছে। পূর্ববর্তী সংস্করণগুলিতে ইনিশিয়েটরের MAC ঠিকানা প্রদানের জন্য L2 মেসেজিং ব্যবহার করা হত, যা ল্যাটেন্সি প্রবর্তন করে। Android 12 এবং উচ্চতর সংস্করণে চলমান ডিভাইসগুলিতে, রেসপন্ডার (সার্ভার) যেকোনো পিয়ার গ্রহণ করার জন্য কনফিগার করা যেতে পারে—অর্থাৎ, এটিকে ইনিশিয়েটরের MAC ঠিকানা আগে থেকে জানার প্রয়োজন হয় না। এটি ডেটাপাথ আনার গতি বাড়ায় এবং শুধুমাত্র একটি নেটওয়ার্ক অনুরোধের মাধ্যমে একাধিক পয়েন্ট-টু-পয়েন্ট লিঙ্ক সক্ষম করে।
- অ্যান্ড্রয়েড ১২ বা তার পরবর্তী ভার্সনে চলমান অ্যাপগুলি
WifiAwareManager.getAvailableAwareResources()পদ্ধতি ব্যবহার করে বর্তমানে উপলব্ধ ডেটা পাথের সংখ্যা, সেশন প্রকাশ এবং সাবস্ক্রাইব সেশন পেতে পারে। এটি অ্যাপটিকে তাদের পছন্দসই কার্যকারিতা চালানোর জন্য পর্যাপ্ত উপলব্ধ সংস্থান আছে কিনা তা নির্ধারণ করতে সহায়তা করতে পারে।
প্রাথমিক সেটআপ
Wi-Fi Aware আবিষ্কার এবং নেটওয়ার্কিং ব্যবহার করার জন্য আপনার অ্যাপ সেট আপ করতে, নিম্নলিখিত পদক্ষেপগুলি সম্পাদন করুন:
আপনার অ্যাপের ম্যানিফেস্টে নিম্নলিখিত অনুমতিগুলির জন্য অনুরোধ করুন:
<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" />
নিচে দেখানো
PackageManagerAPI ব্যবহার করে ডিভাইসটি Wi-Fi Aware সমর্থন করে কিনা তা পরীক্ষা করুন:কোটলিন
context.packageManager.hasSystemFeature(PackageManager.FEATURE_WIFI_AWARE)
জাভা
context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_WIFI_AWARE);
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 Aware পরিষেবা ব্যাহত হয়েছে), তারপর উপলব্ধতার বর্তমান অবস্থা পরীক্ষা করুন এবং সেই অনুযায়ী এর আচরণ সামঞ্জস্য করুন। উদাহরণস্বরূপ:কোটলিন
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কোন কোন ঘটনা ঘটলে কোন কোন ক্রিয়া সম্পাদন করতে হবে তা নির্দিষ্ট করে, যেমন যখন গ্রাহক কোনও বার্তা পান।
এখানে একটি উদাহরণ:
কোটলিন
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() কল করুন। Discovery সেশনগুলি তাদের মূল 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() কল করে সাবস্ক্রাইব সেশন আপডেট করতে পারেন।
এই মুহুর্তে, আপনার সাবস্ক্রিপশনটি Wi-Fi রেঞ্জে মিলিত প্রকাশকদের আসার জন্য অপেক্ষা করে। যখন এটি ঘটে, তখন সিস্টেমটি onServiceDiscovered() কলব্যাক পদ্ধতিটি কার্যকর করে। আপনি এই কলব্যাক থেকে PeerHandle আর্গুমেন্ট ব্যবহার করে একটি বার্তা পাঠাতে বা সেই প্রকাশকের সাথে একটি সংযোগ তৈরি করতে পারেন।
কোনও পরিষেবা সাবস্ক্রাইব করা বন্ধ করতে, DiscoverySession.close() কল করুন। Discovery সেশনগুলি তাদের প্যারেন্ট 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 ডিভাইসের মধ্যে ক্লায়েন্ট-সার্ভার নেটওয়ার্কিং সমর্থন করে।
ক্লায়েন্ট-সার্ভার সংযোগ সেট আপ করতে:
(সার্ভারে) একটি পরিষেবা প্রকাশ করতে এবং (ক্লায়েন্টে) একটি পরিষেবাতে সাবস্ক্রাইব করতে Wi-Fi Aware আবিষ্কার ব্যবহার করুন।
গ্রাহক প্রকাশককে খুঁজে পেলে, গ্রাহকের কাছ থেকে প্রকাশককে একটি বার্তা পাঠান ।
প্রকাশক ডিভাইসে একটি
ServerSocketশুরু করুন এবং এর পোর্ট সেট করুন অথবা পান:কোটলিন
val ss = ServerSocket(0) val port = ss.localPort
জাভা
ServerSocket ss = new ServerSocket(0); int port = ss.getLocalPort();
WifiAwareNetworkSpecifierব্যবহার করে প্রকাশকের উপর একটি Wi-Fi Aware নেটওয়ার্কের অনুরোধ করতে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);
প্রকাশক যখন কোনও নেটওয়ার্কের জন্য অনুরোধ করবেন, তখন গ্রাহককে একটি বার্তা পাঠানো উচিত।
গ্রাহক প্রকাশকের কাছ থেকে বার্তাটি পাওয়ার পর, প্রকাশকের মতো একই পদ্ধতি ব্যবহার করে গ্রাহকের জন্য একটি Wi-Fi Aware নেটওয়ার্কের অনুরোধ করুন।
NetworkSpecifierতৈরি করার সময় কোনও পোর্ট নির্দিষ্ট করবেন না। নেটওয়ার্ক সংযোগ উপলব্ধ থাকলে, পরিবর্তিত হলে বা হারিয়ে গেলে উপযুক্ত কলব্যাক পদ্ধতিগুলি কল করা হয়।একবার সাবস্ক্রাইবারে
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);
নেটওয়ার্ক সংযোগ সম্পন্ন হলে,
unregisterNetworkCallback()এ কল করুন।
সমবয়সীদের সংখ্যা বৃদ্ধি এবং অবস্থান-সচেতন আবিষ্কার
Wi-Fi RTT অবস্থান ক্ষমতা সম্পন্ন একটি ডিভাইস সরাসরি সমকক্ষদের দূরত্ব পরিমাপ করতে পারে এবং Wi-Fi Aware পরিষেবা আবিষ্কারকে সীমাবদ্ধ করতে এই তথ্য ব্যবহার করতে পারে।
Wi-Fi RTT API এর MAC ঠিকানা অথবা PeerHandle ব্যবহার করে Wi-Fi Aware পিয়ারের সাথে সরাসরি যোগাযোগ করার অনুমতি দেয়।
Wi-Fi Aware আবিষ্কার শুধুমাত্র একটি নির্দিষ্ট জিওফেন্সের মধ্যে পরিষেবা আবিষ্কারের জন্য সীমাবদ্ধ হতে পারে। উদাহরণস্বরূপ, আপনি এমন একটি জিওফেন্স সেট আপ করতে পারেন যা "Aware_File_Share_Service_Name" পরিষেবা প্রকাশকারী একটি ডিভাইস আবিষ্কারের অনুমতি দেয় যা 3 মিটারের বেশি (3,000 মিমি হিসাবে নির্দিষ্ট) এবং 10 মিটারের বেশি (10,000 মিমি হিসাবে নির্দিষ্ট) নয়।
জিওফেন্সিং সক্ষম করতে, প্রকাশক এবং গ্রাহক উভয়কেই পদক্ষেপ নিতে হবে:
প্রকাশককে setRangingEnabled(true) ব্যবহার করে প্রকাশিত পরিষেবাতে ranging সক্ষম করতে হবে।
যদি প্রকাশক রেঞ্জিং সক্ষম না করেন, তাহলে গ্রাহকের দ্বারা নির্দিষ্ট করা যেকোনো জিওফেন্স সীমাবদ্ধতা উপেক্ষা করা হয় এবং দূরত্ব উপেক্ষা করে স্বাভাবিক আবিষ্কার করা হয়।
গ্রাহককে setMinDistanceMm এবং setMaxDistanceMm এর কিছু সমন্বয় ব্যবহার করে একটি জিওফেন্স নির্দিষ্ট করতে হবে।
যেকোনো মানের জন্য, একটি অনির্দিষ্ট দূরত্ব কোন সীমা বোঝায় না। শুধুমাত্র সর্বোচ্চ দূরত্ব নির্দিষ্ট করলে সর্বনিম্ন দূরত্ব 0 বোঝায়। শুধুমাত্র সর্বনিম্ন দূরত্ব নির্দিষ্ট করলে সর্বোচ্চ কোন সীমা বোঝায় না।
যখন কোনও জিওফেন্সের মধ্যে কোনও পিয়ার সার্ভিস আবিষ্কৃত হয়, তখন onServiceDiscoveredWithinRange কলব্যাক ট্রিগার হয়, যা পিয়ারকে পরিমাপ করা দূরত্ব প্রদান করে। পরবর্তী সময়ে দূরত্ব পরিমাপ করার জন্য প্রয়োজনে সরাসরি Wi-Fi RTT API কল করা যেতে পারে।