Добрый день через Bluetooth БЕЗ Gamekit?
Меня интересует возможность прямого использования bonjour через Bluetooth в iPhone OS 3.0 или более поздней версии без использования GameKit. Кто-нибудь может привести примеры?
3 ответа
Просто объявите сервис, так же, как tc. сказал ниже:
self.netService = [[[NSNetService alloc] initWithDomain:@""
type:@"_http._tcp"
name:@""
port:8080] autorelease];
[self.netService publish];
В iOS5, однако, по-умолчанию Bluetooth Bonjour отключен, поэтому вы должны использовать C API, объявленный в <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. Он может быть найден в наборах документов 10.6 и 10.7. В 10.8 приведен пример DNSSDObjects, но я не совсем понял, что он делает.) - WiTap - пока вы на самом деле не заботитесь о поддержке Bluetooth в iOS 5, просто посмотрите на пример под названием WiTap, который демонстрирует не только красивый Objective-C API, но и то, как вы можете создать сервер, используя CFSocket API (тонкие обертки вокруг розеток BSD). Вы захотите взглянуть на это, даже если вы используете SRVResolver, чтобы увидеть, как использовать API на основе C из
<dns_sd.h>
,
После объявления или разрешения вашего сервиса вы используете обычные BSD-сокеты для прослушивания или подключения. При написании сервера вы можете даже захотеть сначала listen()
на порту 0 (ноль), а затем запросите, какой случайный доступный порт был назначен вам. После запроса объявите этот порт вместо фиксированного. Это именно то, что делает пример WiTap (но с API CFSocket вместо API сокетов BSD).
Для получения дополнительной информации о сокетах BSD, просто Google вокруг для учебника.
Примечание: информация о iOS 5 взята из Технических вопросов и ответов Apple QA1753.
Прочитайте эту статью: Bonjour через Bluetooth на iOS 5.0 https://developer.apple.com/library/ios/
Это известная проблема в IOS 5.0, и ее необходимо решить с помощью API более низкого уровня: DNSSDObjects.
Если Bluetooth включен, на достаточно новом устройстве (3G и выше, или аналоге iPod, или iPad) и достаточно новой ОС (очевидно, 3.1), Bonjour автоматически будет работать через Bluetooth, используя локальные адреса связи (168.254.*), Тогда вы просто используете TCP/UDP как обычно.
(Я уверен, что GameKit использует Bonjour-over-IP-over-Bluetooth.)
В противном случае публикация / просмотр выполняется на уровне Bluetooth, но если один из них публикует службу Bonjour, а другой просматривает ее, устанавливается автоматическое соединение IP через Bluetooth.
Любые примеры Bonjour должны работать автоматически.