ระยะสัญญาณระหว่างอุปกรณ์

Android 16 เปิดตัวโมดูลการวัดระยะ ซึ่งมีอินเทอร์เฟซแบบรวมและได้มาตรฐานสำหรับการวัดระยะที่แม่นยำระหว่างอุปกรณ์ คุณสามารถใช้ API นี้เพื่อวัดระยะทางและตำแหน่งของอุปกรณ์ที่อยู่ใกล้เคียงโดยไม่ต้อง จัดการเทคโนโลยีการวัดระยะแต่ละอย่างแยกกัน

โมดูลการวัดระยะรองรับเทคโนโลยีต่อไปนี้

ความสามารถและความพร้อมในการจัดอันดับ

คลาส RangingManager จะให้ข้อมูลเกี่ยวกับเทคโนโลยีการวัดระยะที่อุปกรณ์ในเครื่องรองรับ รวมถึงความพร้อมใช้งานและความสามารถของแต่ละเทคโนโลยีแก่แอป แอปสามารถลงทะเบียนเพื่อรับ Callback เพื่อรับข้อมูลอัปเดตเกี่ยวกับการเปลี่ยนแปลงความพร้อมใช้งานหรือความสามารถของเทคโนโลยีที่รองรับ

บทบาทของอุปกรณ์

อุปกรณ์ที่เข้าร่วมเซสชันการวัดระยะต้องเป็นผู้เริ่มหรือผู้ตอบ อุปกรณ์เริ่มต้นจะเริ่มเซสชันการวัดระยะกับอุปกรณ์ตอบกลับอย่างน้อย 1 เครื่อง อุปกรณ์ที่ตอบจะตอบคำขอการวัดระยะจากผู้เริ่มต้นเพียงรายเดียวในแต่ละครั้ง คุณระบุบทบาทสำหรับอุปกรณ์ที่กำหนดในเซสชันการวัดระยะได้ด้วยคลาส RangingPreference

ประเภทเซสชันการจัดอันดับ

เมื่อเริ่มเซสชันการวัดระยะระหว่างอุปกรณ์ มักจะต้องสร้างการรับส่งข้อมูลนอกแบนด์ (OOB) เพื่อแลกเปลี่ยนพารามิเตอร์สำหรับเซสชัน

โมดูลการจัดอันดับสามารถจัดการการเจรจา OOB ให้คุณได้ แต่ก็รองรับการติดตั้งใช้งาน OOB ที่กำหนดเองด้วย

รูปที่ 1 ขั้นตอน OOB สำหรับประเภทเซสชัน

การติดตั้งใช้งาน OOB เริ่มต้น

ในเซสชันประเภทนี้ (RANGING_SESSION_OOB) โมดูลการวัดระยะจะจัดการ การเจรจา OOB เพื่อเริ่มเซสชันการวัดระยะ โดยจะเลือกพารามิเตอร์ที่เหมาะสม ตามค่ากำหนดการวัดระยะที่แอประบุ และใช้ เทคโนโลยีที่เหมาะสมตามสิ่งที่อุปกรณ์ทั้ง 2 เครื่องรองรับ เซสชันประเภทนี้ ใช้ OOB specification ที่ได้มาตรฐาน

โมดูลการวัดระยะจะกำหนดเฉพาะรูปแบบและลำดับข้อมูล OOB ที่จะใช้เพื่อ โต้ตอบกับอุปกรณ์ที่อยู่ใกล้เคียง โดยจะไม่จัดการการค้นหาอุปกรณ์ที่อยู่ร่วมกันหรือ การสร้างการเชื่อมต่อ

การติดตั้งใช้งาน OOB ที่กำหนดเอง

ในเซสชันประเภทนี้ (RANGING_SESSION_RAW) แอปจะข้ามขั้นตอน OOB ของโมดูล Ranging และจัดการการเจรจาและพารามิเตอร์ OOB ของตัวเอง ซึ่งหมายความว่า แอปต้องพิจารณาว่าอุปกรณ์ที่เชื่อมต่อรองรับเทคโนโลยีใด เจรจา พารามิเตอร์การวัดระยะ และเริ่มเซสชันการวัดระยะ

