การสื่อสารแถบความถี่กว้างยิ่งยวด (UWB)

การสื่อสารด้วยแถบความถี่กว้างยิ่งยวดเป็นเทคโนโลยีวิทยุที่เน้นระยะสัญญาณที่แม่นยำ (วัดตำแหน่งด้วยความแม่นยำ 10 ซม.) ระหว่างอุปกรณ์ เทคโนโลยีวิทยุนี้สามารถใช้ความหนาแน่นของพลังงานต่ำสำหรับการวัดระยะใกล้ และดำเนินการส่งสัญญาณแบนด์วิดท์สูงผ่านคลื่นความถี่วิทยุส่วนใหญ่ UWB มีแบนด์วิดท์สูงกว่า 500 MHz (หรือมีเศษส่วนเกิน 20% แบนด์วิดท์)

ผู้ควบคุมข้อมูล/ผู้เริ่มต้น เทียบกับ ผู้ควบคุม/ผู้ตอบ

การสื่อสาร UWB เกิดขึ้นระหว่างอุปกรณ์ 2 เครื่อง โดยเครื่องหนึ่งเป็นตัวควบคุม และ คนอื่นเป็น "ผู้ควบคุม" ตัวควบคุมจะระบุแชแนลที่ซับซ้อน (UwbComplexChannel) ที่ อุปกรณ์ทั้งสองจะใช้ร่วมกันและเป็นผู้ริเริ่ม ในขณะที่ผู้ควบคุมคือ ผู้ตอบ

ผู้ควบคุมข้อมูลสามารถจัดการผู้ควบคุมได้หลายคน แต่ผู้ควบคุมสามารถสมัครรับข้อมูลได้เท่านั้น กับตัวควบคุมเครื่องเดียว ทั้งผู้ควบคุมข้อมูล/ผู้เริ่มต้น และ ผู้ควบคุม/ผู้ตอบ การกำหนดค่าที่รองรับ

พารามิเตอร์ช่วง

ผู้ควบคุมข้อมูลและผู้ควบคุมจำเป็นต้องระบุตัวตนและสื่อสารกัน ช่วงพารามิเตอร์เพื่อเริ่มช่วง การแลกเปลี่ยนนี้มีให้สำหรับการสมัคร ติดตั้งใช้งานโดยใช้กลไกนอกย่านความถี่ (OOB) ที่ปลอดภัยตามที่ต้องการ เช่น บลูทูธพลังงานต่ำ (BLE)

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

ระยะในเบื้องหลัง

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

แอปไม่ได้รับรายงานช่วงเมื่อทำงานในเบื้องหลัง แอป จะได้รับรายงานที่เป็นช่วงเมื่อย้ายไปยังพื้นหน้า

การกำหนดค่า STS

แอปหรือบริการจะจัดสรรเซสชันคีย์สำหรับแต่ละเซสชันโดยใช้สัญญาณรบกวน ลำดับการประทับเวลา (STS) STS ที่จัดสรรไว้มีความปลอดภัยมากกว่า STS แบบคงที่ การกำหนดค่า รองรับ STS ที่จัดสรรแล้วในอุปกรณ์ทั้งหมดที่ใช้ UWB ได้ Android 14 ขึ้นไป

หมวดหมู่ภัยคุกคาม STS แบบคงที่ STS ที่ดูแล
อากาศ: ผู้สังเกตการณ์แบบเชิงรับ ลดลงแล้ว ลดลงแล้ว
อากาศ: การขยายสัญญาณ ลดลงแล้ว ลดลงแล้ว
ทางอากาศ: การเล่นซ้ำ/การโจมตีแบบรีเลย์ มีความเสี่ยง ลดลงแล้ว

สำหรับ STS ที่จัดสรรไว้

  1. ใช้ uwbConfigType ใน RangingParameters ซึ่งรองรับ STS ที่จัดสรรแล้ว

  2. ระบุคีย์ 16 ไบต์ในช่อง sessionKeyInfo

สำหรับ STS แบบคงที่

  1. ใช้ uwbConfigType ใน RangingParameters ที่รองรับ STS แบบคงที่

  2. ระบุคีย์ 8 ไบต์ในช่อง sessionKeyInfo

จำนวนก้าว

หากต้องการใช้ UWB API ให้ทำตามขั้นตอนต่อไปนี้

  1. ตรวจสอบว่าอุปกรณ์ Android ใช้งาน Android 12 ขึ้นไป รองรับ UWB โดยใช้ PackageManager#hasSystemFeature("android.hardware.uwb")
  2. หากอยู่ในช่วงสัญญาณของอุปกรณ์ IoT โปรดตรวจสอบว่าอุปกรณ์เป็น FiRa MAC 1.3 เป็นไปตามข้อกำหนด
  3. สำรวจอุปกรณ์เพียร์ที่สามารถใช้ UWB โดยใช้กลไก OOB ที่คุณเลือก เช่น BluetoothLeScanner
  4. แลกเปลี่ยนพารามิเตอร์ช่วงโดยใช้กลไก OOB ที่ปลอดภัยที่คุณเลือก เช่น BluetoothGatt
  5. หากผู้ใช้ต้องการหยุดเซสชัน ให้ยกเลิกขอบเขตของเซสชัน

ข้อจำกัดการใช้งาน

การใช้งาน UWB API มีข้อจำกัดดังนี้

  1. แอปที่เริ่มต้นเซสชันระยะ UWB ใหม่ต้องเป็นที่ทำงานอยู่เบื้องหน้า แอปหรือบริการ เว้นแต่มีการรองรับระยะพื้นหลังตามภาพที่แสดง ก่อนหน้านี้
  2. เมื่อแอปย้ายไปที่พื้นหลัง (ขณะเซสชันดำเนินอยู่) อาจไม่ได้รับรายงานช่วงอีกต่อไป อย่างไรก็ตาม เซสชัน 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

ตัวแทนจำหน่ายรายย่อย รุ่นอุปกรณ์
Google 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 ปัจจุบัน

ปัญหาที่ทราบ: การกลับลำดับไบต์สำหรับช่องที่อยู่ MAC และรหัสผู้ให้บริการ STS แบบคงที่

ใน Android 13 และต่ำกว่า สแต็ก Android UWB กลับไบต์ไม่ถูกต้อง คำสั่งซื้อสำหรับฟิลด์ต่อไปนี้:

  • ที่อยู่ MAC ของอุปกรณ์
  • ที่อยู่ MAC ของผู้รับปลายทาง
  • รหัสผู้ให้บริการ STS แบบคงที่

การกลับลำดับไบต์เกิดขึ้นเนื่องจากสแต็ก Android จัดการช่องเหล่านี้ เป็นค่า ไม่ใช่อาร์เรย์ เรากำลังทำงานร่วมกับ FiRa เพื่ออัปเดตข้อกำหนด UCI (CR-1112) เพื่อระบุอย่างชัดเจนว่าช่องเหล่านี้ควรถือเป็นอาร์เรย์

ปัญหานี้จะได้รับการแก้ไขผ่านการอัปเดต GMS Core ในรุ่น 2320XXXX เพื่อให้สอดคล้องกับอุปกรณ์ Android นับตั้งแต่นั้น ผู้ให้บริการ IOT จะต้องแก้ไข การนำไปใช้เพื่อหลีกเลี่ยงการกลับลำดับไบต์ของช่องเหล่านี้