Android 16 เปิดตัวโมดูลการวัดระยะ ซึ่งมีอินเทอร์เฟซแบบรวมและได้มาตรฐานสำหรับการวัดระยะที่แม่นยำระหว่างอุปกรณ์ คุณสามารถใช้ API นี้เพื่อวัดระยะทางและตำแหน่งของอุปกรณ์ที่อยู่ใกล้เคียงโดยไม่ต้อง จัดการเทคโนโลยีการวัดระยะแต่ละอย่างแยกกัน
โมดูลการวัดระยะรองรับเทคโนโลยีต่อไปนี้
- แถบความถี่กว้างยิ่งยวด
- การทดสอบช่องสัญญาณบลูทูธ
- RTT ของ Wi-Fi NAN
- การวัดระยะ RSSI ของบลูทูธ
ความสามารถและความพร้อมในการจัดอันดับ
คลาส RangingManager จะให้ข้อมูลเกี่ยวกับเทคโนโลยีการวัดระยะที่อุปกรณ์ในเครื่องรองรับ รวมถึงความพร้อมใช้งานและความสามารถของแต่ละเทคโนโลยีแก่แอป แอปสามารถลงทะเบียนเพื่อรับ Callback เพื่อรับข้อมูลอัปเดตเกี่ยวกับการเปลี่ยนแปลงความพร้อมใช้งานหรือความสามารถของเทคโนโลยีที่รองรับ
บทบาทของอุปกรณ์
อุปกรณ์ที่เข้าร่วมเซสชันการวัดระยะต้องเป็นผู้เริ่มหรือผู้ตอบ อุปกรณ์เริ่มต้นจะเริ่มเซสชันการวัดระยะกับอุปกรณ์ตอบกลับอย่างน้อย 1 เครื่อง อุปกรณ์ที่ตอบจะตอบคำขอการวัดระยะจากผู้เริ่มต้นเพียงรายเดียวในแต่ละครั้ง คุณระบุบทบาทสำหรับอุปกรณ์ที่กำหนดในเซสชันการวัดระยะได้ด้วยคลาส RangingPreference
ประเภทเซสชันการจัดอันดับ
เมื่อเริ่มเซสชันการวัดระยะระหว่างอุปกรณ์ มักจะต้องสร้างการรับส่งข้อมูลนอกแบนด์ (OOB) เพื่อแลกเปลี่ยนพารามิเตอร์สำหรับเซสชัน
โมดูลการจัดอันดับสามารถจัดการการเจรจา OOB ให้คุณได้ แต่ก็รองรับการติดตั้งใช้งาน 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 เริ่มต้น หากคุณส่งแฮนเดิลอุปกรณ์หลายรายการ โมดูลจะสร้างเซสชันแบบหนึ่งต่อหนึ่งสำหรับอุปกรณ์ที่รองรับ อัลตร้าไวด์แบนด์แต่ละเครื่อง
จัดเซสชันการวัดระยะ
หากต้องการทำการวัดระยะโดยใช้โมดูลการวัดระยะ ให้ทำตามขั้นตอนต่อไปนี้
- ตรวจสอบว่าอุปกรณ์ทั้งหมดใช้ Android 16 ขึ้นไป
- ขอ
android.permission.RANGINGสิทธิ์ในไฟล์ Manifest ของแอป - ประเมินความสามารถและความพร้อมใช้งานของเทคโนโลยีการวัดระยะ
- ค้นหาอุปกรณ์ที่อยู่ใกล้เคียงสำหรับการดำเนินการระบุช่วง
- สร้างการเชื่อมต่อสำหรับการแลกเปลี่ยนนอกแบนด์โดยใช้เซสชันประเภทใดประเภทหนึ่งที่อธิบายไว้ในประเภทเซสชันการวัดระยะ
- เริ่มการวัดระยะและรับข้อมูลการวัดระยะอย่างต่อเนื่อง
- สิ้นสุดเซสชันการวัดระยะ
ตัวอย่างโค้ดต่อไปนี้แสดงขั้นตอนเหล่านี้สําหรับทั้งบทบาทผู้เริ่มและบทบาทผู้ตอบ
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