ค่ากำหนดการจัดอันดับ

ใช้ออบเจ็กต์ RangingPreference เพื่อระบุพารามิเตอร์ที่เลือกสำหรับเซสชันการจัดอันดับ ซึ่งประกอบด้วย

  • บทบาทของอุปกรณ์ ซึ่งจะระบุว่าอุปกรณ์จะเป็นผู้เริ่มหรือ ผู้ตอบ
  • การกำหนดค่าการวัดระยะ ออบเจ็กต์ RangingConfig จะระบุ ประเภทเซสชันการวัดระยะและพารามิเตอร์อื่นๆ ที่จำเป็นในการเริ่มเซสชันการวัดระยะ
  • การกำหนดค่าเซสชัน ออบเจ็กต์ SessionConfig จะระบุ พารามิเตอร์ที่จะบังคับใช้ในเซสชันการวัดระยะ เช่น ขีดจํากัดการวัด การผสานเซ็นเซอร์ การกําหนดค่ารั้วภูมิศาสตร์ และอื่นๆ

สิทธิ์ในการกำหนดช่วง

โมดูลการวัดระยะต้องใช้สิทธิ์ใหม่แบบรวม (android.permission.RANGING) เพื่อเข้าถึงเทคโนโลยีการวัดระยะทั้งหมดในปัจจุบันและอนาคต สิทธิ์นี้อยู่ในรายการ NEARBY_DEVICES_PERMISSIONS

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

ข้อจำกัด

โมดูลการวัดระยะอาจจำกัดการวัดระยะเนื่องจากสาเหตุหลายประการ ซึ่งรวมถึงสาเหตุต่อไปนี้

  • แอปของบุคคลที่สามจะได้รับอนุญาตให้ทำการวัดระยะในเบื้องหลังด้วย อัลตร้าไวด์แบนด์ และในอุปกรณ์ที่รองรับเท่านั้น ไม่อนุญาตให้ใช้เทคโนโลยีอื่นๆ ในการวัดระยะใน เบื้องหลัง
  • ระบบจะไม่อนุญาตให้ทำการวัดระยะเมื่อเซสชันการวัดระยะพร้อมกันต่ออุปกรณ์ถึงจำนวนสูงสุดแล้ว
  • การวัดระยะอาจถูกจำกัดเนื่องจากข้อกังวลเกี่ยวกับสถานะของระบบ เช่น แบตเตอรี่ ประสิทธิภาพ หรือหน่วยความจำ

นอกจากนี้ โมดูลการวัดระยะยังมีข้อจำกัดที่ทราบดังต่อไปนี้

  • โมดูลการกำหนดช่วงรองรับเฉพาะการนำส่งข้อมูลการกำหนดช่วงไปยังอุปกรณ์ที่อยู่ใกล้เคียง สำหรับแถบความถี่กว้างยิ่งยวด สำหรับเทคโนโลยีอื่นๆ โมดูลการวัดระยะจะส่งเฉพาะ ข้อมูลการวัดระยะไปยังอุปกรณ์ที่เริ่มการวัดระยะ
  • โมดูลการวัดระยะรองรับเฉพาะการเพิ่มอุปกรณ์แบบไดนามิกในโหมดการวัดระยะดิบ และใช้ได้กับย่านความถี่กว้างพิเศษเท่านั้น
  • โมดูลการวัดระยะไม่รองรับเซสชันอัลตร้าไวท์แบนด์แบบหนึ่งต่อหลายรายการสำหรับการติดตั้งใช้งาน OOB เริ่มต้น หากคุณส่งแฮนเดิลอุปกรณ์หลายรายการ โมดูลจะสร้างเซสชันแบบหนึ่งต่อหนึ่งสำหรับอุปกรณ์ที่รองรับ อัลตร้าไวด์แบนด์แต่ละเครื่อง

