特定のBLE周辺サービスを発見できないのはなぜですか?

次のコードでスキャンしています。

self.centralManager?.scanForPeripherals(withServices: serviceUUID, options: nil)

serviceUUID nil に置き換えるか、または nil として定義すれば、これはうまく機能します(私の tableview はBLEデバイスで埋められます)。

let serviceUUID = [CBUUID(string:"1803")]

しかし、それはうまくいきません

let serviceUUID = [CBUUID(string:"00001803-494c-4f47-4943-544543480000")]

Doublechecked with Lightblue, but the service UUID doesn't seem to have any typos. Lightblue screenshot

1
let serviceUUID = [CBUUID(string: "00001803-494C-4F47-4943-544543480000")] で試してみてください。大文字と小文字が区別されるかどうかはわかりません。あるいは単にoptionsで nil を使用して、 didDiscoverPeripheral:にadvertiseDataを記録し、見つかった値をここにコピーアンドペーストします。
追加された 著者 Larme,
let serviceUUID = [CBUUID(string: "00001803-494C-4F47-4943-544543480000")] で試してみてください。大文字と小文字が区別されるかどうかはわかりません。あるいは単にoptionsで nil を使用して、 didDiscoverPeripheral:にadvertiseDataを記録し、見つかった値をここにコピーアンドペーストします。
追加された 著者 Larme,
let serviceUUID = [CBUUID(string: "00001803-494C-4F47-4943-544543480000")] で試してみてください。大文字と小文字が区別されるかどうかはわかりません。あるいは単にoptionsで nil を使用して、 didDiscoverPeripheral:にadvertiseDataを記録し、見つかった値をここにコピーアンドペーストします。
追加された 著者 Larme,
あなたはservicesUUIDを探してスキャンすることができます、それはそれが周辺機器の広告データで見つけられなければならないことを意味して、それはデバイスによって放送されました。そうでなければ、それは見つかりません。しかし、デバイスはすべてのUUIDをブロードキャストするのではなく、1つか2つの詳細をブロードキャストすることがよくあります(たとえば、自社のものであること、またはある種の血圧サービスを提供するデバイスなど)等。)
追加された 著者 Larme,
Larmeのおかげで、大文字と小文字を区別しないで大文字と同じ結果を試しました。私はあなたの助言を試み、そしてそこから働きます。
追加された 著者 Glenn De Vos,
Larmeのおかげで、大文字と小文字を区別しないで大文字と同じ結果を試しました。私はあなたの助言を試み、そしてそこから働きます。
追加された 著者 Glenn De Vos,
Larmeのおかげで、大文字と小文字を区別しないで大文字と同じ結果を試しました。私はあなたの助言を試み、そしてそこから働きます。
追加された 著者 Glenn De Vos,

6 答え

Larmeはすでに適切な解決策を示していると思いますが、コメントは見落とされている可能性があるため、コメントではなく回答として定式化します。

広告データで特定のサービスを公開している周辺機器をスキャンします。つまり、文字列 00001803-494c-4f47-4943-544543480000 全体を広告データの一部にする必要があります。デバイスが見つからず、 1803 に対応している場合、サービス情報として 1803 のみがデバイスによってブロードキャストされているようです。

デバイスの広告データを確認してください。 16ビットのUUIDしか公開されていない場合は、問題の原因がわかります。

広告データの長さは31バイトに制限されており、これは各項目の長さとデータ型の宣言によってさらに削減されます。そのため、16ビットUUIDのみをブロードキャストするのが一般的であり、128ビットUUIDのペイロードの大部分を無駄にすることはありません。

1
追加された
私がスクリーンショットを正しく理解したならば、項目「サービスUUID」は単に文字列「1803」を含みます。そしてそれはパラメータserviceUUIDに対してチェックされる項目です。それが1803が機能する理由ですが、フル128ビットUUIDは機能しません。
追加された 著者 Thern,
私は本当にこれらすべての128ビットUUIDを見ることに集中していたので、実際にはサービスUUID 1803は「検索する」UUIDであるとは見なされませんでした。 Nebrさん、ありがとうございます。
追加された 著者 Glenn De Vos,
ありがとうNebr - 私は広告されたサービスからの最初の質問にLightblueから取られたスクリーンショットのリンクを追加しました。文字列全体が放送されます。
追加された 著者 Glenn De Vos,

Larmeはすでに適切な解決策を示していると思いますが、コメントは見落とされている可能性があるため、コメントではなく回答として定式化します。

広告データで特定のサービスを公開している周辺機器をスキャンします。つまり、文字列 00001803-494c-4f47-4943-544543480000 全体を広告データの一部にする必要があります。デバイスが見つからず、 1803 に対応している場合、サービス情報として 1803 のみがデバイスによってブロードキャストされているようです。

デバイスの広告データを確認してください。 16ビットのUUIDしか公開されていない場合は、問題の原因がわかります。

