ตำแหน่งของ Wi-Fi: ที่มี RTT

คุณสามารถใช้ฟังก์ชันตำแหน่ง Wi-Fi ที่ให้บริการโดย API RTT ของ Wi-Fi (ไป-กลับ) เพื่อวัดระยะทางไปยังจุดเข้าใช้งาน Wi-Fi และเพียร์ Wi-Fi ใกล้เคียงที่ใช้ RTT ได้ อุปกรณ์ Wi-Fi Aware

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

ด้วยความแม่นยำนี้ คุณจะสามารถพัฒนาการบริการตามสถานที่แบบละเอียด เช่น เป็นการนำทางภายในอาคาร การควบคุมด้วยเสียงที่มีความชัดเจน (เช่น "เปิดฟีเจอร์นี้ แสง") และข้อมูลตามสถานที่ตั้ง (เช่น "มีข้อเสนอพิเศษไหม สำหรับผลิตภัณฑ์นี้")

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

RTT ของ Wi-Fi และการวัดเวลาอย่างละเอียด (FTM) ที่เกี่ยวข้อง ที่กำหนดโดยมาตรฐาน IEEE 802.11-2016 RTT ของ Wi-Fi ต้องใช้เวลาที่แม่นยำ จาก FTM เพราะคำนวณระยะทางระหว่าง โดยการวัดเวลาที่แพ็กเก็ตใช้เดินทางไปมาระหว่าง อุปกรณ์ต่างๆ แล้วนำเวลานั้นไปคูณกับความเร็วแสง

ความแตกต่างในการใช้งานตามเวอร์ชันของ Android

RTT ของ Wi-Fi เปิดตัวใน Android 9 (API ระดับ 28) เมื่อใช้โปรโตคอลนี้ เพื่อระบุตำแหน่งของอุปกรณ์โดยใช้มัลติเพลตกับอุปกรณ์ที่ใช้ Android 9 คุณต้องมีสิทธิ์เข้าถึงตำแหน่งของจุดเข้าใช้งาน (AP) ที่กำหนดไว้ล่วงหน้า ข้อมูลในแอปของคุณ คุณเป็นผู้ตัดสินใจว่าจะจัดเก็บและเรียกข้อมูลนี้อย่างไร

สำหรับอุปกรณ์ที่ใช้ Android 10 (API ระดับ 29) ขึ้นไป ข้อมูลตำแหน่ง AP อาจมีลักษณะดังนี้ แสดงเป็น ResponderLocation ซึ่งรวมถึงละติจูด ลองจิจูด และระดับความสูง สำหรับ RTT ของ Wi-Fi ที่ สนับสนุนข้อมูลการกำหนดค่าตำแหน่ง/รายงานตำแหน่งพลเมือง (ข้อมูล LCI/LCR) โปรโตคอลจะแสดงผลออบเจ็กต์ ResponderLocation ระหว่าง กระบวนการทำช่วง

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

ข้อกำหนด

  • ฮาร์ดแวร์ของอุปกรณ์ที่ส่งคำขอกำหนดระยะต้องใช้ มาตรฐาน FTM 802.11-2016
  • อุปกรณ์ที่ส่งคำขอกำหนดระยะเวลาต้องใช้ Android 9 (ระดับ API 28) ขึ้นไป
  • อุปกรณ์ที่ส่งคำขอกำหนดช่วงต้องเปิดใช้บริการตำแหน่ง และการสแกนหา Wi-Fi เปิดอยู่ (ในส่วนการตั้งค่า > ตำแหน่ง)
  • หากแอปที่กำลังกำหนดเป้าหมายคำขอช่วง Android 13 (API ระดับ 33) ขึ้นไป จะต้องมี NEARBY_WIFI_DEVICES สิทธิ์ หากแอปดังกล่าวกำหนดเป้าหมาย เป็น Android เวอร์ชันก่อนหน้า จะต้อง มี ACCESS_FINE_LOCATION สิทธิ์ของคุณแทน
  • แอปต้องค้นหาช่วงของจุดเข้าใช้งานในขณะที่แอปปรากฏหรืออยู่ใน บริการที่ทำงานอยู่เบื้องหน้า แอปไม่สามารถเข้าถึงข้อมูลตำแหน่งจาก เบื้องหลัง
  • จุดเข้าใช้งานต้องใช้มาตรฐาน IEEE 802.11-2016 FTM

