Wi-Fi Aware özellikleri, Android 8.0 (API düzeyi 26) ve sonraki sürümleri çalıştıran cihazlarda ve başka tür bir iletişim kurmadan birbirleriyle doğrudan bağlantı kurmalarını gerçekten çok iyi. Wi-Fi Aware, Komşu Farkındalığı olarak da bilinir. Ağ iletişimi (NAN).
Wi-Fi Aware ağ iletişimi, komşu cihazlarla kümeler oluşturarak çalışır veya kümedeki ilk cihaz olması halinde yeni bir küme oluşturarak. Bu kümeleme davranışı cihazın tamamı için geçerlidir ve Wi-Fi tarafından yönetilir Duyarlı sistem hizmeti; uygulamalarının kümeleme davranışı üzerinde herhangi bir kontrolü yoktur. Uygulamaların kullanımı Wi-Fi Aware sistem hizmetiyle iletişim kurmak için Wi-Fi Aware API'lerini kullanır. cihazdaki Wi-Fi-Aware donanım üzerinde çalışır.
Wi-Fi Aware API'ler, uygulamaların aşağıdaki işlemleri gerçekleştirmesine izin verir:
Diğer cihazları keşfetme: API, başka cihazları bulmaya yönelik bir mekanizmaya sahiptir yakındaki cihazlar. Süreç, bir cihaz bir cihaz yayınladığında başlar bulunabilir. Ardından, cihaz bir veya daha fazla uygulamaya abone olduğunda yayıncının kablosuz ağ aralığına girer ve abone olan eşleşen bir yayıncının bulunduğuna dair bildirim bir yayıncı keşfettiğinde, aboneden bir kısa video veya bulunan cihazla ağ bağlantısı kurun. Cihazlar aynı anda hem yayıncı hem de abone olabilir.
Ağ bağlantısı oluşturma: İki cihaz, her birini keşfettikten sonra diğer kullanıcılara göre erişim noktası olmayan çift yönlü Kablosuz Aware ağ bağlantısı.
Wi-Fi Aware ağ bağlantıları daha uzun süre boyunca daha yüksek işleme hızı hızlarını destekler Bluetooth'a göre mesafe bağlantılar. Bu tür bağlantılar, büyük boyutlu resim paylaşımı veri miktarı (ör. fotoğraf paylaşımı uygulamaları)
Android 13 (API düzeyi 33) geliştirmeleri
Android 13 (API düzeyi 33) ve sonraki sürümleri çalıştıran ve Anında Arama özelliğini destekleyen cihazlarda
iletişim modundaysa uygulamalar
PublishConfig.Builder.setInstantCommunicationModeEnabled()
ve
SubscribeConfig.Builder.setInstantCommunicationModeEnabled()
yöntemini kullanarak
bir yayıncı veya abone için anında iletişim modunu etkinleştir veya devre dışı bırak
ele alacağız. Anında iletişim modu, mesaj alışverişini hızlandırır,
ve yayıncının ya da abonenin parçası olarak ayarlanmış herhangi bir veri yolu
ele alacağız. Bir cihazın anlık iletişimi destekleyip desteklemediğini belirlemek için
modunda incelemek için isInstantCommunicationModeSupported()
yöntemini kullanın.
Android 12 (API düzeyi 31) geliştirmeleri
Android 12 (API düzeyi 31), Wi-Fi Aware'e bazı geliştirmeler ekler:
- Android 12 (API düzeyi 31) veya sonraki sürümleri çalıştıran cihazlarda
onServiceLost()
veya başka herhangi bir nedenle uygulamanızın keşfedilen bir hizmeti kaybetmesi durumunda durması veya kapsama alanının dışına çıkması gibi bir durum söz konusu. - Wi-Fi Aware veri yollarının kurulumu örneklendi. Önceki sürümler MAC adresini sağlamak için L2 mesajlaşmayı kullandı. gecikmelere neden olabilir. Android 12 ve sonraki sürümleri çalıştıran cihazlarda yanıtlayıcı (server) herhangi bir eşi kabul edecek şekilde yapılandırılabilir, yani MAC adresini önceden bilmek gerekir. Bu, veri yolunu hızlandırır tek bir ağ ile birden çok noktadan noktaya bağlantıya olanak sağlar isteğinde bulunabilirsiniz.
- Android 12 veya sonraki sürümleri çalıştıran uygulamalar
WifiAwareManager.getAvailableAwareResources()
yöntemindeki mevcut veri yollarının sayısını, yayınlama oturumlarını, ve abone oturumlarının sayısını artırın. Bu, uygulamanın aynı zamanda istenen işlevleri yerine getirmek için yeterli kaynak olması gerekir.
İlk kurulum
Uygulamanızı, Wi-Fi Aware keşif ve ağ özelliklerini kullanacak şekilde ayarlamak için şu işlemi gerçekleştirin: şu adımları uygulayın:
Uygulamanızın manifest dosyasında aşağıdaki izinleri isteyin:
<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" />
Cihazın Wi-Fi Aware'i destekleyip desteklemediğini (örneğin,
PackageManager
. API:Kotlin
context.packageManager.hasSystemFeature(PackageManager.FEATURE_WIFI_AWARE)
Java
context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_WIFI_AWARE);
Wi-Fi Aware özelliğinin şu anda kullanılabilir olup olmadığını kontrol edin. Wi-Fi Aware şu cihazlarda olabilir: ancak kullanıcı devre dışı bıraktığından şu anda kullanılamıyor olabilir Kablosuz veya Konum. Donanım ve donanım yazılımı özelliklerine bağlı olarak bazı cihazlar Wi-Fi Direct, SoftAP veya tethering özelliği açıksa Wi-Fi Aware'i desteklemeyebilir pek de iyi olmadığını unutmayın. Wi-Fi Aware'in şu anda kullanılabilir olup olmadığını kontrol etmek için şu numarayı arayın:
isAvailable()
Wi-Fi Aware özelliğinin kullanılabilirliği herhangi bir zamanda değişebilir. Uygulamanız almak için bir
BroadcastReceiver
kaydettirinACTION_WIFI_AWARE_STATE_CHANGED
, kullanılabilirlik durumu her değiştiğinde gönderilir. Uygulamanız tüm mevcut oturumları silmeniz gerekir (örneğin Wi-Fi Aware hizmeti kesintiye uğradıysa) durumu hakkında daha fazla bilgi edinip davranışını buna göre ayarlayabilirsiniz. Örnek: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);
Daha fazla bilgi için Yayınlar konusuna bakın.
Oturum edinme
Wi-Fi Aware'i kullanmaya başlamak için uygulamanızın bir
Telefon ederek WifiAwareSession
attach()
. Bu yöntem
şunları yapar:
- Wi-Fi Aware donanımını açar.
- Kablosuz Ağa Duyarlı bir kümeye katılır veya bir küme oluşturur.
- Farklı bir ad alanına sahip bir kablosuz ağa duyarlı oturum oluşturur içinde oluşturulan tüm keşif oturumları için bir kapsayıcıdır.
Uygulama başarıyla eklenirse, sistem
onAttached()
geri arama.
Bu geri çağırma, bir WifiAwareSession
nesnesi sağlar
kullanın. Bir uygulama,
bir hizmet yayınlama veya
bir hizmete abone olun.
Uygulamanız
Yalnızca bir kez attach()
. Eğer
uygulamanız attach()
numarasını çağırıyor
Bu işlem her çağrı için farklı bir oturum alır. Bu oturumların her biri
kendi ad alanını kullanır. Bu, karmaşık senaryolarda işe yarayabilir ancak
kaçınılması gerekir.
Hizmet yayınlama
Bir hizmeti bulunabilir hale getirmek için
publish()
yöntemi,
şu parametreleri alır:
PublishConfig
, hizmet ve diğer yapılandırma özelliklerini (örneğin, eşleştirme filtresi) kullanabilirsiniz.DiscoverySessionCallback
, işlemler gerçekleştiğinde yürütülecek işlemler (örneğin, abonenin, abone olan mesaj gönderebilirsiniz.
Aşağıda bununla ilgili bir örnek verilmiştir:
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);
Yayın başarılı olursa
onPublishStarted()
.
çağrılır.
Yayından sonra, eşleşen abone uygulamaları çalıştıran cihazlar
Yayın cihazının kablosuz ağ kapsama alanında olması durumunda aboneler hizmeti keşfeder. Zaman
yayıncı bir yayıncı keşfedse, yayıncı bir bildirim almaz,
bildirim; ancak abone yayıncıya bir mesaj gönderirse
Yayıncı bir bildirim alır. Böyle bir durumda,
onMessageReceived()
.
çağrılır. URL parametrelerinin Google tarafından nasıl ele alınmasını istediğinizi belirtmek için
Bu yöntemden PeerHandle
bağımsız değişkenine
Aboneye bir mesaj gönderebilir veya
bir bağlantı oluşturun.
Hizmeti yayınlamayı durdurmak için şu numarayı arayın:
DiscoverySession.close()
Discovery oturumları ebeveynleriyle ilişkilendirilir
WifiAwareSession
Üst oturum
bu platformla ilişkili keşif oturumları da kapatılır. Silinirken
kapalı olduğu için sistem, uygulamanın kapsam dışında olduğunu
oturumlar kapatılmıştır. Bu nedenle, açıkça close()
çağrısı yapmanızı öneririz.
yöntemlerine göz atın.
Bir hizmete abone olma
Bir hizmete abone olmak için
subscribe()
yöntem,
şu parametreleri alır:
-
SubscribeConfig
, abone olma hizmeti ve diğer yapılandırma özelliklerine (örneğin, filtresini uygulayabilirsiniz. DiscoverySessionCallback
, yayıncı bulunması gibi etkinlikler gerçekleştiğinde yürütülecek işlemler.
Aşağıda bununla ilgili bir örnek verilmiştir:
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);
Abone olma işlemi başarılı olursa sistem
onSubscribeStarted()
.
geri arama özelliğini kullanabilirsiniz. Çünkü verileri
SubscribeDiscoverySession
bağımsız değişkeni
geri çağırması için uygulamanız bir tane keşfettikten sonra, söz konusu yayıncıyla
bu referansı kaydetmelidir. Abone olma oturumunu istediğiniz zaman
arama
updateSubscribe()
.
ele alacağız.
Bu noktada aboneliğiniz, eşleşen yayıncıların gelmesini bekler
Kablosuz menzili. Bu durumda sistem,
onServiceDiscovered()
geri çağırma yöntemini kullanın. PeerHandle
kullanabilirsiniz
argümanını mesaj göndermek için kullanın veya
Bu yayıncıyla bağlantı oluşturun.
Bir hizmete aboneliğinizi sonlandırmak için şu numarayı arayın:
DiscoverySession.close()
Discovery oturumları ebeveynleriyle ilişkilendirilir
WifiAwareSession
Üst oturum
bu platformla ilişkili keşif oturumları da kapatılır. Silinirken
kapalı olduğu için sistem, uygulamanın kapsam dışında olduğunu
oturumlar kapatılmıştır. Bu nedenle, açıkça close()
çağrısı yapmanızı öneririz.
yöntemlerine göz atın.
Mesaj gönder
Başka bir cihaza mesaj göndermek için aşağıdaki nesnelere ihtiyacınız vardır:
DiscoverySession
. Bu nesne, telefon etmeksendMessage()
Uygulamanız, aşağıdakilerden birini yaparakDiscoverySession
alır bir hizmet yayınlamak veya bir hizmete abone olmak hizmet.Yönlendirmek için diğer cihazın
PeerHandle
cihazı mesajını alırsınız. Uygulamanız başka bir cihazınPeerHandle
için şu iki yöntemden birini kullanın:- Uygulamanız bir hizmet yayınlar ve aboneden mesaj alır.
Uygulamanız, abonelerin
PeerHandle
, kalkış:onMessageReceived()
geri arama. - Uygulamanız bir hizmete abone olduğunda. Daha sonra, eşleşen bir
uygulamanız yayıncının
Şuradan
PeerHandle
:onServiceDiscovered()
geri arama.
- Uygulamanız bir hizmet yayınlar ve aboneden mesaj alır.
Uygulamanız, abonelerin
Mesaj göndermek için şu numarayı arayın:
sendMessage()
İlgili içeriği oluşturmak için kullanılan
aşağıdaki geri çağırmalar gerçekleşebilir:
- İleti eş tarafından başarıyla alındığında, sistem
onMessageSendSucceeded()
. gönderme uygulamasında geri arama. - Eş bir mesaj aldığında sistem,
onMessageReceived()
. alma uygulamasında geri arama.
PeerHandle
, meslektaşlarınızla iletişim kurmak için gerekli olsa da
bu verileri, size benzer kullanıcıların kalıcı tanımlayıcısı olarak kullanabilir. Daha üst düzey tanımlayıcılar
keşif hizmetinin kendisinde yerleşik uygulama tarafından veya
mesajları takip eder. Keşif hizmetine,
"the"
setMatchFilter()
veya
setServiceSpecificInfo()
PublishConfig
veya
SubscribeConfig
İlgili içeriği oluşturmak için kullanılan
setMatchFilter()
yöntemi, keşfi etkiler.
setServiceSpecificInfo()
yöntemi, keşfi etkilemez.
Bir iletiye tanımlayıcı yerleştirmek, ileti bayt dizisinin bir tanımlayıcı ekleyin (örneğin, ilk birkaç bayt olarak).
Bağlantı oluşturun
Wi-Fi Aware iki Wi-Fi duyarlı cihaz arasında istemci-sunucu ağını destekler.
İstemci-sunucu bağlantısını ayarlamak için:
Bir hizmet yayınlamak için Wi-Fi Aware keşif özelliğini kullanın ( sunucu) ve bir hizmete abone olun ( müşteri).
Abone, yayıncıyı keşfettikten sonra aboneden yayıncıya bir ileti gönderebilirsiniz.
Yayıncıda bir
ServerSocket
başlatın ve bağlantı noktasını ayarlayın veya alın:Kotlin
val ss = ServerSocket(0) val port = ss.localPort
Java
ServerSocket ss = new ServerSocket(0); int port = ss.getLocalPort();
ConnectivityManager
kullanarak birWifiAwareNetworkSpecifier
, Keşif oturumunu ve AboneninPeerHandle
. (abone tarafından iletilen mesajdan edindiğiniz):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);
Yayıncı bir ağ için istekte bulunduğunda Aboneye bir mesaj gönderebilirsiniz.
Abone, yayıncıdan mesajı aldıktan sonra bir kablosuz ağ isteyin Abonede, yayıncıyla aynı yöntemi kullanan duyarlı ağ. Yapılması gerekenler oluşturulurken bir bağlantı noktası belirtmemelidir
NetworkSpecifier
. İlgili içeriği oluşturmak için kullanılan uygun geri çağırma yöntemleri çağrılır: kullanılabilir, değiştirilmiş veya kaybolabilir.Abonede
onAvailable()
yöntemi çağrıldıktan sonra,Network
nesnesi şununla kullanılabilir: Bunu iletişim kurmak içinSocket
yayıncıdaServerSocket
ile iletişim kurmanız gerekiyor, ancakServerSocket
kullanıcısının IPv6 adresi ve bağlantı noktası. Bu görevleriNetworkCapabilities
nesneonCapabilitiesChanged()
geri çağırmasında sağlandı: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);
Ağ bağlantısıyla işiniz bittiğinde şunu arayın:
unregisterNetworkCallback()
.
Benzerlere göre ve konuma duyarlı keşif
Kablosuz RTT konumuna sahip bir cihaz özellikler, benzerlerle mesafeyi doğrudan ölçebilir ve bu bilgiyi kullanarak Wi-Fi Aware hizmet keşfini kısıtlar.
Wi-Fi RTT API, MAC adresi veya PeerHandle
Wi-Fi Aware keşfi, yalnızca belirli bir
ele alacağız. Örneğin, dünyanın dört bir yanındaki
kişilerin keşfedilmesine olanak tanıyan
bir "Aware_File_Share_Service_Name"
hizmeti yayınlayan cihazın
3 metreden yakın (3.000 mm olarak belirtilir) ve 10 metreden uzak olmamak üzere
(10.000 mm olarak belirtilir).
Coğrafi sınır çizmeyi etkinleştirmek için yayıncının ve abonenin işlem yapması gerekir:
Yayıncı, yayınlanan hizmette aralığı setRangingEnabled(true) değerini alır.
Yayıncı aralığı etkinleştirmezse coğrafi sınır kısıtlamaları belirtilen aboneler göz ardı edilir ve normal keşif gerçekleştirilir, atfediyoruz.
Abone, setMinMesafeMm ve setMaxLengthMm.
Her iki değer için de belirtilmemiş bir mesafe, sınır olmadığı anlamına gelir. Yalnızca belirtiliyor maksimum mesafe, minimum mesafenin 0 olduğu anlamına gelir. Yalnızca minimum mesafe, maksimum değer olmadığı anlamına gelir.
Coğrafi sınır içinde bir eş hizmet keşfedildiğinde onServiceKeşfetedWithinRange geri çağırma tetiklenir. Bu, eşle ölçülen mesafeyi sağlar. İlgili içeriği oluşturmak için kullanılan Daha sonra, mesafe ölçümü için gerektiğinde doğrudan Wi-Fi RTT API çağrılabilir devam edebilir.