Android、どうやってble UUIDを適切にスキャン、フィルタリングする

私はAndroid上でBluetoothLeを使用しています(最小API:21+)。現在、サービスのuuidのフィルタ処理の手順は動作していますが、期待どおりではありません。以下は基本的なスキャナパラメータを設定するために使用されるコードセグメントです、これは現在うまくいくものです。 Bleに関する他の分野(iOS、組み込みハードウェア)に基づいて、16ビットUUID割り当てのみに基づいてBleデバイスをフィルタリングする機能があることが明らかになりました。 AndroidがBleとその細分化されたデバイスのエコシステムをややラフに始めたことに気づきましたが、androidが他のプラットフォームと同じようにUUIDと同じような道をたどるのかどうか、理由はわかりません。ブルートゥースSIGから来るすべてのUUIDは、単にUUID_BASE(00000000−0000−1000−8000−00805F9B34FB)の定義だけを有する16ビットの識別子である。

...
// devices UUID service
ParcelUuid parcelUuid = new ParcelUuid(UUID.fromString("1F0E0D0C-0B0A-0909-0807-060504030201"));
// devices UUID service mask
ParcelUuid parcelUuidMask = new ParcelUuid(UUID.fromString("00000D0C-0000-0000-0000-000000000000"));

// Filters and Settings
scanFilter = new ScanFilter.Builder().setServiceUuid(parcelUuid, parcelUuidMask).build();
scanFilterList.add(scanFilter);
scanSettings = new ScanSettings.Builder().setScanMode(ScanSettings.SCAN_MODE_LOW_POWER).build();

// Scanning Started
mBluetoothLeScanner.startScan(scanFilterList, scanSettings, scanCallback);
...

上記のことをすべて踏まえて、私は2つの組み込みハードウェアデバイスで独自のUUIDサービスを2つブロードキャストしています。下記はそれらのUUIDです、すべてのアカウントでMSB(Most Signifigant Byte)だけがそれらの間の差別化要因です。デバイス名も違います。

Device One:
Service 1 - 1F0E0D0C-0B0A-0909-0807-060504030201
Service 2 - 2F0E0D0C-0B0A-0909-0807-060504030201

Device Two:
Service 1 - EF0E0D0C-0B0A-0909-0807-060504030201
Service 2 - FF0E0D0C-0B0A-0909-0807-060504030201

Common Identifier amongst the UUID's:
0x0D0C

以前に提供されたコードセグメントから、setServiceUuidメソッドで使用されるParcelUuidは、マッチングマスクが必要であるにもかかわらず、デバイスがデバイスを返すためにも完全一致を必要とするようです。それでは、完全な128ビットの識別子ではなく、16ビットの識別子でのみフィルタするようにドライバ/ハードウェアに要求しますか。それぞれが独自のサービスUUIDを持つ2つの異なるデバイスを使用して上記で示したモデルでは、必要なデバイスや期待されるすべてのデバイスをスキャンして返すことはできません。

私は私が抱えている問題は二重であるが、どこにでも答えを見つけることができないように思われるので、取り組む必要があるように感じます。私はこのトピックに関して触れているすべてのフォーラム投稿、スタックの質問/回答をハイとローで検索しましたが、それらのどれも私が探しているものとして飛び出しているようには見えません。私はアンドロイドのフィルタリングの私の理解が間違っているかどうか、アンドロイドが機能を欠いている、またはアンドロイドの供給されたクラスでそのような機能を見つけることができないかどうかわからない。ソフトウェアでこの「機能」を実現する方法について私はいくつか考えていますが、それはかなり醜く、時間がかかり、バッテリーに負担をかけるでしょう。そのような例の1つは、オープンスキャンと手動によるフィルタリングです。しかし、デバイスをスキャンするときに128ビットと16ビットのUUIDフィルタリングをサポートする機能がある、またはあるべきだと思います。

誰もがこれに光を当てる手助けすることはできますか?

また、この投稿された質問の長さに対する謝罪...

1

5 答え

私はあなたがフィルタリングしたいものを正確にはわからないが、あなたは単にフィルタを適用したい場合???? 0D0C - ???? - ???? - ???? - ??????? ?????、parcelUuidを00000D0C-0000-0000-0000-000000000000に設定し、parcelUuidMaskを0000FFFF-0000-0000-0000-000000000000に設定する必要があります。

