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

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

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

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

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

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

Android 15 (ระดับ API 35) เปิดตัวการรองรับการกำหนดช่วงแบบไม่ใช้ทริกเกอร์ (NTB) ของ IEEE 802.11az

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

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

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

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

การรองรับการวัดระยะ NTB ของ IEEE 802.11az พร้อมใช้งานในอุปกรณ์ที่ใช้ Android 15 (ระดับ API 35) ขึ้นไป ซึ่งหมายความว่าหากอุปกรณ์รองรับโหมดตัวเริ่มต้น NTB ของ IEEE 802.11az (ระบุโดย WifiRttManager.CHARACTERISTICS_KEY_BOOLEAN_NTB_INITIATOR) แอปของคุณจะค้นหา AP ที่รองรับทั้ง IEEE 802.11mc และ IEEE 802.11az ได้ด้วยคำขอช่วงเดียว API RangingResult ได้รับการขยายเพื่อแสดงข้อมูลเกี่ยวกับค่าต่ำสุดและสูงสุดที่สามารถใช้สำหรับช่วงเวลาระหว่างการวัดระยะ โดยปล่อยให้ช่วงเวลาที่แน่นอนอยู่ในการควบคุมของแอป

ข้อกำหนด

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

ตั้งค่า

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

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. ตรวจสอบว่าอุปกรณ์รองรับ Wi-Fi RTT หรือไม่

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

Kotlin

context.packageManager.hasSystemFeature(PackageManager.FEATURE_WIFI_RTT)

Java

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

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

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

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

เช่น

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

จุดเข้าใช้งานจะระบุด้วยออบเจ็กต์ ScanResult ซึ่งรับได้โดยการเรียกใช้ WifiManager.getScanResults() คุณสามารถใช้ addAccessPoints(List<ScanResult>) เพื่อเพิ่มจุดเข้าใช้งานหลายจุดในกลุ่มได้

ออบเจ็กต์ ScanResult สามารถมีทั้ง AP ที่รองรับ IEEE 802.11mc (is80211mcResponder()) และการกำหนดช่วงที่ไม่ได้อิงตามทริกเกอร์ IEEE 802.11az (is80211azNtbResponder()) อุปกรณ์ที่รองรับการกำหนดช่วง NTB ของ IEEE 802.11az จะทำการกำหนดช่วง 802.11mc หรือ 802.11az โดยขึ้นอยู่กับความสามารถของ AP และจะใช้ 802.11az เป็นค่าเริ่มต้นเมื่อ AP รองรับทั้ง 2 แบบ อุปกรณ์ที่ไม่รองรับ IEEE 802.11az จะทำการวัดระยะทั้งหมดโดยใช้โปรโตคอล IEEE 802.11mc

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

ขอให้จัดอันดับ

แอปจะส่งคำขอการวัดระยะโดยใช้เมธอด WifiRttManager.startRanging() และระบุข้อมูลต่อไปนี้ RangingRequest เพื่อระบุการดำเนินการ Executor เพื่อระบุบริบท 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) { … }
});

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

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

ตีความผลลัพธ์การวัดระยะ

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

1. ระบุคำขอ

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

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

2. พิจารณาว่าการวัดแต่ละครั้งประสบความสำเร็จหรือไม่

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

3. ดูผลลัพธ์สำหรับการวัดผลที่สำเร็จแต่ละรายการ

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

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

    getDistanceMm()

    getDistanceStdDevMm()

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

    getRssi()

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

    getRangingTimestampMillis()

  • จำนวนการวัดที่พยายามทำและจำนวนการวัดที่สำเร็จ (และเป็นพื้นฐานของการวัดระยะทาง)

    getNumAttemptedMeasurements()

    getNumSuccessfulMeasurements()

  • เวลาขั้นต่ำและสูงสุดที่อุปกรณ์ไคลเอ็นต์ต้องรอระหว่างการวัด NTB 11az

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

  • การทำซ้ำ Long Training Field (LTF) ที่สถานีผู้ตอบและผู้เริ่มใช้ในข้อความนำสำหรับผลลัพธ์ IEEE 802.11az NTB

    get80211azResponderTxLtfRepetitionsCount()

    get80211azInitiatorTxLtfRepetitionsCount()

  • จำนวนสตรีมเชิงพื้นที่ (STS) ที่ส่งและรับซึ่งสถานีผู้เริ่มต้นใช้สำหรับผลลัพธ์ IEEE 802.11az NTB

    get80211azNumberOfTxSpatialStreams()

    get80211azNumberOfRxSpatialStreams()

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

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

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

