Android 16-এ রেঞ্জিং মডিউল চালু করা হয়েছে, যা ডিভাইসের মধ্যে নিখুঁত রেঞ্জিংয়ের জন্য ইউনিফায়েড ও স্ট্যান্ডার্ডাইজড ইন্টারফেস প্রদান করে। আপনি এই API সারফেস ব্যবহার করে প্রতিটি রেঞ্জিং প্রযুক্তি আলাদাভাবে ম্যানেজ না করেই পিয়ার ডিভাইসের দূরত্ব ও পজিশন পরিমাপ করতে পারবেন।
রেঞ্জিং মডিউল নিম্নলিখিত প্রযুক্তিগুলি সাপোর্ট করে:
- আলট্রা-ওয়াইডব্যান্ড
- ব্লুটুথ চ্যানেল সাউন্ডিং
- ওয়াই-ফাই NAN RTT
- ব্লুটুথ RSSI রেঞ্জিং
রেঞ্জিং ক্ষমতা ও উপলভ্যতা
RangingManager ক্লাস, অ্যাপকে স্থানীয় ডিভাইসের মাধ্যমে কাজ করে এমন রেঞ্জিং প্রযুক্তি
সম্পর্কে তথ্য প্রদান করে, এর পাশাপাশি প্রতিটি প্রযুক্তির উপলভ্যতা ও
ক্ষমতা সম্পর্কেও জানায়। অ্যাপগুলি Callback-এর জন্য রেজিস্টার করতে পারে যাতে
যেকোনও কাজ করে এমন প্রযুক্তির উপলভ্যতা বা ক্ষমতার যেকোনও পরিবর্তনের আপডেট
পাওয়া যায়।
ডিভাইসের ভূমিকা
রেঞ্জিং সেশনে অংশগ্রহণকারী ডিভাইসকে অবশ্যই ইনিশিয়েটর বা
রেসপন্ডার হতে হবে। ইনিশিয়েটর ডিভাইস এক বা একাধিক রেসপন্ডার ডিভাইসের সাথে রেঞ্জিং সেশন শুরু করে। রেসপন্ডার ডিভাইস একবারে শুধুমাত্র একটি ইনিশিয়েটর থেকে রেঞ্জিংয়ের অনুরোধে
প্রতিক্রিয়া জানায়। আপনি RangingPreference ক্লাস সহ রেঞ্জিং সেশনে কোনও নির্দিষ্ট ডিভাইসের জন্য ভূমিকা নির্দিষ্ট করতে পারেন।
সেশনের বিভিন্ন ধরন
ডিভাইসের মধ্যে রেঞ্জিং সেশন শুরু করার সময়, সেশনের জন্য প্যারামিটার এক্সচেঞ্জ করতে প্রায়ই আউট-অফ-ব্যান্ড (OOB) ডেটা ট্রান্সপোর্ট প্রতিষ্ঠা করতে হয়।
রেঞ্জিং মডিউল আপনার জন্য OOB নেগোসিয়েশন ম্যানেজ করতে পারে, তবে এটি কাস্টম OOB ইমপ্লিমেন্টেশনও সাপোর্ট করে।
ডিফল্ট OOB প্রয়োগ
এই সেশনের ধরন (RANGING_SESSION_OOB)-এ, রেঞ্জিং সেশন শুরু করার জন্য রেঞ্জিং মডিউল
OOB নেগোসিয়েশন ম্যানেজ করে। অ্যাপের দেওয়া রেঞ্জিং সংক্রান্ত পছন্দের ভিত্তিতে
এটি উপযুক্ত প্যারামিটার বেছে নেয় এবং দুটি ডিভাইসেই কাজ করে এমন
উপযুক্ত প্রযুক্তি ব্যবহার করে। এই সেশনের ধরন
স্ট্যান্ডার্ডাইজড OOB specification ব্যবহার করে।
রেঞ্জিং মডিউল শুধুমাত্র OOB ডেটা ফর্ম্যাট এবং পিয়ার ডিভাইসের সাথে ইন্টার্যাক্ট করার জন্য ব্যবহার করা হবে এমন ক্রম নির্ধারণ করে। এটি পিয়ার ডিভাইস খোঁজা বা কানেকশন তৈরি করার কাজ করে না।
কাস্টম OOB প্রয়োগ করা
এই সেশনের ধরন (RANGING_SESSION_RAW) অনুযায়ী, অ্যাপটি রেঞ্জিং
মডিউলের OOB ফ্লো বাইপাস করে এবং নিজস্ব OOB নেগোসিয়েশন ও প্যারামিটার ম্যানেজ করে। এর অর্থ হল, অ্যাপটিকে অবশ্যই নির্ধারণ করতে হবে যে পিয়ার ডিভাইস কোন প্রযুক্তি সমর্থন করে, রেঞ্জিং প্যারামিটার নিয়ে আলোচনা করতে হবে
এবং রেঞ্জিং সেশন শুরু করতে হবে।
রেঞ্জিং সংক্রান্ত পছন্দ
রেঞ্জিং সেশনের জন্য বেছে নেওয়া প্যারামিটার নির্দিষ্ট করতে RangingPreference অবজেক্ট ব্যবহার করুন। এর মধ্যে নিম্নলিখিত বিষয়গুলি অন্তর্ভুক্ত:
- ডিভাইসের ভূমিকা। ডিভাইসটি ইনিশিয়েটর নাকি রেসপন্ডার হবে তা এটি থেকে বোঝা যায়।
- রেঞ্জিং কনফিগারেশন।
RangingConfigঅবজেক্ট রেঞ্জিং সেশনের ধরন এবং রেঞ্জিং সেশন শুরু করার জন্য প্রয়োজনীয় অন্যান্য প্যারামিটার নির্দিষ্ট করে। - সেশন কনফিগারেশন।
SessionConfigঅবজেক্ট রেঞ্জিং সেশনে প্রয়োগ করার জন্য প্যারামিটার নির্দিষ্ট করে, যেমন পরিমাপের সীমা, সেন্সর ফিউশন, জিওফেন্স কনফিগারেশন এবং আরও অনেক কিছু।
রেঞ্জিং সংক্রান্ত অনুমতি
বর্তমান ও ভবিষ্যতের সব রেঞ্জিং প্রযুক্তি অ্যাক্সেস করতে রেঞ্জিং মডিউলের জন্য একটি নতুন ইউনিফায়েড অনুমতি (android.permission.RANGING) প্রয়োজন। এই অনুমতি NEARBY_DEVICES_PERMISSIONS তালিকায় আছে।
<uses-permission android:name="android.permission.RANGING" />
বিধিনিষেধ ও সীমাবদ্ধতা
রেঞ্জিং মডিউল বিভিন্ন কারণে রেঞ্জিং সীমাবদ্ধ করতে পারে, যার মধ্যে নিম্নলিখিতগুলি অন্তর্ভুক্ত:
- থার্ড-পার্টি অ্যাপকে শুধুমাত্র আল্ট্রা-ওয়াইডব্যান্ডের সাথে ব্যাকগ্রাউন্ড রেঞ্জিং পারফর্ম করার অনুমতি দেওয়া হয় এবং শুধুমাত্র মানানসই ডিভাইসে। অন্যান্য প্রযুক্তির সাথে ব্যাকগ্রাউন্ডে রেঞ্জিং করার অনুমতি নেই।
- ডিভাইস দ্বারা সর্বাধিক সংখ্যক কনকারেন্ট রেঞ্জিং সেশন সম্পূর্ণ হয়ে গেলে রেঞ্জিং করার অনুমতি দেওয়া হয় না।
- ব্যাটারি, পারফর্ম্যান্স বা মেমরির মতো সিস্টেমের স্বাস্থ্য সংক্রান্ত সমস্যার কারণে রেঞ্জিং সীমিত করা হতে পারে।
এছাড়াও, রেঞ্জিং মডিউলের নিম্নলিখিত সীমাবদ্ধতা আছে:
- রেঞ্জিং মডিউল শুধুমাত্র আল্ট্রা-ওয়াইডব্যান্ডের জন্য পিয়ার ডিভাইসে রেঞ্জিং ডেটা ডেলিভারি করতে পারে। অন্যান্য প্রযুক্তির ক্ষেত্রে, রেঞ্জিং মডিউল শুধুমাত্র ইনিশিয়েটর ডিভাইসে রেঞ্জিং ডেটা প্রদান করে।
- রেঞ্জিং মডিউল শুধুমাত্র র রেঞ্জিং মোডে ডিভাইসের ডাইনামিক সংযোজন সমর্থন করে এবং শুধুমাত্র আল্ট্রা-ওয়াইডব্যান্ডের জন্য।
- রেঞ্জিং মডিউল ডিফল্ট OOB ইমপ্লিমেন্টেশনের জন্য একটির-সাথে-অনেক আল্ট্রা-ওয়াইডব্যান্ড সেশন সাপোর্ট করে না। আপনি একাধিক ডিভাইস হ্যান্ডেল পাস করলে, মডিউলটি আল্ট্রা-ওয়াইডব্যান্ড সমর্থন করে এমন প্রতিটি পিয়ার ডিভাইসের জন্য একটি ওয়ান-টু-ওয়ান সেশন তৈরি করে।
রেঞ্জিং সেশন পরিচালনা করা
রেঞ্জিং মডিউল ব্যবহার করে রেঞ্জিং সেশন পরিচালনা করতে, এই ধাপগুলি অনুসরণ করুন:
- সব ডিভাইস Android 16 বা তার পরবর্তী ভার্সনে চলছে কিনা তা যাচাই করুন।
- অ্যাপ ম্যানিফেস্টে
android.permission.RANGINGঅনুমতির জন্য অনুরোধ করুন। - রেঞ্জিং প্রযুক্তির ক্ষমতা ও উপলভ্যতা মূল্যায়ন করা।
- রেঞ্জিং অপারেশনের জন্য পিয়ার ডিভাইস খুঁজে নিন।
- রেঞ্জিং সেশনের ধরন-এ বর্ণিত সেশনের ধরনগুলির মধ্যে যেকোনও একটি ব্যবহার করে, আউট-অফ-ব্যান্ড এক্সচেঞ্জের জন্য একটি কানেকশন স্থাপন করুন।
- রেঞ্জিং শুরু করুন এবং ক্রমাগত রেঞ্জিং ডেটা সংগ্রহ করুন।
- রেঞ্জিং সেশন বন্ধ করুন।
নিম্নলিখিত কোড স্যাম্পেল ইনিশিয়েটর ও রেসপন্ডার, উভয় ভূমিকার জন্য এইসব ধাপ দেখায়।
Kotlin
class RangingApp {
// Starts a ranging session on the initiator side.
fun startRangingInitiator(
context: Context,
deviceHandle: DeviceHandle,
executor: Executor,
callback: RangingSessionCallback
) {
// Get the RangingManager which is the entry point for ranging module.
val manager = context.getSystemService(RangingManager::class.java)
// Create a new RangingSession using the provided executor and callback.
val session = manager.createRangingSession(executor, callback)
// Create an OobInitiatorRangingConfig, which specifies the ranging parameters for
// the initiator role.
val config = OobInitiatorRangingConfig.Builder()
.setFastestRangingInterval(Duration.ofMillis(100))
.setSlowestRangingInterval(Duration.ofMillis(5000))
.setRangingMode(RANGING_MODE_AUTO)
.setSecurityLevel(SECURITY_LEVEL_BASIC)
.addDeviceHandle(deviceHandle)
.build()
// Create a RangingPreference, which specifies the role (initiator) and
// configuration for the ranging session.
val preference =
RangingPreference.Builder(DEVICE_ROLE_INITIATOR, config).build()
// Start ranging session.
session.start(preference)
// If successful, the ranging data will be sent through callback#onResults
// Stop ranging session
session.stop()
}
// Starts a ranging session on the responder side.
fun startRangingResponder(
context: Context,
deviceHandle: DeviceHandle,
executor: Executor,
callback: RangingSessionCallback
) {
// Get the RangingManager which is the entry point for ranging module.
val manager = context.getSystemService(RangingManager::class.java)
// Create a new RangingSession using the provided executor and callback.
val session = manager.createRangingSession(executor, callback)
// Create an OobResponderRangingConfig, which specifies the ranging parameters for
// the responder role.
val config = OobResponderRangingConfig.Builder(deviceHandle).build()
// Create a RangingPreference, which specifies the role (responder) and
// configuration for the ranging session.
val preference =
RangingPreference.Builder(DEVICE_ROLE_RESPONDER, config).build()
// Start the ranging session.
session.start(preference)
// Stop the ranging session
session.stop()
}
}
জাভা
public class RangingApp {
// Starts a ranging session on the initiator side.
void startRangingInitiator(Context context, DeviceHandle deviceHandle, Executor executor, RangingSessionCallback callback) {
// Get the RangingManager which is the entry point for ranging module.
RangingManager manager = context.getSystemService(RangingManager.class);
// Create a new RangingSession using the provided executor and callback.
RangingSession session = manager.createRangingSession(executor, callback);
// Create an OobInitiatorRangingConfig, which specifies the ranging parameters for
// the initiator role.
OobInitiatorRangingConfig config = new OobInitiatorRangingConfig.Builder()
.setFastestRangingInterval(Duration.ofMillis(100))
.setSlowestRangingInterval(Duration.ofMillis(5000))
.setRangingMode(RANGING_MODE_AUTO)
.setSecurityLevel(SECURITY_LEVEL_BASIC)
.addDeviceHandle(deviceHandle)
.build();
// Create a RangingPreference, which specifies the role (initiator) and
// configuration for the ranging session.
RangingPreference preference =
new RangingPreference.Builder(DEVICE_ROLE_INITIATOR, config).build();
// Start ranging session.
session.start(preference);
// If successful, the ranging data will be sent through callback#onResults
// Stop ranging session
session.stop();
}
// Starts a ranging session on the responder side.
void startRangingResponder(Context context, DeviceHandle deviceHandle, Executor executor, RangingSessionCallback callback) {
// Get the RangingManager which is the entry point for ranging module.
RangingManager manager = context.getSystemService(RangingManager.class);
// Create a new RangingSession using the provided executor and callback.
RangingSession session = manager.createRangingSession(executor, callback);
// Create an OobResponderRangingConfig, which specifies the ranging parameters for
// the responder role.
OobResponderRangingConfig config = new OobResponderRangingConfig.Builder( deviceHandle).build();
// Create a RangingPreference, which specifies the role (responder) and
// configuration for the ranging session.
RangingPreference preference =
new RangingPreference.Builder(DEVICE_ROLE_RESPONDER, config).build();
// Start the ranging session.
session.start(preference);
// Stop the ranging session
session.stop();
}
}
iOS ডিভাইসের সাথে UWB ইন্টারঅপারেবিলিটি
রেঞ্জিং মডিউল আল্ট্রা-ওয়াইডব্যান্ড (UWB) ব্যবহার করে iOS ডিভাইসের সাথে ইন্টারঅপারেবিলিটি সাপোর্ট করে। iOS ডিভাইসের সাথে রেঞ্জিং করতে, আপনাকে অবশ্যই কাস্টম OOB ইমপ্লিমেন্টেশন ব্যবহার করতে হবে এবং নির্দিষ্ট প্যারামিটার সহ রেঞ্জিং সেশন কনফিগার করতে হবে যা Apple Nearby Interaction Accessory Protocol-এর সাথে মেলে। রেফারেন্সের জন্য স্যাম্পেল অ্যাপ দেখুন।
RangingPreference তৈরি করার সময়, কনফিগারেশন নির্দিষ্ট করতে RawRangingDevice এবং
UwbRangingParams ব্যবহার করুন। iOS ইন্টারঅপারেবিলিটির জন্য
নিম্নলিখিত প্যারামিটারগুলি গুরুত্বপূর্ণ:
- কনফিগারেশন আইডি:
UwbRangingParams.CONFIG_UNICAST_DS_TWRব্যবহার করুন। - সেশন কী সংক্রান্ত তথ্য: ভেন্ডর আইডি এবং স্ট্যাটিক STS IV সহ একটি বাইট অ্যারে প্রদান করুন।
- জটিল চ্যানেল: iOS ডিভাইসের কনফিগারেশনের সাথে ম্যাচ করতে চ্যানেল নম্বর ও প্রারম্ভিক নির্দেশাবলীর ইন্ডেক্স সেট করুন।
নিম্নলিখিত কোড স্নিপেট থেকে জানা যায় যে iOS রেসপন্ডারের সাথে রেঞ্জিং করা
ইনিশিয়েটর ডিভাইসের জন্য কীভাবে RangingPreference তৈরি করতে হয়:
Kotlin
// Create UwbRangingParams with iOS-specific configuration
val uwbRangingParams = UwbRangingParams.Builder(
sessionId,
UwbRangingParams.CONFIG_UNICAST_DS_TWR,
sourceAddress,
destinationAddress
)
.setComplexChannel(
UwbComplexChannel.Builder()
.setChannel(channelNumber)
.setPreambleIndex(preambleIndex)
.build()
)
.setRangingUpdateRate(updateRate)
.setSessionKeyInfo(sessionKeyInfo) // Vendor ID + STS IV
.setSlotDuration(slotDuration)
.build()
// Create RawRangingDevice
val rawRangingDevice = RawRangingDevice.Builder()
.setRangingDevice(RangingDevice.Builder().build())
.setUwbRangingParams(uwbRangingParams)
.build()
// Create SessionConfig
val sessionConfig = SessionConfig.Builder()
.setAngleOfArrivalNeeded(true)
.setDataNotificationConfig(DataNotificationConfig.Builder()
.setNotificationConfigType(DataNotificationConfig.NOTIFICATION_CONFIG_ENABLE)
.build())
.build()
// Create RangingPreference for the initiator
val preference = RangingPreference.Builder(
RangingPreference.DEVICE_ROLE_INITIATOR,
RawInitiatorRangingConfig.Builder()
.addRawRangingDevice(rawRangingDevice)
.build()
)
.setSessionConfig(sessionConfig)
.build()
জাভা
// Create UwbRangingParams with iOS-specific configuration
UwbRangingParams uwbRangingParams = new UwbRangingParams.Builder(
sessionId,
UwbRangingParams.CONFIG_UNICAST_DS_TWR,
sourceAddress,
destinationAddress)
.setComplexChannel(new UwbComplexChannel.Builder()
.setChannel(channelNumber)
.setPreambleIndex(preambleIndex)
.build())
.setRangingUpdateRate(updateRate)
.setSessionKeyInfo(sessionKeyInfo) // Vendor ID + STS IV
.setSlotDuration(slotDuration)
.build();
// Create RawRangingDevice
RawRangingDevice rawRangingDevice = new RawRangingDevice.Builder()
.setRangingDevice(new RangingDevice.Builder().build())
.setUwbRangingParams(uwbRangingParams)
.build();
// Create SessionConfig
SessionConfig sessionConfig = new SessionConfig.Builder()
.setAngleOfArrivalNeeded(true)
.setDataNotificationConfig(new DataNotificationConfig.Builder()
.setNotificationConfigType(DataNotificationConfig.NOTIFICATION_CONFIG_ENABLE)
.build())
.build();
// Create RangingPreference for the initiator
RangingPreference preference = new RangingPreference.Builder(
RangingPreference.DEVICE_ROLE_INITIATOR,
new RawInitiatorRangingConfig.Builder()
.addRawRangingDevice(rawRangingDevice)
.build())
.setSessionConfig(sessionConfig)
.build();
UWB Downlink-TDoA API
UWB DL-TDoA API-এর জন্য, Android 17-এর নতুন ফিচার দেখুন।
স্যাম্পেল অ্যাপ
রেঞ্জিং মডিউল কীভাবে ব্যবহার করতে হয় তার এন্ড-টু-এন্ড উদাহরণ দেখতে, AOSP-তে স্যাম্পেল অ্যাপ দেখুন। এই স্যাম্পেল অ্যাপে রেঞ্জিং মডিউল দ্বারা সমর্থিত সব রেঞ্জিং প্রযুক্তি কভার করা হয় এবং এতে সমর্থিত দুই ধরনের সেশনের জন্য ফ্লো অন্তর্ভুক্ত থাকে।
iOS ডিভাইসের সাথে UWB ইন্টারঅপারেবিলিটি
Android স্যাম্পেল অ্যাপ, iOS স্যাম্পেল অ্যাপ-এর সাথে UWB রেঞ্জিং সেশন শুরু করতে সাহায্য করে।