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

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

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

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

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

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

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

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

ในอุปกรณ์ที่ใช้ Android 13 (API ระดับ 33) ขึ้นไปที่รองรับโหมดการสื่อสารทันที แอปสามารถใช้เมธอด 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, ซึ่งจะส่งเมื่อมีการเปลี่ยนแปลงความพร้อมให้บริการ เมื่อแอปของคุณได้รับ Intent ของการส่งข้อมูล ควรจะทิ้งเซสชันที่มีอยู่ทั้งหมด (สมมติว่าบริการ 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() การเรียกกลับนี้จะระบุออบเจ็กต์ 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);

หากเผยแพร่สําเร็จ ระบบจะเรียกใช้วิธี Callback ของ onPublishStarted()

หลังจากเผยแพร่แล้ว เมื่ออุปกรณ์ที่ใช้แอปผู้สมัครใช้บริการที่ตรงกันย้ายไปยัง ช่วงสัญญาณ 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() ในแอปของคุณ เนื่องจากคุณใช้อาร์กิวเมนต์ SubscribeDiscoverySession ในการเรียกคืนเพื่อสื่อสารกับผู้เผยแพร่โฆษณาได้หลังจากที่แอปค้นพบผู้เผยแพร่โฆษณาแล้ว คุณจึงควรบันทึกการอ้างอิงนี้ คุณสามารถอัปเดตเซสชันการติดตามได้ทุกเมื่อโดย การโทร updateSubscribe() ในเซสชันการค้นพบ

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

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

ส่งข้อความ

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

  • DiscoverySession ออบเจ็กต์นี้ช่วยให้คุณเรียกใช้ sendMessage() ได้ แอปของคุณได้รับ DiscoverySession จาก การเผยแพร่บริการหรือการสมัครใช้บริการ บริการ

  • PeerHandle ของอุปกรณ์อีกเครื่องเพื่อกำหนดเส้นทาง แอปของคุณจะได้รับPeerHandleของอุปกรณ์อื่นด้วยวิธีใดวิธีหนึ่งต่อไปนี้

    • แอปของคุณเผยแพร่บริการและได้รับข้อความจากผู้สมัครใช้บริการ แอปของคุณจะได้รับ PeerHandle ของผู้ติดตามจาก onMessageReceived() callbacks
    • แอปของคุณสมัครใช้บริการ จากนั้น เมื่อโปรแกรมพบรายการที่ตรงกัน ผู้เผยแพร่โฆษณา แอปของคุณจะได้รับ PeerHandle จาก onServiceDiscovered() Callback

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

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

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

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

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

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

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

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

  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 ได้โดยตรงโดยใช้ที่อยู่ MAC หรือ PeerHandle

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

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

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

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

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

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

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