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

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

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

ความสามารถและความพร้อมให้บริการของย่านความถี่

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

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

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

ประเภทเซสชันที่หลากหลาย

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

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

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

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

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

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

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

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

ค่ากำหนดการวัดระยะ

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

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

สิทธิ์ในการวัดระยะ

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

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

ข้อจำกัด

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

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

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

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

ทำการวัดระยะ

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

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

แอปตัวอย่าง

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