Bonjour через Bluetooth БЕЗ Gamekit?

Мне интересно, как напрямую использовать bonjour для bluetooth в iPhone OS 3.0 или более поздней версии без использования GameKit. Может ли кто-нибудь представить какие-либо примеры?

Ответ 1

Просто объявите сервис, как tc. сказал ниже:

self.netService = [[[NSNetService alloc] initWithDomain:@"" 
                                                   type:@"_http._tcp" 
                                                   name:@"" 
                                                   port:8080] autorelease];
[self.netService publish];

С iOS5, однако, let's-call-it "Bluetooth Bonjour" отключен по умолчанию, поэтому вам нужно использовать API C, объявленный в <dns_sd.h>.

DNSServiceRef serviceRef;
DNSServiceRegister(&serviceRef, // sdRef
                   kDNSServiceFlagsIncludeP2P, // interfaceIndex
                   0, // flags
                   NULL, // name
                   "_http._tcp", // regtype
                   NULL, // domain
                   NULL, // host
                   1291, // port
                   0, // txtLen
                   NULL, // txtRecord
                   NULL, // callBack,
                   NULL // context
                   );

Это только часть объявления; разрешение немного сложнее. Я предлагаю вам взглянуть на следующие примеры от Apple:

  • SRVResolver - демонстрирует, как вы можете искать службу с помощью API, объявленного в <dns_sd.h>. Задает OS X, но включает класс под названием SRVResolver, который можно использовать на iOS так же легко, как вы можете использовать его в OS X. Для работы iOS 5 Bluetooth P2P, обновите вызов DNSServiceQueryRecord(), чтобы передать kDNSServiceFlagsIncludeP2P как interfaceIndex. ( ПРИМЕЧАНИЕ! Этот пример, похоже, не существует в OS X 10.8 docset. Он может быть найден в 10.6 и 10.7 документах. В 10.8 есть пример DNSSDObjects, но я не смотрел точно в том, что он делает.)
  • WiTap - пока вы действительно не заботитесь о поддержке Bluetooth на iOS 5, просто посмотрите на пример WiTap, который демонстрирует не только красивый API Objective-C, но и то, как вы можете создать сервер с помощью CFSocket API (тонкие обертки вокруг сокетов BSD). Вы захотите посмотреть на это, даже если вы используете SRVResolver, чтобы узнать, как использовать API на основе C от <dns_sd.h>.

После объявления или разрешения вашей службы вы используете обычные сокеты BSD для прослушивания или подключения. При написании сервера вам может понадобиться сначала listen() на порту 0 (ноль), а затем запросить, какой случайный доступный порт был назначен вам. После запроса на это объявите этот порт вместо фиксированного. Это то, что делает пример WiTap (но с API CFSocket вместо API сокетов BSD).

Для получения дополнительной информации о сокетах BSD, просто Google для учебника.

Примечание: информация о iOS 5 поступает от Apple Технический Q & A QA1753.

Ответ 3

Если Bluetooth включен, на достаточно новом устройстве (3G и выше, или на iPod или iPad) и достаточно новой ОС (по-видимому, 3.1), Bonjour автоматически будет работать через Bluetooth с использованием локальных локальных адресов (168.254. *). Затем вы обычно используете TCP/UDP.

(Под капотом я уверен, что GameKit использует Bonjour-over-IP-over-Bluetooth.)

По-видимому, публикация/просмотр выполняется на уровне Bluetooth, но если вы публикуете услугу Bonjour и другие просмотры для нее, устанавливается автоматическое соединение по протоколу IP-over-Bluetooth.

Любые примеры Bonjour должны автоматически работать.