21

iPhone OS 3.0 以降で、GameKit を使用せずに、Bluetooth 経由で bonjour を直接使用する可能性を考えています。誰でも例を提供できますか?

4

3 に答える 3

20

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を対象としていますが、OS X でSRVResolver使用できるのと同じくらい簡単に iOS でも使用できるというクラスが含まれています。(:このサンプルは、OS X 10.8 docset には存在しないようです。10.6 および 10.7 の docset に含まれています。10.8 には DNSSDObjects の例がありますが、それが何をするのか正確には調べていません。)DNSServiceQueryRecord()kDNSServiceFlagsIncludeP2PinterfaceIndex
  • WiTap - iOS 5 での Bluetooth サポートを実際に気にしない限り、WiTap と呼ばれる例を見てください。これは、美しい Objective-C API だけでなく、CFSocket API (thin BSD ソケットのラッパー)。から C ベースの API を使用する方法を確認するために SRVResolver を使用している場合でも、これを見たいと思うでしょう<dns_sd.h>

サービスをアナウンスまたは解決した後、通常の BSD ソケットを使用してリッスンまたは接続します。サーバーを作成するときは、最初listen()にポート 0 (ゼロ) を使用してから、ランダムに使用可能なポートが割り当てられているかどうかを照会することもできます。それを照会した後、固定ポートの代わりにこのポートをアナウンスします。これはまさに WiTap の例が行っていることです (ただし、BSD ソケット API の代わりに CFSocket API を使用しています)。

BSD ソケットの詳細については、Google でチュートリアルを検索してください。

注: iOS 5 に関する情報は、Apple のTechnical Q&A QA1753から得られます。

于 2011-11-25T19:53:38.203 に答える
5

この記事を読む: iOS 5.0 での Bluetooth 経由の Bonjour https://developer.apple.com/library/ios/#qa/qa1753/_index.html#//apple_ref/doc/uid/DTS40011315

これは IOS 5.0 の既知の問題であり、下位レベルの API である DNSSDObjects を使用して解決する必要があります。

于 2012-01-08T10:01:55.067 に答える
2

Bluetoothが有効になっている場合、新しいデバイス(3G以上、またはiPodと同等のもの、またはiPad)と新しいOS(3.1と思われる)で、Bonjourはリンクローカルアドレス(168.254。*)を使用してBluetooth経由で自動的に動作します。 。次に、通常はTCP/UDPを使用します。

(内部的には、GameKitはBonjour-over-IP-over-Bluetoothを使用していると確信しています。)

おそらく、公開/閲覧はBluetoothレイヤーで行われますが、一方がBonjourサービスを公開し、もう一方がそれを参照すると、Bluetooth経由の自動IP接続が確立されます。

Bonjourの例はすべて自動的に機能するはずです。

于 2010-10-02T13:27:30.683 に答える