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

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

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

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

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

ส่งข้อความ

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

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

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

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

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

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

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

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

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

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 ระบบจะเรียกใช้เมธอดเรียกกลับที่เหมาะสมเมื่อการเชื่อมต่อเครือข่าย พร้อมใช้งาน เปลี่ยนแปลง หรือขาดหายไป

  7. เมื่อเรียกใช้เมธอด onAvailable() ในผู้ติดตามแล้ว ออบเจ็กต์ a Network จะพร้อมใช้งาน ซึ่งคุณสามารถใช้เพื่อเปิด Socket เพื่อสื่อสารกับ ServerSocket ในผู้เผยแพร่โฆษณาได้ แต่คุณต้องทราบที่อยู่ IPv6 และพอร์ตของ ServerSocket คุณจะได้รับข้อมูลเหล่านี้จากออบเจ็กต์ NetworkCapabilities ที่ระบุไว้ในการเรียกกลับ 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 จะวัดระยะทางไปยังอุปกรณ์อื่นๆ ได้โดยตรงและใช้ข้อมูลนี้เพื่อ จำกัดการค้นพบบริการ 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 ซึ่งจะระบุระยะทางที่วัดได้ไปยังเพียร์ จากนั้นจะเรียกใช้ Direct Wi-Fi RTT API ได้ตามต้องการเพื่อวัดระยะทางใน ภายหลัง