ผู้ผลิตและรุ่น วันที่สนับสนุน โปรโตคอล
Nest Wifi Pro (Wi-Fi 6E) รองรับ mc
Compulab WILD AP รองรับ mc
Google Wi-Fi รองรับ mc
เราเตอร์ Google Nest Wifi รองรับ mc
Google Nest Wifi Point รองรับ mc
Aruba AP-635 รองรับ mc
Cisco 9130 รองรับ mc
Cisco 9136 รองรับ mc
Cisco 9166 รองรับ mc
Cisco 9164 รองรับ mc
Cisco CW9172I รองรับ mc/az
Cisco CW9172H รองรับ mc/az
Cisco CW9176I รองรับ mc/az
Cisco CW9178I รองรับ mc/az
Aruba AP-505 รองรับ mc
Aruba AP-515 รองรับ mc
Aruba AP-575 รองรับ mc
Aruba AP-518 รองรับ mc
Aruba AP-505H รองรับ mc
Aruba AP-565 รองรับ mc
Aruba AP-535 รองรับ mc
Aruba AP567 รองรับ mc
Aruba AP577 รองรับ mc
Aruba AP555 รองรับ mc
Aruba AP635 รองรับ mc
Aruba AP655 รองรับ mc
Aruba AP615 รองรับ mc
Aruba AP734 รองรับ mc/az
Aruba AP735 รองรับ mc/az
Aruba AP754 รองรับ mc/az
Aruba AP755 รองรับ mc/az

โทรศัพท์

ผู้ผลิตและรุ่น เวอร์ชัน Android
Google Pixel 9 Pro XL 14+
Google Pixel 9 14+
Google Pixel 9 Pro 14+
Google Pixel 9 Pro XL 14+
Google Pixel 7a 14+
Google Pixel 7 14+
Google Pixel 8 14+
Google Pixel 8 Pro 14+
Google Pixel 8a 14+
Samsung SM-S918B 14+
Samsung SM-A515F 14+
Google Pixel 9 Pro 14+
Samsung SM-A546E 14+
Samsung SM-S928B 14+
Samsung SM-A217F 14+
Samsung SM-A715F 14+
Samsung SM-A528B 14+
Samsung SM-A135F 14+
Samsung SM-S911B 14+
Xiaomi 21091116AI 14+
Google Pixel 9 14+
Samsung SM-A127F 14+
Google Pixel 7 Pro 14+
Samsung SM-A556E 14+
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 ขึ้นไป
Zebra TC57 10.0 ขึ้นไป
Zebra TC72 10.0 ขึ้นไป
Zebra TC77 10.0 ขึ้นไป
Zebra MC93 10.0 ขึ้นไป
Zebra TC8300 10.0 ขึ้นไป
Zebra VC8300 10.0 ขึ้นไป
Zebra EC30 10.0 ขึ้นไป
Zebra ET51 10.0 ขึ้นไป
Zebra ET56 10.0 ขึ้นไป
Zebra L10 10.0 ขึ้นไป
Zebra CC600/CC6000 10.0 ขึ้นไป
Zebra MC3300x 10.0 ขึ้นไป
Zebra MC330x 10.0 ขึ้นไป
Zebra TC52x 10.0 ขึ้นไป
Zebra TC57x 10.0 ขึ้นไป
Zebra EC50 (LAN และ HC) 10.0 ขึ้นไป
Zebra EC55 (WAN) 10.0 ขึ้นไป
Zebra WT6300 10.0 ขึ้นไป
Skorpio X5 10.0 ขึ้นไป