Разговаривать бесплатно уже реально

Mar 26, 2014 11:07




Похоже эра распределенных сетей и технологий начала наступать, сначала был Bittorrent, потом Bitcoin, (на ранних этапах развития имеются twister и cjdns), но недавно появилось приложение которое работает полноценно из коробки и полностью соответствует концепции децентрализации и Mesh.



Речь пойдет о фреймворке от Apple: Multipeer connectivity framework, а точнее о его реализации в приложении - FireChat.

Фреймворк реализует Mesh функции на основе Bluetooth и Wi-Fi, причем в смешанном режиме (Алиса использует Wi-Fi+Bluetooth, Боб только Buetooth, а у Чарли только Wi-Fi) и все они смогут общаться между собой.

Таким образом, в любом месте без интернета или при его блокировке, благодаря данному фреймворку и приложению можно совершенно спокойно продолжать общаться и обмениваться информацией.

Приложение работает действительно отлично - достаточно его запустить и активировать Wi-Fi/Bluetooth и через пару секунд будет найдены соседи.
У него конечно, же есть и недостаток, в нем зачем-то есть общий глобальный чат, который естественно перестает работать при отключенном интернете.

В остальном - я бы советовал скачать его про запас, кто знает какие будут времена…

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

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





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


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

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

Новые темы, Виталий Внуков, новинки

Previous post Next post
Up