Wi-Fi অবস্থান: RTT সহ

আপনি কাছাকাছি RTT-সক্ষম Wi-Fi অ্যাক্সেস পয়েন্ট এবং পিয়ার ওয়াই-ফাই অ্যাওয়ার ডিভাইসগুলির দূরত্ব পরিমাপ করতে Wi-Fi RTT (রাউন্ড-ট্রিপ-টাইম) API দ্বারা প্রদত্ত Wi-Fi অবস্থান কার্যকারিতা ব্যবহার করতে পারেন।

আপনি যদি তিন বা ততোধিক অ্যাক্সেস পয়েন্টের দূরত্ব পরিমাপ করেন, তাহলে আপনি একটি মাল্টিলেটারেশন অ্যালগরিদম ব্যবহার করে ডিভাইসের অবস্থান অনুমান করতে পারেন যা সেই পরিমাপের জন্য সবচেয়ে উপযুক্ত। ফলাফল সাধারণত 1-2 মিটারের মধ্যে সঠিক হয়।

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

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

Wi-Fi RTT এবং সম্পর্কিত ফাইন-টাইম-মেজারমেন্ট (FTM) ক্ষমতাগুলি IEEE 802.11-2016 মান দ্বারা নির্দিষ্ট করা হয়েছে৷ Wi-Fi RTT-এর জন্য FTM দ্বারা প্রদত্ত সুনির্দিষ্ট সময়ের পরিমাপ প্রয়োজন কারণ এটি একটি প্যাকেট ডিভাইসগুলির মধ্যে একটি রাউন্ড ট্রিপ করতে যে সময় নেয় তা পরিমাপ করে এবং আলোর গতি দ্বারা সেই সময়কে গুণ করে দুটি ডিভাইসের মধ্যে দূরত্ব গণনা করে।

Android 15 (API লেভেল 35) IEEE 802.11az নন-ট্রিগার ভিত্তিক (NTB) রেঞ্জের জন্য সমর্থন চালু করেছে।

অ্যান্ড্রয়েড সংস্করণের উপর ভিত্তি করে বাস্তবায়ন পার্থক্য

Android 9 (API লেভেল 28) এ Wi-Fi RTT চালু করা হয়েছিল। Android 9 চালিত ডিভাইসগুলির সাথে মাল্টিলেটেশন ব্যবহার করে একটি ডিভাইসের অবস্থান নির্ধারণ করতে এই প্রোটোকল ব্যবহার করার সময়, আপনার অ্যাপে পূর্ব-নির্ধারিত অ্যাক্সেস পয়েন্ট (AP) অবস্থানের ডেটাতে অ্যাক্সেস থাকতে হবে। এই ডেটা কীভাবে সংরক্ষণ এবং পুনরুদ্ধার করা যায় তা সিদ্ধান্ত নেওয়া আপনার উপর নির্ভর করে।

Android 10 (API স্তর 29) এবং উচ্চতর চলমান ডিভাইসগুলিতে, AP লোকেশন ডেটাকে ResponderLocation অবজেক্ট হিসাবে উপস্থাপন করা যেতে পারে, যার মধ্যে অক্ষাংশ, দ্রাঘিমাংশ এবং উচ্চতা অন্তর্ভুক্ত রয়েছে। অবস্থান কনফিগারেশন তথ্য/লোকেশন সিভিক রিপোর্ট (LCI/LCR ডেটা) সমর্থন করে এমন Wi-Fi RTT AP-এর জন্য, রেঞ্জিং প্রক্রিয়া চলাকালীন প্রোটোকল একটি ResponderLocation অবজেক্ট ফিরিয়ে দেবে।

এই বৈশিষ্ট্যটি অ্যাপগুলিকে এই তথ্যগুলি আগে থেকে সংরক্ষণ করার প্রয়োজন না করে সরাসরি তাদের অবস্থানের জন্য জিজ্ঞাসা করতে অ্যাপগুলিকে জিজ্ঞাসা করতে দেয়৷ সুতরাং, আপনার অ্যাপটি APগুলিকে খুঁজে পেতে এবং তাদের অবস্থান নির্ধারণ করতে পারে এমনকি যদি APগুলি আগে জানা না থাকে, যেমন যখন কোনও ব্যবহারকারী একটি নতুন বিল্ডিংয়ে প্রবেশ করেন৷

IEEE 802.11az NTB রেঞ্জিং সাপোর্ট অ্যান্ড্রয়েড 15 (API লেভেল 35) এবং উচ্চতর চলমান ডিভাইসগুলিতে উপলব্ধ। এর মানে হল যে ডিভাইসটি যদি IEEE 802.11az NTB রেসপন্ডার মোড সমর্থন করে ( WifiRttManager.CHARACTERISTICS_KEY_BOOLEAN_STA_RESPONDER দ্বারা নির্দেশিত), আপনার অ্যাপটি IEEE 802.11mc এবং IEEE 802.11az উভয়ই একটি সক্ষম APs অনুরোধের সাথে খুঁজে পেতে পারে৷ আপনার অ্যাপের নিয়ন্ত্রণে সঠিক ব্যবধান রেখে রেঞ্জিং পরিমাপের মধ্যে ব্যবধানের জন্য ব্যবহার করা যেতে পারে এমন ন্যূনতম এবং সর্বোচ্চ মান সম্পর্কে তথ্য প্রদানের জন্য RangingResult API-কে প্রসারিত করা হয়েছে।

প্রয়োজনীয়তা

  • রেঞ্জিং অনুরোধ করা ডিভাইসের হার্ডওয়্যারকে অবশ্যই 802.11-2016 FTM স্ট্যান্ডার্ড বা 802.11az স্ট্যান্ডার্ড (নন-ট্রিগার ভিত্তিক রেঞ্জিং) বাস্তবায়ন করতে হবে।
  • রেঞ্জিং রিকোয়েস্ট করা ডিভাইসটি অবশ্যই Android 9 (API লেভেল 28) বা তার পরে চলমান হতে হবে। IEEE 802.11az নন-ট্রিগার ভিত্তিক রেঞ্জিং Android 15 (API স্তর 35) এবং উচ্চতর চলমান ডিভাইসগুলিতে সক্ষম করা হয়েছে।
  • রেঞ্জিং রিকোয়েস্ট করা ডিভাইসটিতে অবশ্যই লোকেশন সার্ভিস চালু থাকতে হবে এবং ওয়াই-ফাই স্ক্যানিং চালু থাকতে হবে ( সেটিংস > লোকেশনের অধীনে)।
  • যে অ্যাপটি রেঞ্জিং রিকোয়েস্ট করছে সেটি যদি Android 13 (API লেভেল 33) বা উচ্চতরকে টার্গেট করে, তাহলে তার NEARBY_WIFI_DEVICES অনুমতি থাকতে হবে। যদি এই ধরনের একটি অ্যাপ Android এর পূর্ববর্তী সংস্করণকে লক্ষ্য করে, তবে এটির পরিবর্তে ACCESS_FINE_LOCATION অনুমতি থাকতে হবে।
  • অ্যাপটি দৃশ্যমান থাকা অবস্থায় বা অগ্রভাগের পরিষেবায় থাকা অবস্থায় অ্যাপটিকে অবশ্যই অ্যাক্সেস পয়েন্টের পরিসীমা জিজ্ঞাসা করতে হবে। অ্যাপটি ব্যাকগ্রাউন্ড থেকে অবস্থানের তথ্য অ্যাক্সেস করতে পারে না।
  • অ্যাক্সেস পয়েন্ট অবশ্যই IEEE 802.11-2016 FTM স্ট্যান্ডার্ড বা IEEE 802.11az স্ট্যান্ডার্ড (নন-ট্রিগার ভিত্তিক রেঞ্জিং) বাস্তবায়ন করতে হবে।

সেটআপ

Wi-Fi RTT ব্যবহার করার জন্য আপনার অ্যাপ সেট আপ করতে, নিম্নলিখিত পদক্ষেপগুলি সম্পাদন করুন৷

1. অনুমতি অনুরোধ করুন

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

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<!-- 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" />

NEARBY_WIFI_DEVICES এবং ACCESS_FINE_LOCATION অনুমতিগুলি বিপজ্জনক অনুমতি, তাই ব্যবহারকারী যখনই RTT স্ক্যান অপারেশন করতে চায় তখন আপনাকে রানটাইমে তাদের অনুরোধ করতে হবে৷ অনুমতি ইতিমধ্যে মঞ্জুর করা না হলে আপনার অ্যাপটিকে ব্যবহারকারীর অনুমতির অনুরোধ করতে হবে৷ রানটাইম অনুমতি সম্পর্কে আরও তথ্যের জন্য, অ্যাপের অনুমতির অনুরোধ দেখুন।

2. ডিভাইসটি Wi-Fi RTT সমর্থন করে কিনা তা পরীক্ষা করুন৷

ডিভাইসটি Wi-Fi RTT সমর্থন করে কিনা তা পরীক্ষা করতে, PackageManager API ব্যবহার করুন:

কোটলিন

context.packageManager.hasSystemFeature(PackageManager.FEATURE_WIFI_RTT)

জাভা

context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_WIFI_RTT);

3. Wi-Fi RTT উপলব্ধ কিনা তা পরীক্ষা করুন৷

ডিভাইসে Wi-Fi RTT থাকতে পারে, কিন্তু ব্যবহারকারী Wi-Fi অক্ষম করার কারণে এটি উপলব্ধ নাও হতে পারে। তাদের হার্ডওয়্যার এবং ফার্মওয়্যার ক্ষমতার উপর নির্ভর করে, কিছু ডিভাইস Wi-Fi RTT সমর্থন নাও করতে পারে যদি SoftAP বা টিথারিং ব্যবহার করা হয়। Wi-Fi RTT উপলব্ধ কিনা তা পরীক্ষা করতে, isAvailable() কল করুন।

Wi-Fi RTT এর উপলব্ধতা যে কোনো সময় পরিবর্তন হতে পারে। ACTION_WIFI_RTT_STATE_CHANGED পাওয়ার জন্য আপনার অ্যাপের একটি BroadcastReceiver নিবন্ধন করা উচিত, যা উপলব্ধতা পরিবর্তন হলে পাঠানো হয়। যখন আপনার অ্যাপটি সম্প্রচারের অভিপ্রায় পায়, তখন অ্যাপটির উপলব্ধতার বর্তমান অবস্থা পরীক্ষা করা উচিত এবং সেই অনুযায়ী তার আচরণ সামঞ্জস্য করা উচিত।

যেমন:

কোটলিন

val filter = IntentFilter(WifiRttManager.ACTION_WIFI_RTT_STATE_CHANGED)
val myReceiver = object: BroadcastReceiver() {

    override fun onReceive(context: Context, intent: Intent) {
        if (wifiRttManager.isAvailable) {
            …
        } else {
            …
        }
    }
}
context.registerReceiver(myReceiver, filter)

জাভা

IntentFilter filter =
    new IntentFilter(WifiRttManager.ACTION_WIFI_RTT_STATE_CHANGED);
BroadcastReceiver myReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        if (wifiRttManager.isAvailable()) {
            …
        } else {
            …
        }
    }
};
context.registerReceiver(myReceiver, filter);

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

একটি সীমাবদ্ধ অনুরোধ তৈরি করুন

একটি রেঞ্জিং রিকোয়েস্ট ( RangingRequest ) তৈরি করা হয় APs বা Wi-Fi সচেতন সমবয়সীদের একটি তালিকা নির্দিষ্ট করে যার কাছে একটি রেঞ্জের অনুরোধ করা হয়েছে৷ একাধিক অ্যাক্সেস পয়েন্ট বা Wi-Fi সচেতন সমকক্ষ একটি একক রেঞ্জিং অনুরোধে নির্দিষ্ট করা যেতে পারে; সমস্ত ডিভাইসের দূরত্ব পরিমাপ করা হয় এবং ফেরত দেওয়া হয়।

উদাহরণস্বরূপ, দূরত্ব পরিমাপ করার জন্য একটি অ্যাক্সেস পয়েন্ট নির্দিষ্ট করতে একটি অনুরোধ addAccessPoint() পদ্ধতি ব্যবহার করতে পারে:

কোটলিন

val req: RangingRequest = RangingRequest.Builder().run {
    addAccessPoint(ap1ScanResult)
    addAccessPoint(ap2ScanResult)
    build()
}

জাভা

RangingRequest.Builder builder = new RangingRequest.Builder();
builder.addAccessPoint(ap1ScanResult);
builder.addAccessPoint(ap2ScanResult);

RangingRequest req = builder.build();

একটি অ্যাক্সেস পয়েন্ট তার ScanResult অবজেক্ট দ্বারা চিহ্নিত করা হয়, যা WifiManager.getScanResults() কল করে পাওয়া যেতে পারে। আপনি একটি ব্যাচে একাধিক অ্যাক্সেস পয়েন্ট যোগ করতে addAccessPoints(List<ScanResult>) ব্যবহার করতে পারেন।

ScanResult বস্তুতে IEEE 802.11mc ( is80211mcResponder() ) এবং IEEE 802.11az নন-ট্রিগার ভিত্তিক রেঞ্জিং ( is80211azNtbResponder() ) সমর্থিত AP উভয়ই থাকতে পারে। IEEE 802.11az NTB রেঞ্জিং সমর্থন করে এমন ডিভাইসগুলি AP-এর ক্ষমতার উপর নির্ভর করে 802.11mc বা 802.11az রেঞ্জিং করে, যখন AP উভয়কেই সমর্থন করে তখন ডিফল্ট 802.11az-এ। IEEE 802.11az সমর্থন করে না এমন ডিভাইসগুলি IEEE 802.11mc প্রোটোকল ব্যবহার করে সমস্ত রেঞ্জিং সম্পাদন করে।

