0

この投稿を参照して、Linux デバイス (Raspberry Pi モデル A+) を取得して、Bluetooth 4.0 USB ドングルを「広告」状態に切り替えることに成功しました。

sudo hciconfig hci0 leadv 3

また

sudo hciconfig hci0 leadv 0

「LightBlue Explorer」アプリを実行している iPod を使用して、これを確認しました。

これまでのところすべて順調です。

Bluetooth 4.0ドングルも備えた別のLinuxボックス(別のPi)から; 次のコマンドを使用して、デバイスを表示することもできます。

sudo hcitool lescan --passive

次のようなものが返されます。

LE Scan ...
xx:xx:xx:xx:xx:xx (unknown)
yy:yy:yy:yy:yy:yy (unknown)
xx:xx:xx;xx:xx:xx (unknown)

ただし、コマンドはデバイスのリストを常に更新するループを繰り返します。

したがって、私の主な質問は次のとおりです。実行できるコマンドのバリエーションはありますか、(たとえば)5秒間リッスンします。アドバタイズされていることが判明したデバイスのリストを返し、終了しますか?

定期的にウェイクアップし、広告トラフィックを (受動的に) 数秒間リッスンし、ソース デバイスのリストを返す単純なスクリプト (理想的には Python プログラム) を作成したいと考えています。

さらに、コマンドが検出したデバイスに対して「不明」と表示される理由がわかりません。(一方、LightBlue は名前を識別します)。

4

3 に答える 3

5

Raspberry Pi 3 で実行しているときに、この同じ問題に遭遇しました。しかし、コマンドを複数回実行すると、エラーが発生しました。

Set scan parameters failed: Input/output error

このエラーを回避するには、次のように hcitool に INT シグナルを送信する必要がありました。

timeout -s INT 10s hcitool lescan
于 2017-05-24T23:08:01.897 に答える
2

この質問はすでに回答されており、最近のものではないことは知っていますが、同様の目的で bluepy を使用しました。Scannerメソッドとサンプル スクリプトを含むクラスが付属していscan([timeout = 10])ます (オンライン ドキュメント: http://ianharvey.github.io/bluepy-doc/scanner.html

コードは次のとおりです。

from bluepy.btle import Scanner, DefaultDelegate

class ScanDelegate(DefaultDelegate):
    def __init__(self):
        DefaultDelegate.__init__(self)

    def handleDiscovery(self, dev, isNewDev, isNewData):
        if isNewDev:
            print "Discovered device", dev.addr
        elif isNewData:
            print "Received new data from", dev.addr

scanner = Scanner().withDelegate(ScanDelegate())
devices = scanner.scan(10.0)

for dev in devices:
    print "Device %s (%s), RSSI=%d dB" % (dev.addr, dev.addrType,     dev.rssi)
    for (adtype, desc, value) in dev.getScanData():
        print "  %s = %s" % (desc, value)

このようにして、必要なときに、一定の時間スキャンできます。これはまさにあなたが求めていたものだと思います。私にとっては、Raspberry Pi 3 が定期的に (毎週 1 回) デバイスをポーリングする必要があるシナリオでうまく機能します。

于 2016-09-29T14:27:41.387 に答える