ตั้งค่า

หากต้องการตั้งค่าแอปให้ใช้ RTT ของ Wi-Fi ให้ทำตามขั้นตอนต่อไปนี้

1. ขอสิทธิ์

ขอสิทธิ์ต่อไปนี้ในไฟล์ Manifest ของแอป

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<!-- If your app targets Android 13 (API level 33)
     or higher, you must declare the NEARBY_WIFI_DEVICES permission. -->
<uses-permission android:name="android.permission.NEARBY_WIFI_DEVICES"
                 <!-- If your app derives location information from Wi-Fi APIs,
                      don't include the "usesPermissionFlags" attribute. -->
                 android:usesPermissionFlags="neverForLocation" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"
                 <!-- If any feature in your app relies on precise location
                      information, don't include the "maxSdkVersion"
                      attribute. -->
                 android:maxSdkVersion="32" />

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

2. ตรวจสอบว่าอุปกรณ์รองรับ RTT ของ Wi-Fi หรือไม่

หากต้องการตรวจสอบว่าอุปกรณ์รองรับ RTT ของ Wi-Fi หรือไม่ ให้ใช้ PackageManager API:

Kotlin

context.packageManager.hasSystemFeature(PackageManager.FEATURE_WIFI_RTT)

Java

context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_WIFI_RTT);

3. ตรวจสอบว่า RTT ของ Wi-Fi ใช้งานได้หรือไม่

RTT ของ Wi-Fi อาจมีอยู่ในอุปกรณ์ แต่อาจใช้ไม่ได้ในขณะนี้เนื่องจาก ผู้ใช้ปิดใช้ Wi-Fi ขึ้นอยู่กับฮาร์ดแวร์และเฟิร์มแวร์ อุปกรณ์บางอย่างอาจไม่รองรับ RTT ของ Wi-Fi หากใช้ SoftAP หรือการเชื่อมต่ออินเทอร์เน็ตผ่านมือถือ ที่ใช้งานอยู่ หากต้องการตรวจสอบว่า RTT ของ Wi-Fi ใช้งานได้ในปัจจุบันหรือไม่ โปรดโทร isavailable()

ความพร้อมใช้งานของ RTT ของ Wi-Fi อาจเปลี่ยนแปลงได้ทุกเมื่อ แอปของคุณควรลงทะเบียน BroadcastReceiver ที่จะได้รับ ACTION_WIFI_RTT_STATE_CHANGED ซึ่งจะส่งเมื่อมีการเปลี่ยนแปลงความพร้อมจำหน่ายสินค้า เมื่อแอปได้รับประกาศ แอปควรตรวจสอบสถานะปัจจุบันของความพร้อมให้บริการและปรับ ตามความเหมาะสม

เช่น

Kotlin

val filter = IntentFilter(WifiRttManager.ACTION_WIFI_RTT_STATE_CHANGED)
val myReceiver = object: BroadcastReceiver() {

    override fun onReceive(context: Context, intent: Intent) {
        if (wifiRttManager.isAvailable) {
            
        } else {
            
        }
    }
}
context.registerReceiver(myReceiver, filter)

Java

IntentFilter filter =
    new IntentFilter(WifiRttManager.ACTION_WIFI_RTT_STATE_CHANGED);
BroadcastReceiver myReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        if (wifiRttManager.isAvailable()) {
            
        } else {
            
        }
    }
};
context.registerReceiver(myReceiver, filter);

ดูข้อมูลเพิ่มเติมได้ในประกาศ

สร้างคำขอกำหนดระยะ

คำขอระยะ (RangingRequest) สร้างขึ้นโดย ระบุรายการ AP หรือแอปเทียบเท่า Wi-Fi Aware ที่มีช่วง สามารถระบุจุดเข้าใช้งานหลายจุดหรือแอปเทียบเท่า Wi-Fi Aware ได้ใน คำขอระยะเดียว ระยะทางไปยังอุปกรณ์ทั้งหมดจะได้รับการวัดและส่งคืน

ตัวอย่างเช่น คำขอสามารถใช้ฟิลด์ addAccessPoint() วิธีระบุจุดเข้าใช้งานที่ใช้วัดระยะทาง

