ภาพรวมเกี่ยวกับ Wi-Fi Aware

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

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

Wi-Fi Aware API ทำให้แอปทำงานต่อไปนี้ได้

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

  • สร้างการเชื่อมต่อเครือข่าย: หลังจากพบอุปกรณ์ 2 เครื่องต่อเครื่อง ธุรกิจอื่นๆ ก็สามารถสร้าง การเชื่อมต่อเครือข่าย Wi-Fi Aware แบบ 2 ทิศทางโดยไม่ต้องมีจุดเข้าใช้งาน

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

การเพิ่มประสิทธิภาพ Android 13 (API ระดับ 33)

สำหรับอุปกรณ์ที่ใช้ Android 13 (API ระดับ 33) ขึ้นไปซึ่งรองรับ Instant โหมดการสื่อสาร แอปสามารถใช้ PublishConfig.Builder.setInstantCommunicationModeEnabled() และ SubscribeConfig.Builder.setInstantCommunicationModeEnabled() เมธอดเพื่อ เปิดหรือปิดใช้งานโหมดการสื่อสารทันใจสำหรับผู้เผยแพร่เนื้อหาหรือสมาชิก การค้นหาความต้องการ โหมดการสื่อสารแบบทันทีช่วยให้การแลกเปลี่ยนข้อความเร็วขึ้น การค้นพบบริการ และการตั้งค่าเส้นทางข้อมูลในฐานะส่วนหนึ่งของผู้เผยแพร่โฆษณาหรือสมาชิก การค้นหาความต้องการ หากต้องการตรวจสอบว่าอุปกรณ์รองรับการสื่อสารทันใจหรือไม่ ให้ใช้เมธอด isInstantCommunicationModeSupported()

การเพิ่มประสิทธิภาพ Android 12 (API ระดับ 31)

Android 12 (API ระดับ 31) เพิ่มการเพิ่มประสิทธิภาพบางอย่างให้กับ Wi-Fi Aware

  • ในอุปกรณ์ที่ใช้ Android 12 (API ระดับ 31) ขึ้นไป คุณสามารถใช้ onServiceLost() Callback เพื่อรับการแจ้งเตือนเมื่อแอปของคุณสูญเสียบริการที่ค้นพบเนื่องจาก บริการหยุดทำงานหรือย้ายออกจากช่วง
  • การตั้งค่าเส้นทางข้อมูล Wi-Fi Aware เสร็จสมบูรณ์แล้ว เวอร์ชันก่อนหน้า ใช้การส่งข้อความ L2 เพื่อระบุที่อยู่ MAC ของผู้เริ่ม การใช้เวลาในการตอบสนอง ในอุปกรณ์ที่ใช้ Android 12 ขึ้นไป ผู้ตอบ (เซิร์ฟเวอร์) กำหนดค่าให้ยอมรับแอปเทียบเท่าใดก็ได้ โดยไม่ต้องการ เพื่อดูที่อยู่ MAC ของตัวเริ่มต้นล่วงหน้า การดำเนินการนี้ช่วยให้ Datapath เร็วขึ้น ปรากฏขึ้น และเปิดใช้ลิงก์แบบจุดต่อจุดหลายรายการโดยใช้เพียงเครือข่ายเดียว อีกครั้ง
  • แอปที่ใช้ Android 12 ขึ้นไปสามารถใช้ WifiAwareManager.getAvailableAwareResources() ในการรับจำนวนเส้นทางข้อมูลที่ใช้ได้ในปัจจุบัน เผยแพร่เซสชัน และเซสชันต่างๆ ที่สมัคร วิธีนี้จะช่วยให้แอประบุได้ว่ามี ทรัพยากรที่มีอยู่เพียงพอที่จะดำเนินการฟังก์ชันที่ต้องการ

การตั้งค่าเบื้องต้น

