Bluetoothのペアリングを自動的に受け入れる


9

ヘッドレスRaspberry PI 3を実行していますが、どのデバイスからのペアリングも自動的に受け入れます。

私は同じ答えでこの答えを見ました:

Pi 3でBluetooth接続を自動的に受け入れる

しかし、それは少し時代遅れであるようで、使用されたコマンドのいくつかは存在しないようです。

2016-05-27-raspbian-jessie.imgOSイメージを実行しています。


「使用されているコマンドの一部が存在しないようです」とはどういう意味ですか?何がうまくいかなかったのですか?
Dmitry Grigoryev 2016

1
私の記憶が正しければ、bluetooth-agentわかりません。
Gilad Naaman、2016

回答:


7

以来bluetooth-agentコマンドはジェシーに存在しない、近代的な方法は、パイプに関連するコマンドにありますbluetoothctlこのSOの質問に基づいて、次のスクリプトは手動のピン入力なしで自動ペアリングを有効にする必要があります。

sudo bluetoothctl <<EOF
power on
discoverable on
pairable on
agent NoInputNoOutput
default-agent 
EOF

1
これは、起動時にRPi Zero Wを検出可能にするのに役立ちました。ここ説明した手順とこのスクリプトを使用して、以前にBluetooth構成を更新しました。
チャーリーズ、

これは機能しますが、ペアリング後にラズベリーパイをデバイスに自動信頼させる方法を教えてもらえますか?ありがとう
Daniele Segato

これはペアリングを許可しているようですが、エージェントがないため接続を許可していません。このスクリプトのエージェント部分は正しく機能しないと思います。このスクリプトを実行No agent is registeredすると、default-agentが表示されます。コマンドの実行が高速になっているようです。コマンドを手動で入力してもこのエラーは発生しませんが、いったん終了bluetoothctlするとエージェントが登録解除され、接続しようとして失敗します。bluetoothctl実行したままにすると、接続を信頼するかどうかを尋ねるプロンプトが表示さNoInputNoOutputれますが、期待どおりではありません...
Matthijs Kooijman

私は疑うNoInputNoOutputほどの認可ポリシーではなく、Bluetoothプロトコルの一部は、認証機構の種類を把握するために(例えば、ピンを使用することができますか?)ご利用いただけます。
Matthijs Kooijman