Kotlin

val req: RangingRequest = RangingRequest.Builder().run {
    addAccessPoint(ap1ScanResult)
    addAccessPoint(ap2ScanResult)
    build()
}

Java

RangingRequest.Builder builder = new RangingRequest.Builder();
builder.addAccessPoint(ap1ScanResult);
builder.addAccessPoint(ap2ScanResult);

RangingRequest req = builder.build();

จุดเข้าใช้งานจะระบุโดย Scanresults ได้ซึ่งสามารถ ที่ได้รับจากการโทร WifiManager.getScanผลลัพธ์s() คุณสามารถใช้ addAccessPoints(รายการ) เพื่อเพิ่มจุดเข้าใช้งานหลายจุดในกลุ่ม

ในทำนองเดียวกัน คำขอกำหนดระยะจะสามารถเพิ่มเพียร์ Wi-Fi Aware โดยใช้ MAC ของ Wi-Fi ของเครื่อง หรือ PeerHandle เวลา เพิ่มWifiAwarePeer(แอปเทียบเท่า MacAddress) และ addWifiAwarePeer(PeerHandle แอปเทียบเท่า) ตามลำดับ ดูข้อมูลเพิ่มเติมเกี่ยวกับการค้นหาแอปที่เทียบเท่า Wi-Fi Aware ดูเอกสารประกอบเกี่ยวกับ Wi-Fi Aware

ระยะคำขอ

แอปออกคำขอกำหนดระยะโดยใช้ WifiRttManager.startRanging() และระบุสิ่งต่อไปนี้ RangingRequest เพื่อระบุ ปฏิบัติการเพื่อระบุ บริบท Callback และ RangingResultCallback เพื่อรับผลลัพธ์

เช่น

Kotlin

val mgr = context.getSystemService(Context.WIFI_RTT_RANGING_SERVICE) as WifiRttManager
val request: RangingRequest = myRequest
mgr.startRanging(request, executor, object : RangingResultCallback() {

    override fun onRangingResults(results: List<RangingResult>) {  }

    override fun onRangingFailure(code: Int) {  }
})

Java

WifiRttManager mgr =
      (WifiRttManager) Context.getSystemService(Context.WIFI_RTT_RANGING_SERVICE);

RangingRequest request ...;
mgr.startRanging(request, executor, new RangingResultCallback() {

  @Override
  public void onRangingFailure(int code) {  }

  @Override
  public void onRangingResults(List<RangingResult> results) {  }
});

การดำเนินการกำหนดระยะจะทำงานไม่พร้อมกัน และผลการวัดระยะ แสดงผลในการเรียกกลับรายการใดรายการหนึ่งของ RangingResultCallback:

  • ถ้าการดำเนินการกำหนดระยะทั้งหมดล้มเหลว ระบบจะ RangingFailure Callback จะทำงานโดยมีรหัสสถานะที่อธิบายไว้ใน RangingResultCallback ความล้มเหลวดังกล่าวอาจเกิดขึ้นหากบริการไม่สามารถดำเนินการกำหนดระยะ ในเวลานั้น เช่น เนื่องจาก Wi-Fi ถูกปิดใช้งานเนื่องจากแอปพลิเคชัน ส่งคำขอดำเนินการเกี่ยวกับระยะมากเกินไปและถูกควบคุม หรือเนื่องจาก ปัญหาเกี่ยวกับสิทธิ์
  • เมื่อการดำเนินการกำหนดระยะเสร็จสมบูรณ์ onRangingผลลัพธ์ Callback จะถูกเรียกใช้ด้วยรายการผลลัพธ์ที่ตรงกับรายการของ คำขอ - ผลลัพธ์ 1 รายการสำหรับคำขอแต่ละรายการ ลำดับของผลลัพธ์ไม่ ต้องตรงกับลำดับของคำขอ โปรดทราบว่าการดำเนินการกำหนดระยะห่างอาจ เสร็จสมบูรณ์ แต่ผลลัพธ์แต่ละรายการอาจยังคงบ่งชี้ถึงความล้มเหลวในการดำเนินการนั้นๆ การวัดผล

ตีความผลลัพธ์ของระยะ

