web-dev-qa-db-ja.com

iOS GameKitの「Bluetooth Bonjour」を他のプラットフォームで使用する

Bluetooth経由でiOSベースのデバイスに接続することに興味があります。 「ローカルネットワーク」サービスが公開されていることがわかりますが、それに関する追加情報は見つかりません。キー0x0204の下に格納されているプロパティは、Bonjourキーのように見えます。

どのプロトコルが使用されていますか? Linux、Mac、またはBluetoothチップを搭載した自分の組み込みデバイスを使用してiOSデバイスと通信するにはどうすればよいですか?

IOSデバイスがGameloftのスター大隊を実行しているときに、OS XでBluetooth Explorerを使用して抽出されたSDPデータを次に示します。

    {
        0x0000 = uint32(1330188565),
        0x0200 = uint32(2),
        0x0202 = string(004wD7l1A..0|0|0|ivucic-À'),
        0x030a = uint32(0),
        0x0009 = { { uuid16(11 15), uint16(256) } },
        0x0201 = string(_657o30a6rmst07À),
        0x0005 = { uuid16(10 02) },
        0x0100 = string(Local Network),
        0x0001 = { uuid16(11 15) },
        0x0203 = string(004wd7l1a..0|0|0|ivucic-_657o30a6rmst07À
        0xf000 = uint8(2),
        0x0204 = string(    txtvers=1state=A),
        0x0008 = uint8(255),
        0x0006 = { uint16(25966), uint16(106), uint16(256), uint16(26226), uint16(106), uint16(272), uint16(25701), uint16(106), uint16(288), uint16(27233), uint16(106), uint16(304) },
        0x0004 = { { uuid16(01 00), uint16(15) }, { uuid16(00 0f), uint16(256), { uint16(2048), uint16(2054) } } },
        0x0002 = uint32(0)
    },

その他の部分的に関連する質問:


OS XではAppleのBluetooth Explorerを、GNU/Linuxではsdptoolを使用してさらに調査したところ、0x0001の値を含むキー0x1115(「プロトコルクラス」の略)が立っていることがわかりました。 「PAN」の「PANU」バリアント-peer2peerバリアント。 OS Xがこのプロトコルのサービス側(「ホスティング」)のサポートを提供していないのは注目に値しますが、0x1116ネットワークの作成はサポートされていますバリアント。

これは朗報かもしれませんが、GameKitのセッションプロトコルを使用する必要がない場合のみです。他のUDPトラフィックを送信するためにGameKitによって確立されたメディアレイヤー接続をハイジャックすることは理想的です。

このGameKit接続が本当に0x1115であるかどうかを調査する必要があります。つまり、本当に「PANU」の場合です。誰か他の情報がありますか?


BonjourがiOS 3の後でこのBluetoothサービスを自動的に発表したことに注意してください。これはiOS 5で変更されました。私が投稿した回答を参照してください GameKitなしでBluetooth接続を確立する方法 。Appleの情報を手軽に文書化 テクニカルQ&A QA175


GNU/Linuxでの少量の調査では、接続は成功しませんでした。 pandの適切な使用方法に関する知識が不足していることが原因である可能性があります。また、Bluetooth MACベースのブロッキングが原因である可能性もあります。誰もが提供できる情報が欲しいこれをさらに調査して、何か面白いものに出会ったら、この答えを更新します。


Ubuntuでの結果。このサービスは、Bluetooth Bonjourがアクティブな場合にのみ表示されます。

ivucica@ivucica-MacBook:~$ sdptool browse $ADDR #relevant data only
Browsing ADDRESS_HERE ...
Service Name: Local Network
Service RecHandle: 0x4f491115
Service Class ID List:
  "PAN User" (0x1115)
Protocol Descriptor List:
  "L2CAP" (0x0100)
    PSM: 15
  "BNEP" (0x000f)
    Version: 0x0100
    SEQ8: 0 6
Language Base Attr List:
  code_ISO639: 0x656e
  encoding:    0x6a
  base_offset: 0x100
  code_ISO639: 0x6672
  encoding:    0x6a
  base_offset: 0x110
  code_ISO639: 0x6465
  encoding:    0x6a
  base_offset: 0x120
  code_ISO639: 0x6a61
  encoding:    0x6a
  base_offset: 0x130
Profile Descriptor List:
  "PAN User" (0x1115)
    Version: 0x0100

... and so on ...

接続の試みは次のとおりです。

ivucica@ivucica-MacBook:~$ pand --connect $ADDR -n
pand[3237]: Bluetooth PAN daemon version 4.98
pand[3237]: Connecting to ADDRESS_HERE
pand[3237]: Connect to ADDRESS_HERE failed. Connection refused(111)

何らかの承認が必要ですか?暗号化、認証、安全な接続を有効にし、マスターになることを強制しても、違いはないようです(さまざまな組み合わせの-AESMオプション)。

誰かがアイデアを持っていますか?


はぁ!

ivucica @ ivucica-MacBook:〜$ Sudo hcidump 
 HCIスニファー-Bluetoothパケットアナライザーバージョン2.2 
デバイス:hci0 snap_len:1028フィルター:0xffffffff 
 HCIイベント:コマンドステータス(0x0f) plen 4 
接続の作成(0x01 | 0x0005)ステータス0x00 ncmd 1 
> HCIイベント:ロール変更(0x12)plen 8 
ステータス0x00 bdaddr ADDRESS_HEREロール0x01 
役割:スレーブ
> HCIイベント:接続完了(0x03)plen 11 
ステータス0x00ハンドル12 bdaddr ADDRESS_HEREタイプACL暗号化0x00 
 HCIイベント:コマンドステータス(0x0f)plen 4 
リモートサポート機能の読み取り(0x01 | 0x001b)ステータス0x00 ncmd 1 
> HCIイベント:リモートサポート機能の読み取り(0x0b)plen 11 
ステータス0x00ハンドル12 
機能:0xbf 0xfe 0x8f 0xfe 0x9b 0xff 0x79 0x83 
 HCIイベント:コマンドステータス(0x0f)plen 4 
リモート拡張機能(0x01 | 0x001c)ステータスの読み取り0x00 ncmd 1 
> HCIイベント:最大スロット数の変更(0x1b)plen 3 
は12スロット5 
を処理します> HCIイベント:リモート拡張機能(0x23)の読み取りplen 13 
ステータス0x00ハンドル12ページ1最大1 
機能:0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00 
 HCIイベント:コマンドステータス(0x0f)plen 4 
リモート名要求(0x01 | 0x0019)ステータス0x00 ncmd 1 
> HCIイベント:リモート名要求完了(0x07)plen 255 
ステータス0x00 bdaddr ADDRESS_HERE name 'Evil iPad' 
 HCI Event:Command Status(0x0f)plen 4 
 Authentication Requested(0x01 | 0x0011)status 0x00 ncmd 1 
> HCI Event:Link Key Request(0x17 )plen 6 
 bdaddr ADDRESS_HERE 
 HCIイベント:コマンド完了(0x0e)plen 10 
リンクキー要求応答(0x01 | 0x000b)ncmd 1 
ステータス0x00 bdaddr ADDRESS_HERE 
> HCIイベント:Auth Complete(0x06)plen 3 
 status 0x00 handle 12 
 HCI Event:Command Status(0x0f)plen 4 
 Set Connection Encryption(0x01 | 0x0013)ステータス0x00 ncmd 1 
> HCIイベント:暗号化変更(0x08)plen 4 
ステータス0x00ハンドル12暗号化0x01 
 HCIイベント:完了したパケット数(0x13)plen 5 
ハンドル12パケット1 
> ACLデータ:ハンドル12フラグ0x02 dlen 16 
 L2CAP(s):Info rsp:type 2 result 0 
 Extended feature mask 0x02a8 
 Enhanced Retransmission mode 
 FCS Option 
 Fixed Channels 
ユニキャストConnectless Data Reception 
 HCIイベント:完了したパケット数(0x13)plen 5 
 12パケットを処理1 
> ACLデータ:12フラグを処理0x02 dlen 20 
 L2CAP(s):Info rsp:type 3 result 0 
 Fixed channel list 0x00000006 
 L2CAP Signaling Channel 
 L2CAP Connless 
 HCI Event:Number of Completed Packets( 0x13)plen 5 
 12パケットを処理1 
> ACLデータ:12フラグを処理0x02 dlen 16 
 L2CAP(s):接続rsp:dcid 0x0000 scid 0x0040結果2ステータス0 
接続が拒否されました-PSMはサポートされていません
> HCIイベント:Disconn Complete(0x05)plen 4 
 status 0x00 handle 12 reason 0x13 
 Reason:Remote User Terminated Connection 

この?

> ACLデータ:ハンドル12フラグ0x02 dlen 16 
 L2CAP(s):Connect rsp:dcid 0x0000 scid 0x0040 result 2 status 0 
接続が拒否されました-PSMはサポートされていません
68
Ivan Vučica

この興味深いサイトによると: http://code.google.com/p/btstack/wiki/iPhoneBluetooth AppleはBluetooth以外の特別なチップを使用していますRFチップなしのデバイスの接続を拒否するチップ-これは、ハードウェアレベルでのロックを意味します。

8
James Roeiter

少し遅れるかもしれませんが、テクノロジーは進化してきているため、確かに新しい情報があり、問題に新鮮な光を当てています...

従来のGameKitは、iOSでWiFi Directのサポートを導入するとともにMultiper Connectivityに置き換えられましたが、フレームワークはiOSのみのままです。私はそこに起こっている独占的なものがあると思います。

また、iOSはWiFiダイレクトのダイレクトAPIをまだオープンしていないため、これに取り組む最善の方法は、両方のプラットフォームでサポートされているBLEを使用することです(他のプラットフォームよりも優れています)。

IOSでは、デバイスはBLEセントラルとBLEペリフェラルの両方として同時に機能できます。Androidでは、すべてのデバイスがBLEペリフェラルの状態をサポートするわけではないため、状況はより複雑になります。また、Android BLEスタックは(現在のところ)非常に不安定です。

ユースケースが機能主導の場合は、ゼロから構築する必要なく、クロスプラットフォーム通信を実現できるフレームワークとライブラリを検討することをお勧めします。

例: http://p2pkit.io または近くのgoogle

免責事項:私はUepaaで働いており、AndroidおよびiOS用のp2pkit.ioを開発しています。

1
p2pkit