หากต้องการตั้งค่าแอปให้ใช้การค้นพบและการสร้างเครือข่ายและการรับรู้ Wi-Fi ให้ดำเนินการต่อไปนี้ ขั้นตอนต่อไปนี้

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

    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <!-- 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" />
    
  2. ตรวจสอบว่าอุปกรณ์รองรับ Wi-Fi Aware ด้วยหรือไม่ PackageManager API ตามที่แสดงด้านล่าง

    Kotlin

    context.packageManager.hasSystemFeature(PackageManager.FEATURE_WIFI_AWARE)
    

    Java

    context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_WIFI_AWARE);
    
  3. ตรวจสอบว่า Wi-Fi Aware พร้อมใช้งานในขณะนี้หรือไม่ Wi-Fi Aware อาจเปิดอยู่ อุปกรณ์ แต่อาจไม่พร้อมใช้งานในขณะนี้เนื่องจากผู้ใช้ได้ปิดการใช้งาน Wi-Fi หรือตำแหน่ง อุปกรณ์บางรุ่นจะขึ้นอยู่กับความสามารถของฮาร์ดแวร์และเฟิร์มแวร์ อาจไม่รองรับ Wi-Fi Aware หากใช้ Wi-Fi Direct, SoftAP หรือการเชื่อมต่ออินเทอร์เน็ตผ่านมือถือ หากต้องการตรวจสอบว่า Wi-Fi Aware ใช้งานได้ในปัจจุบันหรือไม่ ให้โทร isAvailable()

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

    Kotlin

    val wifiAwareManager = context.getSystemService(Context.WIFI_AWARE_SERVICE) as WifiAwareManager?
    val filter = IntentFilter(WifiAwareManager.ACTION_WIFI_AWARE_STATE_CHANGED)
    val myReceiver = object : BroadcastReceiver() {
    
        override fun onReceive(context: Context, intent: Intent) {
            // discard current sessions
            if (wifiAwareManager?.isAvailable) {
                ...
            } else {
                ...
            }
        }
    }
    context.registerReceiver(myReceiver, filter)
    

    Java

    WifiAwareManager wifiAwareManager = 
            (WifiAwareManager)context.getSystemService(Context.WIFI_AWARE_SERVICE)
    IntentFilter filter =
            new IntentFilter(WifiAwareManager.ACTION_WIFI_AWARE_STATE_CHANGED);
    BroadcastReceiver myReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            // discard current sessions
            if (wifiAwareManager.isAvailable()) {
                ...
            } else {
                ...
            }
        }
    };
    context.registerReceiver(myReceiver, filter);
    

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

รับเซสชัน

หากต้องการเริ่มใช้ Wi-Fi Aware แอปของคุณต้องได้รับ WifiAwareSessionโดยการโทร attach() วิธีนี้ ทำสิ่งต่อไปนี้

  • เปิดฮาร์ดแวร์ Wi-Fi Aware
  • เข้าร่วมหรือสร้างคลัสเตอร์ Wi-Fi Aware
  • สร้างเซสชันการรับรู้ Wi-Fi โดยมีเนมสเปซที่ไม่ซ้ำกันซึ่งทำหน้าที่เป็น คอนเทนเนอร์สำหรับเซสชันการค้นพบทั้งหมดที่สร้างขึ้นภายใน

หากแนบแอปสำเร็จ ระบบจะเรียกใช้ การติดต่อกลับของ onAttached() Callback นี้แสดงออบเจ็กต์ WifiAwareSession ที่แอปของคุณควรใช้สำหรับการดำเนินการเซสชันเพิ่มเติมทั้งหมด แอปสามารถใช้ เซสชันเพื่อเผยแพร่บริการ หรือ สมัครใช้บริการ

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

เผยแพร่บริการ

หากต้องการให้ค้นพบบริการได้ ให้เรียกใช้ publish() ซึ่ง ใช้พารามิเตอร์ต่อไปนี้

  • PublishConfig ระบุชื่อของ บริการและพร็อพเพอร์ตี้การกำหนดค่าอื่นๆ เช่น ตัวกรองการจับคู่
  • DiscoverySessionCallback ระบุ การดำเนินการเมื่อเกิดเหตุการณ์ต่างๆ เช่น เมื่อสมาชิกได้รับ ข้อความ