0
追加された
Googleドライブなどで共有する
追加された 著者 Emil,
広告データとスキャンレスポンスはどのようなものですか。
追加された 著者 Emil,
あなたはおそらく共有するためにhciスヌープログを持っていますか?
追加された 著者 Emil,
うまくいくはずのドキュメントによると...他のAndroidデバイスを試したことがありますか?
追加された 著者 Emil,
WiresharkがAndroidのカスタムパケットを実装しているかどうかわからない。フォーマットは source.android.com/devices/にあります。 Android-6.0-Bluetooth-HCI-Reqs.pd‌ f に変換して手動でデコードします。とにかく、サービスUUIDのフィルタリングが有効になっているのを見ますが、あなたの特定のUUIDフィルタ+マスク(0x03 APCFサービスUUID)を設定するコマンドは見当たりません。 Bluetoothを再起動してスキャンを開始するまでキャプチャして、Service UUIDコマンドが含まれるようにすることはできますか?そのようなパケットがない場合、私はAndroidのコードにバグがあるに違いないと思います...あなたはMarshmallowを試したことがあるかNougatだけを試しましたか?
追加された 著者 Emil,
ここで私が前に言ったように、2つのファイルがあります、それらはフィルターをかけられたそしてフィルターをかけられていないスキャンから成ります。また、wiresharkでそれらを開いた後でさえ私は彼らの内容をdecyferすることができません..これらが正しく作られるかどうかわからないが、ここで彼らはそうです。 drive.google.com/file/d/0BxTtOlodjQYjMVplZ1U/V a> drive.google.com/file/d/0BxTtOlodjQYjSHNUa2Uw/R3
追加された 著者 Mr.Invisible,
それが私が持っているすべてのデバイス上にあることが起こるので、今日の時点で、私はヌガーに自分自身を心配しています。マシュマロでデバイスを試してみることはできますが、息を止めているわけではありません。とにかく、このhciスヌープログを自動化する方法はありますか - >人間が読める形式ですか?あなたがリンクした文書は確かに飛び込むのに時間がかかるので、その間にこれをしないでください。
追加された 著者 Mr.Invisible,
また、フィルタを作成してアプリケーションを起動するボタンがアプリに含まれているため、「Bluetoothを再起動し、スキャンを開始するまでキャプチャしてService UUIDコマンドを含めることができますか?」という要求をよく理解できません。 scancallbackの戻り結果に設定されたブレークポイントでスキャンします。私はスヌープログを有効にしてからデバッガを介してアプリを起動し、それから私のブレークポイントを待ちます(5秒遅れで待ちます。
追加された 著者 Mr.Invisible,
その間に、私は提案されたコードの別のログを取りました、うまくいけばそれは最後のものよりわずかに大きいので異なるでしょう。 drive.google.com/file/d/0BxTtOlodjQYjM25oaFlw/xしかし、もう一度実行しても、ログファイルに異なる結果が表示されるとは思われません。
あるソースコードを共有することがこの問題を明らかにするのに役立つかどうか私にはわからない、私は他の何かがこれにさえも関係していることに疑いを抱いている。しかし、私はフィルタリング、設定、およびブルートゥースのスキャンに関連する実際のコードセグメントの写真をリンクしています。これは私がこれを理解することができるまでボタンのためのonClickメソッドに包まれています。 drive.google.com/file/d/0BxTtOlodjQYjQWNYazVla29Yaあなたが私にくれることができるどんな助けでもとても感謝しています!
ここでそれを共有する方法がわからない..しかし、私は上記の提案からのスキャンでオープンスキャンと別のものを実行しているデバイスのスヌープログを持っています。
追加された 著者 Mr.Invisible,
すべてのデバイスをもう一度実行しても同様の結果が得られ、提案は機能しません。
追加された 著者 Mr.Invisible,
はい、一種の..私はデバイス、Nexus 9タブレット、Nexus 5x、Moto G4Plusの限られた選択があります。すべてのデバイスがAndroid 7.1.1以降を実行しています。すべて同じ結果を示しているようです。
追加された 著者 Mr.Invisible,
アンドロイドスタジオのデバイスからすべての広告データを取得することについて約行く方法がわからない。上記は、コールバックによって与えられた結果に従ったデバッガからのコピーペーストです。
追加された 著者 Mr.Invisible,
ScanResult {mDevice = F5:00:00:05:70:83、mScanRecord = ScanRecord [mAdvertiseFlags = 6、mServiceUuids = [1f0e0d0c-0b0a-0909-0807-060504030201]、mManufacturerSpecificData = {}、mLevelData = {}} -2147483648、mDeviceName = BLUE]、mRssi = -38、mTimestampNanos = 624459810326031}
追加された 著者 Mr.Invisible,
私はこれを試してみましたが、幸運にも... onScanResultが返されることはありません。
追加された 著者 Mr.Invisible,

私はあなたがフィルタリングしたいものを正確にはわからないが、あなたは単にフィルタを適用したい場合???? 0D0C - ???? - ???? - ???? - ??????? ?????、parcelUuidを00000D0C-0000-0000-0000-000000000000に設定し、parcelUuidMaskを0000FFFF-0000-0000-0000-000000000000に設定する必要があります。

