অ্যান্ড্রয়েড ১৬-এ রেঞ্জিং মডিউল চালু করা হয়েছে, যা ডিভাইসগুলোর মধ্যে নির্ভুল দূরত্ব পরিমাপের জন্য একটি সমন্বিত ও মানসম্মত ইন্টারফেস প্রদান করে। প্রতিটি রেঞ্জিং প্রযুক্তি আলাদাভাবে পরিচালনা করার প্রয়োজন ছাড়াই, আপনি এই এপিআই সারফেস ব্যবহার করে সমকক্ষ ডিভাইসগুলোর দূরত্ব ও অবস্থান পরিমাপ করতে পারেন।
রেঞ্জিং মডিউলটি নিম্নলিখিত প্রযুক্তিগুলো সমর্থন করে:
- আল্ট্রা-ওয়াইডব্যান্ড
- ব্লুটুথ চ্যানেলের শব্দ
- ওয়াই-ফাই ন্যান আরটিটি
- ব্লুটুথ আরএসএসআই রেঞ্জিং
পরিসীমা ক্ষমতা এবং প্রাপ্যতা
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.permission.RANGINGপারমিশনটির জন্য অনুরোধ করুন। - রেঞ্জিং প্রযুক্তিগুলোর সক্ষমতা ও প্রাপ্যতা মূল্যায়ন করুন।
- রেঞ্জিং অপারেশনের জন্য একটি সমকক্ষ ডিভাইস খুঁজুন।
- রেঞ্জিং সেশন টাইপস -এ বর্ণিত সেশন টাইপগুলোর যেকোনো একটি ব্যবহার করে একটি আউট-অফ-ব্যান্ড এক্সচেঞ্জের জন্য সংযোগ স্থাপন করুন।
- দূরত্ব পরিমাপ শুরু করুন এবং ক্রমাগত দূরত্ব পরিমাপের তথ্য সংগ্রহ করুন।
- রেঞ্জিং সেশনটি বন্ধ করুন।
নিম্নলিখিত কোড নমুনাটি ইনিশিয়েটর এবং রেসপন্ডার উভয় ভূমিকার জন্য এই ধাপগুলো প্রদর্শন করে।
কোটলিন
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ব্যবহার করুন। - সেশন কী তথ্য: ভেন্ডর আইডি এবং স্ট্যাটিক এসটিএস IV সম্বলিত একটি বাইট অ্যারে প্রদান করুন।
- জটিল চ্যানেল: iOS ডিভাইসের কনফিগারেশনের সাথে মিলিয়ে চ্যানেল নম্বর এবং প্রিম্বল ইনডেক্স সেট করুন।
নিম্নলিখিত কোড স্নিপেটটি দেখায় কিভাবে একটি iOS রেসপন্ডার ব্যবহার করে রেঞ্জিং করা একটি ইনিশিয়েটর ডিভাইসের জন্য একটি RangingPreference তৈরি করতে হয়:
কোটলিন
// 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 ডাউনলিঙ্ক-TDoA এপিআই
UWB DL-TDoA API-এর জন্য, Android 17 নতুন বৈশিষ্ট্যগুলি দেখুন।
নমুনা অ্যাপ
রেঞ্জিং মডিউলটি কীভাবে ব্যবহার করতে হয় তার একটি সম্পূর্ণ উদাহরণের জন্য, AOSP-তে থাকা নমুনা অ্যাপটি দেখুন। এই নমুনা অ্যাপটিতে রেঞ্জিং মডিউল দ্বারা সমর্থিত সমস্ত রেঞ্জিং প্রযুক্তি অন্তর্ভুক্ত রয়েছে এবং উভয় সমর্থিত সেশন প্রকারের জন্যই ফ্লো রয়েছে।
iOS ডিভাইসগুলির সাথে UWB-এর আন্তঃকার্যক্ষমতা
অ্যান্ড্রয়েড স্যাম্পল অ্যাপটি আইওএস স্যাম্পল অ্যাপের সাথে একটি UWB রেঞ্জিং সেশন শুরু করা সমর্থন করে।