একইভাবে, একটি রেঞ্জিং অনুরোধ যথাক্রমে addWifiAwarePeer(MacAddress peer) এবং addWifiAwarePeer(PeerHandle peer) পদ্ধতি ব্যবহার করে একটি Wi-Fi Aware পিয়ার এর MAC ঠিকানা বা তার PeerHandle ব্যবহার করে যোগ করতে পারে। Wi-Fi সচেতন সমকক্ষদের আবিষ্কার সম্পর্কে আরও তথ্যের জন্য, Wi-Fi সচেতন ডকুমেন্টেশন দেখুন।

সীমাবদ্ধ অনুরোধ

একটি অ্যাপ WifiRttManager.startRanging() পদ্ধতি ব্যবহার করে একটি রেঞ্জিং অনুরোধ জারি করে এবং নিম্নলিখিতগুলি প্রদান করে: অপারেশনটি নির্দিষ্ট করার জন্য একটি RangingRequest , কলব্যাক প্রসঙ্গ নির্দিষ্ট করার জন্য একটি Executor এবং ফলাফলগুলি পাওয়ার জন্য একটি RangingResultCallback

যেমন:

কোটলিন

val mgr = context.getSystemService(Context.WIFI_RTT_RANGING_SERVICE) as WifiRttManager
val request: RangingRequest = myRequest
mgr.startRanging(request, executor, object : RangingResultCallback() {

    override fun onRangingResults(results: List<RangingResult>) { … }

    override fun onRangingFailure(code: Int) { … }
})

জাভা

WifiRttManager mgr =
      (WifiRttManager) Context.getSystemService(Context.WIFI_RTT_RANGING_SERVICE);

RangingRequest request ...;
mgr.startRanging(request, executor, new RangingResultCallback() {

  @Override
  public void onRangingFailure(int code) { … }

  @Override
  public void onRangingResults(List<RangingResult> results) { … }
});

রেঞ্জিং অপারেশন অ্যাসিঙ্ক্রোনাসভাবে সম্পাদিত হয়, এবং RangingResultCallback এর কলব্যাকগুলির একটিতে রেঞ্জিং ফলাফল ফেরত দেওয়া হয়:

  • পুরো রেঞ্জিং অপারেশন ব্যর্থ হলে, RangingResultCallback এ বর্ণিত একটি স্ট্যাটাস কোড দিয়ে onRangingFailure কলব্যাক ট্রিগার করা হয়। এই ধরনের ব্যর্থতা ঘটতে পারে যদি পরিষেবাটি সময়ে একটি রেঞ্জিং অপারেশন চালাতে না পারে--উদাহরণস্বরূপ, কারণ Wi-Fi অক্ষম করা আছে, কারণ অ্যাপ্লিকেশনটি অনেকগুলি পরিসরের ক্রিয়াকলাপগুলির জন্য অনুরোধ করেছে এবং থ্রোটল করা হয়েছে, বা একটি অনুমতি সমস্যার কারণে৷
  • রেঞ্জিং অপারেশন শেষ হলে, onRangingResults কলব্যাক ফলাফলের একটি তালিকার সাথে ট্রিগার হয় যা অনুরোধের তালিকার সাথে মেলে—প্রতিটি অনুরোধের জন্য একটি ফলাফল। ফলাফলের ক্রম অগত্যা অনুরোধের ক্রম মেলে না। মনে রাখবেন রেঞ্জিং অপারেশন সম্পূর্ণ হতে পারে কিন্তু প্রতিটি ফলাফল এখনও সেই নির্দিষ্ট পরিমাপের ব্যর্থতা নির্দেশ করতে পারে।

পরিসরের ফলাফল ব্যাখ্যা করুন

onRangingResults কলব্যাক দ্বারা প্রত্যাবর্তিত ফলাফলগুলির প্রতিটি একটি RangingResult বস্তু দ্বারা নির্দিষ্ট করা হয়৷ প্রতিটি অনুরোধে, নিম্নলিখিত করুন।

1. অনুরোধ সনাক্ত করুন

RangingRequest তৈরি করার সময় প্রদত্ত তথ্যের উপর ভিত্তি করে অনুরোধটি শনাক্ত করুন : প্রায়শই ScanResult এ দেওয়া একটি MAC ঠিকানা একটি অ্যাক্সেস পয়েন্ট সনাক্ত করে। getMacAddress() পদ্ধতি ব্যবহার করে রেঞ্জিং ফলাফল থেকে MAC ঠিকানা পাওয়া যেতে পারে।

রেঞ্জিং রিকোয়েস্টে নির্দিষ্ট করা পিয়ার (অ্যাক্সেস পয়েন্ট) থেকে রেঞ্জিং ফলাফলের তালিকা ভিন্ন ক্রমে হতে পারে, তাই আপনার পিয়ার সনাক্ত করতে MAC ঠিকানা ব্যবহার করা উচিত, ফলাফলের ক্রম নয়।

2. প্রতিটি পরিমাপ সফল হয়েছে কিনা তা নির্ধারণ করুন

একটি পরিমাপ সফল হয়েছে কিনা তা নির্ধারণ করতে, getStatus() পদ্ধতি ব্যবহার করুন। STATUS_SUCCESS ব্যতীত অন্য কোনো মান একটি ব্যর্থতা নির্দেশ করে৷ একটি ব্যর্থতার অর্থ হল এই ফলাফলের অন্যান্য সমস্ত ক্ষেত্র (উপরের অনুরোধ শনাক্তকরণ ব্যতীত) অবৈধ, এবং সংশ্লিষ্ট get* পদ্ধতিটি একটি IllegalStateException ব্যতিক্রম সহ ব্যর্থ হবে৷

3. প্রতিটি সফল পরিমাপের জন্য ফলাফল পান

প্রতিটি সফল পরিমাপের জন্য ( RangingResult ), আপনি সংশ্লিষ্ট get পদ্ধতিগুলির সাথে ফলাফলের মানগুলি পুনরুদ্ধার করতে পারেন:

  • দূরত্ব, মিমি, এবং পরিমাপের আদর্শ বিচ্যুতি:

    getDistanceMm()

    getDistanceStdDevMm()

  • পরিমাপের জন্য ব্যবহৃত প্যাকেটগুলির RSSI:

    getRssi()

  • মিলিসেকেন্ডে সময় যেখানে পরিমাপ নেওয়া হয়েছিল (বুট হওয়ার পর থেকে সময় নির্দেশ করে):

    getRangingTimestampMillis()

  • পরিমাপের সংখ্যা যা চেষ্টা করা হয়েছিল এবং পরিমাপের সংখ্যা যা সফল হয়েছে (এবং যার উপর ভিত্তি করে দূরত্ব পরিমাপ করা হয়):

    getNumAttemptedMeasurements()

    getNumSuccessfulMeasurements()

  • একটি ক্লায়েন্ট ডিভাইসকে 11az NTB পরিমাপের মধ্যে সর্বনিম্ন এবং সর্বোচ্চ সময় অপেক্ষা করতে হবে:

    getMinTimeBetweenNtbMeasurementsMicros() এবং getMaxTimeBetweenNtbMeasurementsMicros() সর্বনিম্ন এবং সর্বোচ্চ সময় ফেরত দেয়। ন্যূনতম সময় অতিবাহিত হওয়ার আগে যদি পরবর্তী রেঞ্জিং পরিমাপের অনুরোধ করা হয়, তাহলে API ক্যাশ করা রেঞ্জিং ফলাফল প্রদান করে। সর্বোচ্চ সময় অতিবাহিত হওয়ার পরে যদি পরবর্তী রেঞ্জিং পরিমাপের অনুরোধ করা হয়, তাহলে API নন-ট্রিগার রেঞ্জিং সেশনটি বন্ধ করে দেয় এবং প্রতিক্রিয়াকারী স্টেশনের সাথে একটি নতুন রেঞ্জিং সেশনের জন্য আলোচনা করে। আপনার একটি নতুন রেঞ্জিং সেশনের অনুরোধ করা এড়ানো উচিত, কারণ এটি রেঞ্জিং পরিমাপের সময় ওভারহেড যোগ করে। 802.11az নন-ট্রিগার ভিত্তিক রেঞ্জিং দক্ষতার সম্পূর্ণ সুবিধা নিতে, পূর্ববর্তী RangingResult পরিমাপে নির্দিষ্ট ন্যূনতম এবং সর্বোচ্চ পরিমাপের সময়ের মধ্যে পরবর্তী রেঞ্জিং অনুরোধটি ট্রিগার করুন।

  • লং ট্রেনিং ফিল্ড (LTF) পুনরাবৃত্তি যা IEEE 802.11az NTB ফলাফলের প্রস্তাবনায় ব্যবহৃত প্রতিক্রিয়াকারী এবং সূচনাকারী স্টেশনগুলি:

    get80211azResponderTxLtfRepetitionsCount()

    get80211azInitiatorTxLtfRepetitionsCount()

  • IEEE 802.11az NTB ফলাফলের জন্য ইনিশিয়েটর স্টেশন ব্যবহার করা স্থানিক টাইম স্ট্রিম (STS) প্রেরণ এবং গ্রহণের সংখ্যা:

    get80211azNumberOfTxSpatialStreams()

    get80211azNumberOfRxSpatialStreams()

অ্যান্ড্রয়েড ডিভাইস যা ওয়াইফাই-আরটিটি সমর্থন করে

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

অ্যাক্সেস পয়েন্ট

প্রস্তুতকারক এবং মডেল সমর্থন তারিখ
Nest Wifi Pro (Wi-Fi 6E) সমর্থিত
Compulab ওয়াইল্ড এপি সমর্থিত
Google Wi-Fi সমর্থিত
Google Nest Wi-Fi রাউটার সমর্থিত
Google Nest Wi-Fi পয়েন্ট সমর্থিত
আরুবা AP-635 সমর্থিত
সিসকো 9130 সমর্থিত
সিসকো 9136 সমর্থিত
সিসকো 9166 সমর্থিত
সিসকো 9164 সমর্থিত
আরুবা AP-505 সমর্থিত
আরুবা AP-515 সমর্থিত
আরুবা AP-575 সমর্থিত
আরুবা AP-518 সমর্থিত
আরুবা AP-505H সমর্থিত
আরুবা AP-565 সমর্থিত
আরুবা AP-535 সমর্থিত

ফোন

প্রস্তুতকারক এবং মডেল অ্যান্ড্রয়েড সংস্করণ
পিক্সেল 6 9.0+
Pixel 6 Pro 9.0+
পিক্সেল 5 9.0+
Pixel 5a 9.0+
Pixel 5a 5G 9.0+
Xiaomi Mi 10 Pro 9.0+
Xiaomi Mi 10 9.0+
Xiaomi Redmi Mi 9T Pro 9.0+
Xiaomi Mi 9T 9.0+
Xiaomi Mi 9 9.0+
Xiaomi Mi Note 10 9.0+
Xiaomi Mi Note 10 Lite 9.0+
Xiaomi Redmi Note 9S 9.0+
Xiaomi Redmi Note 9 Pro 9.0+
Xiaomi Redmi Note 8T 9.0+
Xiaomi Redmi Note 8 9.0+
Xiaomi Redmi K30 Pro 9.0+
Xiaomi Redmi K20 Pro 9.0+
Xiaomi Redmi K20 9.0+
Xiaomi Redmi Note 5 Pro 9.0+
Xiaomi Mi CC9 Pro 9.0+
LG G8X ThinQ 9.0+
LG V50S ThinQ 9.0+
LG V60 ThinQ 9.0+
LG V30 9.0+
Samsung Galaxy Note 10+ 5G 9.0+
Samsung Galaxy S20+ 5G 9.0+
Samsung Galaxy S20+ 9.0+
Samsung Galaxy S20 5G 9.0+
Samsung Galaxy S20 Ultra 5G 9.0+
Samsung Galaxy S20 9.0+
Samsung Galaxy Note 10+ 9.0+
Samsung Galaxy Note 10 5G 9.0+
Samsung Galaxy Note 10 9.0+
Samsung A9 Pro 9.0+
Google Pixel 4 XL 9.0+
গুগল পিক্সেল 4 9.0+
Google Pixel 4a 9.0+
গুগল পিক্সেল 3 এক্সএল 9.0+
গুগল পিক্সেল 3 9.0+
Google Pixel 3a XL 9.0+
Google Pixel 3a 9.0+
Google Pixel 2 XL 9.0+
গুগল পিক্সেল 2 9.0+
গুগল পিক্সেল 1 এক্সএল 9.0+
গুগল পিক্সেল 1 9.0+
পোকো এক্স২ 9.0+
শার্প অ্যাকোস R3 SH-04L 9.0+

খুচরা, গুদামজাতকরণ এবং বিতরণ কেন্দ্র ডিভাইস

প্রস্তুতকারক এবং মডেল অ্যান্ড্রয়েড সংস্করণ
জেব্রা PS20 10.0+
জেব্রা TC52/TC52HC 10.0+
জেব্রা TC57 10.0+
জেব্রা TC72 10.0+
জেব্রা TC77 10.0+
জেব্রা MC93 10.0+
জেব্রা TC8300 10.0+
জেব্রা VC8300 10.0+
জেব্রা EC30 10.0+
জেব্রা ET51 10.0+
জেব্রা ET56 10.0+
জেব্রা L10 10.0+
জেব্রা CC600/CC6000 10.0+
জেব্রা MC3300x 10.0+
জেব্রা MC330x 10.0+
জেব্রা TC52x 10.0+
জেব্রা TC57x 10.0+
জেব্রা EC50 (LAN এবং HC) 10.0+
জেব্রা EC55 (WAN) 10.0+
জেব্রা WT6300 10.0+
Skorpio X5 10.0+
,

