Мне интересно, как напрямую использовать bonjour для bluetooth в iPhone OS 3.0 или более поздней версии без использования GameKit. Может ли кто-нибудь представить какие-либо примеры?
Bonjour через Bluetooth БЕЗ 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.
Ответ 2
Прочтите эту статью: Bonjour через Bluetooth на iOS 5.0 https://developer.apple.com/library/ios/#qa/qa1753/_index.html#//apple_ref/doc/uid/DTS40011315
Это известная проблема в IOS 5.0 и ее необходимо разрешить с помощью API нижнего уровня: DNSSDObjects.
Ответ 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 должны автоматически работать.