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