আপনি কাছাকাছি RTT-সক্ষম Wi-Fi অ্যাক্সেস পয়েন্ট এবং পিয়ার ওয়াই-ফাই অ্যাওয়ার ডিভাইসগুলির দূরত্ব পরিমাপ করতে Wi-Fi RTT (রাউন্ড-ট্রিপ-টাইম) API দ্বারা প্রদত্ত Wi-Fi অবস্থান কার্যকারিতা ব্যবহার করতে পারেন।

আপনি যদি তিন বা ততোধিক অ্যাক্সেস পয়েন্টের দূরত্ব পরিমাপ করেন, তাহলে আপনি একটি মাল্টিলেটারেশন অ্যালগরিদম ব্যবহার করে ডিভাইসের অবস্থান অনুমান করতে পারেন যা সেই পরিমাপের জন্য সবচেয়ে উপযুক্ত। ফলাফল সাধারণত 1-2 মিটারের মধ্যে সঠিক হয়।

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

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

Wi-Fi RTT এবং সম্পর্কিত ফাইন-টাইম-মেজারমেন্ট (FTM) ক্ষমতাগুলি IEEE 802.11-2016 মান দ্বারা নির্দিষ্ট করা হয়েছে৷ Wi-Fi RTT-এর জন্য FTM দ্বারা প্রদত্ত সুনির্দিষ্ট সময়ের পরিমাপ প্রয়োজন কারণ এটি একটি প্যাকেট ডিভাইসগুলির মধ্যে একটি রাউন্ড ট্রিপ করতে যে সময় নেয় তা পরিমাপ করে এবং আলোর গতি দ্বারা সেই সময়কে গুণ করে দুটি ডিভাইসের মধ্যে দূরত্ব গণনা করে।

Android 15 (API লেভেল 35) IEEE 802.11az নন-ট্রিগার ভিত্তিক (NTB) রেঞ্জের জন্য সমর্থন চালু করেছে।

অ্যান্ড্রয়েড সংস্করণের উপর ভিত্তি করে বাস্তবায়ন পার্থক্য

Android 9 (API লেভেল 28) এ Wi-Fi RTT চালু করা হয়েছিল। Android 9 চালিত ডিভাইসগুলির সাথে মাল্টিলেটেশন ব্যবহার করে একটি ডিভাইসের অবস্থান নির্ধারণ করতে এই প্রোটোকল ব্যবহার করার সময়, আপনার অ্যাপে পূর্ব-নির্ধারিত অ্যাক্সেস পয়েন্ট (AP) অবস্থানের ডেটাতে অ্যাক্সেস থাকতে হবে। এই ডেটা কীভাবে সংরক্ষণ এবং পুনরুদ্ধার করা যায় তা সিদ্ধান্ত নেওয়া আপনার উপর নির্ভর করে।

Android 10 (API স্তর 29) এবং উচ্চতর চলমান ডিভাইসগুলিতে, AP লোকেশন ডেটাকে ResponderLocation অবজেক্ট হিসাবে উপস্থাপন করা যেতে পারে, যার মধ্যে অক্ষাংশ, দ্রাঘিমাংশ এবং উচ্চতা অন্তর্ভুক্ত রয়েছে। অবস্থান কনফিগারেশন তথ্য/লোকেশন সিভিক রিপোর্ট (LCI/LCR ডেটা) সমর্থন করে এমন Wi-Fi RTT AP-এর জন্য, রেঞ্জিং প্রক্রিয়া চলাকালীন প্রোটোকল একটি ResponderLocation অবজেক্ট ফিরিয়ে দেবে।

এই বৈশিষ্ট্যটি অ্যাপগুলিকে এই তথ্যগুলি আগে থেকে সংরক্ষণ করার প্রয়োজন না করে সরাসরি তাদের অবস্থানের জন্য জিজ্ঞাসা করতে অ্যাপগুলিকে জিজ্ঞাসা করতে দেয়৷ সুতরাং, আপনার অ্যাপটি APগুলিকে খুঁজে পেতে এবং তাদের অবস্থান নির্ধারণ করতে পারে এমনকি যদি APগুলি আগে জানা না থাকে, যেমন যখন কোনও ব্যবহারকারী একটি নতুন বিল্ডিংয়ে প্রবেশ করেন৷

IEEE 802.11az NTB রেঞ্জিং সাপোর্ট অ্যান্ড্রয়েড 15 (API লেভেল 35) এবং উচ্চতর চলমান ডিভাইসগুলিতে উপলব্ধ। এর মানে হল যে ডিভাইসটি যদি IEEE 802.11az NTB রেসপন্ডার মোড সমর্থন করে ( WifiRttManager.CHARACTERISTICS_KEY_BOOLEAN_STA_RESPONDER দ্বারা নির্দেশিত), আপনার অ্যাপটি IEEE 802.11mc এবং IEEE 802.11az উভয়ই একটি সক্ষম APs অনুরোধের সাথে খুঁজে পেতে পারে৷ আপনার অ্যাপের নিয়ন্ত্রণে সঠিক ব্যবধান রেখে রেঞ্জিং পরিমাপের মধ্যে ব্যবধানের জন্য ব্যবহার করা যেতে পারে এমন ন্যূনতম এবং সর্বোচ্চ মান সম্পর্কে তথ্য প্রদানের জন্য RangingResult API-কে প্রসারিত করা হয়েছে।

প্রয়োজনীয়তা

  • রেঞ্জিং অনুরোধ করা ডিভাইসের হার্ডওয়্যারকে অবশ্যই 802.11-2016 FTM স্ট্যান্ডার্ড বা 802.11az স্ট্যান্ডার্ড (নন-ট্রিগার ভিত্তিক রেঞ্জিং) বাস্তবায়ন করতে হবে।
  • রেঞ্জিং রিকোয়েস্ট করা ডিভাইসটি অবশ্যই Android 9 (API লেভেল 28) বা তার পরে চলমান হতে হবে। IEEE 802.11az নন-ট্রিগার ভিত্তিক রেঞ্জিং Android 15 (API স্তর 35) এবং উচ্চতর চলমান ডিভাইসগুলিতে সক্ষম করা হয়েছে।
  • রেঞ্জিং রিকোয়েস্ট করা ডিভাইসটিতে অবশ্যই লোকেশন সার্ভিস চালু থাকতে হবে এবং ওয়াই-ফাই স্ক্যানিং চালু থাকতে হবে ( সেটিংস > লোকেশনের অধীনে)।
  • যে অ্যাপটি রেঞ্জিং রিকোয়েস্ট করছে সেটি যদি Android 13 (API লেভেল 33) বা উচ্চতরকে টার্গেট করে, তাহলে তার NEARBY_WIFI_DEVICES অনুমতি থাকতে হবে। যদি এই ধরনের একটি অ্যাপ Android এর পূর্ববর্তী সংস্করণকে লক্ষ্য করে, তবে এটির পরিবর্তে ACCESS_FINE_LOCATION অনুমতি থাকতে হবে।
  • অ্যাপটি দৃশ্যমান থাকা অবস্থায় বা অগ্রভাগের পরিষেবায় থাকা অবস্থায় অ্যাপটিকে অবশ্যই অ্যাক্সেস পয়েন্টের পরিসীমা জিজ্ঞাসা করতে হবে। অ্যাপটি ব্যাকগ্রাউন্ড থেকে অবস্থানের তথ্য অ্যাক্সেস করতে পারে না।
  • অ্যাক্সেস পয়েন্ট অবশ্যই IEEE 802.11-2016 FTM স্ট্যান্ডার্ড বা IEEE 802.11az স্ট্যান্ডার্ড (নন-ট্রিগার ভিত্তিক রেঞ্জিং) বাস্তবায়ন করতে হবে।

সেটআপ

Wi-Fi RTT ব্যবহার করার জন্য আপনার অ্যাপ সেট আপ করতে, নিম্নলিখিত পদক্ষেপগুলি সম্পাদন করুন৷

1. অনুমতি অনুরোধ করুন

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

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<!-- 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" />

NEARBY_WIFI_DEVICES এবং ACCESS_FINE_LOCATION অনুমতিগুলি বিপজ্জনক অনুমতি, তাই ব্যবহারকারী যখনই RTT স্ক্যান অপারেশন করতে চায় তখন আপনাকে রানটাইমে তাদের অনুরোধ করতে হবে৷ অনুমতি ইতিমধ্যে মঞ্জুর করা না হলে আপনার অ্যাপটিকে ব্যবহারকারীর অনুমতির অনুরোধ করতে হবে৷ রানটাইম অনুমতি সম্পর্কে আরও তথ্যের জন্য, অ্যাপের অনুমতির অনুরোধ দেখুন।

2. ডিভাইসটি Wi-Fi RTT সমর্থন করে কিনা তা পরীক্ষা করুন৷

ডিভাইসটি Wi-Fi RTT সমর্থন করে কিনা তা পরীক্ষা করতে, PackageManager API ব্যবহার করুন:

কোটলিন

context.packageManager.hasSystemFeature(PackageManager.FEATURE_WIFI_RTT)

জাভা

context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_WIFI_RTT);

3. Wi-Fi RTT উপলব্ধ কিনা তা পরীক্ষা করুন৷

ডিভাইসে Wi-Fi RTT থাকতে পারে, কিন্তু ব্যবহারকারী Wi-Fi অক্ষম করার কারণে এটি উপলব্ধ নাও হতে পারে। তাদের হার্ডওয়্যার এবং ফার্মওয়্যার ক্ষমতার উপর নির্ভর করে, কিছু ডিভাইস Wi-Fi RTT সমর্থন নাও করতে পারে যদি SoftAP বা টিথারিং ব্যবহার করা হয়। Wi-Fi RTT উপলব্ধ কিনা তা পরীক্ষা করতে, isAvailable() কল করুন।

Wi-Fi RTT এর উপলব্ধতা যে কোনো সময় পরিবর্তন হতে পারে। ACTION_WIFI_RTT_STATE_CHANGED পাওয়ার জন্য আপনার অ্যাপের একটি BroadcastReceiver নিবন্ধন করা উচিত, যা উপলব্ধতা পরিবর্তন হলে পাঠানো হয়। যখন আপনার অ্যাপটি সম্প্রচারের অভিপ্রায় পায়, তখন অ্যাপটির উপলব্ধতার বর্তমান অবস্থা পরীক্ষা করা উচিত এবং সেই অনুযায়ী তার আচরণ সামঞ্জস্য করা উচিত।

যেমন:

কোটলিন

val filter = IntentFilter(WifiRttManager.ACTION_WIFI_RTT_STATE_CHANGED)
val myReceiver = object: BroadcastReceiver() {

    override fun onReceive(context: Context, intent: Intent) {
        if (wifiRttManager.isAvailable) {
            …
        } else {
            …
        }
    }
}
context.registerReceiver(myReceiver, filter)

জাভা

IntentFilter filter =
    new IntentFilter(WifiRttManager.ACTION_WIFI_RTT_STATE_CHANGED);
BroadcastReceiver myReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        if (wifiRttManager.isAvailable()) {
            …
        } else {
            …
        }
    }
};
context.registerReceiver(myReceiver, filter);

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

একটি সীমাবদ্ধ অনুরোধ তৈরি করুন

একটি রেঞ্জিং রিকোয়েস্ট ( RangingRequest ) তৈরি করা হয় APs বা Wi-Fi সচেতন সমবয়সীদের একটি তালিকা নির্দিষ্ট করে যার কাছে একটি রেঞ্জের অনুরোধ করা হয়েছে৷ একাধিক অ্যাক্সেস পয়েন্ট বা Wi-Fi সচেতন সমকক্ষ একটি একক রেঞ্জিং অনুরোধে নির্দিষ্ট করা যেতে পারে; সমস্ত ডিভাইসের দূরত্ব পরিমাপ করা হয় এবং ফেরত দেওয়া হয়।

উদাহরণস্বরূপ, দূরত্ব পরিমাপ করার জন্য একটি অ্যাক্সেস পয়েন্ট নির্দিষ্ট করতে একটি অনুরোধ addAccessPoint() পদ্ধতি ব্যবহার করতে পারে:

কোটলিন

val req: RangingRequest = RangingRequest.Builder().run {
    addAccessPoint(ap1ScanResult)
    addAccessPoint(ap2ScanResult)
    build()
}

জাভা

RangingRequest.Builder builder = new RangingRequest.Builder();
builder.addAccessPoint(ap1ScanResult);
builder.addAccessPoint(ap2ScanResult);

RangingRequest req = builder.build();

একটি অ্যাক্সেস পয়েন্ট তার ScanResult অবজেক্ট দ্বারা চিহ্নিত করা হয়, যা WifiManager.getScanResults() কল করে পাওয়া যেতে পারে। আপনি একটি ব্যাচে একাধিক অ্যাক্সেস পয়েন্ট যোগ করতে addAccessPoints(List<ScanResult>) ব্যবহার করতে পারেন।

ScanResult বস্তুতে IEEE 802.11mc ( is80211mcResponder() ) এবং IEEE 802.11az নন-ট্রিগার ভিত্তিক রেঞ্জিং ( is80211azNtbResponder() ) সমর্থিত AP উভয়ই থাকতে পারে। IEEE 802.11az NTB রেঞ্জিং সমর্থন করে এমন ডিভাইসগুলি AP-এর ক্ষমতার উপর নির্ভর করে 802.11mc বা 802.11az রেঞ্জিং করে, যখন AP উভয়কেই সমর্থন করে তখন ডিফল্ট 802.11az-এ। IEEE 802.11az সমর্থন করে না এমন ডিভাইসগুলি IEEE 802.11mc প্রোটোকল ব্যবহার করে সমস্ত রেঞ্জিং সম্পাদন করে।