ตัวอย่างเช่น

Kotlin

val config: PublishConfig = PublishConfig.Builder()
        .setServiceName(AWARE_FILE_SHARE_SERVICE_NAME)
        .build()
awareSession.publish(config, object : DiscoverySessionCallback() {

    override fun onPublishStarted(session: PublishDiscoverySession) {
        ...
    }

    override fun onMessageReceived(peerHandle: PeerHandle, message: ByteArray) {
        ...
    }
})

Java

PublishConfig config = new PublishConfig.Builder()
    .setServiceName(Aware_File_Share_Service_Name)
    .build();

awareSession.publish(config, new DiscoverySessionCallback() {
    @Override
    public void onPublishStarted(PublishDiscoverySession session) {
        ...
    }
    @Override
    public void onMessageReceived(PeerHandle peerHandle, byte[] message) {
        ...
    }
}, null);

หากการเผยแพร่ประสบความสำเร็จ onPublishStarted() มีการเรียก Method ของ Callback

หลังจากเผยแพร่แล้ว เมื่ออุปกรณ์ที่ใช้แอปผู้สมัครใช้บริการที่ตรงกันย้ายไปยัง ช่วง Wi-Fi ของอุปกรณ์เผยแพร่ ผู้สมัครใช้บริการจะเห็นบริการได้ วันและเวลา เมื่อสมาชิกค้นพบผู้เผยแพร่ ผู้เผยแพร่โฆษณาจะไม่ได้รับ การแจ้งเตือน หากสมาชิกส่งข้อความถึง ผู้เผยแพร่เนื้อหาแล้ว ผู้เผยแพร่โฆษณาจะได้รับการแจ้งเตือน เมื่อเกิดเหตุการณ์นี้ขึ้น ฟิลด์ onMessageReceived() มีการเรียก Method ของ Callback คุณสามารถใช้ PeerHandle อาร์กิวเมนต์จากเมธอดนี้ไปยัง ส่งข้อความกลับไปยังสมาชิก หรือ สร้างการเชื่อมต่อ

หากต้องการหยุดเผยแพร่บริการ โปรดเรียก DiscoverySession.close() เซสชันการค้นพบเชื่อมโยงกับผู้เผยแพร่โฆษณาหลัก WifiAwareSession หากเซสชันหลักคือ ปิดแล้ว เซสชันการค้นพบที่เกี่ยวข้องก็ปิดเช่นกัน ขณะทิ้ง วัตถุถูกปิดด้วยเช่นกัน ระบบจะไม่รับประกันเมื่ออยู่นอกขอบเขต เซสชันปิดแล้ว ดังนั้นเราขอแนะนำให้คุณเรียกใช้ close() อย่างชัดแจ้ง

สมัครใช้บริการ

หากต้องการสมัครใช้บริการ ให้ไปที่ subscribe() วิธี ซึ่งจะใช้พารามิเตอร์ต่อไปนี้

  • SubscribeConfig ระบุชื่อของ เพื่อสมัครใช้บริการ และพร็อพเพอร์ตี้การกำหนดค่าอื่นๆ เช่น การจับคู่ ตัวกรอง
  • DiscoverySessionCallback ระบุ การดำเนินการเมื่อเกิดเหตุการณ์ขึ้น เช่น เมื่อค้นพบผู้เผยแพร่โฆษณา

ตัวอย่างเช่น

Kotlin

val config: SubscribeConfig = SubscribeConfig.Builder()
        .setServiceName(AWARE_FILE_SHARE_SERVICE_NAME)
        .build()
awareSession.subscribe(config, object : DiscoverySessionCallback() {

    override fun onSubscribeStarted(session: SubscribeDiscoverySession) {
        ...
    }

    override fun onServiceDiscovered(
            peerHandle: PeerHandle,
            serviceSpecificInfo: ByteArray,
            matchFilter: List<ByteArray>
    ) {
        ...
    }
}, null)

