カスタムサービスと特性を備えたBLEを使用してRaspberry Pi 3にアドバタイズすることを期待して、UbuntuとPython 2.7を実行している自宅のコンピューターでテストを実行しています。Bluezバージョン5.42を(推奨される方法を使用して)両方のデバイスとdbus-pythonにインストールしました。私のコンピューターとRaspberry Piはどちらもhci0 lescan 0
コマンドを使用して宣伝できますが、自分で使用したいため、ここにあるbluezサンプルスクリプトexample-gatt-client.pyとexample-advertisement.py を使って宣伝したいと思います。カスタム特性。
ホームコンピューター-カーネルバージョン4.4.0-31汎用
自宅のコンピューターで問題なくexample-gatt-server.pyとexample-advertise.pyを実行することで、カスタム特性を作成して宣伝することができます。私が抱えていた唯一の問題--experimental
は、にあるbluetooth.serviceファイルに追加してBluez試験運用モードを有効にする必要があったことです/lib/systemd/system/bluetooth.service
。また、Python2用に自分でビルドしてインストールする必要があったため、dbus-pythonライブラリのインストールは少し面倒でした。
advertise.pyスクリプトは、「org.bluez.LEAdvertisingManager1」と呼ばれる特定の広告インターフェースを探します。gatt-server.pyスクリプトは「org.bluez.GattManager1」を探します。次のコマンドを実行して、そのインターフェイスが存在するかどうかを確認できます。
dbus-send --system --dest=org.bluez --print-reply / org.freedesktop.DBus.ObjectManager.GetManagedObjects
これらのインターフェイスが見つかり、私の自宅のコンピューターで正常に動作します。スクリプトは問題なく実行されます。
Raspberry Pi-カーネルバージョン4.4.38-v7 +
同じbluezバージョンと試験運用機能を有効にすると、advertise.pyを実行しようとすると、このエラーが発生します。
LEAdvertisingManager1インターフェイスが見つかりません。
そして、「systemctl status bluetooth」コマンドを実行すると、実験的なフラグが有効になっていることが示されますが、実行時にLEAdvertistingManager1が表示されません。
dbus-send --system --dest=org.bluez --print-reply / org.freedesktop.DBus.ObjectManager.GetManagedObjects
ただし、gatt-server.pyスクリプトは問題なく実行できます。つまり、「org.bluez.GattManager1」が見つかり、適切に機能しています。ここで何が欠けていますか?
この問題を検索しましたが、唯一の提案は、実験的な機能を有効にし、カーネルが4.1以上であることを確認することでした。
問題は解決しました!多くのデバッグを行い、bluezエラーログを確認した後、自分のPiにbluezを正しくインストールしていないことに気付きました。raspbianの新規インストールからbluezを適切にインストールするための手順は次のとおりです。
sudo apt-get update
sudo apt-get upgrade
mkdir bluez
cd bluez
wget http://www.kernel.org/pub/linux/bluetooth/bluez-5.43.tar.xz
tar xvf bluez-5.43.tar.xz
cd bluez-5.43/
sudo apt-get install -y libusb-dev libdbus-1-dev libglib2.0-dev libudev-dev libical-dev libreadline-dev
./configure
sudo make
sudo make install
次に、試験運用モードを有効にします。これはBluez v5.23では必要ないかもしれませんが、とにかくそれを行いました。
cd
sudo nano /lib/systemd/system/bluetooth.service
"ExecStart = / usr / local / libexec / bluetooth / bluetoothd"という行の後に--experimentalを追加すると、次のようになります。
ExecStart=/usr/local/libexec/bluetooth/bluetoothd --experimental
次に、この新しい構成でBluetoothを実行します
sudo systemctl daemon-reload
sudo systemctl restart bluetooth
テストアドバタイズメントを実行する場合は、以下を使用できます。
sudo hciconfig hci0 up
sudo hciconfig hcio leadv 0
Pi3は「raspberrypi」としてアドバタイズする必要があり、お気に入りのBLEアプリ(iOSではLiteBlueを使用)を使用して接続しようとすると、いくつかのデフォルトの特性を持つはずです。
「LEAdvertisingManager1」が存在するかどうかを確認するために、実行する必要があります
dbus-send --system --dest=org.bluez --print-reply / org.freedesktop.DBus.ObjectManager.GetManagedObjects
最後に、元の投稿のリンクからスクリプトを実行しないでください。彼らはとても信じられないほど古くなっています。代わりに、作成したディレクトリにあるサンプルスクリプトを実行します。
cd bluez/bluez-5.43/tests
実行する前に、以下を介してdbus-pythonをインストールする必要があります。
sudo apt-get install python-dev libdbus-1-dev libdbus-glib-1-dev
sudo apt-get install python-pip
sudo apt-get install --reinstall python-gi
sudo python2.7 -m pip install dbus-python
python2.7(私がやった)を使用してexample-advertiseスクリプトを実行する場合は、example-advertiseの行を次のように変更する必要があります。
import gobject
に
from gi.repository import GObject as gobject
独自のカスタム特性を追加する場合は、変更せずに実行できるexample-gatt-serverを同時に実行する必要があります。
また、iPhoneがPi3に問い合わせてスタックし、接続できないという小さな問題もありました。これは、Bluetoothをリセットするだけで解決しました。
sudo systemctl daemon-reload
sudo systemctl restart bluetooth
がんばって!
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加