広告データの長さは31バイトに制限されており、これは各項目の長さとデータ型の宣言によってさらに削減されます。そのため、16ビットUUIDのみをブロードキャストするのが一般的であり、128ビットUUIDのペイロードの大部分を無駄にすることはありません。

1
追加された
私がスクリーンショットを正しく理解したならば、項目「サービスUUID」は単に文字列「1803」を含みます。そしてそれはパラメータserviceUUIDに対してチェックされる項目です。それが1803が機能する理由ですが、フル128ビットUUIDは機能しません。
追加された 著者 Thern,
私は本当にこれらすべての128ビットUUIDを見ることに集中していたので、実際にはサービスUUID 1803は「検索する」UUIDであるとは見なされませんでした。 Nebrさん、ありがとうございます。
追加された 著者 Glenn De Vos,
ありがとうNebr - 私は広告されたサービスからの最初の質問にLightblueから取られたスクリーンショットのリンクを追加しました。文字列全体が放送されます。
追加された 著者 Glenn De Vos,

Larmeはすでに適切な解決策を示していると思いますが、コメントは見落とされている可能性があるため、コメントではなく回答として定式化します。

広告データで特定のサービスを公開している周辺機器をスキャンします。つまり、文字列 00001803-494c-4f47-4943-544543480000 全体を広告データの一部にする必要があります。デバイスが見つからず、 1803 に対応している場合、サービス情報として 1803 のみがデバイスによってブロードキャストされているようです。

デバイスの広告データを確認してください。 16ビットのUUIDしか公開されていない場合は、問題の原因がわかります。

広告データの長さは31バイトに制限されており、これは各項目の長さとデータ型の宣言によってさらに削減されます。そのため、16ビットUUIDのみをブロードキャストするのが一般的であり、128ビットUUIDのペイロードの大部分を無駄にすることはありません。

1
追加された
私がスクリーンショットを正しく理解したならば、項目「サービスUUID」は単に文字列「1803」を含みます。そしてそれはパラメータserviceUUIDに対してチェックされる項目です。それが1803が機能する理由ですが、フル128ビットUUIDは機能しません。
追加された 著者 Thern,
私は本当にこれらすべての128ビットUUIDを見ることに集中していたので、実際にはサービスUUID 1803は「検索する」UUIDであるとは見なされませんでした。 Nebrさん、ありがとうございます。
追加された 著者 Glenn De Vos,
ありがとうNebr - 私は広告されたサービスからの最初の質問にLightblueから取られたスクリーンショットのリンクを追加しました。文字列全体が放送されます。
追加された 著者 Glenn De Vos,

0x1803 の128ビットUUIDバージョンは 00001803-0000-1000-8000-00805F9B34FB になると思います。ライトブルーは「広告データ(サービスUUID)」の下にこの値を表示していますか?それとも 00001803-494c-4f47-4943-544543480000 を表示していますか?デバイスがGATTを介して応答する実際のサービスUUIDに関係なく、 scanForPeripherals 広告データ内の指定されたサービスUUIDを持つデバイスのみを返します。

0
追加された
はい、Lightblueは正確なサービスUUIDを表示しています。元の記事のスクリーンショットへのリンクを追加しました。シモンズ:私はあなたの提案を128ビットバージョンについて試してみたが、何も拾わなかった。
追加された 著者 Glenn De Vos,

0x1803 の128ビットUUIDバージョンは 00001803-0000-1000-8000-00805F9B34FB になると思います。ライトブルーは「広告データ(サービスUUID)」の下にこの値を表示していますか?それとも 00001803-494c-4f47-4943-544543480000 を表示していますか?デバイスがGATTを介して応答する実際のサービスUUIDに関係なく、 scanForPeripherals 広告データ内の指定されたサービスUUIDを持つデバイスのみを返します。

0
追加された
はい、Lightblueは正確なサービスUUIDを表示しています。元の記事のスクリーンショットへのリンクを追加しました。シモンズ:私はあなたの提案を128ビットバージョンについて試してみたが、何も拾わなかった。
追加された 著者 Glenn De Vos,

0x1803 の128ビットUUIDバージョンは 00001803-0000-1000-8000-00805F9B34FB になると思います。ライトブルーは「広告データ(サービスUUID)」の下にこの値を表示していますか?それとも 00001803-494c-4f47-4943-544543480000 を表示していますか?デバイスがGATTを介して応答する実際のサービスUUIDに関係なく、 scanForPeripherals 広告データ内の指定されたサービスUUIDを持つデバイスのみを返します。

0
追加された
はい、Lightblueは正確なサービスUUIDを表示しています。元の記事のスクリーンショットへのリンクを追加しました。シモンズ:私はあなたの提案を128ビットバージョンについて試してみたが、何も拾わなかった。
追加された 著者 Glenn De Vos,