ความสามารถของ 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 ให้ทำตามขั้นตอนต่อไปนี้
ขอสิทธิ์ต่อไปนี้ในไฟล์ 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" />
ตรวจสอบว่าอุปกรณ์รองรับ Wi-Fi Aware ด้วย API
PackageManagerหรือไม่ ดังที่แสดงด้านล่างKotlin
context.packageManager.hasSystemFeature(PackageManager.FEATURE_WIFI_AWARE)
Java
context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_WIFI_AWARE);
ตรวจสอบว่า 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ของผู้สมัครใช้บริการจาก CallbackonMessageReceived() - แอปของคุณสมัครใช้บริการ จากนั้นเมื่อพบผู้เผยแพร่โฆษณาที่ตรงกัน แอปของคุณจะได้รับ
PeerHandleของผู้เผยแพร่โฆษณาจาก CallbackonServiceDiscovered()
- แอปของคุณเผยแพร่บริการและได้รับข้อความจากผู้สมัครใช้บริการ
แอปของคุณจะได้รับ
หากต้องการส่งข้อความ ให้โทรหา sendMessage() จากนั้น Callback ต่อไปนี้อาจเกิดขึ้น
- เมื่อแอปเทียบเท่าได้รับข้อความเรียบร้อยแล้ว ระบบจะเรียกใช้ Callback
onMessageSendSucceeded()ในแอปที่ส่ง - เมื่อแอปเพียร์ได้รับข้อความ ระบบจะเรียกใช้ Callback
onMessageReceived()ในแอปที่รับข้อความ
แม้ว่า PeerHandle จะจำเป็นสำหรับการสื่อสารกับเพียร์ แต่คุณไม่ควรใช้เป็นตัวระบุเพียร์แบบถาวร แอปพลิเคชันสามารถใช้ตัวระบุระดับที่สูงขึ้นได้ โดยฝังอยู่ในบริการค้นพบเองหรือในข้อความต่อๆ มา คุณสามารถฝังตัวระบุในบริการ Discovery ด้วยเมธอด setMatchFilter() หรือ setServiceSpecificInfo() ของ PublishConfig หรือ SubscribeConfig วิธี setMatchFilter() จะส่งผลต่อการค้นพบ แต่วิธี setServiceSpecificInfo() จะไม่ส่งผลต่อการค้นพบ
การฝังตัวระบุในข้อความหมายถึงการแก้ไขอาร์เรย์ไบต์ของข้อความเพื่อรวมตัวระบุ (เช่น เป็นไบต์คู่แรก)
สร้างการเชื่อมต่อ
Wi-Fi Aware รองรับเครือข่ายไคลเอ็นต์-เซิร์ฟเวอร์ระหว่างอุปกรณ์ Wi-Fi Aware 2 เครื่อง
วิธีตั้งค่าการเชื่อมต่อไคลเอ็นต์-เซิร์ฟเวอร์
ใช้การค้นพบ Wi-Fi Aware เพื่อเผยแพร่บริการ (บนเซิร์ฟเวอร์) และสมัครใช้บริการ (ในไคลเอ็นต์)
เมื่อผู้สมัครรับข้อมูลค้นพบผู้เผยแพร่แล้ว ให้ส่งข้อความจากผู้สมัครรับข้อมูลไปยังผู้เผยแพร่
เริ่ม
ServerSocketในอุปกรณ์ของผู้เผยแพร่โฆษณาและตั้งค่าหรือรับพอร์ตของอุปกรณ์Kotlin
val ss = ServerSocket(0) val port = ss.localPort
Java
ServerSocket ss = new ServerSocket(0); int port = ss.getLocalPort();
ใช้
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);
เมื่อผู้เผยแพร่โฆษณาขอเครือข่าย ผู้เผยแพร่โฆษณาควรส่งข้อความไปยังผู้สมัครใช้บริการ
เมื่อผู้สมัครรับข้อมูลได้รับข้อความจากผู้เผยแพร่แล้ว ให้ส่งคำขอเครือข่าย Wi-Fi Aware ในผู้สมัครรับข้อมูลโดยใช้วิธีการเดียวกับในผู้เผยแพร่ อย่าระบุพอร์ตเมื่อสร้าง
NetworkSpecifierระบบจะเรียกใช้เมธอด Callback ที่เหมาะสมเมื่อการเชื่อมต่อเครือข่ายพร้อมใช้งาน มีการเปลี่ยนแปลง หรือขาดหายไปเมื่อเรียกใช้เมธอด
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);
เมื่อใช้การเชื่อมต่อเครือข่ายเสร็จแล้ว ให้เรียกใช้
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 โดยตรงได้ตามความจำเป็นเพื่อวัดระยะทางในภายหลัง