একইভাবে, একটি রেঞ্জিং অনুরোধ যথাক্রমে addWifiAwarePeer(MacAddress peer) এবং addWifiAwarePeer(PeerHandle peer) পদ্ধতি ব্যবহার করে একটি Wi-Fi Aware পিয়ার এর MAC ঠিকানা বা তার PeerHandle ব্যবহার করে যোগ করতে পারে। Wi-Fi সচেতন সমকক্ষদের আবিষ্কার সম্পর্কে আরও তথ্যের জন্য, Wi-Fi সচেতন ডকুমেন্টেশন দেখুন।

সীমাবদ্ধ অনুরোধ

একটি অ্যাপ WifiRttManager.startRanging() পদ্ধতি ব্যবহার করে একটি রেঞ্জিং অনুরোধ জারি করে এবং নিম্নলিখিতগুলি প্রদান করে: অপারেশনটি নির্দিষ্ট করার জন্য একটি RangingRequest , কলব্যাক প্রসঙ্গ নির্দিষ্ট করার জন্য একটি Executor এবং ফলাফলগুলি পাওয়ার জন্য একটি RangingResultCallback

যেমন:

কোটলিন

val mgr = context.getSystemService(Context.WIFI_RTT_RANGING_SERVICE) as WifiRttManager
val request: RangingRequest = myRequest
mgr.startRanging(request, executor, object : RangingResultCallback() {

    override fun onRangingResults(results: List<RangingResult>) { … }

    override fun onRangingFailure(code: Int) { … }
})

জাভা

WifiRttManager mgr =
      (WifiRttManager) Context.getSystemService(Context.WIFI_RTT_RANGING_SERVICE);

RangingRequest request ...;
mgr.startRanging(request, executor, new RangingResultCallback() {

  @Override
  public void onRangingFailure(int code) { … }

  @Override
  public void onRangingResults(List<RangingResult> results) { … }
});

রেঞ্জিং অপারেশন অ্যাসিঙ্ক্রোনাসভাবে সম্পাদিত হয়, এবং RangingResultCallback এর কলব্যাকগুলির একটিতে রেঞ্জিং ফলাফল ফেরত দেওয়া হয়:

  • পুরো রেঞ্জিং অপারেশন ব্যর্থ হলে, RangingResultCallback এ বর্ণিত একটি স্ট্যাটাস কোড দিয়ে onRangingFailure কলব্যাক ট্রিগার করা হয়। এই ধরনের ব্যর্থতা ঘটতে পারে যদি পরিষেবাটি সময়ে একটি রেঞ্জিং অপারেশন চালাতে না পারে--উদাহরণস্বরূপ, কারণ Wi-Fi অক্ষম করা আছে, কারণ অ্যাপ্লিকেশনটি অনেকগুলি পরিসরের ক্রিয়াকলাপগুলির জন্য অনুরোধ করেছে এবং থ্রোটল করা হয়েছে, বা একটি অনুমতি সমস্যার কারণে৷
  • রেঞ্জিং অপারেশন শেষ হলে, onRangingResults কলব্যাক ফলাফলের একটি তালিকার সাথে ট্রিগার হয় যা অনুরোধের তালিকার সাথে মেলে—প্রতিটি অনুরোধের জন্য একটি ফলাফল। ফলাফলের ক্রম অগত্যা অনুরোধের ক্রম মেলে না। মনে রাখবেন রেঞ্জিং অপারেশন সম্পূর্ণ হতে পারে কিন্তু প্রতিটি ফলাফল এখনও সেই নির্দিষ্ট পরিমাপের ব্যর্থতা নির্দেশ করতে পারে।

পরিসরের ফলাফল ব্যাখ্যা করুন

onRangingResults কলব্যাক দ্বারা প্রত্যাবর্তিত ফলাফলগুলির প্রতিটি একটি RangingResult বস্তু দ্বারা নির্দিষ্ট করা হয়৷ প্রতিটি অনুরোধে, নিম্নলিখিত করুন।

1. অনুরোধ সনাক্ত করুন

RangingRequest তৈরি করার সময় প্রদত্ত তথ্যের উপর ভিত্তি করে অনুরোধটি শনাক্ত করুন : প্রায়শই ScanResult এ দেওয়া একটি MAC ঠিকানা একটি অ্যাক্সেস পয়েন্ট সনাক্ত করে। getMacAddress() পদ্ধতি ব্যবহার করে রেঞ্জিং ফলাফল থেকে MAC ঠিকানা পাওয়া যেতে পারে।

রেঞ্জিং রিকোয়েস্টে নির্দিষ্ট করা পিয়ার (অ্যাক্সেস পয়েন্ট) থেকে রেঞ্জিং ফলাফলের তালিকা ভিন্ন ক্রমে হতে পারে, তাই আপনার পিয়ার সনাক্ত করতে MAC ঠিকানা ব্যবহার করা উচিত, ফলাফলের ক্রম নয়।

2. প্রতিটি পরিমাপ সফল হয়েছে কিনা তা নির্ধারণ করুন

একটি পরিমাপ সফল হয়েছে কিনা তা নির্ধারণ করতে, getStatus() পদ্ধতি ব্যবহার করুন। STATUS_SUCCESS ব্যতীত অন্য কোনো মান একটি ব্যর্থতা নির্দেশ করে৷ একটি ব্যর্থতার অর্থ হল এই ফলাফলের অন্যান্য সমস্ত ক্ষেত্র (উপরের অনুরোধ শনাক্তকরণ ব্যতীত) অবৈধ, এবং সংশ্লিষ্ট get* পদ্ধতিটি একটি IllegalStateException ব্যতিক্রম সহ ব্যর্থ হবে৷

3. প্রতিটি সফল পরিমাপের জন্য ফলাফল পান

প্রতিটি সফল পরিমাপের জন্য ( RangingResult ), আপনি সংশ্লিষ্ট get পদ্ধতিগুলির সাথে ফলাফলের মানগুলি পুনরুদ্ধার করতে পারেন:

  • দূরত্ব, মিমি, এবং পরিমাপের আদর্শ বিচ্যুতি:

    getDistanceMm()

    getDistanceStdDevMm()

  • পরিমাপের জন্য ব্যবহৃত প্যাকেটগুলির RSSI:

    getRssi()

  • মিলিসেকেন্ডে সময় যেখানে পরিমাপ নেওয়া হয়েছিল (বুট হওয়ার পর থেকে সময় নির্দেশ করে):

    getRangingTimestampMillis()

  • পরিমাপের সংখ্যা যা চেষ্টা করা হয়েছিল এবং পরিমাপের সংখ্যা যা সফল হয়েছে (এবং যার উপর ভিত্তি করে দূরত্ব পরিমাপ করা হয়):

    getNumAttemptedMeasurements()

    getNumSuccessfulMeasurements()

  • একটি ক্লায়েন্ট ডিভাইসকে 11az NTB পরিমাপের মধ্যে সর্বনিম্ন এবং সর্বোচ্চ সময় অপেক্ষা করতে হবে:

    getMinTimeBetweenNtbMeasurementsMicros() এবং getMaxTimeBetweenNtbMeasurementsMicros() সর্বনিম্ন এবং সর্বোচ্চ সময় ফেরত দেয়। ন্যূনতম সময় অতিবাহিত হওয়ার আগে যদি পরবর্তী রেঞ্জিং পরিমাপের অনুরোধ করা হয়, তাহলে API ক্যাশ করা রেঞ্জিং ফলাফল প্রদান করে। সর্বোচ্চ সময় অতিবাহিত হওয়ার পরে যদি পরবর্তী রেঞ্জিং পরিমাপের অনুরোধ করা হয়, তাহলে API নন-ট্রিগার রেঞ্জিং সেশনটি বন্ধ করে দেয় এবং প্রতিক্রিয়াকারী স্টেশনের সাথে একটি নতুন রেঞ্জিং সেশনের জন্য আলোচনা করে। আপনার একটি নতুন রেঞ্জিং সেশনের অনুরোধ করা এড়ানো উচিত, কারণ এটি রেঞ্জিং পরিমাপের সময় ওভারহেড যোগ করে। 802.11az নন-ট্রিগার ভিত্তিক রেঞ্জিং দক্ষতার সম্পূর্ণ সুবিধা নিতে, পূর্ববর্তী RangingResult পরিমাপে নির্দিষ্ট ন্যূনতম এবং সর্বোচ্চ পরিমাপের সময়ের মধ্যে পরবর্তী রেঞ্জিং অনুরোধটি ট্রিগার করুন।

  • লং ট্রেনিং ফিল্ড (LTF) পুনরাবৃত্তি যা IEEE 802.11az NTB ফলাফলের প্রস্তাবনায় ব্যবহৃত প্রতিক্রিয়াকারী এবং সূচনাকারী স্টেশনগুলি:

    get80211azResponderTxLtfRepetitionsCount()

    get80211azInitiatorTxLtfRepetitionsCount()

  • IEEE 802.11az NTB ফলাফলের জন্য ইনিশিয়েটর স্টেশন ব্যবহার করা স্থানিক টাইম স্ট্রিম (STS) প্রেরণ এবং গ্রহণের সংখ্যা:

    get80211azNumberOfTxSpatialStreams()

    get80211azNumberOfRxSpatialStreams()

অ্যান্ড্রয়েড ডিভাইস যা ওয়াইফাই-আরটিটি সমর্থন করে

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

অ্যাক্সেস পয়েন্ট

প্রস্তুতকারক এবং মডেল সমর্থন তারিখ
Nest Wifi Pro (Wi-Fi 6E) সমর্থিত
Compulab ওয়াইল্ড এপি সমর্থিত
Google Wi-Fi সমর্থিত
Google Nest Wi-Fi রাউটার সমর্থিত
Google Nest Wi-Fi পয়েন্ট সমর্থিত
আরুবা AP-635 সমর্থিত
সিসকো 9130 সমর্থিত
সিসকো 9136 সমর্থিত
সিসকো 9166 সমর্থিত
সিসকো 9164 সমর্থিত
আরুবা AP-505 সমর্থিত
আরুবা AP-515 সমর্থিত
আরুবা AP-575 সমর্থিত
আরুবা AP-518 সমর্থিত
আরুবা AP-505H সমর্থিত
আরুবা AP-565 সমর্থিত
আরুবা AP-535 সমর্থিত

ফোন

প্রস্তুতকারক এবং মডেল অ্যান্ড্রয়েড সংস্করণ
পিক্সেল 6 9.0+
Pixel 6 Pro 9.0+
পিক্সেল 5 9.0+
Pixel 5a 9.0+
Pixel 5a 5G 9.0+
Xiaomi Mi 10 Pro 9.0+
Xiaomi Mi 10 9.0+
Xiaomi Redmi Mi 9T Pro 9.0+
Xiaomi Mi 9T 9.0+
Xiaomi Mi 9 9.0+
Xiaomi Mi Note 10 9.0+
Xiaomi Mi Note 10 Lite 9.0+
Xiaomi Redmi Note 9S 9.0+
Xiaomi Redmi Note 9 Pro 9.0+
Xiaomi Redmi Note 8T 9.0+
Xiaomi Redmi Note 8 9.0+
Xiaomi Redmi K30 Pro 9.0+
Xiaomi Redmi K20 Pro 9.0+
Xiaomi Redmi K20 9.0+
Xiaomi Redmi Note 5 Pro 9.0+
Xiaomi Mi CC9 Pro 9.0+
LG G8X ThinQ 9.0+
LG V50S ThinQ 9.0+
LG V60 ThinQ 9.0+
LG V30 9.0+
Samsung Galaxy Note 10+ 5G 9.0+
Samsung Galaxy S20+ 5G 9.0+
Samsung Galaxy S20+ 9.0+
Samsung Galaxy S20 5G 9.0+
Samsung Galaxy S20 Ultra 5G 9.0+
Samsung Galaxy S20 9.0+
Samsung Galaxy Note 10+ 9.0+
Samsung Galaxy Note 10 5G 9.0+
Samsung Galaxy Note 10 9.0+
Samsung A9 Pro 9.0+
Google Pixel 4 XL 9.0+
গুগল পিক্সেল 4 9.0+
Google Pixel 4a 9.0+
গুগল পিক্সেল 3 এক্সএল 9.0+
গুগল পিক্সেল 3 9.0+
Google Pixel 3a XL 9.0+
Google Pixel 3a 9.0+
Google Pixel 2 XL 9.0+
গুগল পিক্সেল 2 9.0+
গুগল পিক্সেল 1 এক্সএল 9.0+
গুগল পিক্সেল 1 9.0+
পোকো এক্স২ 9.0+
শার্প অ্যাকোস R3 SH-04L 9.0+

খুচরা, গুদামজাতকরণ এবং বিতরণ কেন্দ্র ডিভাইস

প্রস্তুতকারক এবং মডেল অ্যান্ড্রয়েড সংস্করণ
জেব্রা PS20 10.0+
জেব্রা TC52/TC52HC 10.0+
জেব্রা TC57 10.0+
জেব্রা TC72 10.0+
জেব্রা TC77 10.0+
জেব্রা MC93 10.0+
জেব্রা TC8300 10.0+
জেব্রা VC8300 10.0+
জেব্রা EC30 10.0+
জেব্রা ET51 10.0+
জেব্রা ET56 10.0+
জেব্রা L10 10.0+
জেব্রা CC600/CC6000 10.0+
জেব্রা MC3300x 10.0+
জেব্রা MC330x 10.0+
জেব্রা TC52x 10.0+
জেব্রা TC57x 10.0+
জেব্রা EC50 (LAN এবং HC) 10.0+
জেব্রা EC55 (WAN) 10.0+
জেব্রা WT6300 10.0+
Skorpio X5 10.0+
,