ผลลัพธ์แต่ละรายการที่แสดงโดย onRangingผลลัพธ์ Callback จะระบุโดย RangingResult ออบเจ็กต์ ในคำขอแต่ละรายการ ให้ทำตามขั้นตอนต่อไปนี้

1. ระบุคำขอ

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

รายการผลลัพธ์ช่วงอาจเรียงลำดับต่างจากแอปเทียบเท่า (การเข้าถึง จุด) ที่ระบุในคำขอระยะ ดังนั้นคุณควรใช้ที่อยู่ MAC เพื่อ ระบุแอปเทียบเท่า ไม่ใช่ลำดับของผลลัพธ์

2. ตรวจสอบว่าการวัดผลแต่ละครั้งสําเร็จหรือไม่

หากต้องการดูว่าการวัดสำเร็จหรือไม่ ให้ใช้ getStatus() ค่าอื่นๆ นอกเหนือจาก STATUS_สำเร็จ หมายถึงล้มเหลว ความล้มเหลวหมายถึงฟิลด์อื่นๆ ทั้งหมดของผลลัพธ์นี้ (ยกเว้นการระบุคำขอด้านบน) ไม่ถูกต้อง และ เมธอด get* จะล้มเหลวโดยมี ข้อยกเว้น IllegalStateException

3. รับผลลัพธ์ของการวัดที่ประสบความสำเร็จแต่ละรายการ

ในการวัดที่สำเร็จแต่ละครั้ง คุณสามารถดึงค่าผลลัพธ์ที่มี เมธอด get ที่เกี่ยวข้อง:

  • ระยะทางเป็นมม. และค่าเบี่ยงเบนมาตรฐานของการวัด

    getDistanceMm()

    getDistanceStdDevMm()

  • RSSI ของแพ็กเก็ตที่ใช้สำหรับการวัด:

    getRssi()

  • เวลาเป็นมิลลิวินาทีที่ใช้การวัด (ระบุเวลา ตั้งแต่เปิดเครื่อง):

    getRangingTimestampMillis()

  • จำนวนการวัดที่พยายามทำและจำนวนการวัด ที่สำเร็จ (และที่ใช้การวัดระยะทาง)

    getNumAttemptedMeasurements()

    getNumSuccessMeasurements()

อุปกรณ์ Android ที่รองรับ Wi-Fi-RTT

ตารางด้านล่างแสดงรายการโทรศัพท์ จุดเข้าใช้งาน และอุปกรณ์ค้าปลีก คลังสินค้า และศูนย์กระจายสินค้าบางส่วน ที่รองรับ Wi-Fi-RTT สิ่งเหล่านี้ห่างไกลจากความครอบคลุม เราขอแนะนำให้คุณ ติดต่อเรา เพื่อแสดงผลิตภัณฑ์ที่รองรับ RTT ที่นี่

จุดเข้าใช้งาน

ผู้ผลิตและรุ่น วันที่ให้การสนับสนุน
Nest Wifi Pro (Wi-Fi 6E) รองรับ
Compulab WILD AP รองรับ
Google Wi-Fi รองรับ
เราเตอร์ Wi-Fi ของ Google Nest รองรับ
Google Nest Wi-Fi Point รองรับ
อารูบา AP-635 รองรับ
Cisco 9130 รองรับ
Cisco 9136 รองรับ
Cisco 9166 รองรับ
Cisco 9164 รองรับ
อารูบา AP-505 รองรับ
อารูบา AP-515 รองรับ
อารูบา AP-575 รองรับ
อารูบา AP-518 รองรับ
อารูบา AP-505H รองรับ
อารูบา AP-565 รองรับ
อารูบา AP-535 รองรับ

โทรศัพท์

