การสื่อสารด้วยแถบความถี่กว้างยิ่งยวดเป็นเทคโนโลยีวิทยุที่เน้นระยะสัญญาณที่แม่นยำ (วัดตำแหน่งด้วยความแม่นยำ 10 ซม.) ระหว่างอุปกรณ์ เทคโนโลยีวิทยุนี้สามารถใช้ความหนาแน่นของพลังงานต่ำสำหรับการวัดระยะใกล้ และดำเนินการส่งสัญญาณแบนด์วิดท์สูงผ่านคลื่นความถี่วิทยุส่วนใหญ่ UWB มีแบนด์วิดท์สูงกว่า 500 MHz (หรือมีเศษส่วนเกิน 20% แบนด์วิดท์)
ผู้ควบคุมข้อมูล/ผู้เริ่มต้น เทียบกับ ผู้ควบคุม/ผู้ตอบ
การสื่อสาร UWB เกิดขึ้นระหว่างอุปกรณ์ 2 เครื่อง โดยเครื่องหนึ่งเป็นตัวควบคุม และ
คนอื่นเป็น "ผู้ควบคุม" ตัวควบคุมจะระบุแชแนลที่ซับซ้อน
(UwbComplexChannel
) ที่
อุปกรณ์ทั้งสองจะใช้ร่วมกันและเป็นผู้ริเริ่ม ในขณะที่ผู้ควบคุมคือ
ผู้ตอบ
ผู้ควบคุมข้อมูลสามารถจัดการผู้ควบคุมได้หลายคน แต่ผู้ควบคุมสามารถสมัครรับข้อมูลได้เท่านั้น กับตัวควบคุมเครื่องเดียว ทั้งผู้ควบคุมข้อมูล/ผู้เริ่มต้น และ ผู้ควบคุม/ผู้ตอบ การกำหนดค่าที่รองรับ
พารามิเตอร์ช่วง
ผู้ควบคุมข้อมูลและผู้ควบคุมจำเป็นต้องระบุตัวตนและสื่อสารกัน ช่วงพารามิเตอร์เพื่อเริ่มช่วง การแลกเปลี่ยนนี้มีให้สำหรับการสมัคร ติดตั้งใช้งานโดยใช้กลไกนอกย่านความถี่ (OOB) ที่ปลอดภัยตามที่ต้องการ เช่น บลูทูธพลังงานต่ำ (BLE)
พารามิเตอร์ช่วง ประกอบด้วยที่อยู่ในเครื่อง แชแนลที่ซับซ้อน และเซสชันคีย์ และอื่นๆ หมายเหตุ พารามิเตอร์เหล่านี้อาจหมุนหรือเปลี่ยนแปลงหลังจากเซสชันการจัดระยะ สิ้นสุดลงและต้องได้รับการสื่อสารใหม่ เพื่อเริ่มต้นช่วงเวลาใหม่
ระยะในเบื้องหลัง
แอปที่ทำงานในพื้นหลังสามารถเริ่มเซสชันการจัดระยะ UWB ได้ถ้าอุปกรณ์
ก็รองรับ หากต้องการตรวจสอบความสามารถของอุปกรณ์ โปรดดูที่ RangingCapabilities
แอปไม่ได้รับรายงานช่วงเมื่อทำงานในเบื้องหลัง แอป จะได้รับรายงานที่เป็นช่วงเมื่อย้ายไปยังพื้นหน้า
การกำหนดค่า STS
แอปหรือบริการจะจัดสรรเซสชันคีย์สำหรับแต่ละเซสชันโดยใช้สัญญาณรบกวน ลำดับการประทับเวลา (STS) STS ที่จัดสรรไว้มีความปลอดภัยมากกว่า STS แบบคงที่ การกำหนดค่า รองรับ STS ที่จัดสรรแล้วในอุปกรณ์ทั้งหมดที่ใช้ UWB ได้ Android 14 ขึ้นไป
หมวดหมู่ภัยคุกคาม | STS แบบคงที่ | STS ที่ดูแล |
---|---|---|
อากาศ: ผู้สังเกตการณ์แบบเชิงรับ | ลดลงแล้ว | ลดลงแล้ว |
อากาศ: การขยายสัญญาณ | ลดลงแล้ว | ลดลงแล้ว |
ทางอากาศ: การเล่นซ้ำ/การโจมตีแบบรีเลย์ | มีความเสี่ยง | ลดลงแล้ว |
สำหรับ STS ที่จัดสรรไว้
ใช้
uwbConfigType
ในRangingParameters
ซึ่งรองรับ STS ที่จัดสรรแล้วระบุคีย์ 16 ไบต์ในช่อง
sessionKeyInfo
สำหรับ STS แบบคงที่
ใช้
uwbConfigType
ในRangingParameters
ที่รองรับ STS แบบคงที่ระบุคีย์ 8 ไบต์ในช่อง
sessionKeyInfo
จำนวนก้าว
หากต้องการใช้ UWB API ให้ทำตามขั้นตอนต่อไปนี้
- ตรวจสอบว่าอุปกรณ์ Android ใช้งาน Android 12 ขึ้นไป
รองรับ UWB โดยใช้
PackageManager#hasSystemFeature("android.hardware.uwb")
- หากอยู่ในช่วงสัญญาณของอุปกรณ์ IoT โปรดตรวจสอบว่าอุปกรณ์เป็น FiRa MAC 1.3 เป็นไปตามข้อกำหนด
- สำรวจอุปกรณ์เพียร์ที่สามารถใช้ UWB โดยใช้กลไก OOB ที่คุณเลือก
เช่น
BluetoothLeScanner
- แลกเปลี่ยนพารามิเตอร์ช่วงโดยใช้กลไก OOB ที่ปลอดภัยที่คุณเลือก
เช่น
BluetoothGatt
- หากผู้ใช้ต้องการหยุดเซสชัน ให้ยกเลิกขอบเขตของเซสชัน
ข้อจำกัดการใช้งาน
การใช้งาน UWB API มีข้อจำกัดดังนี้
- แอปที่เริ่มต้นเซสชันระยะ UWB ใหม่ต้องเป็นที่ทำงานอยู่เบื้องหน้า แอปหรือบริการ เว้นแต่มีการรองรับระยะพื้นหลังตามภาพที่แสดง ก่อนหน้านี้
- เมื่อแอปย้ายไปที่พื้นหลัง (ขณะเซสชันดำเนินอยู่) อาจไม่ได้รับรายงานช่วงอีกต่อไป อย่างไรก็ตาม เซสชัน UWB จะ ในชั้นล่างสุดต่อไป เมื่อแอปเลื่อนกลับไปยัง เบื้องหน้า รายงานระยะจะกลับมาทำงานอีกครั้ง
ตัวอย่างโค้ด
แอปตัวอย่าง
ดูตัวอย่างจากต้นทางถึงปลายทางเกี่ยวกับวิธีใช้ไลบรารี UWB Jetpack ได้ที่แอปพลิเคชันตัวอย่างใน GitHub แอปตัวอย่างนี้ครอบคลุมการตรวจสอบความเข้ากันได้ของ UWB ในอุปกรณ์ Android, การเปิดใช้กระบวนการค้นหาโดยใช้กลไก OOB และการตั้งค่า UWB ระหว่างอุปกรณ์ที่รองรับ UWB 2 เครื่อง ตัวอย่างนี้ยังครอบคลุมถึงระบบควบคุมอุปกรณ์และกรณีการใช้งานการแชร์สื่อด้วย
ระดับ UWB
ตัวอย่างโค้ดนี้เริ่มต้นและสิ้นสุดช่วง UWB สำหรับ Controlee
// The coroutineScope responsible for handling uwb ranging.
// This will be initialized when startRanging is called.
var job: Job?
// A code snippet that initiates uwb ranging for a Controlee.
suspend fun startRanging() {
// Get the ranging parameter of a partnering Controller using an OOB mechanism of choice.
val partnerAddress : Pair<UwbAddress, UwbComplexChannel> = listenForPartnersAddress()
// Create the ranging parameters.
val partnerParameters = RangingParameters(
uwbConfigType = UwbRangingParameters.UWB_CONFIG_ID_1,
// SessionKeyInfo is used to encrypt the ranging session.
sessionKeyInfo = null,
complexChannel = partnerAddress.second,
peerDevices = listOf(UwbDevice.createForAddress(partnerAddress.first)),
updateRateType = UwbRangingParameters.RANGING_UPDATE_RATE_AUTOMATIC
)
// Initiate a session that will be valid for a single ranging session.
val clientSession = uwbManager.clientSessionScope()
// Share the localAddress of the current session to the partner device.
broadcastMyParameters(clientSession.localAddress)
val sessionFlow = clientSession.prepareSession(partnerParameters)
// Start a coroutine scope that initiates ranging.
CoroutineScope(Dispatchers.Main.immediate).launch {
sessionFlow.collect {
when(it) {
is RangingResultPosition -> doSomethingWithPosition(it.position)
is RangingResultPeerDisconnected -> peerDisconnected(it)
}
}
}
}
// A code snippet that cancels uwb ranging.
fun cancelRanging() {
// Canceling the CoroutineScope will stop the ranging.
job?.let {
it.cancel()
}
}
การสนับสนุน RxJava3
ขณะนี้การสนับสนุน Rxjava3 พร้อมให้บริการแล้วเพื่อช่วยให้สามารถทำงานร่วมกับ Java ลูกค้า ไลบรารีนี้มีวิธีรับผลลัพธ์ช่วงเป็น สังเกตได้ หรือ สตรีมโฟลว์ได้ และเพื่อเรียก UwbClientSessionScope เป็นออบเจ็กต์เดี่ยว
private final UwbManager uwbManager;
// Retrieve uwbManager.clientSessionScope as a Single object
Single<UwbClientSessionScope> clientSessionScopeSingle =
UwbManagerRx.clientSessionScopeSingle(uwbManager);
UwbClientSessionScope uwbClientSessionScope = clientSessionScopeSingle.blockingGet();
// Retrieve uwbClientSessionScope.prepareSession Flow as an Observable object
Observable<RangingResult> rangingResultObservable =
UwbClientSessionScopeRx.rangingResultsObservable(clientSessionScope,
rangingParameters);
// Consume ranging results from Observable
rangingResultObservable.subscribe(
rangingResult -> doSomethingWithRangingResult(result), // onNext
(error) -> doSomethingWithError(error), // onError
() -> doSomethingOnResultEventsCompleted(), //onCompleted
);
// Unsubscribe
rangingResultObservable.unsubscribe();
// Retrieve uwbClientSessionScope.prepareSession Flow as a Flowable object
Flowable<RangingResult> rangingResultFlowable =
UwbClientSessionScopeRx.rangingResultsFlowable(clientSessionScope,
rangingParameters);
// Consume ranging results from Flowable using Disposable
Disposable disposable = rangingResultFlowable
.delay(1, TimeUnit.SECONDS)
.subscribeWith(new DisposableSubscriber<RangingResult> () {
@Override public void onStart() {
request(1);
}
@Override public void onNext(RangingResult rangingResult) {
doSomethingWithRangingResult(rangingResult);
request(1);
}
@Override public void onError(Throwable t) {
t.printStackTrace();
}
@Override public void onComplete() {
doSomethingOnEventsCompleted();
}
});
// Stop subscription
disposable.dispose();
การรองรับระบบนิเวศ
อุปกรณ์ของพาร์ทเนอร์และ SDK ของบุคคลที่สามที่รองรับมีดังนี้
อุปกรณ์เคลื่อนที่ที่รองรับ UWB
ตั้งแต่เดือนมีนาคม 2024 อุปกรณ์เหล่านี้รองรับไลบรารี Android UWB Jetpack
ตัวแทนจำหน่ายรายย่อย | รุ่นอุปกรณ์ |
---|---|
Pixel 6 Pro, 7 Pro, 8 Pro, Fold, แท็บเล็ต | |
Samsung | Galaxy Note 20, S21+, S22+, S23+, S24+ Z Fold 2, 3, 4, 5 |
SDK ของบุคคลที่สาม
โดยตั้งแต่เดือนเมษายน 2023 โซลูชันของพาร์ทเนอร์เหล่านี้สามารถทำงานร่วมกับ ไลบรารี Jetpack ปัจจุบัน
- ชุดเครื่องมือการพัฒนา UWB ของ Estimote
- ความรู้เกี่ยวกับอุปกรณ์เคลื่อนที่ MK UWB Kit Mobile Edition 2.0
ปัญหาที่ทราบ: การกลับลำดับไบต์สำหรับช่องที่อยู่ MAC และรหัสผู้ให้บริการ STS แบบคงที่
ใน Android 13 และต่ำกว่า สแต็ก Android UWB กลับไบต์ไม่ถูกต้อง คำสั่งซื้อสำหรับฟิลด์ต่อไปนี้:
- ที่อยู่ MAC ของอุปกรณ์
- ที่อยู่ MAC ของผู้รับปลายทาง
- รหัสผู้ให้บริการ STS แบบคงที่
การกลับลำดับไบต์เกิดขึ้นเนื่องจากสแต็ก Android จัดการช่องเหล่านี้ เป็นค่า ไม่ใช่อาร์เรย์ เรากำลังทำงานร่วมกับ FiRa เพื่ออัปเดตข้อกำหนด UCI (CR-1112) เพื่อระบุอย่างชัดเจนว่าช่องเหล่านี้ควรถือเป็นอาร์เรย์
ปัญหานี้จะได้รับการแก้ไขผ่านการอัปเดต GMS Core ในรุ่น 2320XXXX
เพื่อให้สอดคล้องกับอุปกรณ์ Android นับตั้งแต่นั้น ผู้ให้บริการ IOT จะต้องแก้ไข
การนำไปใช้เพื่อหลีกเลี่ยงการกลับลำดับไบต์ของช่องเหล่านี้