จัดเซสชันการวัดระยะ

หากต้องการทำการวัดระยะโดยใช้โมดูลการวัดระยะ ให้ทำตามขั้นตอนต่อไปนี้

  1. ตรวจสอบว่าอุปกรณ์ทั้งหมดใช้ Android 16 ขึ้นไป
  2. ขอandroid.permission.RANGING สิทธิ์ในไฟล์ Manifest ของแอป
  3. ประเมินความสามารถและความพร้อมใช้งานของเทคโนโลยีการวัดระยะ
  4. ค้นหาอุปกรณ์ที่อยู่ใกล้เคียงสำหรับการดำเนินการระบุช่วง
  5. สร้างการเชื่อมต่อสำหรับการแลกเปลี่ยนนอกแบนด์โดยใช้เซสชันประเภทใดประเภทหนึ่งที่อธิบายไว้ในประเภทเซสชันการวัดระยะ
  6. เริ่มการวัดระยะและรับข้อมูลการวัดระยะอย่างต่อเนื่อง
  7. สิ้นสุดเซสชันการวัดระยะ

ตัวอย่างโค้ดต่อไปนี้แสดงขั้นตอนเหล่านี้สําหรับทั้งบทบาทผู้เริ่มและบทบาทผู้ตอบ

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()
    }
}

Java

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();
    }
}

ความสามารถในการทำงานร่วมกันของ UWB กับอุปกรณ์ iOS

โมดูลการกำหนดช่วงรองรับการทำงานร่วมกันกับอุปกรณ์ iOS ที่ใช้ แถบความถี่กว้างยิ่งยวด (UWB) หากต้องการวัดระยะด้วยอุปกรณ์ iOS คุณต้องใช้การติดตั้งใช้งาน OOB แบบกำหนดเองและกำหนดค่าเซสชันการวัดระยะด้วยพารามิเตอร์ที่เฉพาะเจาะจง ซึ่งตรงกับโปรโตคอลอุปกรณ์เสริมการโต้ตอบในบริเวณใกล้เคียงของ Apple โปรดดูข้อมูลอ้างอิงในแอปตัวอย่าง

เมื่อสร้าง RangingPreference ให้ใช้ RawRangingDevice และ UwbRangingParams เพื่อระบุการกำหนดค่า พารามิเตอร์ต่อไปนี้ มีความสําคัญต่อการทํางานร่วมกันของ iOS

  • รหัสการกำหนดค่า: ใช้ UwbRangingParams.CONFIG_UNICAST_DS_TWR
  • ข้อมูลคีย์เซสชัน: ระบุอาร์เรย์ไบต์ที่มีรหัสผู้ให้บริการและ Static STS IV
  • ช่องที่ซับซ้อน: ตั้งค่าหมายเลขช่องและดัชนีคำนำให้ตรงกับการกำหนดค่าของอุปกรณ์ iOS

ข้อมูลโค้ดต่อไปนี้แสดงวิธีสร้าง RangingPreference สำหรับ อุปกรณ์เริ่มต้นที่วัดระยะกับอุปกรณ์ตอบกลับ iOS

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()

Java

// 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();

แอปตัวอย่าง

ดูตัวอย่างแบบครบวงจรเกี่ยวกับวิธีใช้โมดูลการวัดระยะได้ในแอปตัวอย่างใน AOSP แอปตัวอย่างนี้ครอบคลุมเทคโนโลยีการวัดระยะทั้งหมดที่โมดูลการวัดระยะรองรับ และมีขั้นตอนสำหรับเซสชันทั้ง 2 ประเภทที่รองรับ

ความสามารถในการทำงานร่วมกันของ UWB กับอุปกรณ์ iOS

แอปตัวอย่าง Android รองรับการเริ่มเซสชันการวัดระยะ UWB ด้วยแอปตัวอย่าง iOS

รูปที่ 2 การใช้งาน UWB ใน Android และ iOS