আপনি কাছাকাছি RTT-সক্ষম Wi-Fi অ্যাক্সেস পয়েন্ট এবং পিয়ার ওয়াই-ফাই অ্যাওয়ার ডিভাইসগুলির দূরত্ব পরিমাপ করতে Wi-Fi RTT (রাউন্ড-ট্রিপ-টাইম) API দ্বারা প্রদত্ত Wi-Fi অবস্থান কার্যকারিতা ব্যবহার করতে পারেন।

আপনি যদি তিন বা ততোধিক অ্যাক্সেস পয়েন্টের দূরত্ব পরিমাপ করেন, তাহলে আপনি একটি মাল্টিলেটারেশন অ্যালগরিদম ব্যবহার করে ডিভাইসের অবস্থান অনুমান করতে পারেন যা সেই পরিমাপের জন্য সবচেয়ে উপযুক্ত। ফলাফল সাধারণত 1-2 মিটারের মধ্যে সঠিক হয়।

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

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

Wi-Fi RTT এবং সম্পর্কিত ফাইন-টাইম-মেজারমেন্ট (FTM) ক্ষমতাগুলি IEEE 802.11-2016 মান দ্বারা নির্দিষ্ট করা হয়েছে৷ Wi-Fi RTT-এর জন্য FTM দ্বারা প্রদত্ত সুনির্দিষ্ট সময়ের পরিমাপ প্রয়োজন কারণ এটি একটি প্যাকেট ডিভাইসগুলির মধ্যে একটি রাউন্ড ট্রিপ করতে যে সময় নেয় তা পরিমাপ করে এবং আলোর গতি দ্বারা সেই সময়কে গুণ করে দুটি ডিভাইসের মধ্যে দূরত্ব গণনা করে।

Android 15 (API লেভেল 35) IEEE 802.11az নন-ট্রিগার ভিত্তিক (NTB) রেঞ্জের জন্য সমর্থন চালু করেছে।

অ্যান্ড্রয়েড সংস্করণের উপর ভিত্তি করে বাস্তবায়ন পার্থক্য

Android 9 (API লেভেল 28) এ Wi-Fi RTT চালু করা হয়েছিল। Android 9 চালিত ডিভাইসগুলির সাথে মাল্টিলেটেশন ব্যবহার করে একটি ডিভাইসের অবস্থান নির্ধারণ করতে এই প্রোটোকল ব্যবহার করার সময়, আপনার অ্যাপে পূর্ব-নির্ধারিত অ্যাক্সেস পয়েন্ট (AP) অবস্থানের ডেটাতে অ্যাক্সেস থাকতে হবে। এই ডেটা কীভাবে সংরক্ষণ এবং পুনরুদ্ধার করা যায় তা সিদ্ধান্ত নেওয়া আপনার উপর নির্ভর করে।

Android 10 (API স্তর 29) এবং উচ্চতর চলমান ডিভাইসগুলিতে, AP লোকেশন ডেটাকে ResponderLocation অবজেক্ট হিসাবে উপস্থাপন করা যেতে পারে, যার মধ্যে অক্ষাংশ, দ্রাঘিমাংশ এবং উচ্চতা অন্তর্ভুক্ত রয়েছে। অবস্থান কনফিগারেশন তথ্য/লোকেশন সিভিক রিপোর্ট (LCI/LCR ডেটা) সমর্থন করে এমন Wi-Fi RTT AP-এর জন্য, রেঞ্জিং প্রক্রিয়া চলাকালীন প্রোটোকল একটি ResponderLocation অবজেক্ট ফিরিয়ে দেবে।

এই বৈশিষ্ট্যটি অ্যাপগুলিকে এই তথ্যগুলি আগে থেকে সংরক্ষণ করার প্রয়োজন না করে সরাসরি তাদের অবস্থানের জন্য জিজ্ঞাসা করতে অ্যাপগুলিকে জিজ্ঞাসা করতে দেয়৷ সুতরাং, আপনার অ্যাপটি APগুলিকে খুঁজে পেতে এবং তাদের অবস্থান নির্ধারণ করতে পারে এমনকি যদি APগুলি আগে জানা না থাকে, যেমন যখন কোনও ব্যবহারকারী একটি নতুন বিল্ডিংয়ে প্রবেশ করেন৷

IEEE 802.11az NTB রেঞ্জিং সাপোর্ট অ্যান্ড্রয়েড 15 (API লেভেল 35) এবং উচ্চতর চলমান ডিভাইসগুলিতে উপলব্ধ। এর মানে হল যে ডিভাইসটি যদি IEEE 802.11az NTB রেসপন্ডার মোড সমর্থন করে ( WifiRttManager.CHARACTERISTICS_KEY_BOOLEAN_STA_RESPONDER দ্বারা নির্দেশিত), আপনার অ্যাপটি IEEE 802.11mc এবং IEEE 802.11az উভয়ই একটি সক্ষম APs অনুরোধের সাথে খুঁজে পেতে পারে৷ আপনার অ্যাপের নিয়ন্ত্রণে সঠিক ব্যবধান রেখে রেঞ্জিং পরিমাপের মধ্যে ব্যবধানের জন্য ব্যবহার করা যেতে পারে এমন ন্যূনতম এবং সর্বোচ্চ মান সম্পর্কে তথ্য প্রদানের জন্য RangingResult API-কে প্রসারিত করা হয়েছে।

প্রয়োজনীয়তা

  • রেঞ্জিং অনুরোধ করা ডিভাইসের হার্ডওয়্যারকে অবশ্যই 802.11-2016 FTM স্ট্যান্ডার্ড বা 802.11az স্ট্যান্ডার্ড (নন-ট্রিগার ভিত্তিক রেঞ্জিং) বাস্তবায়ন করতে হবে।
  • রেঞ্জিং রিকোয়েস্ট করা ডিভাইসটি অবশ্যই Android 9 (API লেভেল 28) বা তার পরে চলমান হতে হবে। IEEE 802.11az নন-ট্রিগার ভিত্তিক রেঞ্জিং Android 15 (API স্তর 35) এবং উচ্চতর চলমান ডিভাইসগুলিতে সক্ষম করা হয়েছে।
  • রেঞ্জিং রিকোয়েস্ট করা ডিভাইসটিতে অবশ্যই লোকেশন সার্ভিস চালু থাকতে হবে এবং ওয়াই-ফাই স্ক্যানিং চালু থাকতে হবে ( সেটিংস > লোকেশনের অধীনে)।
  • যে অ্যাপটি রেঞ্জিং রিকোয়েস্ট করছে সেটি যদি Android 13 (API লেভেল 33) বা উচ্চতরকে টার্গেট করে, তাহলে তার NEARBY_WIFI_DEVICES অনুমতি থাকতে হবে। যদি এই ধরনের একটি অ্যাপ Android এর পূর্ববর্তী সংস্করণকে লক্ষ্য করে, তবে এটির পরিবর্তে ACCESS_FINE_LOCATION অনুমতি থাকতে হবে।
  • অ্যাপটি দৃশ্যমান থাকা অবস্থায় বা অগ্রভাগের পরিষেবায় থাকা অবস্থায় অ্যাপটিকে অবশ্যই অ্যাক্সেস পয়েন্টের পরিসীমা জিজ্ঞাসা করতে হবে। অ্যাপটি ব্যাকগ্রাউন্ড থেকে অবস্থানের তথ্য অ্যাক্সেস করতে পারে না।
  • অ্যাক্সেস পয়েন্ট অবশ্যই IEEE 802.11-2016 FTM স্ট্যান্ডার্ড বা IEEE 802.11az স্ট্যান্ডার্ড (নন-ট্রিগার ভিত্তিক রেঞ্জিং) বাস্তবায়ন করতে হবে।

সেটআপ

Wi-Fi RTT ব্যবহার করার জন্য আপনার অ্যাপ সেট আপ করতে, নিম্নলিখিত পদক্ষেপগুলি সম্পাদন করুন৷

1. অনুমতি অনুরোধ করুন

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

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<!-- 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" />

NEARBY_WIFI_DEVICES এবং ACCESS_FINE_LOCATION অনুমতিগুলি বিপজ্জনক অনুমতি, তাই ব্যবহারকারী যখনই RTT স্ক্যান অপারেশন করতে চায় তখন আপনাকে রানটাইমে তাদের অনুরোধ করতে হবে৷ অনুমতি ইতিমধ্যে মঞ্জুর করা না হলে আপনার অ্যাপটিকে ব্যবহারকারীর অনুমতির অনুরোধ করতে হবে৷ রানটাইম অনুমতি সম্পর্কে আরও তথ্যের জন্য, অ্যাপের অনুমতির অনুরোধ দেখুন।

2. ডিভাইসটি Wi-Fi RTT সমর্থন করে কিনা তা পরীক্ষা করুন৷

ডিভাইসটি Wi-Fi RTT সমর্থন করে কিনা তা পরীক্ষা করতে, PackageManager API ব্যবহার করুন:

কোটলিন

context.packageManager.hasSystemFeature(PackageManager.FEATURE_WIFI_RTT)

জাভা

context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_WIFI_RTT);

3. Wi-Fi RTT উপলব্ধ কিনা তা পরীক্ষা করুন৷

ডিভাইসে Wi-Fi RTT থাকতে পারে, কিন্তু ব্যবহারকারী Wi-Fi অক্ষম করার কারণে এটি উপলব্ধ নাও হতে পারে। তাদের হার্ডওয়্যার এবং ফার্মওয়্যার ক্ষমতার উপর নির্ভর করে, কিছু ডিভাইস Wi-Fi RTT সমর্থন নাও করতে পারে যদি SoftAP বা টিথারিং ব্যবহার করা হয়। Wi-Fi RTT উপলব্ধ কিনা তা পরীক্ষা করতে, isAvailable() কল করুন।

Wi-Fi RTT এর উপলব্ধতা যে কোনো সময় পরিবর্তন হতে পারে। ACTION_WIFI_RTT_STATE_CHANGED পাওয়ার জন্য আপনার অ্যাপের একটি BroadcastReceiver নিবন্ধন করা উচিত, যা উপলব্ধতা পরিবর্তন হলে পাঠানো হয়। যখন আপনার অ্যাপটি সম্প্রচারের অভিপ্রায় পায়, তখন অ্যাপটির উপলব্ধতার বর্তমান অবস্থা পরীক্ষা করা উচিত এবং সেই অনুযায়ী তার আচরণ সামঞ্জস্য করা উচিত।

যেমন:

কোটলিন

val filter = IntentFilter(WifiRttManager.ACTION_WIFI_RTT_STATE_CHANGED)
val myReceiver = object: BroadcastReceiver() {

    override fun onReceive(context: Context, intent: Intent) {
        if (wifiRttManager.isAvailable) {
            …
        } else {
            …
        }
    }
}
context.registerReceiver(myReceiver, filter)

জাভা

IntentFilter filter =
    new IntentFilter(WifiRttManager.ACTION_WIFI_RTT_STATE_CHANGED);
BroadcastReceiver myReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        if (wifiRttManager.isAvailable()) {
            …
        } else {
            …
        }
    }
};
context.registerReceiver(myReceiver, filter);

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

একটি সীমাবদ্ধ অনুরোধ তৈরি করুন

একটি রেঞ্জিং রিকোয়েস্ট ( RangingRequest ) তৈরি করা হয় APs বা Wi-Fi সচেতন সমবয়সীদের একটি তালিকা নির্দিষ্ট করে যার কাছে একটি রেঞ্জের অনুরোধ করা হয়েছে৷ একাধিক অ্যাক্সেস পয়েন্ট বা Wi-Fi সচেতন সমকক্ষ একটি একক রেঞ্জিং অনুরোধে নির্দিষ্ট করা যেতে পারে; সমস্ত ডিভাইসের দূরত্ব পরিমাপ করা হয় এবং ফেরত দেওয়া হয়।

উদাহরণস্বরূপ, দূরত্ব পরিমাপ করার জন্য একটি অ্যাক্সেস পয়েন্ট নির্দিষ্ট করতে একটি অনুরোধ addAccessPoint() পদ্ধতি ব্যবহার করতে পারে:

কোটলিন

val req: RangingRequest = RangingRequest.Builder().run {
    addAccessPoint(ap1ScanResult)
    addAccessPoint(ap2ScanResult)
    build()
}

জাভা

RangingRequest.Builder builder = new RangingRequest.Builder();
builder.addAccessPoint(ap1ScanResult);
builder.addAccessPoint(ap2ScanResult);

RangingRequest req = builder.build();

একটি অ্যাক্সেস পয়েন্ট তার ScanResult অবজেক্ট দ্বারা চিহ্নিত করা হয়, যা WifiManager.getScanResults() কল করে পাওয়া যেতে পারে। আপনি একটি ব্যাচে একাধিক অ্যাক্সেস পয়েন্ট যোগ করতে addAccessPoints(List<ScanResult>) ব্যবহার করতে পারেন।

ScanResult বস্তুতে IEEE 802.11mc ( is80211mcResponder() ) এবং IEEE 802.11az নন-ট্রিগার ভিত্তিক রেঞ্জিং ( is80211azNtbResponder() ) সমর্থিত AP উভয়ই থাকতে পারে। IEEE 802.11az NTB রেঞ্জিং সমর্থন করে এমন ডিভাইসগুলি AP-এর ক্ষমতার উপর নির্ভর করে 802.11mc বা 802.11az রেঞ্জিং করে, যখন AP উভয়কেই সমর্থন করে তখন ডিফল্ট 802.11az-এ। IEEE 802.11az সমর্থন করে না এমন ডিভাইসগুলি IEEE 802.11mc প্রোটোকল ব্যবহার করে সমস্ত রেঞ্জিং সম্পাদন করে।

