Kablosuz Ağ Farkındalığı özellikleri, Android 8.0 (API düzeyi 26) ve sonraki sürümleri çalıştıran cihazların, aralarında başka bir bağlantı türü olmadan birbirlerini keşfetmelerini ve doğrudan bağlanmalarını sağlar. Wi-Fi Aware, Neighbor Awareness Networking (NAN) olarak da bilinir.
Kablosuz Ağ Farkındalığı ağı, komşu cihazlarla kümeler oluşturarak veya cihaz bölgedeki ilk cihazsa yeni bir küme oluşturarak çalışır. Bu gruplandırma davranışı cihazın tamamı için geçerlidir ve Wi-FiAware sistem hizmeti tarafından yönetilir. Uygulamaların gruplandırma davranışı üzerinde hiçbir kontrolü yoktur. Uygulamalar, cihazdaki kablosuz ağ bağlantısı farkında donanımını yöneten kablosuz ağ bağlantısı farkında sistem hizmetiyle iletişim kurmak için kablosuz ağ bağlantısı farkında API'lerini kullanır.
Wi-Fi Aware API'ler, uygulamaların aşağıdaki işlemleri gerçekleştirmesine izin verir:
Diğer cihazları keşfetme: API, yakındaki diğer cihazları bulmak için bir mekanizmaya sahiptir. İşlem, bir cihaz bir veya daha fazla bulunabilir hizmeti yayınladığında başlar. Ardından, bir cihaz bir veya daha fazla hizmete abone olduğunda ve yayıncının kablosuz aralığına girdiğinde abone, eşleşen bir yayıncının bulunduğuna dair bildirim alır. 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, hizmet keşfini ve yayıncı veya abone keşif oturumu kapsamında ayarlanan tüm veri yollarını hızlandırır. Bir cihazın anlık iletişim modunu destekleyip desteklemediğini belirlemek için isInstantCommunicationModeSupported()
yöntemini kullanın.
Android 12 (API düzeyi 31) geliştirmeleri
Android 12 (API düzeyi 31), kablosuz ağ farkındalığı özelliğine bazı iyileştirmeler ekler:
- Android 12 (API düzeyi 31) veya sonraki sürümleri çalıştıran cihazlarda, uygulamanız bir hizmeti durdurması veya kapsama alanından çıkması nedeniyle kaybettiğinde uyarı almak için
onServiceLost()
geri çağırma işlevini kullanabilirsiniz. - Wi-Fi Aware veri yollarının kurulumu basitleştirildi. Ö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ıtlayan (sunucu), herhangi bir eşlemeyi kabul edecek şekilde yapılandırılabilir. Yani başlatıcının MAC adresini önceden bilmesi gerekmez. Bu, veri yolunu hızlandırır tek bir ağ ile birden çok noktadan noktaya bağlantıya olanak sağlar isteği gönderin.
- 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ı, kablosuz ağ bilinir keşif ve ağ oluşturma özelliğini kullanacak şekilde ayarlamak için aşağıdaki 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, aşağıdaki gibi
PackageManager
API ile kablosuz ağ farkındalığını destekleyip desteklemediğini kontrol edin: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. Kablosuz Ağ Farkındalığı cihazda mevcut olabilir ancak kullanıcı kablosuz ağı veya konumu devre dışı bıraktığı için şu anda kullanılamayabilir. Donanım ve donanım yazılımı özelliklerine bağlı olarak bazı cihazlar, kablosuz bağlantı doğrudan, SoftAP veya tethering kullanılıyorsa kablosuz bağlantıyı desteklemeyebilir. Wi-Fi Aware'ın şu anda kullanılıp kullanılamadığını kontrol etmek için
isAvailable()
numaralı telefonu arayın.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 attach()
çağrısı yaparak bir WifiAwareSession
alması gerekir. Bu yöntem
şunları yapar:
- Kablosuz Ağ Farkındalığı donanımını açar.
- Kablosuz Ağa Duyarlı bir kümeye katılır veya bir küme oluşturur.
- İçinde oluşturulan tüm keşif oturumları için kapsayıcı görevi gören benzersiz bir ad alanını içeren bir kablosuz ağ farkında oturumu oluşturur.
Uygulama başarıyla bağlanırsa sistem onAttached()
geri çağırma işlevini yürütür.
Bu geri çağırma, bir WifiAwareSession
nesnesi sağlar
kullanın. Uygulamalar, hizmet yayınlamak veya hizmete abone olmak için oturumu kullanabilir.
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
, hizmetin adını ve eşleme filtresi gibi diğer yapılandırma özelliklerini belirtir.DiscoverySessionCallback
, abone bir mesaj aldığında olduğu gibi etkinlikler gerçekleştiğinde uygulanacak işlemleri belirtir.
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. Bir abone yayıncıyı keşfettiğinde yayıncı bildirim almaz. Ancak abone yayıncıya mesaj gönderirse yayıncı bildirim alır. Bu durumda onMessageReceived()
geri çağırma yöntemi çağrılır. Aboneye mesaj göndermek veya aboneyle bağlantı oluşturmak için bu yöntemdeki PeerHandle
bağımsız değişkenini kullanabilirsiniz.
Hizmeti yayınlamayı durdurmak için şu numarayı arayın:
DiscoverySession.close()
Discovery oturumları ebeveynleriyle ilişkilendirilir
WifiAwareSession
Üst oturum kapatılırsa ilişkili keşif oturumları da kapatılır. Silinirken
kapalı olduğuna göre sistem, kapsam dışında kalmanın
oturumlar kapatıldığı için, bu işlemi 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
, etkinlikler gerçekleştiğinde (ör. bir yayıncı keşfedildiğinde) yürütülecek işlemleri belirtir.
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. Keşif oturumunda updateSubscribe()
simgesini çağırarak abonelik oturumunu dilediğiniz zaman güncelleyebilirsiniz.
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. Bu geri çağırmadaki PeerHandle
bağımsız değişkenini kullanarak söz konusu yayıncıya mesaj gönderebilir veya bağlantı oluşturabilirsiniz.
Bir hizmete aboneliği durdurmak için DiscoverySession.close()
numaralı telefonu arayın.
Keşif oturumları, üst öğeleriyle WifiAwareSession
ilişkilendirilir. Üst oturum
bu platformla ilişkili keşif oturumları da kapatılır. Atılan nesneler de kapatılır ancak sistem, kapsam dışındaki oturumların ne zaman kapatılacağını garanti etmez. Bu nedenle, close()
yöntemlerini açıkça çağırmanızı öneririz.
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, bir hizmet yayınlayarak veya bir hizmete abone olarakDiscoverySession
alır.Yönlendirmek için diğer cihazın
PeerHandle
cihazı mesajını alırsınız. Uygulamanız, başka bir cihazınPeerHandle
bilgisini iki yoldan alır:- Uygulamanız bir hizmet yayınlar ve aboneden mesaj alır.
Uygulamanız, abonelerin
PeerHandle
, kalkış:onMessageReceived()
geri arama. - Uygulamanız bir hizmete abone olur. Ardından, eşleşen bir yayıncı bulduğunda uygulamanız
onServiceDiscovered()
geri çağırma işlevinden yayıncınınPeerHandle
değerini alır.
- 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:
- Mesaj eş taraf tarafından başarıyla alındığında sistem, gönderen uygulamasında
onMessageSendSucceeded()
geri çağırma işlevini çağırır. - Eş, mesaj aldığında sistem, alıcı uygulamasında
onMessageReceived()
geri çağırma işlevini çağırır.
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 Aware cihaz arasında istemci-sunucu ağını destekler.
İstemci-sunucu bağlantısını ayarlamak için:
Hizmet yayınlamak (sunucu üzerinde) ve hizmete abone olmak (istemci üzerinde) için kablosuz bağlantıyı kullanarak keşif yapın.
Abone yayıncıyı keşfettikten sonra aboneden yayıncıya mesaj gönderin.
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();
WifiAwareNetworkSpecifier
kullanarak yayıncıda kablosuz ağ farkındalık ağı istemek içinConnectivityManager
'u kullanın. Bu sırada, abone tarafından iletilen mesajdan elde ettiğiniz keşif oturumunu ve aboneninPeerHandle
değerini belirtin: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ğ istediğinde aboneye mesaj göndermelidir.
Abone, yayıncıdan mesaj aldıktan sonra yayıncıdakiyle aynı yöntemi kullanarak abonede kablosuz ağ farkındalığı ağı isteyin.
NetworkSpecifier
oluştururken bağlantı noktası belirtmeyin. İ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, yayıncıdakiServerSocket
ile iletişim kurmak içinSocket
açabileceğiniz birNetwork
nesnesi kullanılabilir. Ancak bunun içinServerSocket
'nin IPv6 adresini ve bağlantı noktasını bilmeniz gerekir. 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ını tamamladığınızda
unregisterNetworkCallback()
düğmesine basın.
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 adresini veya PeerHandle'ı kullanarak bir Wi-Fi Aware eşle doğrudan menzil belirlemenize olanak tanır.
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ırlamayı etkinleştirmek için hem yayıncının hem de 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ş mesafe, sınır olmadığını gösterir. Yalnızca belirtiliyor maksimum mesafe, minimum mesafenin 0 olduğu anlamına gelir. Yalnızca minimum mesafenin belirtilmesi, maksimum mesafenin 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. Daha sonra, mesafeyi ölçmek için gerektiğinde doğrudan kablosuz RTT API'si çağrılabilir.