- PVSM.RU - https://www.pvsm.ru -
Multipeer Connectivity Framework [1] передает текстовые сообщения, потоки и файлы между iOS устройствами, находящимися рядом. Для этого используются WiFi сети, прямое WiFI соединение и Bluetooth. То есть интернет не требуется.
Фреймворк позволяет взаимодействовать устройствам из разных сетей, например у смартфона №2 включен только WiFi, а у №3 только Bluetooth. Если в радиусе доступности этих устройств будет третий смартфон с включенным Wifi и Bluetooth, смартфоны №2 и №3 смогут прозрачно обмениваться
данными.
Класс MCAdvertiserAssistant [2] делает устройство обнаруживаемым, а класс MCBrowserViewController [3] позволяет устройства искать. Эти классы реализуют стандартный интерфейс поиска устройств и установления сессии, если вы хотите реализовать свой, используйте классы MCNearbyServiceAdvertiser и MCNearbyServiceBrowser.
Передадим сообщение между устройствами. Первое устройство будет искать.
void StartMultipeerBrowser ()
{
peer = new MCPeerID ("Monkey");
session = new MCSession (peer);
session.Delegate = sessionDelegate;
browser = new MCBrowserViewController (serviceType, session);
browser.Delegate = browserDelegate;
browser.ModalPresentationStyle = UIModalPresentationStyle.FormSheet;
PresentViewController (browser, true, null);
}
MVBrowserViewController отображает окно с найденными устройствами. По тапу на одно из них, на удаленном устройстве появляется приглашение обменяться данными.
Делегат класса MCSession получает события о соединении, отключении устройств и о полученных данных.
class MySessionDelegate : MCSessionDelegate
{
public override void DidChangeState (MCSession session, MCPeerID peerID, MCSessionState state)
{
switch (state) {
case MCSessionState.Connected:
Console.WriteLine ("Connected: {0}", peerID.DisplayName);
break;
case MCSessionState.Connecting:
Console.WriteLine ("Connecting: {0}", peerID.DisplayName);
break;
case MCSessionState.NotConnected:
Console.WriteLine ("Not Connected: {0}", peerID.DisplayName);
break;
}
}
public override void DidReceiveData (MCSession session, NSData data, MCPeerID peerID)
{
InvokeOnMainThread (() => {
var alert = new UIAlertView ("", data.ToString (), null, "OK");
alert.Show ();
});
}
...
}
Когда пользователь закроет окно поиска устройств делегат класса MCBrowserViewController получит событие. Окно поиска устройств необходимо скрывать вручную.
class MyBrowserDelegate : MCBrowserViewControllerDelegate
{
public override void DidFinish (MCBrowserViewController browserViewController)
{
InvokeOnMainThread (() => {
browserViewController.DismissViewController (true, null);
});
}
public override void WasCancelled (MCBrowserViewController browserViewController)
{
InvokeOnMainThread (() => {
browserViewController.DismissViewController (true, null);
});
}
}
Второе устройство сделаем обнаруживаемым:
void StartMultipeerAdvertiser ()
{
peer = new MCPeerID ("Player1");
session = new MCSession (peer);
session.Delegate = sessionDelegate;
assistant = new MCAdvertiserAssistant (serviceType, dict, session);
assistant.Start ();
}
Когда приходит приглашение на обмен данными MCAdvertiserAssistant спросит согласия пользователя.
Как только сессия установлена можно передать сообщение, поток или ресурс. Пример передачи сообщения
void SendMessage ()
{
var message = NSData.FromString (
String.Format ("{0} found the monkey", peer.DisplayName));
NSError error;
session.SendData (message, session.ConnectedPeers,
MCSessionSendDataMode.Reliable, out error);
}
Для передачи ресурса используется метод sendResourceAtUrl [4]. Объект для передачи указывается через NSUrl это может быть локальный файл или сетевой ресурс.
Для установления байтового потока между устройствами используется метод startStreamWithName [5], он создает NSOutputStream и NSInputStream на разных концах соединения. Не знаю зачем, но можно, например передавать поток аудио с микрофона одного устройства и проигрывать на другом.
Автор: junk
Источник [6]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/wifi/48233
Ссылки в тексте:
[1] Multipeer Connectivity Framework: https://developer.apple.com/library/ios/documentation/MultipeerConnectivity/Reference/MultipeerConnectivityFramework/Introduction/Introduction.html
[2] MCAdvertiserAssistant: https://developer.apple.com/library/ios/documentation/MultipeerConnectivity/Reference/MCAdvertiserAssistant_class/Reference/Reference.html#//apple_ref/occ/cl/MCAdvertiserAssistant
[3] MCBrowserViewController: https://developer.apple.com/library/ios/documentation/MultipeerConnectivity/Reference/MCBrowserViewController_class/Reference/Reference.html#//apple_ref/occ/cl/MCBrowserViewController
[4] sendResourceAtUrl: https://developer.apple.com/library/ios/documentation/MultipeerConnectivity/Reference/MCSessionClassRef/Reference/Reference.html#//apple_ref/occ/instm/MCSession/sendResourceAtURL:withName:toPeer:withCompletionHandler:
[5] startStreamWithName: https://developer.apple.com/library/ios/documentation/MultipeerConnectivity/Reference/MCSessionClassRef/Reference/Reference.html#//apple_ref/occ/instm/MCSession/startStreamWithName:toPeer:error:
[6] Источник: http://habrahabr.ru/post/198814/
Нажмите здесь для печати.