ডিভাইসের মধ্যে পরিসীমা

অ্যান্ড্রয়েড ১৬ রেঞ্জিং মডিউল চালু করেছে, যা ডিভাইসগুলির মধ্যে সুনির্দিষ্ট রেঞ্জিংয়ের জন্য একটি একীভূত এবং মানসম্মত ইন্টারফেস প্রদান করে। প্রতিটি রেঞ্জিং প্রযুক্তি পৃথকভাবে পরিচালনা না করেই আপনি পিয়ার ডিভাইসগুলির দূরত্ব এবং অবস্থান পরিমাপ করতে এই API পৃষ্ঠটি ব্যবহার করতে পারেন।

রেঞ্জিং মডিউল নিম্নলিখিত প্রযুক্তিগুলিকে সমর্থন করে:

পরিসরের ক্ষমতা এবং প্রাপ্যতা

RangingManager ক্লাসটি অ্যাপগুলিকে স্থানীয় ডিভাইস দ্বারা সমর্থিত বিস্তৃত প্রযুক্তির পাশাপাশি প্রতিটি প্রযুক্তির প্রাপ্যতা এবং ক্ষমতা সম্পর্কে তথ্য সরবরাহ করে। অ্যাপগুলি যেকোনো সমর্থিত প্রযুক্তির প্রাপ্যতা বা ক্ষমতার যেকোনো পরিবর্তন সম্পর্কে আপডেট পেতে Callback জন্য নিবন্ধন করতে পারে।

ডিভাইসের ভূমিকা

একটি রেঞ্জিং সেশনে অংশগ্রহণকারী একটি ডিভাইসকে অবশ্যই ইনিশিয়েটর অথবা রেসপন্ডার হতে হবে। ইনিশিয়েটর ডিভাইসটি এক বা একাধিক রেসপন্ডার ডিভাইস দিয়ে রেঞ্জিং সেশন শুরু করে। একটি রেসপন্ডার ডিভাইস একবারে শুধুমাত্র একজন ইনিশিয়েটরের রেঞ্জিং অনুরোধের জবাব দেয়। আপনি RangingPreference ক্লাসের সাহায্যে একটি রেঞ্জিং সেশনে একটি প্রদত্ত ডিভাইসের ভূমিকা নির্দিষ্ট করতে পারেন।

বিভিন্ন ধরণের সেশন

ডিভাইসগুলির মধ্যে একটি রেঞ্জিং সেশন শুরু করার সময়, সেশনের জন্য প্যারামিটার বিনিময় করার জন্য প্রায়শই একটি আউট-অফ-ব্যান্ড (OOB) ডেটা ট্রান্সপোর্ট স্থাপন করা প্রয়োজন।

Ranging মডিউলটি আপনার জন্য OOB আলোচনা পরিচালনা করতে পারে, তবে এটি কাস্টম OOB বাস্তবায়নকেও সমর্থন করে।

চিত্র ১. সেশনের ধরণগুলির জন্য OOB প্রবাহ।

ডিফল্ট OOB বাস্তবায়ন

এই সেশন টাইপে ( RANGING_SESSION_OOB ), Ranging মডিউলটি একটি রেঞ্জিং সেশন শুরু করার জন্য OOB আলোচনা পরিচালনা করে। এটি অ্যাপ দ্বারা প্রদত্ত রেঞ্জিং পছন্দের উপর ভিত্তি করে উপযুক্ত প্যারামিটার নির্বাচন করে এবং উভয় ডিভাইস যা সমর্থন করে তার উপর ভিত্তি করে উপযুক্ত প্রযুক্তি ব্যবহার করে। এই সেশন টাইপটি একটি স্ট্যান্ডার্ডাইজড OOB specification ব্যবহার করে।

রেঞ্জিং মডিউলটি শুধুমাত্র পিয়ার ডিভাইসের সাথে ইন্টারঅ্যাক্ট করার জন্য ব্যবহৃত OOB ডেটা ফর্ম্যাট এবং সিকোয়েন্স সংজ্ঞায়িত করে। এটি পিয়ার ডিভাইস আবিষ্কার বা সংযোগ স্থাপন পরিচালনা করে না।

কাস্টম OOB বাস্তবায়ন