1
おそらく、しかし、その後、すべてのペアリングの試行に対してyesを供給し続ける必要があります(そして、それがstdinから機能するか、またはスクリプトがスマートになり、stdinではなく直接ターミナルを開こうとするかどうか(たまに起こる)...これを試していないが、私はgist.github.com/mill1000/74c7473ee3b4a5b13f6325e9994ff84c
Matthijs Kooijman

0

の新規インストールを使用して、2016-09-23-raspbian-jessie-lite.img追加の更新なしで試してみました。ノーapt-get updateノーapt-get install bluez-utilsか何か。この単一のコマンドにより、Piが検出可能およびペアリング可能になります。誰が接続できるかを制御するエージェントがなければ、誰にでも許可されます:

sudo hciconfig hci0 piscan

0

ラズビアン-ジェシー

sudo apt-get install expect

xxxxx.sh

#!/usr/bin/expect -f
set prompt "#"
spawn sudo bluetoothctl
sleep 1
expect -re $prompt
sleep 1
send "agent NoInputNoOutput\r"
sleep 2
expect "Agent registered"
send "default-agent\r"
expect -re $prompt
sleep 3
interact
expect eof

1
コードのみで構成される回答はあまり明確ではないため、回答についてより詳細な説明を提供してください。また、コードブロックをインデントして、コードのように見せます。好みに応じて、4つのスペースまたはタブを使用してください。

0

私は同じ問題に直面していて、この方法が機能することがわかりました(RasPi 3、モデルB、Raspbian 9ストレッチ)

私はRaspberry PiをIoT EDGEデバイスとして使用しており、介入なしにBluetoothペア要求を受け入れるためにそれを必要としていました。Bluetoothを介してPiにテキスト情報を通信するAndroidアプリがあり、接続するにはAndroidデバイスを必要とする私の問題の説明があります

まず、個別のBluetoothエージェントを実行していません(Bluemanはありません。事実、削除する必要がありました)。

で.bashrcファイルを編集しました

    sudo nano /home/pi/.bashrc

これに最後に2つのコマンドを追加しました

    sudo hciconfig hci0 piscan 
    sudo hciconfig hci0 sspmode 1

piscanはRaspberry Pi Bluetoothを発見可能にします

sspmode 1は、Bluetoothイヤホンまたはスピーカー(基本的にはPINを確認できるディスプレイがないデバイス)で使用されているのと同じタイプの方法である「セキュアシンプルペアリング」を有効にします。これらのコマンドは.bashrcにあるため、起動時に実行されます。

Bluetoothスクリプトを実行します。ペア。確認を求めるポップアップが表示されますが、アプリとPiの間でメッセージをやり取りできます

注:hci0は全体が同じではない可能性があります。hci1、hci2の可能性があります。CLIでhciconfigを実行して確認してください

これはほとんど仕掛けのようなもので、未知の影響があるかどうかはわかりませんが、動作します。改善はありがたいです


-1

あなたは覗いて見て下さいて、ソースコードEcoDroidLink。ログインしなくてもBluetooth接続を受け入れます。

編集:一般的な要求により、これを実現するモジュールのコードの抜粋を以下に示しedl_agent ます。

# - automate the agent for running on a headless Pi - to answer pair and connection requests without a blocking query

import dbus
import dbus.service
import dbus.mainloop.glib
import bluezutils

BUS_NAME = 'org.bluez'
AGENT_INTERFACE = 'org.bluez.Agent1'
AGENT_PATH = "/test/agent"

bus = None
device_obj = None
dev_path = None

def set_trusted(path):
    props = dbus.Interface(bus.get_object("org.bluez", path),
                    "org.freedesktop.DBus.Properties")
    props.Set("org.bluez.Device1", "Trusted", True)

def dev_connect(path):
    dev = dbus.Interface(bus.get_object("org.bluez", path),
                            "org.bluez.Device1")
    dev.Connect()

class Rejected(dbus.DBusException):
    _dbus_error_name = "org.bluez.Error.Rejected"

class Agent(dbus.service.Object):
    exit_on_release = True

    def set_exit_on_release(self, exit_on_release):
        self.exit_on_release = exit_on_release

    @dbus.service.method(AGENT_INTERFACE,
                    in_signature="", out_signature="")
    def Release(self):
        printlog("Release")
        if self.exit_on_release:
            mainloop.quit()

    @dbus.service.method(AGENT_INTERFACE,
                    in_signature="os", out_signature="")
    def AuthorizeService(self, device, uuid):
        printlog("AuthorizeService (%s, %s)" % (device, uuid))
        authorize = "yes" #ask("Authorize connection (yes/no): ")
        if (authorize == "yes"):
            return
        raise Rejected("Connection rejected by user")

    @dbus.service.method(AGENT_INTERFACE,
                    in_signature="o", out_signature="s")
    def RequestPinCode(self, device):
        printlog("RequestPinCode (%s)" % (device))
        set_trusted(device)
        return "0000" #ask("Enter PIN Code: ")

    @dbus.service.method(AGENT_INTERFACE,
                    in_signature="o", out_signature="u")
    def RequestPasskey(self, device):
        printlog("RequestPasskey (%s)" % (device))
        set_trusted(device)
        passkey = "0000" #ask("Enter passkey: ")
        return dbus.UInt32(passkey)

    @dbus.service.method(AGENT_INTERFACE,
                    in_signature="ouq", out_signature="")
    def DisplayPasskey(self, device, passkey, entered):
        printlog("DisplayPasskey (%s, %06u entered %u)" %
                        (device, passkey, entered))

    @dbus.service.method(AGENT_INTERFACE,
                    in_signature="os", out_signature="")
    def DisplayPinCode(self, device, pincode):
        printlog("DisplayPinCode (%s, %s)" % (device, pincode))

    @dbus.service.method(AGENT_INTERFACE,
                    in_signature="ou", out_signature="")
    def RequestConfirmation(self, device, passkey):
        printlog("RequestConfirmation (%s, %06d)" % (device, passkey))
        confirm = "yes" #ask("Confirm passkey (yes/no): ")
        if (confirm == "yes"):
            set_trusted(device)
            return
        raise Rejected("Passkey doesn't match")

    @dbus.service.method(AGENT_INTERFACE,
                    in_signature="o", out_signature="")
    def RequestAuthorization(self, device):
        printlog("RequestAuthorization (%s)" % (device))
        auth = "yes" #ask("Authorize? (yes/no): ")
        if (auth == "yes"):
            return
        raise Rejected("Pairing rejected")

    @dbus.service.method(AGENT_INTERFACE,
                    in_signature="", out_signature="")
    def Cancel(self):
        printlog("Cancel")

1
これは理論的には質問に答える可能性がありますが、答えの本質的な部分をここに含め、参照用のリンクを提供することが望ましいでしょう
Jacobm001

@ Jacobm001コードの抜粋を追加しました。もういいですか?
Serge Stroobandt 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.