একইভাবে, একটি রেঞ্জিং অনুরোধ যথাক্রমে addWifiAwarePeer(MacAddress peer) এবং addWifiAwarePeer(PeerHandle peer) পদ্ধতি ব্যবহার করে একটি Wi-Fi Aware পিয়ার এর MAC ঠিকানা বা তার PeerHandle ব্যবহার করে যোগ করতে পারে। Wi-Fi সচেতন সমকক্ষদের আবিষ্কার সম্পর্কে আরও তথ্যের জন্য, Wi-Fi সচেতন ডকুমেন্টেশন দেখুন।

সীমাবদ্ধ অনুরোধ

একটি অ্যাপ WifiRttManager.startRanging() পদ্ধতি ব্যবহার করে একটি রেঞ্জিং অনুরোধ জারি করে এবং নিম্নলিখিতগুলি প্রদান করে: অপারেশনটি নির্দিষ্ট করার জন্য একটি RangingRequest , কলব্যাক প্রসঙ্গ নির্দিষ্ট করার জন্য একটি Executor এবং ফলাফলগুলি পাওয়ার জন্য একটি RangingResultCallback

যেমন:

কোটলিন

val mgr = context.getSystemService(Context.WIFI_RTT_RANGING_SERVICE) as WifiRttManager
val request: RangingRequest = myRequest
mgr.startRanging(request, executor, object : RangingResultCallback() {

    override fun onRangingResults(results: List<RangingResult>) { … }

    override fun onRangingFailure(code: Int) { … }
})

জাভা

WifiRttManager mgr =
      (WifiRttManager) Context.getSystemService(Context.WIFI_RTT_RANGING_SERVICE);

RangingRequest request ...;
mgr.startRanging(request, executor, new RangingResultCallback() {

  @Override
  public void onRangingFailure(int code) { … }

  @Override
  public void onRangingResults(List<RangingResult> results) { … }
});

রেঞ্জিং অপারেশন অ্যাসিঙ্ক্রোনাসভাবে সম্পাদিত হয়, এবং RangingResultCallback এর কলব্যাকগুলির একটিতে রেঞ্জিং ফলাফল ফেরত দেওয়া হয়:

  • পুরো রেঞ্জিং অপারেশন ব্যর্থ হলে, RangingResultCallback এ বর্ণিত একটি স্ট্যাটাস কোড দিয়ে onRangingFailure কলব্যাক ট্রিগার করা হয়। এই ধরনের ব্যর্থতা ঘটতে পারে যদি পরিষেবাটি সময়ে একটি রেঞ্জিং অপারেশন চালাতে না পারে--উদাহরণস্বরূপ, কারণ Wi-Fi অক্ষম করা আছে, কারণ অ্যাপ্লিকেশনটি অনেকগুলি পরিসরের ক্রিয়াকলাপগুলির জন্য অনুরোধ করেছে এবং থ্রোটল করা হয়েছে, বা একটি অনুমতি সমস্যার কারণে৷
  • রেঞ্জিং অপারেশন শেষ হলে, onRangingResults কলব্যাক ফলাফলের একটি তালিকার সাথে ট্রিগার হয় যা অনুরোধের তালিকার সাথে মেলে—প্রতিটি অনুরোধের জন্য একটি ফলাফল। ফলাফলের ক্রম অগত্যা অনুরোধের ক্রম মেলে না। মনে রাখবেন রেঞ্জিং অপারেশন সম্পূর্ণ হতে পারে কিন্তু প্রতিটি ফলাফল এখনও সেই নির্দিষ্ট পরিমাপের ব্যর্থতা নির্দেশ করতে পারে।

পরিসরের ফলাফল ব্যাখ্যা করুন

onRangingResults কলব্যাক দ্বারা প্রত্যাবর্তিত ফলাফলগুলির প্রতিটি একটি RangingResult বস্তু দ্বারা নির্দিষ্ট করা হয়৷ প্রতিটি অনুরোধে, নিম্নলিখিত করুন।

1. অনুরোধ সনাক্ত করুন

RangingRequest তৈরি করার সময় প্রদত্ত তথ্যের উপর ভিত্তি করে অনুরোধটি শনাক্ত করুন : প্রায়শই ScanResult এ দেওয়া একটি MAC ঠিকানা একটি অ্যাক্সেস পয়েন্ট সনাক্ত করে। getMacAddress() পদ্ধতি ব্যবহার করে রেঞ্জিং ফলাফল থেকে MAC ঠিকানা পাওয়া যেতে পারে।

রেঞ্জিং রিকোয়েস্টে নির্দিষ্ট করা পিয়ার (অ্যাক্সেস পয়েন্ট) থেকে রেঞ্জিং ফলাফলের তালিকা ভিন্ন ক্রমে হতে পারে, তাই আপনার পিয়ার সনাক্ত করতে MAC ঠিকানা ব্যবহার করা উচিত, ফলাফলের ক্রম নয়।

2. প্রতিটি পরিমাপ সফল হয়েছে কিনা তা নির্ধারণ করুন

একটি পরিমাপ সফল হয়েছে কিনা তা নির্ধারণ করতে, getStatus() পদ্ধতি ব্যবহার করুন। STATUS_SUCCESS ব্যতীত অন্য কোনো মান একটি ব্যর্থতা নির্দেশ করে৷ একটি ব্যর্থতার অর্থ হল এই ফলাফলের অন্যান্য সমস্ত ক্ষেত্র (উপরের অনুরোধ শনাক্তকরণ ব্যতীত) অবৈধ, এবং সংশ্লিষ্ট get* পদ্ধতিটি একটি IllegalStateException ব্যতিক্রম সহ ব্যর্থ হবে৷

3. প্রতিটি সফল পরিমাপের জন্য ফলাফল পান

প্রতিটি সফল পরিমাপের জন্য ( RangingResult ), আপনি সংশ্লিষ্ট get পদ্ধতিগুলির সাথে ফলাফলের মানগুলি পুনরুদ্ধার করতে পারেন:

  • দূরত্ব, মিমি, এবং পরিমাপের আদর্শ বিচ্যুতি:

    getDistanceMm()

    getDistanceStdDevMm()

  • পরিমাপের জন্য ব্যবহৃত প্যাকেটগুলির RSSI:

    getRssi()

  • মিলিসেকেন্ডে সময় যেখানে পরিমাপ নেওয়া হয়েছিল (বুট হওয়ার পর থেকে সময় নির্দেশ করে):

    getRangingTimestampMillis()

  • পরিমাপের সংখ্যা যা চেষ্টা করা হয়েছিল এবং পরিমাপের সংখ্যা যা সফল হয়েছে (এবং যার উপর ভিত্তি করে দূরত্ব পরিমাপ করা হয়):

    getNumAttemptedMeasurements()

    getNumSuccessfulMeasurements()

  • একটি ক্লায়েন্ট ডিভাইসকে 11az NTB পরিমাপের মধ্যে সর্বনিম্ন এবং সর্বোচ্চ সময় অপেক্ষা করতে হবে:

    getMinTimeBetweenNtbMeasurementsMicros() এবং getMaxTimeBetweenNtbMeasurementsMicros() সর্বনিম্ন এবং সর্বোচ্চ সময় ফেরত দেয়। ন্যূনতম সময় অতিবাহিত হওয়ার আগে যদি পরবর্তী রেঞ্জিং পরিমাপের অনুরোধ করা হয়, তাহলে API ক্যাশ করা রেঞ্জিং ফলাফল প্রদান করে। সর্বোচ্চ সময় অতিবাহিত হওয়ার পরে যদি পরবর্তী রেঞ্জিং পরিমাপের অনুরোধ করা হয়, তাহলে API নন-ট্রিগার রেঞ্জিং সেশনটি বন্ধ করে দেয় এবং প্রতিক্রিয়াকারী স্টেশনের সাথে একটি নতুন রেঞ্জিং সেশনের জন্য আলোচনা করে। আপনার একটি নতুন রেঞ্জিং সেশনের অনুরোধ করা এড়ানো উচিত, কারণ এটি রেঞ্জিং পরিমাপের সময় ওভারহেড যোগ করে। 802.11az নন-ট্রিগার ভিত্তিক রেঞ্জিং দক্ষতার সম্পূর্ণ সুবিধা নিতে, পূর্ববর্তী RangingResult পরিমাপে নির্দিষ্ট ন্যূনতম এবং সর্বোচ্চ পরিমাপের সময়ের মধ্যে পরবর্তী রেঞ্জিং অনুরোধটি ট্রিগার করুন।

  • লং ট্রেনিং ফিল্ড (LTF) পুনরাবৃত্তি যা IEEE 802.11az NTB ফলাফলের প্রস্তাবনায় ব্যবহৃত প্রতিক্রিয়াকারী এবং সূচনাকারী স্টেশনগুলি:

    get80211azResponderTxLtfRepetitionsCount()

    get80211azInitiatorTxLtfRepetitionsCount()

  • IEEE 802.11az NTB ফলাফলের জন্য ইনিশিয়েটর স্টেশন ব্যবহার করা স্থানিক টাইম স্ট্রিম (STS) প্রেরণ এবং গ্রহণের সংখ্যা:

    get80211azNumberOfTxSpatialStreams()

    get80211azNumberOfRxSpatialStreams()

অ্যান্ড্রয়েড ডিভাইস যা ওয়াইফাই-আরটিটি সমর্থন করে

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

অ্যাক্সেস পয়েন্ট

প্রস্তুতকারক এবং মডেল সমর্থন তারিখ
Nest Wifi Pro (Wi-Fi 6E) সমর্থিত
Compulab ওয়াইল্ড এপি সমর্থিত
Google Wi-Fi সমর্থিত
Google Nest Wi-Fi রাউটার সমর্থিত
Google Nest Wi-Fi পয়েন্ট সমর্থিত
আরুবা AP-635 সমর্থিত
সিসকো 9130 সমর্থিত
সিসকো 9136 সমর্থিত
সিসকো 9166 সমর্থিত
সিসকো 9164 সমর্থিত
আরুবা AP-505 সমর্থিত
আরুবা AP-515 সমর্থিত
আরুবা AP-575 সমর্থিত
আরুবা AP-518 সমর্থিত
আরুবা AP-505H সমর্থিত
আরুবা AP-565 সমর্থিত
আরুবা AP-535 সমর্থিত

ফোন

প্রস্তুতকারক এবং মডেল অ্যান্ড্রয়েড সংস্করণ
পিক্সেল 6 9.0+
Pixel 6 Pro 9.0+
পিক্সেল 5 9.0+
Pixel 5a 9.0+
Pixel 5a 5G 9.0+
Xiaomi Mi 10 Pro 9.0+
Xiaomi Mi 10 9.0+
Xiaomi Redmi Mi 9T Pro 9.0+
Xiaomi Mi 9T 9.0+
Xiaomi Mi 9 9.0+
Xiaomi Mi Note 10 9.0+
Xiaomi Mi Note 10 Lite 9.0+
Xiaomi Redmi Note 9S 9.0+
Xiaomi Redmi Note 9 Pro 9.0+
Xiaomi Redmi Note 8T 9.0+
Xiaomi Redmi Note 8 9.0+
Xiaomi Redmi K30 Pro 9.0+
Xiaomi Redmi K20 Pro 9.0+
Xiaomi Redmi K20 9.0+
Xiaomi Redmi Note 5 Pro 9.0+
Xiaomi Mi CC9 Pro 9.0+
LG G8X ThinQ 9.0+
LG V50S ThinQ 9.0+
LG V60 ThinQ 9.0+
LG V30 9.0+
Samsung Galaxy Note 10+ 5G 9.0+
Samsung Galaxy S20+ 5G 9.0+
Samsung Galaxy S20+ 9.0+
Samsung Galaxy S20 5G 9.0+
Samsung Galaxy S20 Ultra 5G 9.0+
Samsung Galaxy S20 9.0+
Samsung Galaxy Note 10+ 9.0+
Samsung Galaxy Note 10 5G 9.0+
Samsung Galaxy Note 10 9.0+
Samsung A9 Pro 9.0+
Google Pixel 4 XL 9.0+
গুগল পিক্সেল 4 9.0+
Google Pixel 4a 9.0+
গুগল পিক্সেল 3 এক্সএল 9.0+
গুগল পিক্সেল 3 9.0+
Google Pixel 3a XL 9.0+
Google Pixel 3a 9.0+
Google Pixel 2 XL 9.0+
গুগল পিক্সেল 2 9.0+
গুগল পিক্সেল 1 এক্সএল 9.0+
গুগল পিক্সেল 1 9.0+
পোকো এক্স২ 9.0+
শার্প অ্যাকোস R3 SH-04L 9.0+

খুচরা, গুদামজাতকরণ এবং বিতরণ কেন্দ্র ডিভাইস

প্রস্তুতকারক এবং মডেল অ্যান্ড্রয়েড সংস্করণ
জেব্রা PS20 10.0+
জেব্রা TC52/TC52HC 10.0+
জেব্রা TC57 10.0+
জেব্রা TC72 10.0+
জেব্রা TC77 10.0+
জেব্রা MC93 10.0+
জেব্রা TC8300 10.0+
জেব্রা VC8300 10.0+
জেব্রা EC30 10.0+
জেব্রা ET51 10.0+
জেব্রা ET56 10.0+
জেব্রা L10 10.0+
জেব্রা CC600/CC6000 10.0+
জেব্রা MC3300x 10.0+
জেব্রা MC330x 10.0+
জেব্রা TC52x 10.0+
জেব্রা TC57x 10.0+
জেব্রা EC50 (LAN এবং HC) 10.0+
জেব্রা EC55 (WAN) 10.0+
জেব্রা WT6300 10.0+
Skorpio X5 10.0+
,

