1

あるマシンでの BLE アクティブ スキャンが別のマシンで接続の問題を引き起こすという問題があります。誰かがその理由を説明し、修正方法について提案を提供できれば、私は傷つきました.

私のコードが行うことの大まかなバージョンを単純なスクリプトに分解しました。

マシン 1:

sudo stdbuf -oL hcidump -X |tee hci.log &
sudo hcitool lewlclr
sudo hcitool lewladd 68:C9:0B:xx:xx:01
sudo hcitool lewladd 68:C9:0B:xx:xx:02
sudo hcitool lewladd 68:C9:0B:xx:xx:03
sudo hcitool lewladd 68:C9:0B:xx:xx:04
sudo hcitool lewladd 68:C9:0B:xx:xx:05
sudo hcitool lewladd 68:C9:0B:xx:xx:06
while true; do sudo hcitool lecc --whitelist; if [ $? == 1 ] ; then sleep 20;  else sleep 1; sudo hcitool ledc 64 ; fi; done

上記は問題なく動作します

ただし、別のマシンで次を実行すると、接続の問題が発生します。

sudo hcitool lescan --duplicates

hci ログから、通常の接続は次のようになります。

< HCI Command: LE Create Connection (0x08|0x000d) plen 25
    bdaddr 00:00:00:00:00:00 type 0
    interval 4 window 4 initiator_filter 1
    own_bdaddr_type 0 min_interval 15 max_interval 15
    latency 0 supervision_to 3200 min_ce 1 max_ce 1
> HCI Event: Command Status (0x0f) plen 4
    LE Create Connection (0x08|0x000d) status 0x00 ncmd 1
> HCI Event: LE Meta Event (0x3e) plen 19
    LE Connection Complete
      status 0x00 handle 64, role master
      bdaddr 68:C9:0B:xx:xx:xx (Public)
< HCI Command: Disconnect (0x01|0x0006) plen 3
    handle 64 reason 0x13
    Reason: Remote User Terminated Connection
> HCI Event: Command Status (0x0f) plen 4
    Disconnect (0x01|0x0006) status 0x00 ncmd 1
> HCI Event: Disconn Complete (0x05) plen 4
    status 0x00 handle 64 reason 0x16
    Reason: Connection Terminated by Local Host

悪い接続は次のとおりです。

< HCI Command: LE Create Connection (0x08|0x000d) plen 25
    bdaddr 00:00:00:00:00:00 type 0
    interval 4 window 4 initiator_filter 1
    own_bdaddr_type 0 min_interval 15 max_interval 15
    latency 0 supervision_to 3200 min_ce 1 max_ce 1
> HCI Event: Command Status (0x0f) plen 4
    LE Create Connection (0x08|0x000d) status 0x00 ncmd 1
> HCI Event: LE Meta Event (0x3e) plen 19
    LE Connection Complete
      status 0x00 handle 64, role master
      bdaddr 68:C9:0B:xx:xx:xx (Public)
> HCI Event: Disconn Complete (0x05) plen 4
    status 0x00 handle 64 reason 0x3e
    Reason: Connection Failed to be Established
< HCI Command: Disconnect (0x01|0x0006) plen 3
    handle 64 reason 0x13
    Reason: Remote User Terminated Connection
> HCI Event: Command Status (0x0f) plen 4
    Disconnect (0x01|0x0006) status 0x12 ncmd 1
    Error: Invalid HCI Command Parameters

注: 最後の 2 つのエントリ (Invalid HCI Command Parameters) は、スクリプトの粗さが原因であり、接続の失敗が原因でのみ発生します。

注目すべきは、接続が確立されているように見えますが、「できませんでした (接続が確立されませんでした)」と表示されます。これは私には少し混乱しているようです。

これをさまざまなマシンで試しました。(デスクトップ PC と RPi3)

4

2 に答える 2

2

作成された接続と確立された接続の混乱については、第 6 巻、パート B、低エネルギー仕様 (コア 4.2) のセクション 4.5 を参照してください。そのため、2 番目のインスタンスでは、リモート デバイスが CONNECT_REQ PDU の後にデータ チャネル パケットを送信しなかったようです。2 番目のケースで、確立されていないリンクで切断が試行された場合、コントローラーは無効なハンドルについて文句を言います (有効な接続が存在しないため)。さらにデバッグするには、hcidump でタイミングを有効にすることができます。これにより、監視タイムアウト後にホストが確立失敗イベントを受信したことを確認できます。

「イニシエーターが CONNECT_REQ PDU を広告主に送信するか、広告主がイニシエーターから CONNECT_REQ PDU を受信すると、リンク層は接続状態に入ります。接続状態に入った後、接続は作成されたと見なされます。接続は、接続されているとは見なされません。この時点で確立されます. 接続は、データ チャネル パケットがピア デバイスから受信された場合にのみ、確立されたと見なされます. 作成された接続と確立された接続の唯一の違いは、リンク層接続監視タイムアウト値です.使用されている"

「接続が確立される前にリンク層接続監視タイマーが 6 * connInterval に達した場合 (セクション 4.5 を参照)、接続は失われたと見なされます。これにより、確立に失敗した接続の高速終了が可能になります」

于 2016-04-22T08:37:23.463 に答える