এই সেশন টাইপ ( RANGING_SESSION_RAW ) তে, অ্যাপটি Ranging মডিউলের OOB ফ্লোকে বাইপাস করে এবং নিজস্ব OOB নেগোসিয়েশন এবং প্যারামিটার পরিচালনা করে। এর অর্থ হল অ্যাপটিকে পিয়ার ডিভাইস কোন প্রযুক্তি সমর্থন করে তা নির্ধারণ করতে হবে, রেঞ্জিং প্যারামিটারগুলি নেগোসিয়েশন করতে হবে এবং রেঞ্জিং সেশন শুরু করতে হবে।

বিভিন্ন পছন্দ

একটি রেঞ্জিং সেশনের জন্য নির্বাচিত প্যারামিটারগুলি নির্দিষ্ট করতে একটি RangingPreference অবজেক্ট ব্যবহার করুন। এর মধ্যে নিম্নলিখিতগুলি অন্তর্ভুক্ত রয়েছে:

  • ডিভাইসের ভূমিকা। এটি নির্দেশ করে যে ডিভাইসটি ইনিশিয়েটর হবে নাকি রেসপন্ডার হবে।
  • রেঞ্জিং কনফিগারেশন। একটি RangingConfig অবজেক্ট রেঞ্জিং সেশনের ধরণ এবং রেঞ্জিং সেশন শুরু করার জন্য প্রয়োজনীয় অন্যান্য পরামিতি নির্দিষ্ট করে।
  • সেশন কনফিগারেশন। একটি SessionConfig অবজেক্ট রেঞ্জিং সেশনে প্রয়োগ করার জন্য প্যারামিটারগুলি নির্দিষ্ট করে যেমন পরিমাপ সীমা, সেন্সর ফিউশন, জিওফেন্স কনফিগারেশন এবং আরও অনেক কিছু।

রেঞ্জিং অনুমতি

Ranging মডিউলের বর্তমান এবং ভবিষ্যতের সমস্ত রেঞ্জিং প্রযুক্তি অ্যাক্সেস করার জন্য একটি নতুন একীভূত অনুমতি ( android.permission.RANGING ) প্রয়োজন। এই অনুমতিটি NEARBY_DEVICES_PERMISSIONS তালিকায় রয়েছে।

<uses-permission android:name="android.permission.RANGING" />

সীমাবদ্ধতা এবং সীমাবদ্ধতা

রেঞ্জিং মডিউলটি বিভিন্ন কারণে রেঞ্জিং সীমাবদ্ধ করতে পারে, যার মধ্যে নিম্নলিখিতগুলি অন্তর্ভুক্ত রয়েছে:

  • তৃতীয় পক্ষের অ্যাপগুলি শুধুমাত্র আল্ট্রা-ওয়াইডব্যান্ড সহ ব্যাকগ্রাউন্ড রেঞ্জিং সম্পাদন করতে পারে, এবং শুধুমাত্র সমর্থিত ডিভাইসগুলিতে । অন্যান্য প্রযুক্তির সাথে ব্যাকগ্রাউন্ডে রেঞ্জিং অনুমোদিত নয়।
  • ডিভাইস অনুসারে সমকালীন রেঞ্জিং সেশনের সর্বাধিক সংখ্যা পৌঁছে গেলে রেঞ্জিং অনুমোদিত নয়।
  • ব্যাটারি, কর্মক্ষমতা, বা মেমরির মতো সিস্টেমের স্বাস্থ্যগত উদ্বেগের কারণে রেঞ্জিং সীমিত হতে পারে।

রেঞ্জিং মডিউলের নিম্নলিখিত জ্ঞাত সীমাবদ্ধতাগুলিও রয়েছে:

  • রেঞ্জিং মডিউলটি শুধুমাত্র আল্ট্রা-ওয়াইডব্যান্ডের জন্য পিয়ার ডিভাইসগুলিতে রেঞ্জিং ডেটা সরবরাহ সমর্থন করে। অন্যান্য প্রযুক্তির জন্য, রেঞ্জিং মডিউলটি কেবল ইনিশিয়েটার ডিভাইসে রেঞ্জিং ডেটা সরবরাহ করে।
  • রেঞ্জিং মডিউল শুধুমাত্র কাঁচা রেঞ্জিং মোডে ডিভাইসের গতিশীল সংযোজন সমর্থন করে, এবং শুধুমাত্র আল্ট্রা-ওয়াইডব্যান্ডের জন্য।
  • ডিফল্ট OOB বাস্তবায়নের জন্য Ranging মডিউলটি এক থেকে একাধিক আল্ট্রা-ওয়াইডব্যান্ড সেশন সমর্থন করে না। যদি আপনি একাধিক ডিভাইস হ্যান্ডেল পাস করেন, তাহলে মডিউলটি প্রতিটি পিয়ার ডিভাইসের জন্য একটি এক থেকে এক সেশন তৈরি করে যা আল্ট্রা-ওয়াইডব্যান্ড সমর্থন করে।

