Добрый день через Bluetooth БЕЗ Gamekit? - PullRequest
21 голосов
/ 02 октября 2010

Меня интересует возможность прямого использования bonjour через Bluetooth в iPhone OS 3.0 или более поздней версии без использования GameKit. Кто-нибудь может привести примеры?

Ответы [ 3 ]

20 голосов
/ 25 ноября 2011

Просто объявите услугу, как 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 .

5 голосов
/ 08 января 2012

Прочитайте эту статью: 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.

2 голосов
/ 02 октября 2010

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

(Я уверен, что GameKit использует Bonjour-over-IP-over-Bluetooth.)

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

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

...