আপনি কাছাকাছি RTT-সক্ষম Wi-Fi অ্যাক্সেস পয়েন্ট এবং পিয়ার ওয়াই-ফাই অ্যাওয়ার ডিভাইসগুলির দূরত্ব পরিমাপ করতে Wi-Fi RTT (রাউন্ড-ট্রিপ-টাইম) API দ্বারা প্রদত্ত Wi-Fi অবস্থান কার্যকারিতা ব্যবহার করতে পারেন।

আপনি যদি তিন বা ততোধিক অ্যাক্সেস পয়েন্টের দূরত্ব পরিমাপ করেন, তাহলে আপনি একটি মাল্টিলেটারেশন অ্যালগরিদম ব্যবহার করে ডিভাইসের অবস্থান অনুমান করতে পারেন যা সেই পরিমাপের জন্য সবচেয়ে উপযুক্ত। ফলাফল সাধারণত 1-2 মিটারের মধ্যে সঠিক হয়।

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

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

Wi-Fi RTT এবং সম্পর্কিত ফাইন-টাইম-মেজারমেন্ট (FTM) ক্ষমতাগুলি IEEE 802.11-2016 মান দ্বারা নির্দিষ্ট করা হয়েছে৷ Wi-Fi RTT-এর জন্য FTM দ্বারা প্রদত্ত সুনির্দিষ্ট সময়ের পরিমাপ প্রয়োজন কারণ এটি একটি প্যাকেট ডিভাইসগুলির মধ্যে একটি রাউন্ড ট্রিপ করতে যে সময় নেয় তা পরিমাপ করে এবং আলোর গতি দ্বারা সেই সময়কে গুণ করে দুটি ডিভাইসের মধ্যে দূরত্ব গণনা করে।

Android 15 (API লেভেল 35) IEEE 802.11az নন-ট্রিগার ভিত্তিক (NTB) রেঞ্জের জন্য সমর্থন চালু করেছে।

অ্যান্ড্রয়েড সংস্করণের উপর ভিত্তি করে বাস্তবায়ন পার্থক্য

Android 9 (API লেভেল 28) এ Wi-Fi RTT চালু করা হয়েছিল। Android 9 চালিত ডিভাইসগুলির সাথে মাল্টিলেটেশন ব্যবহার করে একটি ডিভাইসের অবস্থান নির্ধারণ করতে এই প্রোটোকল ব্যবহার করার সময়, আপনার অ্যাপে পূর্ব-নির্ধারিত অ্যাক্সেস পয়েন্ট (AP) অবস্থানের ডেটাতে অ্যাক্সেস থাকতে হবে। এই ডেটা কীভাবে সংরক্ষণ এবং পুনরুদ্ধার করা যায় তা সিদ্ধান্ত নেওয়া আপনার উপর নির্ভর করে।

Android 10 (API স্তর 29) এবং উচ্চতর চলমান ডিভাইসগুলিতে, AP লোকেশন ডেটাকে ResponderLocation অবজেক্ট হিসাবে উপস্থাপন করা যেতে পারে, যার মধ্যে অক্ষাংশ, দ্রাঘিমাংশ এবং উচ্চতা অন্তর্ভুক্ত রয়েছে। অবস্থান কনফিগারেশন তথ্য/লোকেশন সিভিক রিপোর্ট (LCI/LCR ডেটা) সমর্থন করে এমন Wi-Fi RTT AP-এর জন্য, রেঞ্জিং প্রক্রিয়া চলাকালীন প্রোটোকল একটি ResponderLocation অবজেক্ট ফিরিয়ে দেবে।

এই বৈশিষ্ট্যটি অ্যাপগুলিকে এই তথ্যগুলি আগে থেকে সংরক্ষণ করার প্রয়োজন না করে সরাসরি তাদের অবস্থানের জন্য জিজ্ঞাসা করতে অ্যাপগুলিকে জিজ্ঞাসা করতে দেয়৷ সুতরাং, আপনার অ্যাপটি APগুলিকে খুঁজে পেতে এবং তাদের অবস্থান নির্ধারণ করতে পারে এমনকি যদি APগুলি আগে জানা না থাকে, যেমন যখন কোনও ব্যবহারকারী একটি নতুন বিল্ডিংয়ে প্রবেশ করেন৷

IEEE 802.11az NTB রেঞ্জিং সাপোর্ট অ্যান্ড্রয়েড 15 (API লেভেল 35) এবং উচ্চতর চলমান ডিভাইসগুলিতে উপলব্ধ। এর মানে হল যে ডিভাইসটি যদি IEEE 802.11az NTB রেসপন্ডার মোড সমর্থন করে ( WifiRttManager.CHARACTERISTICS_KEY_BOOLEAN_STA_RESPONDER দ্বারা নির্দেশিত), আপনার অ্যাপটি IEEE 802.11mc এবং IEEE 802.11az উভয়ই একটি সক্ষম APs অনুরোধের সাথে খুঁজে পেতে পারে৷ আপনার অ্যাপের নিয়ন্ত্রণে সঠিক ব্যবধান রেখে রেঞ্জিং পরিমাপের মধ্যে ব্যবধানের জন্য ব্যবহার করা যেতে পারে এমন ন্যূনতম এবং সর্বোচ্চ মান সম্পর্কে তথ্য প্রদানের জন্য RangingResult API-কে প্রসারিত করা হয়েছে।

প্রয়োজনীয়তা

  • রেঞ্জিং অনুরোধ করা ডিভাইসের হার্ডওয়্যারকে অবশ্যই 802.11-2016 FTM স্ট্যান্ডার্ড বা 802.11az স্ট্যান্ডার্ড (নন-ট্রিগার ভিত্তিক রেঞ্জিং) বাস্তবায়ন করতে হবে।
  • রেঞ্জিং রিকোয়েস্ট করা ডিভাইসটি অবশ্যই Android 9 (API লেভেল 28) বা তার পরে চলমান হতে হবে। IEEE 802.11az নন-ট্রিগার ভিত্তিক রেঞ্জিং Android 15 (API স্তর 35) এবং উচ্চতর চলমান ডিভাইসগুলিতে সক্ষম করা হয়েছে।
  • রেঞ্জিং রিকোয়েস্ট করা ডিভাইসটিতে অবশ্যই লোকেশন সার্ভিস চালু থাকতে হবে এবং ওয়াই-ফাই স্ক্যানিং চালু থাকতে হবে ( সেটিংস > লোকেশনের অধীনে)।
  • যে অ্যাপটি রেঞ্জিং রিকোয়েস্ট করছে সেটি যদি Android 13 (API লেভেল 33) বা উচ্চতরকে টার্গেট করে, তাহলে তার NEARBY_WIFI_DEVICES অনুমতি থাকতে হবে। যদি এই ধরনের একটি অ্যাপ Android এর পূর্ববর্তী সংস্করণকে লক্ষ্য করে, তবে এটির পরিবর্তে ACCESS_FINE_LOCATION অনুমতি থাকতে হবে।
  • অ্যাপটি দৃশ্যমান থাকা অবস্থায় বা অগ্রভাগের পরিষেবায় থাকা অবস্থায় অ্যাপটিকে অবশ্যই অ্যাক্সেস পয়েন্টের পরিসীমা জিজ্ঞাসা করতে হবে। অ্যাপটি ব্যাকগ্রাউন্ড থেকে অবস্থানের তথ্য অ্যাক্সেস করতে পারে না।
  • অ্যাক্সেস পয়েন্ট অবশ্যই IEEE 802.11-2016 FTM স্ট্যান্ডার্ড বা IEEE 802.11az স্ট্যান্ডার্ড (নন-ট্রিগার ভিত্তিক রেঞ্জিং) বাস্তবায়ন করতে হবে।

সেটআপ

Wi-Fi RTT ব্যবহার করার জন্য আপনার অ্যাপ সেট আপ করতে, নিম্নলিখিত পদক্ষেপগুলি সম্পাদন করুন৷

1. অনুমতি অনুরোধ করুন

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

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<!-- 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" />

NEARBY_WIFI_DEVICES এবং ACCESS_FINE_LOCATION অনুমতিগুলি বিপজ্জনক অনুমতি, তাই ব্যবহারকারী যখনই RTT স্ক্যান অপারেশন করতে চায় তখন আপনাকে রানটাইমে তাদের অনুরোধ করতে হবে৷ অনুমতি ইতিমধ্যে মঞ্জুর করা না হলে আপনার অ্যাপটিকে ব্যবহারকারীর অনুমতির অনুরোধ করতে হবে৷ রানটাইম অনুমতি সম্পর্কে আরও তথ্যের জন্য, অ্যাপের অনুমতির অনুরোধ দেখুন।

2. ডিভাইসটি Wi-Fi RTT সমর্থন করে কিনা তা পরীক্ষা করুন৷

ডিভাইসটি Wi-Fi RTT সমর্থন করে কিনা তা পরীক্ষা করতে, PackageManager API ব্যবহার করুন:

কোটলিন

context.packageManager.hasSystemFeature(PackageManager.FEATURE_WIFI_RTT)

জাভা

context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_WIFI_RTT);

3. Wi-Fi RTT উপলব্ধ কিনা তা পরীক্ষা করুন৷

ডিভাইসে Wi-Fi RTT থাকতে পারে, কিন্তু ব্যবহারকারী Wi-Fi অক্ষম করার কারণে এটি উপলব্ধ নাও হতে পারে। তাদের হার্ডওয়্যার এবং ফার্মওয়্যার ক্ষমতার উপর নির্ভর করে, কিছু ডিভাইস Wi-Fi RTT সমর্থন নাও করতে পারে যদি SoftAP বা টিথারিং ব্যবহার করা হয়। Wi-Fi RTT উপলব্ধ কিনা তা পরীক্ষা করতে, isAvailable() কল করুন।

Wi-Fi RTT এর উপলব্ধতা যে কোনো সময় পরিবর্তন হতে পারে। ACTION_WIFI_RTT_STATE_CHANGED পাওয়ার জন্য আপনার অ্যাপের একটি BroadcastReceiver নিবন্ধন করা উচিত, যা উপলব্ধতা পরিবর্তন হলে পাঠানো হয়। যখন আপনার অ্যাপটি সম্প্রচারের অভিপ্রায় পায়, তখন অ্যাপটির উপলব্ধতার বর্তমান অবস্থা পরীক্ষা করা উচিত এবং সেই অনুযায়ী তার আচরণ সামঞ্জস্য করা উচিত।

যেমন:

কোটলিন

val filter = IntentFilter(WifiRttManager.ACTION_WIFI_RTT_STATE_CHANGED)
val myReceiver = object: BroadcastReceiver() {

    override fun onReceive(context: Context, intent: Intent) {
        if (wifiRttManager.isAvailable) {
            …
        } else {
            …
        }
    }
}
context.registerReceiver(myReceiver, filter)

জাভা

IntentFilter filter =
    new IntentFilter(WifiRttManager.ACTION_WIFI_RTT_STATE_CHANGED);
BroadcastReceiver myReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        if (wifiRttManager.isAvailable()) {
            …
        } else {
            …
        }
    }
};
context.registerReceiver(myReceiver, filter);

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

একটি সীমাবদ্ধ অনুরোধ তৈরি করুন

একটি রেঞ্জিং রিকোয়েস্ট ( RangingRequest ) তৈরি করা হয় APs বা Wi-Fi সচেতন সমবয়সীদের একটি তালিকা নির্দিষ্ট করে যার কাছে একটি রেঞ্জের অনুরোধ করা হয়েছে৷ একাধিক অ্যাক্সেস পয়েন্ট বা Wi-Fi সচেতন সমকক্ষ একটি একক রেঞ্জিং অনুরোধে নির্দিষ্ট করা যেতে পারে; সমস্ত ডিভাইসের দূরত্ব পরিমাপ করা হয় এবং ফেরত দেওয়া হয়।

উদাহরণস্বরূপ, দূরত্ব পরিমাপ করার জন্য একটি অ্যাক্সেস পয়েন্ট নির্দিষ্ট করতে একটি অনুরোধ addAccessPoint() পদ্ধতি ব্যবহার করতে পারে:

কোটলিন

val req: RangingRequest = RangingRequest.Builder().run {
    addAccessPoint(ap1ScanResult)
    addAccessPoint(ap2ScanResult)
    build()
}

জাভা

RangingRequest.Builder builder = new RangingRequest.Builder();
builder.addAccessPoint(ap1ScanResult);
builder.addAccessPoint(ap2ScanResult);

RangingRequest req = builder.build();

একটি অ্যাক্সেস পয়েন্ট তার ScanResult অবজেক্ট দ্বারা চিহ্নিত করা হয়, যা WifiManager.getScanResults() কল করে পাওয়া যেতে পারে। আপনি একটি ব্যাচে একাধিক অ্যাক্সেস পয়েন্ট যোগ করতে addAccessPoints(List<ScanResult>) ব্যবহার করতে পারেন।

ScanResult বস্তুতে IEEE 802.11mc ( is80211mcResponder() ) এবং IEEE 802.11az নন-ট্রিগার ভিত্তিক রেঞ্জিং ( is80211azNtbResponder() ) সমর্থিত AP উভয়ই থাকতে পারে। IEEE 802.11az NTB রেঞ্জিং সমর্থন করে এমন ডিভাইসগুলি AP-এর ক্ষমতার উপর নির্ভর করে 802.11mc বা 802.11az রেঞ্জিং করে, যখন AP উভয়কেই সমর্থন করে তখন ডিফল্ট 802.11az-এ। IEEE 802.11az সমর্থন করে না এমন ডিভাইসগুলি IEEE 802.11mc প্রোটোকল ব্যবহার করে সমস্ত রেঞ্জিং সম্পাদন করে।