একটি বিস্তৃত অধিবেশন পরিচালনা করুন

Ranging মডিউল ব্যবহার করে একটি রেঞ্জিং সেশন পরিচালনা করতে, এই পদক্ষেপগুলি অনুসরণ করুন:

  1. সমস্ত ডিভাইস অ্যান্ড্রয়েড ১৬ বা তার উচ্চতর সংস্করণে কাজ করছে কিনা তা যাচাই করুন।
  2. অ্যাপ ম্যানিফেস্টে android.permission.RANGING অনুমতির জন্য অনুরোধ করুন।
  3. বিস্তৃত প্রযুক্তির সক্ষমতা এবং প্রাপ্যতা মূল্যায়ন করুন।
  4. বিস্তৃত ক্রিয়াকলাপের জন্য একটি পিয়ার ডিভাইস আবিষ্কার করুন।
  5. Ranging session types -এ বর্ণিত যেকোনো একটি সেশন টাইপ ব্যবহার করে একটি আউট-অফ-ব্যান্ড এক্সচেঞ্জের জন্য একটি সংযোগ স্থাপন করুন।
  6. রেঞ্জিং শুরু করুন এবং ক্রমাগত রেঞ্জিং ডেটা অর্জন করুন।
  7. রেঞ্জিং সেশনটি বন্ধ করুন।

নিম্নলিখিত কোড নমুনাটি ইনিশিয়েটর ভূমিকা এবং প্রতিক্রিয়াকারী ভূমিকা উভয়ের জন্য এই পদক্ষেপগুলি প্রদর্শন করে।

কোটলিন

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 আন্তঃকার্যক্ষমতা

Ranging মডিউলটি iOS ডিভাইসের সাথে আল্ট্রা-ওয়াইডব্যান্ড (UWB) ব্যবহার করে ইন্টারঅপারেবিলিটি সমর্থন করে। iOS ডিভাইসের সাথে রেঞ্জ করার জন্য, আপনাকে একটি কাস্টম OOB বাস্তবায়ন ব্যবহার করতে হবে এবং Apple Nearby Interaction Accessory Protocol এর সাথে মেলে এমন নির্দিষ্ট প্যারামিটার সহ রেঞ্জিং সেশন কনফিগার করতে হবে। রেফারেন্সের জন্য নমুনা অ্যাপটি দেখুন।

RangingPreference তৈরি করার সময়, কনফিগারেশন নির্দিষ্ট করতে RawRangingDevice এবং UwbRangingParams ব্যবহার করুন। iOS ইন্টারঅপারেবিলিটির জন্য নিম্নলিখিত প্যারামিটারগুলি অত্যন্ত গুরুত্বপূর্ণ:

  • কনফিগারেশন আইডি: UwbRangingParams.CONFIG_UNICAST_DS_TWR ব্যবহার করুন।
  • সেশনের মূল তথ্য: ভেন্ডর আইডি এবং স্ট্যাটিক STS 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();

নমুনা অ্যাপ

Ranging মডিউলটি কীভাবে ব্যবহার করবেন তার একটি এন্ড-টু-এন্ড উদাহরণের জন্য, AOSP-তে নমুনা অ্যাপটি দেখুন। এই নমুনা অ্যাপটি Ranging মডিউল দ্বারা সমর্থিত সমস্ত রেঞ্জিং প্রযুক্তি কভার করে এবং উভয় সমর্থিত সেশন ধরণের জন্য প্রবাহ অন্তর্ভুক্ত করে।

iOS ডিভাইসের সাথে UWB আন্তঃকার্যক্ষমতা

অ্যান্ড্রয়েড স্যাম্পল অ্যাপটি iOS স্যাম্পল অ্যাপের মাধ্যমে একটি UWB রেঞ্জিং সেশন শুরু করতে সহায়তা করে।

চিত্র ২। অ্যান্ড্রয়েড এবং আইওএসে ইউডব্লিউবি ব্যবহার।