Java

SubscribeConfig config = new SubscribeConfig.Builder()
    .setServiceName("Aware_File_Share_Service_Name")
    .build();

awareSession.subscribe(config, new DiscoverySessionCallback() {
    @Override
    public void onSubscribeStarted(SubscribeDiscoverySession session) {
        ...
    }

    @Override
    public void onServiceDiscovered(PeerHandle peerHandle,
            byte[] serviceSpecificInfo, List<byte[]> matchFilter) {
        ...
    }
}, null);

หากการดำเนินการสมัครใช้บริการสำเร็จ ระบบจะเรียกใช้เมธอด onSubscribeStarted() Callback ในแอป เนื่องจากคุณสามารถใช้ อาร์กิวเมนต์ SubscribeDiscoverySession ในอาร์กิวเมนต์ Callback เพื่อสื่อสารกับผู้เผยแพร่โฆษณา หลังจากที่แอปของคุณพบผู้เผยแพร่โฆษณา คุณจะ ควรบันทึกการอ้างอิงนี้ คุณสามารถอัปเดตเซสชันการติดตามได้ทุกเมื่อโดย การโทร updateSubscribe() ในเซสชันการค้นพบ

ในขั้นตอนนี้ การสมัครใช้บริการของคุณจะรอให้ผู้เผยแพร่โฆษณาที่ตรงกันเข้ามา ช่วงสัญญาณ Wi-Fi เมื่อเกิดกรณีนี้ขึ้น ระบบจะดำเนินการ onServiceDiscovered() Callback Method คุณสามารถใช้ PeerHandle จาก Callback นี้เพื่อ ส่งข้อความ หรือ สร้างการเชื่อมต่อกับผู้เผยแพร่โฆษณารายดังกล่าว

หากต้องการหยุดสมัครใช้บริการ ให้โทร DiscoverySession.close() เซสชันการค้นพบเชื่อมโยงกับผู้เผยแพร่โฆษณาหลัก WifiAwareSession หากเซสชันหลักคือ ปิดแล้ว เซสชันการค้นพบที่เกี่ยวข้องก็ปิดเช่นกัน ขณะทิ้ง วัตถุถูกปิดด้วยเช่นกัน ระบบจะไม่รับประกันเมื่ออยู่นอกขอบเขต เซสชันถูกปิดแล้ว ดังนั้นเราขอแนะนำให้คุณเรียกใช้ close() อย่างชัดแจ้ง

ส่งข้อความ

หากต้องการส่งข้อความไปยังอุปกรณ์อื่น คุณต้องมีรายการต่อไปนี้

หากต้องการส่งข้อความ ให้โทร sendMessage() อาจมี Callback ต่อไปนี้เกิดขึ้น

  • เมื่อแอปเทียบเท่าได้รับข้อความเรียบร้อยแล้ว ระบบจะเรียกใช้ onMessageSendSucceeded() Callback ในแอป sending
  • เมื่อเพียร์ได้รับข้อความ ระบบจะเรียกใช้เมธอด onMessageReceived() Callback ในแอปการรับ

แม้ว่า PeerHandle จะจำเป็นต้องใช้เพื่อสื่อสารกับผู้อื่น คุณไม่ควรทำ ก็ต้องใช้เป็นตัวระบุถาวรของแอปเทียบเท่า ตัวระบุระดับสูงอาจเป็น ที่ใช้โดยแอปพลิเคชันที่ฝังอยู่ในบริการสำรวจหรือใน ข้อความต่อมา คุณสามารถฝังตัวระบุไว้ในบริการสำรวจด้วย เวลา setMatchFilter() หรือ setServiceSpecificInfo() ของ PublishConfig หรือ SubscribeConfig เมธอด setMatchFilter() ส่งผลต่อการค้นพบ ขณะที่ เมธอด setServiceSpecificInfo() ไม่มีผลต่อการค้นพบ