0
追加された
広告データとスキャンレスポンスはどのようなものですか。
追加された 著者 Emil,
Googleドライブなどで共有する
追加された 著者 Emil,
WiresharkがAndroidのカスタムパケットを実装しているかどうかわからない。フォーマットは source.android.com/devices/にあります。 Android-6.0-Bluetooth-HCI-Reqs.pd‌ f に変換して手動でデコードします。とにかく、サービスUUIDのフィルタリングが有効になっているのを見ますが、あなたの特定のUUIDフィルタ+マスク(0x03 APCFサービスUUID)を設定するコマンドは見当たりません。 Bluetoothを再起動してスキャンを開始するまでキャプチャして、Service UUIDコマンドが含まれるようにすることはできますか?そのようなパケットがない場合、私はAndroidのコードにバグがあるに違いないと思います...あなたはMarshmallowを試したことがあるかNougatだけを試しましたか?
追加された 著者 Emil,
うまくいくはずのドキュメントによると...他のAndroidデバイスを試したことがありますか?
追加された 著者 Emil,
あなたはおそらく共有するためにhciスヌープログを持っていますか?
追加された 著者 Emil,
また、フィルタを作成してアプリケーションを起動するボタンがアプリに含まれているため、「Bluetoothを再起動し、スキャンを開始するまでキャプチャしてService UUIDコマンドを含めることができますか?」という要求をよく理解できません。 scancallbackの戻り結果に設定されたブレークポイントでスキャンします。私はスヌープログを有効にしてからデバッガを介してアプリを起動し、それから私のブレークポイントを待ちます(5秒遅れで待ちます。
追加された 著者 Mr.Invisible,
それが私が持っているすべてのデバイス上にあることが起こるので、今日の時点で、私はヌガーに自分自身を心配しています。マシュマロでデバイスを試してみることはできますが、息を止めているわけではありません。とにかく、このhciスヌープログを自動化する方法はありますか - >人間が読める形式ですか?あなたがリンクした文書は確かに飛び込むのに時間がかかるので、その間にこれをしないでください。
追加された 著者 Mr.Invisible,
ここでそれを共有する方法がわからない..しかし、私は上記の提案からのスキャンでオープンスキャンと別のものを実行しているデバイスのスヌープログを持っています。
追加された 著者 Mr.Invisible,
その間に、私は提案されたコードの別のログを取りました、うまくいけばそれは最後のものよりわずかに大きいので異なるでしょう。 drive.google.com/file/d/0BxTtOlodjQYjM25oaFlw/xしかし、もう一度実行しても、ログファイルに異なる結果が表示されるとは思われません。
あるソースコードを共有することがこの問題を明らかにするのに役立つかどうか私にはわからない、私は他の何かがこれにさえも関係していることに疑いを抱いている。しかし、私はフィルタリング、設定、およびブルートゥースのスキャンに関連する実際のコードセグメントの写真をリンクしています。これは私がこれを理解することができるまでボタンのためのonClickメソッドに包まれています。 drive.google.com/file/d/0BxTtOlodjQYjQWNYazVla29Yaあなたが私にくれることができるどんな助けでもとても感謝しています!
ここで私が前に言ったように、2つのファイルがあります、それらはフィルターをかけられたそしてフィルターをかけられていないスキャンから成ります。また、wiresharkでそれらを開いた後でさえ私は彼らの内容をdecyferすることができません..これらが正しく作られるかどうかわからないが、ここで彼らはそうです。 drive.google.com/file/d/0BxTtOlodjQYjMVplZ1U/V a> drive.google.com/file/d/0BxTtOlodjQYjSHNUa2Uw/R3
追加された 著者 Mr.Invisible,
私はこれを試してみましたが、幸運にも... onScanResultが返されることはありません。
追加された 著者 Mr.Invisible,
すべてのデバイスをもう一度実行しても同様の結果が得られ、提案は機能しません。
追加された 著者 Mr.Invisible,
はい、一種の..私はデバイス、Nexus 9タブレット、Nexus 5x、Moto G4Plusの限られた選択があります。すべてのデバイスがAndroid 7.1.1以降を実行しています。すべて同じ結果を示しているようです。
追加された 著者 Mr.Invisible,
アンドロイドスタジオのデバイスからすべての広告データを取得することについて約行く方法がわからない。上記は、コールバックによって与えられた結果に従ったデバッガからのコピーペーストです。
追加された 著者 Mr.Invisible,
ScanResult {mDevice = F5:00:00:05:70:83、mScanRecord = ScanRecord [mAdvertiseFlags = 6、mServiceUuids = [1f0e0d0c-0b0a-0909-0807-060504030201]、mManufacturerSpecificData = {}、mLevelData = {}} -2147483648、mDeviceName = BLUE]、mRssi = -38、mTimestampNanos = 624459810326031}
追加された 著者 Mr.Invisible,

マスクiは反対にする必要があります。含めるビットには1を、無視するビットには0を使用します。

filter:  1F0E0D0C-0B0A-0909-0807-060504030201
mask:    0000FFFF-0000-0000-0000-000000000000

その結果、「0D0C」を持つデバイスがすべて含まれます。これよりも類似性の高い「よりタイトな」フィルタが必要になるでしょう。

0
追加された

マスクiは反対にする必要があります。含めるビットには1を、無視するビットには0を使用します。

filter:  1F0E0D0C-0B0A-0909-0807-060504030201
mask:    0000FFFF-0000-0000-0000-000000000000

その結果、「0D0C」を持つデバイスがすべて含まれます。これよりも類似性の高い「よりタイトな」フィルタが必要になるでしょう。

0
追加された

あなたはMACアドレスに基づいてBLEをフィルターにかけるべきです、彼らは魅力のようにフィルターをかけます、そして、あなたがUUIDフィルターのための解決策を見つけたならばおそらく共有してください。

0
追加された