ผู้ผลิตและรุ่น รุ่นของ Android
Pixel 6 9.0 ขึ้นไป
Pixel 6 Pro 9.0 ขึ้นไป
Pixel 5 9.0 ขึ้นไป
Pixel 5a 9.0 ขึ้นไป
Pixel 5a 5G 9.0 ขึ้นไป
Xiaomi Mi 10 Pro 9.0 ขึ้นไป
Xiaomi Mi 10 9.0 ขึ้นไป
Xiaomi Redmi Mi 9T Pro 9.0 ขึ้นไป
Xiaomi Mi 9T 9.0 ขึ้นไป
Xiaomi Mi 9 9.0 ขึ้นไป
Xiaomi Mi Note 10 9.0 ขึ้นไป
Xiaomi Mi Note 10 Lite 9.0 ขึ้นไป
Xiaomi Redmi Note 9S 9.0 ขึ้นไป
Xiaomi Redmi Note 9 Pro 9.0 ขึ้นไป
Xiaomi Redmi Note 8T 9.0 ขึ้นไป
Xiaomi Redmi Note 8 9.0 ขึ้นไป
Xiaomi Redmi K30 Pro 9.0 ขึ้นไป
Xiaomi Redmi K20 Pro 9.0 ขึ้นไป
Xiaomi Redmi K20 9.0 ขึ้นไป
Xiaomi Redmi Note 5 Pro 9.0 ขึ้นไป
Xiaomi Mi CC9 Pro 9.0 ขึ้นไป
LG G8X ThinQ 9.0 ขึ้นไป
LG V50S ThinQ 9.0 ขึ้นไป
LG V60 ThinQ 9.0 ขึ้นไป
LG V30 9.0 ขึ้นไป
Samsung Galaxy Note 10 ขึ้นไป 5G 9.0 ขึ้นไป
Samsung Galaxy S20+ 5G 9.0 ขึ้นไป
Samsung Galaxy S20 ขึ้นไป 9.0 ขึ้นไป
Samsung Galaxy S20 5G 9.0 ขึ้นไป
Samsung Galaxy S20 Ultra 5G 9.0 ขึ้นไป
Samsung Galaxy S20 9.0 ขึ้นไป
Samsung Galaxy Note 10 ขึ้นไป 9.0 ขึ้นไป
Samsung Galaxy Note 10 5G 9.0 ขึ้นไป
Samsung Galaxy Note 10 9.0 ขึ้นไป
Samsung A9 Pro 9.0 ขึ้นไป
Google Pixel 4 XL 9.0 ขึ้นไป
Google Pixel 4 9.0 ขึ้นไป
Google Pixel 4a 9.0 ขึ้นไป
Google Pixel 3 XL 9.0 ขึ้นไป
Google Pixel 3 9.0 ขึ้นไป
Google Pixel 3a XL 9.0 ขึ้นไป
Google Pixel 3a 9.0 ขึ้นไป
Google Pixel 2 XL 9.0 ขึ้นไป
Google Pixel 2 9.0 ขึ้นไป
Google Pixel 1 XL 9.0 ขึ้นไป
Google Pixel 1 9.0 ขึ้นไป
Poco X2 9.0 ขึ้นไป
Sharp Aquos R3 SH-04L 9.0 ขึ้นไป

อุปกรณ์สำหรับร้านค้าปลีก คลังสินค้า และศูนย์กระจายสินค้า

ผู้ผลิตและรุ่น รุ่นของ Android
Zebra PS20 10.0 ขึ้นไป
Zebra TC52/TC52HC 10.0 ขึ้นไป
ม้าลาย TC57 10.0 ขึ้นไป
ม้าลาย TC72 10.0 ขึ้นไป
ม้าลาย TC77 10.0 ขึ้นไป
ม้าลาย MC93 10.0 ขึ้นไป
ม้าลาย TC8300 10.0 ขึ้นไป
ม้าลาย VC8300 10.0 ขึ้นไป
ม้าลาย EC30 10.0 ขึ้นไป
ม้าลาย ET51 10.0 ขึ้นไป
ม้าลาย ET56 10.0 ขึ้นไป
ม้าลาย L10 10.0 ขึ้นไป
ม้าลาย CC600/CC6000 10.0 ขึ้นไป
ม้าลาย MC3300X 10.0 ขึ้นไป
ม้าลาย MC330X 10.0 ขึ้นไป
ม้าลาย TC52X 10.0 ขึ้นไป
ม้าลาย TC57X 10.0 ขึ้นไป
Zebra EC50 (LAN และ HC) 10.0 ขึ้นไป
Zebra EC55 (WAN) 10.0 ขึ้นไป
ม้าลาย WT6300 10.0 ขึ้นไป
Skorpio X5 10.0 ขึ้นไป