การฝังตัวระบุในข้อความหมายถึงการแก้ไขอาร์เรย์ไบต์ของข้อความเป็น มีตัวระบุ (เช่น 2-3 ไบต์แรก)

สร้างการเชื่อมต่อ

Wi-Fi Aware รองรับเครือข่ายแบบไคลเอ็นต์เซิร์ฟเวอร์ระหว่างอุปกรณ์ Wi-Fi Aware 2 เครื่อง

วิธีตั้งค่าการเชื่อมต่อแบบไคลเอ็นต์-เซิร์ฟเวอร์

  1. ใช้การค้นพบ Wi-Fi เพื่อเผยแพร่บริการ (ใน เซิร์ฟเวอร์) และสมัครใช้บริการ (ใน )

  2. เมื่อสมาชิกค้นพบผู้เผยแพร่เนื้อหาแล้ว ส่งข้อความจากสมาชิกไปยังผู้เผยแพร่

  3. เริ่มใช้งาน ServerSocket ในผู้เผยแพร่โฆษณา อุปกรณ์ และตั้งค่าหรือรับพอร์ตได้โดยทำดังนี้

    Kotlin

    val ss = ServerSocket(0)
    val port = ss.localPort
    

    Java

    ServerSocket ss = new ServerSocket(0);
    int port = ss.getLocalPort();
    
  4. ใช้ConnectivityManagerเพื่อ ขอเครือข่าย Wi-Fi Aware จากผู้เผยแพร่โฆษณาโดยใช้ WifiAwareNetworkSpecifier, โดยระบุเซสชันการค้นพบ PeerHandle ของสมาชิก ที่คุณได้รับจากข้อความที่สมาชิกส่ง:

    Kotlin

    val networkSpecifier = WifiAwareNetworkSpecifier.Builder(discoverySession, peerHandle)
        .setPskPassphrase("somePassword")
        .setPort(port)
        .build()
    val myNetworkRequest = NetworkRequest.Builder()
        .addTransportType(NetworkCapabilities.TRANSPORT_WIFI_AWARE)
        .setNetworkSpecifier(networkSpecifier)
        .build()
    val callback = object : ConnectivityManager.NetworkCallback() {
        override fun onAvailable(network: Network) {
            ...
        }
    
        override fun onCapabilitiesChanged(network: Network, networkCapabilities: NetworkCapabilities) {
            ...
        }
    
        override fun onLost(network: Network) {
            ...
        }
    }
    
    connMgr.requestNetwork(myNetworkRequest, callback);
    

    Java

    NetworkSpecifier networkSpecifier = new WifiAwareNetworkSpecifier.Builder(discoverySession, peerHandle)
        .setPskPassphrase("somePassword")
        .setPort(port)
        .build();
    NetworkRequest myNetworkRequest = new NetworkRequest.Builder()
        .addTransportType(NetworkCapabilities.TRANSPORT_WIFI_AWARE)
        .setNetworkSpecifier(networkSpecifier)
        .build();
    ConnectivityManager.NetworkCallback callback = new ConnectivityManager.NetworkCallback() {
        @Override
        public void onAvailable(Network network) {
            ...
        }
    
        @Override
        public void onCapabilitiesChanged(Network network, NetworkCapabilities networkCapabilities) {
            ...
        }
    
        @Override
        public void onLost(Network network) {
            ...
        }
    };
    
    ConnectivityManager connMgr.requestNetwork(myNetworkRequest, callback);
    
  5. เมื่อผู้เผยแพร่โฆษณาขอเครือข่าย ส่งข้อความถึงสมาชิก

  6. เมื่อสมาชิกได้รับข้อความจากผู้เผยแพร่ ให้ขอ Wi-Fi เครือข่าย Aware ของผู้สมัครใช้บริการใช้วิธีการเดียวกันกับผู้เผยแพร่ ควรทำ ไม่ระบุพอร์ตเมื่อสร้าง NetworkSpecifier ระบบจะเรียกเมธอด Callback ที่เหมาะสมเมื่อเชื่อมต่อเครือข่าย พร้อมใช้งาน มีการเปลี่ยนแปลง หรือสูญหาย

  7. เมื่อเรียกใช้เมธอด onAvailable() ในสมาชิก ออบเจ็กต์ Network ใช้ได้กับ ซึ่งคุณสามารถเปิด Socket เพื่อสื่อสาร กับ ServerSocket ในผู้เผยแพร่โฆษณาแต่คุณจำเป็นต้องทราบ ที่อยู่และพอร์ต IPv6 ของ ServerSocket คุณได้รับข้อมูลเหล่านี้จาก ออบเจ็กต์ NetworkCapabilities รายการ ที่ระบุไว้ใน Callback onCapabilitiesChanged()

    Kotlin

    val peerAwareInfo = networkCapabilities.transportInfo as WifiAwareNetworkInfo
    val peerIpv6 = peerAwareInfo.peerIpv6Addr
    val peerPort = peerAwareInfo.port
    ...
    val socket = network.getSocketFactory().createSocket(peerIpv6, peerPort)
    

    Java

    WifiAwareNetworkInfo peerAwareInfo = (WifiAwareNetworkInfo) networkCapabilities.getTransportInfo();
    Inet6Address peerIpv6 = peerAwareInfo.getPeerIpv6Addr();
    int peerPort = peerAwareInfo.getPort();
    ...
    Socket socket = network.getSocketFactory().createSocket(peerIpv6, peerPort);
    
  8. เมื่อเชื่อมต่อเครือข่ายเสร็จแล้ว ให้โทร unregisterNetworkCallback()

