ヘッドレスRaspberry PI 3を実行していますが、どのデバイスからのペアリングも自動的に受け入れます。
私は同じ答えでこの答えを見ました:
しかし、それは少し時代遅れであるようで、使用されたコマンドのいくつかは存在しないようです。
2016-05-27-raspbian-jessie.img
OSイメージを実行しています。
bluetooth-agent
わかりません。
ヘッドレスRaspberry PI 3を実行していますが、どのデバイスからのペアリングも自動的に受け入れます。
私は同じ答えでこの答えを見ました:
しかし、それは少し時代遅れであるようで、使用されたコマンドのいくつかは存在しないようです。
2016-05-27-raspbian-jessie.img
OSイメージを実行しています。
bluetooth-agent
わかりません。
回答:
以来bluetooth-agent
コマンドはジェシーに存在しない、近代的な方法は、パイプに関連するコマンドにありますbluetoothctl
。このSOの質問に基づいて、次のスクリプトは手動のピン入力なしで自動ペアリングを有効にする必要があります。
sudo bluetoothctl <<EOF
power on
discoverable on
pairable on
agent NoInputNoOutput
default-agent
EOF
No agent is registered
すると、default-agent
が表示されます。コマンドの実行が高速になっているようです。コマンドを手動で入力してもこのエラーは発生しませんが、いったん終了bluetoothctl
するとエージェントが登録解除され、接続しようとして失敗します。bluetoothctl
実行したままにすると、接続を信頼するかどうかを尋ねるプロンプトが表示さNoInputNoOutput
れますが、期待どおりではありません...
NoInputNoOutput
ほどの認可ポリシーではなく、Bluetoothプロトコルの一部は、認証機構の種類を把握するために(例えば、ピンを使用することができますか?)ご利用いただけます。
の新規インストールを使用して、2016-09-23-raspbian-jessie-lite.img
追加の更新なしで試してみました。ノーapt-get update
ノーapt-get install bluez-utils
か何か。この単一のコマンドにより、Piが検出可能およびペアリング可能になります。誰が接続できるかを制御するエージェントがなければ、誰にでも許可されます:
sudo hciconfig hci0 piscan
ラズビアン-ジェシー
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
私は同じ問題に直面していて、この方法が機能することがわかりました(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を実行して確認してください
これはほとんど仕掛けのようなもので、未知の影響があるかどうかはわかりませんが、動作します。改善はありがたいです
あなたは覗いて見て下さいて、ソースコードの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")