Multipeer Connectivity
As consumer web technologies and enterprises race towards cloud infrastructure, there is a curious and significant counter-movement towards connected devices.
In this age of mobile computing, the possibilities of collaboration, whether in work or play, have never been greater. In this age of privacy concerns and mass surveillance, the need for secure, ad hoc communications has never been more prescient. In this age of connected devices, the promise of mastery over the everyday objects of our lives has never been closer at hand.
The Multipeer Connectivity APIs, introduced in iOS 7, therefore may well be the most significant for the platform. It allows developers to completely reimagine how mobile apps are built, and to redefine what is possible. And we’re not just talking about successors to the lame bump-to-send-contact-information genre, either: multi-peer connectivity has implications on everything from collaborative editing and file sharing to multiplayer gaming and sensor aggregation.
Multipeer Connectivity is a framework that enables nearby devices to communicate over infrastructure Wi-Fi networks, peer-to-peer Wi-Fi, and Bluetooth personal area networks. Connected peers are able securely transmit messages, streams, or file resources to other devices without going through an intermediary web service.
Advertising & Discovering
The first step in communication is to make peers aware of one another. This is accomplished by advertising and discovering services.
Advertising makes a service known to other peers, while discovery is the inverse process of the client being made aware of services advertised by other peers. In many cases, clients both discover and advertise for the same service, which can lead to some initial confusion—especially to anyone rooted in the client-server paradigm.
Each service is identified by a type, which is a short text string of ASCII letters, numbers, and dashes, up to 15 characters in length. By convention, a service name should begin with the app name, followed by a dash and a unique descriptor for that service (think of it as simplified com.apple.* -esque reverse-DNS notation):
Peers are uniquely identified by an MCPeer ID object, which are initialized with a display name. This could be a user-specified nickname, or simply the current device name:
Peers can be also be advertised or discovered manually using NSNet Service or the Bonjour C APIs, but this is a rather advanced and specific concern. Additional information about manual peer management can be found in the MCSession documentation.
Advertising
Services are advertised by the MCNearby Service Advertiser , which is initialized with a local peer, service type, and any optional information to be communicated to peers that discover the service.
Discovery information is sent as Bonjour TXT records encoded according to RFC 6763.
Events are handled by the advertiser’s delegate , conforming to the MCNearby Service Advertiser Delegate protocol.
As an example implementation, consider a client that allows the user to choose whether to accept or reject incoming connection requests, with the option to reject and block any subsequent requests from that peer:
For sake of simplicity, this example contrives a block-based initializer for UIAction Sheet , which allows for the invitation Handler to be passed directly into the action sheet responder in order to avoid the messy business of creating and managing a custom delegate object. This method can be implemented in a category, or adapted from any of the implementations available on CocoaPods
Creating a Session
As in the example above, sessions are created by advertisers, and passed to peers when accepting an invitation to connect. An MCSession object is initialized with the local peer identifier, as well as security Identity and encryption Preference parameters.
security Identity is an optional parameter that allows peers to securely identify peers by X.509 certificates. When specified, the first object should be an Sec Identity Ref identifying the client, followed by one or more Sec Certificate Ref objects than can be used to verify the local peer’s identity.
The encryption Preference parameter specifies whether to encrypt communication between peers. Three possible values are provided by the MCEncryption Preference enum:
- MCEncryption Optional : The session prefers to use encryption, but will accept unencrypted connections.
- MCEncryption Required : The session requires encryption.
- MCEncryption None : The session should not be encrypted.
Enabling encryption can significantly reduce transfer rates, so unless your application specifically deals with user-sensitive information, MCEncryption None is recommended.
The MCSession Delegate protocol will be covered in the section on sending and receiving information.
Discovering
Clients can discover advertised services using MCNearby Service Browser , which is initialized with the local peer identifier and the service type, much like for MCNearby Service Advertiser .
There may be many peers advertising a particular service, so as a convenience to the user (and the developer), the MCBrowser View Controller offers a built-in, standard way to present and connect to advertising peers:
When a browser has finished connecting to peers, it calls -browser View Controller Did Finish: on its delegate, to notify the presenting view controller that it should update its UI to accommodate the newly-connected clients.
Sending & Receiving Information
Once peers are connected to one another, information can be sent between them. The Multipeer Connectivity framework distinguishes between three different forms of data transfer:
- Messages are information with well-defined boundaries, such as short text or small serialized objects.
- Streams are open channels of information used to continuously transfer data like audio, video, or real-time sensor events.
- Resources are files like images, movies, or documents.
Messages
Messages are sent with -send Data:to Peers:with Mode:error: :
Messages are received through the MCSession Delegate method -session Did Receive Data:from Peer: . Here’s how one would decode the message sent in the previous code example:
Another approach would be to send NSKeyed Archiver -encoded objects:
In order to guard against object substitution attacks, it is important to set requires Secure Coding to YES , such that an exception is thrown if the root object class does not conform to Coding> . For more information, see the [NSHipster article on NSSecureCoding.
Streams
Streams are created with -start Stream With Name:to Peer: :
Streams are received by the MCSession Delegate with -session:did Receive Stream:with Name:from Peer: :
Both the input and output streams must be scheduled and opened before they can be used. Once that’s done, streams can be read from and written to just like any other bound pair.
Resources
Resources are sent with send Resource At URL:with Name:to Peer:with Completion Handler: :
The returned NSProgress object can be Key-Value Observed to monitor progress of the file transfer, as well as provide a cancellation handler, through the -cancel method.
Receiving resources happens across two methods in MCSession Delegate : -session:did Start Receiving Resource With Name:from Peer:with Progress: & -session:did Finish Receiving Resource With Name:from Peer:at URL:with Error: :
Again, the NSProgress parameter in -session:did Start Receiving Resource With Name:from Peer:with Progress: allows the receiving peer to monitor the file transfer progress. In -session:did Finish Receiving Resource With Name:from Peer:at URL:with Error: , it is the responsibility of the delegate to move the file at the temporary local URL to a permanent location.
Multipeer Connectivity is a ground-breaking API, whose value is only just starting to be fully understood. Although full support for features like AirDrop are currently limited to latest-gen devices, you should expect to see this kind of functionality become expected behavior.
As you look forward to the possibilities of the new year ahead, get your head out of the cloud, and start to consider the incredible possibilities around you.
Questions? Corrections? Issues and pull requests are always welcome.
Mattt (@mattt) is a writer and developer in Portland, Oregon.
UIApplicationDelegate launchOptions
AppDelegate is the dumping ground for functionality in iOS.
Источник
Ячеистые сети и технологии беспорядка
Инженеры, которые конструируют новые автомобили, самолёты или, скажем, диваны, всегда знают, что получат в итоге. Они могут не сомневаться, что на их автомобилях будут ездить, на самолётах летать, а на диванах — валяться. У создателей социальных сервисов такой уверенности нет. Их разработки почему-то никогда не используют так, как было задумано.
Основатели Twitter не понимали, что у них получится сервис, который будет сообщать новости быстрее любого традиционного СМИ. Марк Цукерберг целых три года был уверен, что Facebook — это нишевый сервис для американских студентов, и не видел в этом проблемы. Авторы Pinterest не планировали делать социальную сеть для женщин — это произошло помимо их воли.
Если задуматься, то это правило действует и для самого интернета. Его замышляли как резервный телекоммуникационный сервис на случай атомной войны, а используют для порно и фотографий с кошками.
Разработчики приложения Firechat, которое появилось в App Store в начале марта, надеялись, что у них выйдет легкомысленный сервис для общения с людьми, которые находятся поблизости — например, на том же концерте, спортивном матче или фестивале под открытым небом.
Блог Techcrunch и прочие вестники Кремниевой долины обозначают эту нишу термином «гиперлокальные социальные сети». Некоторые эксперты верят, что за гиперлокальными соцсетями будущее, но на практике ни одна из них не преуспела. И можно понять, почему: с теми, кто рядом, можно общаться и без соцсетей.
В обычной ситуации от таких приложений мало толка. Но Firechat повезло. Ситуация, которая привлекла к нему внимание, была совершенно необычной.
Выход приложения совпал по времени со студенческими волнениями в Тайване. Сотни тысяч человек вышли на улицы, чтобы помешать ослаблению ограничений на торговлю с Китаем, которое, по их мнению, способно повредить экономике острова и даст Пекину рычаги политического давления на Тайвань.
Антикитайские протесты в Тайване стали первым испытанием Firechat
Большие и, главное, неожиданные скопления людей всегда были проблемой для традиционных сетей мобильной связи. Базовые станции — «соты» — рассчитаны на обслуживание ограниченного количества абонентов. Когда на небольшой площади собирается слишком много людей, соты перестают справляться с нагрузкой, и связь пропадает.
Одна из функций Firechat даёт возможность использовать приложение для общения даже в тех случаях, когда мобильная связь (и, соответственно, интернет) недоступны. Сообщения продолжают распространяться на небольшом расстоянии, но уже не через интернет, а посредством Bluetooth или Wi-Fi.
Существуют и другие приложения с похожей функциональностью, но Firechat оказался в нужном месте в нужное время. Кто-то из тайваньских протестующих заметил его описание на местном ИТ-ресурсе и понял, что такой сервис поможет координировать действия в условиях, когда сотовая связь то и дело пропадает, а от властей можно ждать любого подвоха. Весть быстро облетела площадь. Демонстранты стали устанавливать Firechat на свои смартфоны и за считанные часы вывели его на первое место по количеству скачиваний в тайваньской версии App Store.
Такое применение не вполне соответствовало ожиданиям разработчиков — небольшого калифорнийского стартапа под названием Open Garden. Они догадывались, что Firechat особенно полезен, когда с традиционными средствами связи что-то не так, но не подумали, что причины этого «не так» редко бывают позитивными.
Firechat — не единственный и даже не главный проект Open Garden
В Open Garden рассчитывали на пользователей, которые мирно обсуждают концерты и спортивные матчи. В действительности первыми пользователями Firechat стали демонстранты, захватившие здание тайваньского парламента. Они говорили о слезоточивом газе, полиции и площади Тяньаньмэнь.
Жители Тайваня обсуждают использование Firechat
Следующая волна признания пришла из Ирака. Когда власти этой страны заблокировали Facebook и Twitter, иракцы стали перебираться в Firechat. Всего за пару дней его установили около сорока тысяч человек. Им было не до «фестивалей под открытым небом», про которые думали в Open Garden. У них была более животрепещущая тема: наступление боевиков Исламского Государства.
Заблокировать Firechat будет труднее, чем Facebook и Twitter. Даже если иракские власти перекроют доступ к серверам Firechat, это уже ничего не изменит. В некоторых районах Багдада плотность пользователей приложения достаточно велика, чтобы поддерживать локальное общение, не требующее интернета.
Следующий сегмент аудитории Firechat — это жители беднейших деревень Индии. Там связи нет не из-за демонстраций или войны, а из-за повсеместной нищеты.
Последний эпизод случился чуть больше месяца назад во время массовых демонстраций в Гонконге. В этот раз поводом стали опасения, что Китай перекроет онлайновые средства коммуникации протестующих. Для паранойи был повод: в конце сентября китайские власти заблокировали Instagram.
Китайская цензура была бессильна перед Firechat в Гонконге
В течение следующих двадцати четырёх часов Open Garden зафиксировал более ста тысяч скачиваний приложения в Гонконге. Это было лишь начало. Спустя несколько дней количество установок Firechat, связанных с гонконгскими протестами, в двадцать раз превзошло тайваньский уровень.
Протестующие использовали приложение, чтобы решать организационные вопросы: сколько нужно масок для защиты от слезоточивого газа, где не хватает питьевой воды, и так далее. Знаменитая китайская интернет-цензура оказалась бессильна перед децентрализованной натурой Firechat.
Как устроен Firechat
Установка приложения открывает доступ к паре общих чатов и набору тематических комнат. Чат Everyone предназначен для общения через интернет с пользователями, которые находятся в том же географическом регионе. Регион в понимании Firechat — понятие растяжимое. Приложение не отличает Канаду от США, Китай от Гонконга, а Россию от Украины. Последствия предсказуемы: глупейшие флеймы о политике не кончаются никогда.
Одновременно в чате Everyone могут общаться не более восьмидесяти человек. Для восемьдесят первого создадут изолированную группу, куда будут попадать те, кто не уместился в первой. Перейти из группы в группу и даже узнать о том, сколько их, нельзя. В результате нет никаких гарантий, что вы и ваши знакомые попадут в одну и ту же группу чата Everyone.
Если сообщения в чате Everyone передаются только через интернет, то в чате Nearby они распространяются исключительно при помощи Bluetooth и локального Wi-Fi. Это и есть та возможность, которая привлекла к нему внимание. Именно наличие локального чата, не требующего доступа к интернету, отличает Firechat от множества аналогичных (и, как правило, куда более популярных) приложений для общения.
К появлению Firechat привела одна из новых возможностей iOS 7 — технология Multipeer Connectivity Framework. Обладателям айфонов и айпадов хорошо знакома функция AirDrop, с помощью которой можно пересылать файлы на соседние мобильные устройства или «маки», — это один из примеров использования фреймворка.
Multipeer Connectivity Framework позволяет устройствам на базе iOS, находящимся недалеко друг от друга, обмениваться информацией через Wi-Fi или Bluetooth, минуя интернет. Поскольку устройства соединяются напрямую, сервер не требуется.
Долгое время AirDrop оставался не только самым известным, но и единственным применением этой технологии. Firechat стал одним из первых приложений для iOS, использующим Multipeer Connectivity Framework.
Несмотря на «яблочные» корни, в Open Garden сумели перенести приложение на Android. Поначалу, впрочем, не обошлось без компромиссов. Первые версии Firechat для Android не могли подключаться к устройствам на iOS. Для межплатформенного общения требовался интернет. Но спустя несколько месяцев и эта проблема была решена.
Официальные объяснения принципа действия Firechat рассчитаны на публику, которая далека от технических подробностей. Однако, вооружившись программным обеспечением для перехвата и анализа беспроводного трафика, можно составить некоторое представление о том, как в действительности работает это приложение.
После запуска Firechat создаёт два канала Bluetooth и открывает два соединения Wi-Fi. Каналы Bluetooth используют протокол RFCOMM — грубо говоря, беспроводную имитацию последовательного порта RS-232 (сейчас такой порт — это почти экзотика, но до распространения USB именно к нему подключали компьютерные мыши или модемы).
Первое из соединений Wi-Fi использует адрес 239.192.0.0, имеющий особое значение. Это широковещательный адрес, позволяющий обмениваться данными сразу со всеми устройствами, которые подключены к той же беспроводной сети. Другое — это защищённое SSL-соединение с центральным сервером Firechat, находящимся в интернете.
В чате через интернет нет ничего интересного, поэтому сосредоточимся на том, как Firechat обходится без него. Для локальной работы приложения требуется, чтобы действовало либо широковещательное соединение по Wi-Fi, либо по Bluetooth. Они работают одновременно и дублируют друг друга.
Каждое сообщение передаётся по Bluetooth всем устройствам, с которыми приложению удалось установить связь, а по Wi-Fi — всем устройствам, подключенным к той же беспроводной сети, что и отправитель. Получатели, в свою очередь, делают то же самое.
Каждый узел ячеистой сети соединён с другими и служит коммутатором
Такое приложение можно сравнить с маленькой радиостанцией: её сообщение получат все, кого достигнет радиосигнал. Разумеется, радиус действия Bluetooth и Wi-Fi не очень велик. Создатели Firechat утверждают, что локальное соединение при помощи Firechat возможно на расстоянии до семидесяти метров.
Однако есть и другой, более любопытный вариант (пока он, правда, в большей степени декларируется, чем применяется на практике). В достаточно людном месте сообщение может добраться до смартфонов, находящихся дальше семидесяти метров от отправителя, перескакивая с одного устройства на другое по цепочке.
Чтобы достичь этого, приложение должно распространять по всем возможным каналам не только отправляемые, но и получаемые сообщения. В этом случае каждый смартфон становится своего рода ретранслятором, добавляя в сеть новые ячейки и делая её всё шире и шире.
Самоорганизующиеся сети такого рода принято называть ячеистыми (в английском языке им соответствует термин mesh network). Они лишены иерархии — их узлы (или ячейки) не делятся на серверы и потребителей. Они равноправны и сообща заботятся о доставке информации.
По прикидкам разработчиков Firechat, если приложение, работающее по такому принципу, установят хотя бы 7–8% жителей города, то почти всегда поблизости будет находиться хотя бы одно устройство, к которому можно подключиться. После этого наличие интернета или сотовой связи перестанет играть роль — в 93% случаев сообщения можно будет отправлять и без них.
Полное отсутствие централизации означает значительно большую стойкость к внешним воздействиям. Ячеистую сеть практически невозможно отключить, заблокировать или взять под полный контроль. Отключение одного или даже нескольких узлов, скорее всего, не причинит ей ни малейшего вреда (сравните с обычной сотовой сетью, где отключение единственной базовой станции может оставить без связи тысячи абонентов!).
В определённой степени ячеистые сети можно сравнить с распределёнными пиринговыми технологиями вроде BitTorrent. Все три основателя Open Garden в прошлом имели к ним самое непосредственное отношение. Один из них, выходец из России Станислав Шалунов, известен как создатель протокола LEDBAT, который используют Apple и BitTorrent. Другой много лет был ведущим разработчиком μTorrent, распространённого клиента BitTorrent. Третий сотрудничал со Skype — раньше этот сервис был почти полностью децентрализованным.
Неуязвимость и независимость имеют цену. Ячеистые сети нуждаются в существенной избыточности и, следовательно, менее экономичны, чем обычные. Кроме того, как и многие другие пиринговые технологии, они плохо работают, когда количество пользователей недостаточно. BitTorrent бесполезен, когда у нужного файла не хватает «сидов», а локальный Firechat — когда рядом слишком мало других пользователей.
Ещё один недостаток Firechat связан с тем, что сообщения распространяются в текстовом формате JSON и ничем не защищены. Любое устройство, которое находится в радиусе действия одного из узлов сети, может их перехватить. Разработчики утверждают, что одна из следующих версий приложения будет шифровать текст, но пока этого не происходит.
Этот минус до определённой степени компенсирует полная анонимность. Уникальный идентификатор пользователя меняется случайным образом с каждым отправленным сообщением. Подпись при этом остаётся той же, но проверить, действительно ли она принадлежит отправителю, без подключения к серверу Firechat в интернете невозможно.
Ячейки печали
Ячеистые сети — это крайне интересная технология, но в большинстве случаев её полезность сомнительна. Людям, у которых есть мобильный телефон, открытый интернет и хотя бы относительно спокойная жизнь, они не нужны. У них и так всё в порядке.
Именно поэтому первыми пользователями Firechat стали люди, находящиеся в «горячих точках». Что бы ни планировали в Open Garden, у них получилось социальное приложение для тех, у кого не всё в порядке. Оно нужнее всего в тех обстоятельствах, которые мешают пользоваться обычными средствами связи.
Источник