กลุ่มผู้ใช้และการค้นพบโดยรับรู้ตำแหน่ง

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

Wi-Fi RTT API อนุญาตให้เชื่อมต่อไปยังเครือข่าย Wi-Fi Aware ได้โดยตรงโดยใช้การเชื่อมต่อ Wi-Fi ที่อยู่ MAC หรือ PeerHandle

การค้นพบ Wi-Fi Aware อาจถูกจำกัดให้ค้นพบเฉพาะบริการภายใน เขตพื้นที่เสมือนหนึ่งๆ เช่น คุณสามารถตั้งค่าเขตพื้นที่เสมือนที่ช่วยให้ค้นพบ ของอุปกรณ์ที่เผยแพร่บริการ "Aware_File_Share_Service_Name" ซึ่งไม่ใช่ ใกล้มากกว่า 3 เมตร (ระบุเป็น 3,000 มม.) และไม่เกิน 10 เมตร (ระบุเป็น 10,000 มม.)

หากต้องการเปิดใช้การกำหนดเขตพื้นที่เสมือน ทั้งผู้เผยแพร่และผู้สมัครใช้บริการต้องดำเนินการดังต่อไปนี้

  • ผู้เผยแพร่ต้องเปิดใช้ช่วงในบริการที่เผยแพร่โดยใช้ setRangingEnabled(true)

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

  • สมาชิกต้องระบุเขตพื้นที่เสมือนโดยใช้การผสมผสานระหว่าง setMinDistanceMm และ setMaxDistanceMm

    สำหรับค่าใดค่าหนึ่ง ระยะทางที่ไม่ระบุจะหมายถึงไม่มีขีดจำกัด การระบุเท่านั้น ระยะทางสูงสุดหมายถึงระยะทางต่ำสุดที่ 0 การระบุเฉพาะ ระยะทางต่ำสุดหมายถึงไม่มีค่าสูงสุด

เมื่อพบบริการที่คล้ายกันภายในเขตพื้นที่เสมือน onServiceDiscoveredinternalRange Callback จะทริกเกอร์ซึ่งระบุระยะทางที่วัดได้แก่เพียร์ จากนั้นสามารถเรียกใช้ Wi-Fi RTT API โดยตรงตามที่จำเป็นในการวัดระยะทางที่ ครั้งต่อๆ ไป