একইভাবে, একটি রেঞ্জিং অনুরোধ যথাক্রমে addWifiAwarePeer(MacAddress peer) এবং addWifiAwarePeer(PeerHandle peer) পদ্ধতি ব্যবহার করে একটি Wi-Fi Aware পিয়ার এর MAC ঠিকানা বা তার PeerHandle ব্যবহার করে যোগ করতে পারে। Wi-Fi সচেতন সমকক্ষদের আবিষ্কার সম্পর্কে আরও তথ্যের জন্য, Wi-Fi সচেতন ডকুমেন্টেশন দেখুন।

সীমাবদ্ধ অনুরোধ

একটি অ্যাপ WifiRttManager.startRanging() পদ্ধতি ব্যবহার করে একটি রেঞ্জিং অনুরোধ জারি করে এবং নিম্নলিখিতগুলি প্রদান করে: অপারেশনটি নির্দিষ্ট করার জন্য একটি RangingRequest , কলব্যাক প্রসঙ্গ নির্দিষ্ট করার জন্য একটি Executor এবং ফলাফলগুলি পাওয়ার জন্য একটি RangingResultCallback

যেমন:

কোটলিন

val mgr = context.getSystemService(Context.WIFI_RTT_RANGING_SERVICE) as WifiRttManager
val request: RangingRequest = myRequest
mgr.startRanging(request, executor, object : RangingResultCallback() {

    override fun onRangingResults(results: List<RangingResult>) { … }

    override fun onRangingFailure(code: Int) { … }
})

জাভা

WifiRttManager mgr =
      (WifiRttManager) Context.getSystemService(Context.WIFI_RTT_RANGING_SERVICE);

RangingRequest request ...;
mgr.startRanging(request, executor, new RangingResultCallback() {

  @Override
  public void onRangingFailure(int code) { … }

  @Override
  public void onRangingResults(List<RangingResult> results) { … }
});

রেঞ্জিং অপারেশন অ্যাসিঙ্ক্রোনাসভাবে সম্পাদিত হয়, এবং RangingResultCallback এর কলব্যাকগুলির একটিতে রেঞ্জিং ফলাফল ফেরত দেওয়া হয়:

  • পুরো রেঞ্জিং অপারেশন ব্যর্থ হলে, RangingResultCallback এ বর্ণিত একটি স্ট্যাটাস কোড দিয়ে onRangingFailure কলব্যাক ট্রিগার করা হয়। এই ধরনের ব্যর্থতা ঘটতে পারে যদি পরিষেবাটি সময়ে একটি রেঞ্জিং অপারেশন চালাতে না পারে--উদাহরণস্বরূপ, কারণ Wi-Fi অক্ষম করা আছে, কারণ অ্যাপ্লিকেশনটি অনেকগুলি পরিসরের ক্রিয়াকলাপগুলির জন্য অনুরোধ করেছে এবং থ্রোটল করা হয়েছে, বা একটি অনুমতি সমস্যার কারণে৷
  • রেঞ্জিং অপারেশন শেষ হলে, onRangingResults কলব্যাক ফলাফলের একটি তালিকার সাথে ট্রিগার হয় যা অনুরোধের তালিকার সাথে মেলে—প্রতিটি অনুরোধের জন্য একটি ফলাফল। ফলাফলের ক্রম অগত্যা অনুরোধের ক্রম মেলে না। মনে রাখবেন রেঞ্জিং অপারেশন সম্পূর্ণ হতে পারে কিন্তু প্রতিটি ফলাফল এখনও সেই নির্দিষ্ট পরিমাপের ব্যর্থতা নির্দেশ করতে পারে।

পরিসরের ফলাফল ব্যাখ্যা করুন

onRangingResults কলব্যাক দ্বারা প্রত্যাবর্তিত ফলাফলগুলির প্রতিটি একটি RangingResult বস্তু দ্বারা নির্দিষ্ট করা হয়৷ প্রতিটি অনুরোধে, নিম্নলিখিত করুন।

1. অনুরোধ সনাক্ত করুন

RangingRequest তৈরি করার সময় প্রদত্ত তথ্যের উপর ভিত্তি করে অনুরোধটি শনাক্ত করুন : প্রায়শই ScanResult এ দেওয়া একটি MAC ঠিকানা একটি অ্যাক্সেস পয়েন্ট সনাক্ত করে। getMacAddress() পদ্ধতি ব্যবহার করে রেঞ্জিং ফলাফল থেকে MAC ঠিকানা পাওয়া যেতে পারে।

রেঞ্জিং রিকোয়েস্টে নির্দিষ্ট করা পিয়ার (অ্যাক্সেস পয়েন্ট) থেকে রেঞ্জিং ফলাফলের তালিকা ভিন্ন ক্রমে হতে পারে, তাই আপনার পিয়ার সনাক্ত করতে MAC ঠিকানা ব্যবহার করা উচিত, ফলাফলের ক্রম নয়।

2. প্রতিটি পরিমাপ সফল হয়েছে কিনা তা নির্ধারণ করুন

একটি পরিমাপ সফল হয়েছে কিনা তা নির্ধারণ করতে, getStatus() পদ্ধতি ব্যবহার করুন। STATUS_SUCCESS ব্যতীত অন্য কোনো মান একটি ব্যর্থতা নির্দেশ করে৷ একটি ব্যর্থতার অর্থ হল এই ফলাফলের অন্যান্য সমস্ত ক্ষেত্র (উপরের অনুরোধ শনাক্তকরণ ব্যতীত) অবৈধ, এবং সংশ্লিষ্ট get* পদ্ধতিটি একটি IllegalStateException ব্যতিক্রম সহ ব্যর্থ হবে৷

3. প্রতিটি সফল পরিমাপের জন্য ফলাফল পান

প্রতিটি সফল পরিমাপের জন্য ( RangingResult ), আপনি সংশ্লিষ্ট get পদ্ধতিগুলির সাথে ফলাফলের মানগুলি পুনরুদ্ধার করতে পারেন:

  • দূরত্ব, মিমি, এবং পরিমাপের আদর্শ বিচ্যুতি:

    getDistanceMm()

    getDistanceStdDevMm()

  • পরিমাপের জন্য ব্যবহৃত প্যাকেটগুলির RSSI:

    getRssi()

  • মিলিসেকেন্ডে সময় যেখানে পরিমাপ নেওয়া হয়েছিল (বুট হওয়ার পর থেকে সময় নির্দেশ করে):

    getRangingTimestampMillis()

  • পরিমাপের সংখ্যা যা চেষ্টা করা হয়েছিল এবং পরিমাপের সংখ্যা যা সফল হয়েছে (এবং যার উপর ভিত্তি করে দূরত্ব পরিমাপ করা হয়):

    getNumAttemptedMeasurements()

    getNumSuccessfulMeasurements()

  • একটি ক্লায়েন্ট ডিভাইসকে 11az NTB পরিমাপের মধ্যে সর্বনিম্ন এবং সর্বোচ্চ সময় অপেক্ষা করতে হবে:

    getMinTimeBetweenNtbMeasurementsMicros() এবং getMaxTimeBetweenNtbMeasurementsMicros() সর্বনিম্ন এবং সর্বোচ্চ সময় ফেরত দেয়। ন্যূনতম সময় অতিবাহিত হওয়ার আগে যদি পরবর্তী রেঞ্জিং পরিমাপের অনুরোধ করা হয়, তাহলে API ক্যাশ করা রেঞ্জিং ফলাফল প্রদান করে। সর্বোচ্চ সময় অতিবাহিত হওয়ার পরে যদি পরবর্তী রেঞ্জিং পরিমাপের অনুরোধ করা হয়, তাহলে API নন-ট্রিগার রেঞ্জিং সেশনটি বন্ধ করে দেয় এবং প্রতিক্রিয়াকারী স্টেশনের সাথে একটি নতুন রেঞ্জিং সেশনের জন্য আলোচনা করে। আপনার একটি নতুন রেঞ্জিং সেশনের অনুরোধ করা এড়ানো উচিত, কারণ এটি রেঞ্জিং পরিমাপের সময় ওভারহেড যোগ করে। 802.11az নন-ট্রিগার ভিত্তিক রেঞ্জিং দক্ষতার সম্পূর্ণ সুবিধা নিতে, পূর্ববর্তী RangingResult পরিমাপে নির্দিষ্ট ন্যূনতম এবং সর্বোচ্চ পরিমাপের সময়ের মধ্যে পরবর্তী রেঞ্জিং অনুরোধটি ট্রিগার করুন।

  • লং ট্রেনিং ফিল্ড (LTF) পুনরাবৃত্তি যা IEEE 802.11az NTB ফলাফলের প্রস্তাবনায় ব্যবহৃত প্রতিক্রিয়াকারী এবং সূচনাকারী স্টেশনগুলি:

    get80211azResponderTxLtfRepetitionsCount()

    get80211azInitiatorTxLtfRepetitionsCount()

  • IEEE 802.11az NTB ফলাফলের জন্য ইনিশিয়েটর স্টেশন ব্যবহার করা স্থানিক টাইম স্ট্রিম (STS) প্রেরণ এবং গ্রহণের সংখ্যা:

    get80211azNumberOfTxSpatialStreams()

    get80211azNumberOfRxSpatialStreams()

অ্যান্ড্রয়েড ডিভাইস যা ওয়াইফাই-আরটিটি সমর্থন করে

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

অ্যাক্সেস পয়েন্ট

প্রস্তুতকারক এবং মডেল সমর্থন তারিখ
Nest Wifi Pro (Wi-Fi 6E) সমর্থিত
Compulab ওয়াইল্ড এপি সমর্থিত
Google Wi-Fi সমর্থিত
Google Nest Wi-Fi রাউটার সমর্থিত
Google Nest Wi-Fi পয়েন্ট সমর্থিত
আরুবা AP-635 সমর্থিত
সিসকো 9130 সমর্থিত
সিসকো 9136 সমর্থিত
সিসকো 9166 সমর্থিত
সিসকো 9164 সমর্থিত
আরুবা AP-505 সমর্থিত
আরুবা AP-515 সমর্থিত
আরুবা AP-575 সমর্থিত
আরুবা AP-518 সমর্থিত
আরুবা AP-505H সমর্থিত
আরুবা AP-565 সমর্থিত
আরুবা AP-535 সমর্থিত

ফোন

প্রস্তুতকারক এবং মডেল অ্যান্ড্রয়েড সংস্করণ
পিক্সেল 6 9.0+
Pixel 6 Pro 9.0+
পিক্সেল 5 9.0+
Pixel 5a 9.0+
Pixel 5a 5G 9.0+
Xiaomi Mi 10 Pro 9.0+
Xiaomi Mi 10 9.0+
Xiaomi Redmi Mi 9T Pro 9.0+
Xiaomi Mi 9T 9.0+
Xiaomi Mi 9 9.0+
Xiaomi Mi Note 10 9.0+
Xiaomi Mi Note 10 Lite 9.0+
Xiaomi Redmi Note 9S 9.0+
Xiaomi Redmi Note 9 Pro 9.0+
Xiaomi Redmi Note 8T 9.0+
Xiaomi Redmi Note 8 9.0+
Xiaomi Redmi K30 Pro 9.0+
Xiaomi Redmi K20 Pro 9.0+
Xiaomi Redmi K20 9.0+
Xiaomi Redmi Note 5 Pro 9.0+
Xiaomi Mi CC9 Pro 9.0+
LG G8X ThinQ 9.0+
LG V50S ThinQ 9.0+
LG V60 ThinQ 9.0+
LG V30 9.0+
Samsung Galaxy Note 10+ 5G 9.0+
Samsung Galaxy S20+ 5G 9.0+
Samsung Galaxy S20+ 9.0+
Samsung Galaxy S20 5G 9.0+
Samsung Galaxy S20 Ultra 5G 9.0+
Samsung Galaxy S20 9.0+
Samsung Galaxy Note 10+ 9.0+
Samsung Galaxy Note 10 5G 9.0+
Samsung Galaxy Note 10 9.0+
Samsung A9 Pro 9.0+
Google Pixel 4 XL 9.0+
গুগল পিক্সেল 4 9.0+
Google Pixel 4a 9.0+
গুগল পিক্সেল 3 এক্সএল 9.0+
গুগল পিক্সেল 3 9.0+
Google Pixel 3a XL 9.0+
Google Pixel 3a 9.0+
Google Pixel 2 XL 9.0+
গুগল পিক্সেল 2 9.0+
গুগল পিক্সেল 1 এক্সএল 9.0+
গুগল পিক্সেল 1 9.0+
পোকো এক্স২ 9.0+
শার্প অ্যাকোস R3 SH-04L 9.0+

খুচরা, গুদামজাতকরণ এবং বিতরণ কেন্দ্র ডিভাইস

প্রস্তুতকারক এবং মডেল অ্যান্ড্রয়েড সংস্করণ
জেব্রা PS20 10.0+
জেব্রা TC52/TC52HC 10.0+
জেব্রা TC57 10.0+
জেব্রা TC72 10.0+
জেব্রা TC77 10.0+
জেব্রা MC93 10.0+
জেব্রা TC8300 10.0+
জেব্রা VC8300 10.0+
জেব্রা EC30 10.0+
জেব্রা ET51 10.0+
জেব্রা ET56 10.0+
জেব্রা L10 10.0+
জেব্রা CC600/CC6000 10.0+
জেব্রা MC3300x 10.0+
জেব্রা MC330x 10.0+
জেব্রা TC52x 10.0+
জেব্রা TC57x 10.0+
জেব্রা EC50 (LAN এবং HC) 10.0+
জেব্রা EC55 (WAN) 10.0+
জেব্রা WT6300 10.0+
Skorpio X5 10.0+