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


14

Bluetooth経由でPiに接続しようとするデバイスを自動的に接続する車用のプラットフォームを開発したいと考えています。現在、Piによるペアリングの受け入れが必要ですが、この場合は画面がないため、自動的に行う必要があります。どうすればこれを達成できますか?


pi 3のみがcaribであるため、お持ちのpiモデルについて詳しく説明していただけますか?
モハンマドアリ

ラズベリーパイ3モデルB-ブルートゥースで構築
オリバークチーズ

だからあなたが期待するのは、Piが絶えず放送していて、あなたの電話で行われているペアリング接続を受け入れることですか?セキュリティへの影響を理解していますか?正しい?そして、仕事をするための小さなPythonスクリプトを書くことは許容できる解決策ですか?
モハマド・アリ

うん、しかしそれをより安全にするために、私は再発見する前に一つの接続に制限する方法を示すことを提案する。また、ヘルプ他人への回答にセキュリティ上の影響を追加して自由に感じる:)
オリバーKuchies

回答:


12

bluezがbluetooth-agentコマンドを削除したため、この回答はRaspbian Jessieの時点で機能しなくなっていることに注意してください。

したがって、現在、Piには問題なく接続できますが、ペアリングプロセスにはモニターが必要であると述べています。

注:接続を受け入れることは信じられないほど安全ではないアイデアであり、限られたデバイスセットのみを使用している場合、信頼できるデバイスとして設定すると、Macアドレスへの接続が制限されますが、新しいデバイスは許可されませんモニターなしで追加されるデバイス

しかし、とにかく、Piに対して行われているすべての接続を受け入れ、Piを検出可能にし、予測可能なピンを設定するために実行する必要があるコマンドは以下のとおりです。

注:hci0 デバイスのBluetooth番号のゼロを変更する必要がある場合があります。

hciconfig hci0 up
hciconfig hci0 sspmode 1
hciconfig hci0 piscan
sudo bluetooth-agent 1234

これらのコマンドを実行し、それらが期待どおりに動作するかどうかを確認したら、Piの起動時に開始するように設定に移ることができます。

  1. コマンドを実行してbashファイルを作成することから始めます sudo nano mohammadIsAmazing.sh
  2. そのファイルに以下を入力します。

    #!/bin/sh
    sleep 20
    hciconfig hci0 up
    hciconfig hci0 sspmode 1
    hciconfig hci0 piscan
    sudo bluetooth-agent 1234
    
  3. 次に、ファイルを保存して閉じます control key and x

  4. /etc/rc.local次のコマンドを使用してファイルを開きます。

    Sudo nano /etc/rc.local
    
  5. 次に、bashスクリプトを実行するコマンドを入力します /etc/rc.local

    sudo /path/to/script/mohammadIsAmazing.sh &
    

    注:以下を含む/etc/rc.localの最後の行の前にコマンドを配置する必要があります。 exit 0

  6. このファイルを保存して閉じ、Piを再起動します。

副次的な注意事項:セキュリティをわずかに高めるために、ランダムピンを選択してください

別の注意事項:Bluetoothデバイス名を変更する場合/etc/machine-infoは、次のものを含むファイルを作成する必要があります。

PRETTY_HOSTNAME=device-name

その後、実行service bluetooth restartします


2
ことを覚えておく&の行の末尾にrc.localファイルを-それなしでスクリプトがシェルの待機などの起動が完了しないことがありRPI /path/to/script/mohammadIsAmazing.shと、それはブートを完了しない場合、あなたがすることはできません-それは続行する前に実行を終了するsshに物事を修正するために...!
SlySven

こんにちは、モハメッド。sudoのブルートゥース・エージェントが認識できないコマンドです
オリバーKuchies

@OliverKuchiesはapt-get install bluetooth bluez最初に実行してみて、それがあなたにとってうまくいくかどうか教えてください。
モハンマドアリ

実行しようbluetooth-agentとしましたが、見つかりませんでした。パッケージをインストールしても修正されませんでした。
ギラッドナアマン

@GiladNaamanよく何を使ってるの?
モハマド・アリ

0

私があなたが必要とするものを理解していることに基づいて、スレーブのBluetoothモジュールがあります。一般的なHC-06モジュールを使用し、レベルシフターを介してPiのTXおよびRXピンにラズベリーpiに接続し、pythonスクリプトを使用してシリアルデータを読み取り、必要に応じて処理することができます。


ハードウェアを接続するのではなく、Bluetoothデバイスが接続するとすぐに実行できるPythonモジュールがあると思いますか?私はパイとあまりにもみすぼらしいないんだけど、まだ初心者が、それは論理的なアプローチになりそうです
オリバーKuchies

