ความสามารถของ Wi-Fi Aware ช่วยให้อุปกรณ์ที่ใช้ Android 8.0 (API ระดับ 26) และ สูงกว่าเพื่อให้ค้นพบและติดต่อกันได้โดยตรง โดยไม่มี การติดต่อระหว่างกัน Wi-Fi Aware มีชื่อเรียกอีกอย่างว่าการรับรู้จากเพื่อนบ้าน Networking (NAN)
เครือข่าย Wi-Fi Aware ทำงานได้โดยการสร้างคลัสเตอร์ที่มีอุปกรณ์ที่อยู่ใกล้เคียง หรือ โดยการสร้างคลัสเตอร์ใหม่หากอุปกรณ์เป็นรายการแรกในพื้นที่ ช่วงเวลานี้ ลักษณะการจัดกลุ่มจะมีผลกับทั้งอุปกรณ์และจัดการโดย Wi-Fi บริการของระบบ Aware แอปจะควบคุมลักษณะการทำงานของคลัสเตอร์ไม่ได้ แอปใช้ Wi-Fi Aware API เพื่อสื่อสารกับบริการระบบ Wi-Fi Aware ซึ่งจัดการ ฮาร์ดแวร์การรับรู้ Wi-Fi ในอุปกรณ์
Wi-Fi Aware API ทำให้แอปทำงานต่อไปนี้ได้
ค้นพบอุปกรณ์อื่นๆ: API มีกลไกในการค้นหาอุปกรณ์อื่นๆ อุปกรณ์ที่อยู่ใกล้เคียง ขั้นตอนจะเริ่มต้นเมื่ออุปกรณ์หนึ่งเผยแพร่อุปกรณ์หนึ่ง หรือบริการที่ค้นพบได้อื่นๆ จากนั้นเมื่ออุปกรณ์สมัครใช้บริการอย่างน้อย 1 รายการ และป้อนช่วงสัญญาณ Wi-Fi ของผู้เผยแพร่ สมาชิกจะได้รับ ว่ามีการพบผู้เผยแพร่โฆษณาที่ตรงกันแล้ว หลังจาก สมาชิกอาจค้นพบผู้เผยแพร่ สมาชิกอาจส่ง Shorts หรือสร้างการเชื่อมต่อเครือข่ายกับอุปกรณ์ที่พบ อุปกรณ์สามารถเป็นได้ทั้งผู้เผยแพร่และสมาชิกในเวลาเดียวกัน
สร้างการเชื่อมต่อเครือข่าย: หลังจากพบอุปกรณ์ 2 เครื่องต่อเครื่อง ธุรกิจอื่นๆ ก็สามารถสร้าง การเชื่อมต่อเครือข่าย Wi-Fi Aware แบบ 2 ทิศทางโดยไม่ต้องมีจุดเข้าใช้งาน
การเชื่อมต่อเครือข่าย Wi-Fi Aware รองรับอัตราการส่งข้อมูลที่สูงกว่าและใช้งานได้นานขึ้น ระยะทางกว่าบลูทูธ การเชื่อมต่อ การเชื่อมต่อประเภทเหล่านี้มีประโยชน์สำหรับแอปที่แชร์ ปริมาณข้อมูลระหว่างผู้ใช้ เช่น แอปแชร์รูปภาพ
การเพิ่มประสิทธิภาพ Android 13 (API ระดับ 33)
สำหรับอุปกรณ์ที่ใช้ Android 13 (API ระดับ 33) ขึ้นไปซึ่งรองรับ Instant
โหมดการสื่อสาร แอปสามารถใช้
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 ให้ดำเนินการต่อไปนี้ ขั้นตอนต่อไปนี้
ขอสิทธิ์ต่อไปนี้ในไฟล์ 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
, ซึ่งจะส่งเมื่อมีการเปลี่ยนแปลงความพร้อมให้บริการ เมื่อแอปได้รับ ความตั้งใจในการออกอากาศ ควรทิ้งเซสชันที่มีอยู่ทั้งหมด (สมมติว่า บริการ 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()
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);
หากการเผยแพร่ประสบความสำเร็จ
onPublishStarted()
มีการเรียก Method ของ Callback
หลังจากเผยแพร่แล้ว เมื่ออุปกรณ์ที่ใช้แอปผู้สมัครใช้บริการที่ตรงกันย้ายไปยัง
ช่วง 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()
Callback ในแอป เนื่องจากคุณสามารถใช้
อาร์กิวเมนต์ SubscribeDiscoverySession
ในอาร์กิวเมนต์
Callback เพื่อสื่อสารกับผู้เผยแพร่โฆษณา หลังจากที่แอปของคุณพบผู้เผยแพร่โฆษณา คุณจะ
ควรบันทึกการอ้างอิงนี้ คุณสามารถอัปเดตเซสชันการติดตามได้ทุกเมื่อโดย
การโทร
updateSubscribe()
ในเซสชันการค้นพบ
ในขั้นตอนนี้ การสมัครใช้บริการของคุณจะรอให้ผู้เผยแพร่โฆษณาที่ตรงกันเข้ามา
ช่วงสัญญาณ Wi-Fi เมื่อเกิดกรณีนี้ขึ้น ระบบจะดำเนินการ
onServiceDiscovered()
Callback Method คุณสามารถใช้ PeerHandle
จาก Callback นี้เพื่อ ส่งข้อความ หรือ
สร้างการเชื่อมต่อกับผู้เผยแพร่โฆษณารายดังกล่าว
หากต้องการหยุดสมัครใช้บริการ ให้โทร
DiscoverySession.close()
เซสชันการค้นพบเชื่อมโยงกับผู้เผยแพร่โฆษณาหลัก
WifiAwareSession
หากเซสชันหลักคือ
ปิดแล้ว เซสชันการค้นพบที่เกี่ยวข้องก็ปิดเช่นกัน ขณะทิ้ง
วัตถุถูกปิดด้วยเช่นกัน ระบบจะไม่รับประกันเมื่ออยู่นอกขอบเขต
เซสชันปิดแล้ว ดังนั้นเราขอแนะนำให้คุณเรียกใช้ close()
อย่างชัดแจ้ง
ส่งข้อความ
หากต้องการส่งข้อความไปยังอุปกรณ์อื่น คุณต้องมีรายการต่อไปนี้
DiscoverySession
ออบเจ็กต์นี้ช่วยให้คุณ เพื่อโทรsendMessage()
แอปของคุณได้รับDiscoverySession
จาก การเผยแพร่บริการหรือการสมัครใช้บริการ บริการPeerHandle
ของอุปกรณ์อีกเครื่องเพื่อกำหนดเส้นทาง แอปของคุณของอุปกรณ์อื่นPeerHandle
ได้ 2 วิธี ดังนี้- แอปเผยแพร่บริการและรับข้อความจากสมาชิก
แอปของคุณจะได้รับ
PeerHandle
จากonMessageReceived()
Callback - แอปของคุณสมัครใช้บริการ จากนั้น เมื่อโปรแกรมพบรายการที่ตรงกัน
ผู้เผยแพร่โฆษณา แอปของคุณจะได้รับ
PeerHandle
จากonServiceDiscovered()
Callback
- แอปเผยแพร่บริการและรับข้อความจากสมาชิก
แอปของคุณจะได้รับ
หากต้องการส่งข้อความ ให้โทร
sendMessage()
อาจมี Callback ต่อไปนี้เกิดขึ้น
- เมื่อแอปเทียบเท่าได้รับข้อความเรียบร้อยแล้ว ระบบจะเรียกใช้
onMessageSendSucceeded()
Callback ในแอป sending - เมื่อเพียร์ได้รับข้อความ ระบบจะเรียกใช้เมธอด
onMessageReceived()
Callback ในแอปการรับ
แม้ว่า PeerHandle
จะจำเป็นต้องใช้เพื่อสื่อสารกับผู้อื่น คุณไม่ควรทำ
ก็ต้องใช้เป็นตัวระบุถาวรของแอปเทียบเท่า ตัวระบุระดับสูงอาจเป็น
ที่ใช้โดยแอปพลิเคชันที่ฝังอยู่ในบริการสำรวจหรือใน
ข้อความต่อมา คุณสามารถฝังตัวระบุไว้ในบริการสำรวจด้วย
เวลา
setMatchFilter()
หรือ
setServiceSpecificInfo()
ของ PublishConfig
หรือ
SubscribeConfig
เมธอด setMatchFilter()
ส่งผลต่อการค้นพบ ขณะที่
เมธอด setServiceSpecificInfo()
ไม่มีผลต่อการค้นพบ
การฝังตัวระบุในข้อความหมายถึงการแก้ไขอาร์เรย์ไบต์ของข้อความเป็น มีตัวระบุ (เช่น 2-3 ไบต์แรก)
สร้างการเชื่อมต่อ
Wi-Fi Aware รองรับเครือข่ายแบบไคลเอ็นต์เซิร์ฟเวอร์ระหว่างอุปกรณ์ Wi-Fi Aware 2 เครื่อง
วิธีตั้งค่าการเชื่อมต่อแบบไคลเอ็นต์-เซิร์ฟเวอร์
ใช้การค้นพบ Wi-Fi เพื่อเผยแพร่บริการ (ใน เซิร์ฟเวอร์) และสมัครใช้บริการ (ใน )
เมื่อสมาชิกค้นพบผู้เผยแพร่เนื้อหาแล้ว ส่งข้อความจากสมาชิกไปยังผู้เผยแพร่
เริ่มใช้งาน
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
รายการ ที่ระบุไว้ใน CallbackonCapabilitiesChanged()
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()
กลุ่มผู้ใช้และการค้นพบโดยรับรู้ตำแหน่ง
อุปกรณ์ที่มีตำแหน่ง RTT ของ Wi-Fi จะใช้เพื่อวัดระยะทางระหว่างแอปเทียบเท่าได้โดยตรง และใช้ข้อมูลนี้เพื่อ จะจำกัดการค้นหาบริการ Wi-Fi Aware
Wi-Fi RTT API อนุญาตให้เชื่อมต่อไปยังเครือข่าย Wi-Fi Aware ได้โดยตรงโดยใช้การเชื่อมต่อ Wi-Fi ที่อยู่ MAC หรือ PeerHandle
การค้นพบ Wi-Fi Aware อาจถูกจำกัดให้ค้นพบเฉพาะบริการภายใน
เขตพื้นที่เสมือนหนึ่งๆ เช่น คุณสามารถตั้งค่าเขตพื้นที่เสมือนที่ช่วยให้ค้นพบ
ของอุปกรณ์ที่เผยแพร่บริการ "Aware_File_Share_Service_Name"
ซึ่งไม่ใช่
ใกล้มากกว่า 3 เมตร (ระบุเป็น 3,000 มม.) และไม่เกิน 10 เมตร
(ระบุเป็น 10,000 มม.)
หากต้องการเปิดใช้การกำหนดเขตพื้นที่เสมือน ทั้งผู้เผยแพร่และผู้สมัครใช้บริการต้องดำเนินการดังต่อไปนี้
ผู้เผยแพร่ต้องเปิดใช้ช่วงในบริการที่เผยแพร่โดยใช้ setRangingEnabled(true)
หากผู้เผยแพร่โฆษณาไม่ได้เปิดใช้ระยะ ก็จะทำให้ข้อจำกัดด้านเขตพื้นที่เสมือนใดๆ ระบบจะไม่สนใจสมาชิกที่ระบุไว้ และจะมีการค้นหาตามปกติ โดยไม่คำนึงถึงระยะทาง
สมาชิกต้องระบุเขตพื้นที่เสมือนโดยใช้การผสมผสานระหว่าง setMinDistanceMm และ setMaxDistanceMm
สำหรับค่าใดค่าหนึ่ง ระยะทางที่ไม่ระบุจะหมายถึงไม่มีขีดจำกัด การระบุเท่านั้น ระยะทางสูงสุดหมายถึงระยะทางต่ำสุดที่ 0 การระบุเฉพาะ ระยะทางต่ำสุดหมายถึงไม่มีค่าสูงสุด
เมื่อพบบริการที่คล้ายกันภายในเขตพื้นที่เสมือน onServiceDiscoveredinternalRange Callback จะทริกเกอร์ซึ่งระบุระยะทางที่วัดได้แก่เพียร์ จากนั้นสามารถเรียกใช้ Wi-Fi RTT API โดยตรงตามที่จำเป็นในการวัดระยะทางที่ ครั้งต่อๆ ไป