Multipeer connectivity framework в iOS7

в 12:28, , рубрики: bluetooth, ios7, mobile development, multipeer connectivity, wifi, Блог компании Touch Instinct, разработка под iOS

Multipeer Connectivity Framework передает текстовые сообщения, потоки и файлы между iOS устройствами, находящимися рядом. Для этого используются WiFi сети, прямое WiFI соединение и Bluetooth. То есть интернет не требуется.

Фреймворк позволяет взаимодействовать устройствам из разных сетей, например у смартфона №2 включен только WiFi, а у №3 только Bluetooth. Если в радиусе доступности этих устройств будет третий смартфон с включенным Wifi и Bluetooth, смартфоны №2 и №3 смогут прозрачно обмениваться
данными.

Multipeer connectivity framework в iOS7

Класс MCAdvertiserAssistant делает устройство обнаруживаемым, а класс MCBrowserViewController позволяет устройства искать. Эти классы реализуют стандартный интерфейс поиска устройств и установления сессии, если вы хотите реализовать свой, используйте классы 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 отображает окно с найденными устройствами. По тапу на одно из них, на удаленном устройстве появляется приглашение обменяться данными.
Multipeer connectivity framework в iOS7

Делегат класса 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 спросит согласия пользователя.
Multipeer connectivity framework в iOS7

Как только сессия установлена можно передать сообщение, поток или ресурс. Пример передачи сообщения

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. Объект для передачи указывается через NSUrl это может быть локальный файл или сетевой ресурс.

Для установления байтового потока между устройствами используется метод startStreamWithName, он создает NSOutputStream и NSInputStream на разных концах соединения. Не знаю зачем, но можно, например передавать поток аудио с микрофона одного устройства и проигрывать на другом.

Автор: junk

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js