@OliverKuchies Linuxでbluetoothプログラミング(または使用!)を行ったことはありませんが、そのようなことに対応する何らかのデーモンサービスを探しています。詳述すると、Pythonモジュールはそれ自体を実行せず、既に実行中のプロセスで使用する必要があります。それはデーモンです。「bluetooth linux daemon」を検索すると、いくつかのものが見つかります。私は私がそれを持っていることに気づいたと思うsystemd、あなたはおそらく特定の方法で動作するようにそれを設定する必要があります。
goldilocks

@OliverKuchiesはblog.miguelgrinberg.com/post/をご覧になります
evolutionizer

0

セキュリティへの影響について議論するつもりはありませんが、これは私が行う方法です:

  1. 次の内容でauto_connect.shというスクリプトを作成します。
#!/bin/bash
bt-adapter --set Powered 1
bt-adapter --set DiscoverableTimeout 0
bt-adapter --set Discoverable 1
bt-adapter --set PairableTimeout 0
bt-adapter --set Pairable 1
/path/to/python_script.py >/dev/nul 2>dev/nul &
list=""
bt-device -l | grep -E -o '[[:xdigit:]]{2}(:[[:xdigit:]]{2}){5}' | { while read line
do
       list="$list connect $line
"
done
bluetoothctl << EOF
$list
EOF
}
  1. 次の内容でファイル/path/to/python_script.pyを作成します。
#!/usr/bin/python3

from __future__ import absolute_import, print_function, unicode_literals

#import gobject
from gi.repository import GObject as gobject

import re
import dbus
import dbus.mainloop.glib
import subprocess

relevant_ifaces = [ "org.bluez.Adapter1", "org.bluez.Device1" ]

def property_changed(interface, changed, invalidated, path):
    iface = interface[interface.rfind(".") + 1:]
    for name, value in changed.iteritems():
        val = str(value)
        print("{%s.PropertyChanged} [%s] %s = %s" % (iface, path, name, val))

def interfaces_added(path, interfaces):
    for iface in interfaces:
        if not(iface in relevant_ifaces):
            continue
        try:
            found = re.search('dev\_(..\_..\_..\_..\_..\_..)', path).group(1)
        except AttributeError:
            found = '' # apply your error handling
            mac=found.replace("_",":")
            cmd='echo -e "trust '+mac+' \\nconnect '+mac+' \\nquit" | bluetoothctl'
            subprocess.call(cmd, shell=True)

def interfaces_removed(path, interfaces):
    for iface in interfaces:
        if not(iface in relevant_ifaces):
            continue
        print("{Removed %s} [%s]" % (iface, path))

if __name__ == '__main__':
    dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)

    bus = dbus.SystemBus()

    bus.add_signal_receiver(interfaces_added, bus_name="org.bluez", dbus_interface="org.freedesktop.DBus.ObjectManager", signal_name="InterfacesAdded")

    bus.add_signal_receiver(interfaces_removed, bus_name="org.bluez", dbus_interface="org.freedesktop.DBus.ObjectManager", signal_name="InterfacesRemoved")

    mainloop = gobject.MainLoop()
    mainloop.run()
  1. 使用しているOSに応じて、ブート時にauto_connect.shを実行してください。

これがすべてすること:

  1. デバイスを常に検出可能に設定します。

  2. デバイスがペアリングすると、信頼できるデバイスに自動的にマークを付けて接続します。

  3. 起動するたびに、既知のデバイスのリストを巡回し、それらへの接続を試みます。

このアプローチはあらゆる種類のセキュリティに直接反することに注意してください。しかし、それを達成したい場合はユーザーのケースがあるかもしれません。


-1

Raspberry Pi3 Model Bには、bluetoothとwifiに障害があります。OBEXサーバーを使用すると、毎回ペアリング要求について尋ねることなく、他のデバイスからファイルを受信できます。ファイルが常に受信されるという点で、最初にそのデバイスとペアリングを行い、1つのディレクトリを作成する必要があります。

以下のリンクの手順に従ってください。

https://www.raspberrypi.org/forums/viewtopic.php?p=963751#p963751


1
質問を読みましたか?OP は画面が表示されないため、手動によるペアリングを回避する方法を具体的に尋ねます
ドミトリーグリゴリエフ

これで一度だけペアリングする必要があるため、初めてペアリングのためにディスプレイに接続できます。
ミヒットガンジー

デバイスごとに一度だけ行う必要があります。そして、もし新しい人が乗りたいと思ったら、それはどこからでもそれを掘り出し、それをモニターとキーボードに接続することを意味します。それが彼がそれを避ける方法を探している理由です。
Different55
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.