Wi-Fi Aware সক্ষমতার কারণে Android 8.0 (API লেভেল 26) এবং তার পরবর্তী সংস্করণে চালিত ডিভাইসগুলো নিজেদের মধ্যে অন্য কোনো ধরনের সংযোগ ছাড়াই সরাসরি একে অপরকে খুঁজে বের করতে ও সংযুক্ত হতে পারে। Wi-Fi Aware, Neighbor Awareness Networking (NAN) নামেও পরিচিত।
Wi-Fi Aware নেটওয়ার্কিং পার্শ্ববর্তী ডিভাইসগুলোর সাথে ক্লাস্টার গঠন করে, অথবা কোনো এলাকায় ডিভাইসটি প্রথম হলে একটি নতুন ক্লাস্টার তৈরি করে কাজ করে। এই ক্লাস্টারিং আচরণটি পুরো ডিভাইসের জন্য প্রযোজ্য এবং এটি Wi-Fi Aware সিস্টেম সার্ভিস দ্বারা পরিচালিত হয়; অ্যাপগুলোর এই ক্লাস্টারিং আচরণের উপর কোনো নিয়ন্ত্রণ নেই। অ্যাপগুলো Wi-Fi Aware সিস্টেম সার্ভিসের সাথে যোগাযোগের জন্য Wi-Fi Aware API ব্যবহার করে, যা ডিভাইসের Wi-Fi Aware হার্ডওয়্যার পরিচালনা করে।
Wi-Fi Aware API-গুলো অ্যাপগুলোকে নিম্নলিখিত অপারেশনগুলো সম্পাদন করতে দেয়:
অন্যান্য ডিভাইস খুঁজুন: এপিআই-তে কাছাকাছি থাকা অন্যান্য ডিভাইস খুঁজে বের করার একটি ব্যবস্থা রয়েছে। এই প্রক্রিয়াটি শুরু হয় যখন কোনো একটি ডিভাইস এক বা একাধিক আবিষ্কারযোগ্য পরিষেবা প্রকাশ করে । এরপর, যখন কোনো ডিভাইস এক বা একাধিক পরিষেবা সাবস্ক্রাইব করে এবং প্রকাশকের ওয়াই-ফাই সীমার মধ্যে প্রবেশ করে, তখন সাবস্ক্রাইবার একটি বিজ্ঞপ্তি পায় যে একটি মিলে যাওয়া প্রকাশক খুঁজে পাওয়া গেছে। কোনো প্রকাশক খুঁজে পাওয়ার পর, সাবস্ক্রাইবার সেই আবিষ্কৃত ডিভাইসটির সাথে একটি সংক্ষিপ্ত বার্তা পাঠাতে বা একটি নেটওয়ার্ক সংযোগ স্থাপন করতে পারে। ডিভাইসগুলো একই সাথে প্রকাশক এবং সাবস্ক্রাইবার উভয়ই হতে পারে।
নেটওয়ার্ক সংযোগ তৈরি করুন: দুটি ডিভাইস একে অপরকে খুঁজে পাওয়ার পর, তারা কোনো অ্যাক্সেস পয়েন্ট ছাড়াই একটি দ্বি-মুখী Wi-Fi Aware নেটওয়ার্ক সংযোগ তৈরি করতে পারে।
ব্লুটুথ সংযোগের তুলনায় ওয়াই-ফাই অ্যাওয়্যার নেটওয়ার্ক সংযোগগুলো দীর্ঘ দূরত্বে উচ্চতর থ্রুপুট রেট সমর্থন করে। এই ধরনের সংযোগগুলো এমন অ্যাপের জন্য উপযোগী, যেগুলো ব্যবহারকারীদের মধ্যে প্রচুর পরিমাণে ডেটা আদান-প্রদান করে, যেমন ফটো-শেয়ারিং অ্যাপ।
অ্যান্ড্রয়েড ১৩ (এপিআই লেভেল ৩৩) এর উন্নয়নসমূহ
অ্যান্ড্রয়েড ১৩ (এপিআই লেভেল ৩৩) এবং তার পরবর্তী সংস্করণে চালিত যেসব ডিভাইস ইনস্ট্যান্ট কমিউনিকেশন মোড সমর্থন করে, সেগুলিতে অ্যাপগুলি একটি পাবলিশার বা সাবস্ক্রাইবার ডিসকভারি সেশনের জন্য ইনস্ট্যান্ট কমিউনিকেশন মোড চালু বা বন্ধ করতে PublishConfig.Builder.setInstantCommunicationModeEnabled() এবং SubscribeConfig.Builder.setInstantCommunicationModeEnabled() মেথডগুলি ব্যবহার করতে পারে। ইনস্ট্যান্ট কমিউনিকেশন মোড মেসেজ আদান-প্রদান, সার্ভিস ডিসকভারি এবং একটি পাবলিশার বা সাবস্ক্রাইবার ডিসকভারি সেশনের অংশ হিসাবে সেট আপ করা যেকোনো ডেটা-পাথের গতি বাড়ায়। কোনো ডিভাইস ইনস্ট্যান্ট কমিউনিকেশন মোড সমর্থন করে কিনা তা জানতে isInstantCommunicationModeSupported() মেথডটি ব্যবহার করুন।
অ্যান্ড্রয়েড ১২ (এপিআই লেভেল ৩১) এর উন্নয়নসমূহ
অ্যান্ড্রয়েড ১২ (এপিআই লেভেল ৩১) ওয়াই-ফাই অ্যাওয়্যার-এ কিছু উন্নতি যোগ করেছে:
- অ্যান্ড্রয়েড ১২ (এপিআই লেভেল ৩১) বা তার চেয়ে উন্নত সংস্করণে চালিত ডিভাইসগুলোতে, কোনো সার্ভিস বন্ধ হয়ে যাওয়া বা নাগালের বাইরে চলে যাওয়ার কারণে আপনার অ্যাপ যখন কোনো আবিষ্কৃত সার্ভিস হারিয়ে ফেলে, তখন সতর্কবার্তা পাওয়ার জন্য আপনি
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 বা Location নিষ্ক্রিয় করে রাখায় এটি বর্তমানে উপলব্ধ নাও থাকতে পারে। হার্ডওয়্যার এবং ফার্মওয়্যারের ক্ষমতার উপর নির্ভর করে, কিছু ডিভাইস Wi-Fi Direct, SoftAP, বা টিথারিং ব্যবহৃত হলে Wi-Fi Aware সমর্থন নাও করতে পারে। Wi-Fi Aware বর্তমানে উপলব্ধ আছে কিনা তা পরীক্ষা করতে,
isAvailable()কল করুন।Wi-Fi Aware-এর প্রাপ্যতা যেকোনো সময় পরিবর্তিত হতে পারে। আপনার অ্যাপের একটি
BroadcastReceiverরেজিস্টার করা উচিত, যাACTION_WIFI_AWARE_STATE_CHANGEDগ্রহণ করবে; প্রাপ্যতা পরিবর্তিত হলেই এটি পাঠানো হয়। যখন আপনার অ্যাপ ব্রডকাস্ট ইন্টেন্টটি গ্রহণ করবে, তখন তার উচিত হবে সমস্ত বিদ্যমান সেশন বাতিল করে দেওয়া (ধরে নেওয়া যে 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 ক্লাস্টারে যোগদান করে বা গঠন করে।
- একটি অনন্য নেমস্পেস সহ একটি ওয়াই-ফাই অ্যাওয়্যার সেশন তৈরি করে, যা এর মধ্যে তৈরি হওয়া সমস্ত ডিসকভারি সেশনের জন্য একটি ধারক হিসাবে কাজ করে।
অ্যাপটি সফলভাবে সংযুক্ত হলে, সিস্টেম 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() কলব্যাক মেথডটি কল করা হয়।
প্রকাশের পর, যখন একই রকম সাবস্ক্রাইবার অ্যাপ চালিত ডিভাইসগুলো প্রকাশকারী ডিভাইসের ওয়াই-ফাই সীমার মধ্যে আসে, তখন সাবস্ক্রাইবাররা পরিষেবাটি খুঁজে পায়। যখন কোনো সাবস্ক্রাইবার একজন প্রকাশককে খুঁজে পায়, তখন প্রকাশক কোনো বিজ্ঞপ্তি পায় না; তবে, যদি সাবস্ক্রাইবার প্রকাশককে কোনো বার্তা পাঠায়, তাহলে প্রকাশক একটি বিজ্ঞপ্তি পায়। যখন এমনটা ঘটে, তখন 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 ডিভাইসের মধ্যে ক্লায়েন্ট-সার্ভার নেটওয়ার্কিং সমর্থন করে।
ক্লায়েন্ট-সার্ভার সংযোগ স্থাপন করতে:
ওয়াই-ফাই অ্যাওয়্যার ডিসকভারি ব্যবহার করে (সার্ভারে) একটি সার্ভিস পাবলিশ করুন এবং (ক্লায়েন্টে) একটি সার্ভিসে সাবস্ক্রাইব করুন ।
সাবস্ক্রাইবার যখনই পাবলিশারকে খুঁজে পাবে, তখন সাবস্ক্রাইবারের পক্ষ থেকে পাবলিশারের কাছে একটি বার্তা পাঠান ।
পাবলিশার ডিভাইসে একটি
ServerSocketচালু করুন এবং এর পোর্টটি সেট বা সংগ্রহ করুন:কোটলিন
val ss = ServerSocket(0) val port = ss.localPort
জাভা
ServerSocket ss = new ServerSocket(0); int port = ss.getLocalPort();
ConnectivityManagerব্যবহার করে, একটিWifiAwareNetworkSpecifierএর মাধ্যমে পাবলিশারে একটি Wi-Fi Aware নেটওয়ার্কের জন্য অনুরোধ করুন এবং এর জন্য সাবস্ক্রাইবারের পাঠানো বার্তা থেকে প্রাপ্ত ডিসকভারি সেশন ও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 ব্যবহার করে কোনো Wi-Fi Aware পিয়ারের MAC অ্যাড্রেস অথবা PeerHandle ব্যবহার করে সরাসরি তার সাথে রেঞ্জিং করা যায়।
Wi-Fi Aware ডিসকভারিকে একটি নির্দিষ্ট জিওফেন্সের মধ্যে থাকা সার্ভিসগুলো আবিষ্কার করার জন্য সীমাবদ্ধ করা যেতে পারে। উদাহরণস্বরূপ, আপনি এমন একটি জিওফেন্স সেট আপ করতে পারেন যা "Aware_File_Share_Service_Name" সার্ভিস প্রকাশকারী একটি ডিভাইসকে আবিষ্কার করার অনুমতি দেয়, যদি ডিভাইসটি ৩ মিটারের (৩,০০০ মিমি হিসাবে নির্দিষ্ট) কম কাছে এবং ১০ মিটারের (১০,০০০ মিমি হিসাবে নির্দিষ্ট) বেশি দূরে না থাকে।
জিওফেন্সিং সক্রিয় করতে, প্রকাশক এবং গ্রাহক উভয়কেই পদক্ষেপ নিতে হবে:
প্রকাশককে অবশ্যই setRangingEnabled(true) ব্যবহার করে প্রকাশিত পরিষেবাতে রেঞ্জিং সক্রিয় করতে হবে।
যদি পাবলিশার রেঞ্জিং সক্ষম না করে, তাহলে সাবস্ক্রাইবারের দ্বারা নির্দিষ্ট করা যেকোনো জিওফেন্স সীমাবদ্ধতা উপেক্ষা করা হয় এবং দূরত্বকে অগ্রাহ্য করে স্বাভাবিক ডিসকভারি সম্পন্ন করা হয়।
সাবস্ক্রাইবারকে অবশ্যই setMinDistanceMm এবং setMaxDistanceMm- এর কোনো একটি সমন্বয় ব্যবহার করে একটি জিওফেন্স নির্দিষ্ট করতে হবে।
উভয় মানের ক্ষেত্রেই, অনির্দিষ্ট দূরত্ব কোনো সীমা বোঝায় না। শুধুমাত্র সর্বোচ্চ দূরত্ব নির্দিষ্ট করলে সর্বনিম্ন দূরত্ব ০ বোঝায়। শুধুমাত্র সর্বনিম্ন দূরত্ব নির্দিষ্ট করলে কোনো সর্বোচ্চ সীমা থাকে না।
যখন একটি জিওফেন্সের মধ্যে কোনো পিয়ার সার্ভিস আবিষ্কৃত হয়, তখন onServiceDiscoveredWithinRange কলব্যাকটি ট্রিগার হয়, যা পিয়ারটির পরিমাপকৃত দূরত্ব প্রদান করে। পরবর্তীতে দূরত্ব পরিমাপ করার জন্য প্রয়োজন অনুযায়ী সরাসরি Wi-Fi RTT API কল করা যেতে পারে।