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

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

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

Wi-Fi Aware API ช่วยให้แอปดำเนินการต่อไปนี้ได้

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

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

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

  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 ด้วย API PackageManager หรือไม่ ดังที่แสดงด้านล่าง

    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 Aware ที่มีเนมสเปซที่ไม่ซ้ำกันซึ่งทำหน้าที่เป็นคอนเทนเนอร์สำหรับเซสชันการค้นพบทั้งหมดที่สร้างขึ้นภายในนั้น

หากแนบแอปสำเร็จ ระบบจะเรียกใช้ Callback 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);

หากเผยแพร่สำเร็จ ระบบจะเรียกใช้เมธอด Callback onPublishStarted()

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

หากต้องการหยุดเผยแพร่บริการ ให้เรียกใช้ DiscoverySession.close() เซสชัน Discovery จะเชื่อมโยงกับ 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);

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

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

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

ส่งข้อความ

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

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

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

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

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

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

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

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

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

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

การกำหนดระยะของอุปกรณ์ที่เทียบเท่าและการค้นพบที่รับรู้ถึงตำแหน่ง

อุปกรณ์ที่มีความสามารถด้านตำแหน่ง Wi-Fi RTT จะวัดระยะทางไปยังอุปกรณ์เทียบเท่าได้โดยตรง และใช้ข้อมูลนี้เพื่อจำกัด Service Discovery ของ 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 การระบุเฉพาะระยะห่างขั้นต่ำหมายความว่าไม่มีระยะห่างสูงสุด

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