Python-Servo

BLEを使った Raspberry Pi Zero <-> Raspberry Pi 4 <-> Raspberry Pi Zero 通信

BLEのアドレス

testpip) pi@rpi-202603261445:~/python $ hciconfig
hci0: Type: Primary  Bus: UART
BD Address: B8:27:EB:ED:CD:2A  ACL MTU: 1021:8  SCO MTU: 64:1
UP RUNNING 
RX bytes:6056 acl:128 sco:0 events:331 errors:0
TX bytes:37576 acl:118 sco:0 commands:259 errors:0

2. 動かない時のチェックリスト(重要)
プログラムを修正しても NoReply や接続エラーが出る場合、OSレベルの設定が原因です。
1. Bluetoothサービスの権限
2. Raspberry PiでBlueZをユーザー権限から操作する場合、権限エラーが出ることがあります。テストとして、両方のプログラムを sudo で実行してみてください。
Bash

sudo python3 peripheral2.py
3. 




4. 既存のアドバタイズのクリア
5. 以前の実行情報が残っていると競合します。一度 Bluetooth をリセットしてください。
Bash

sudo hciconfig hci0 down
6. sudo hciconfig hci0 up
7. 




8. Bluetoothデーモンの設定 (Peripheral側)
9. bluez-peripheral を使う場合、Bluetoothを「Experimental」モードで動かす必要がある場合があります。
   * /lib/systemd/system/bluetooth.service を開き、
   * ExecStart=/usr/lib/bluetooth/bluetoothd の末尾に -E を追加して ExecStart=/usr/lib/bluetooth/bluetoothd -E にする。
    * その後 sudo systemctl daemon-reload && sudo systemctl restart bluetooth を実行。
3. Central側 (Pi 4) のヒント
Central側の NoReply は、相手(Zero)が接続を承認した直後にプロセスが固まった際によく出ます。
* Zero側の peripheral2.py を起動し、「Peripheral 準備完了」が出てから Pi 4 側を実行してください。
* もし Bleak で Service not found が出る場合は、一度 bluetoothctl で remove <ZeroのMACアドレス> を実行してペアリング情報を消去してから試してください。
まずは 「双方 sudo で実行」 と 「Bluetoothサービスのリセット」 を試すのが解決への近道です!

sudo で実行していても、D-Bus側で拒否されることがあります。もし上記コードでもエラーが出る場合は、以下のファイルを作成(または編集)して、Bluetoothの操作権限を明示的に許可してみてください。

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
<!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"
 "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
<busconfig>
  <policy user="root">
    <allow send_destination="org.bluez"/>
  </policy>
  <policy user="pi">
    <allow send_destination="org.bluez"/>
  </policy>
  <policy context="default">
    <allow send_destination="org.bluez"/>
  </policy>
</busconfig>

3. 最終手段の確認:Bluetoothの状態

hciconfig で UP になっていても、BlueZが管理を放棄している場合があります。以下のコマンドを打ってからプログラムを実行してみてください。

Bash

# 一旦リセットしてBlueZに再認識させる
sudo bluetoothctl power off
sudo bluetoothctl power on
sudo bluetoothctl scan on  # 数秒動かして Ctrl+C

その上で、再度実行します:

Bash

sudo ./testpip/bin/python3 peripheral2.py これで get_first で失敗しても、後半の「手動取得」の方で hci0 を掴めるはずです!

 $ sudo bluetoothctl power on
Failed to set power on: org.bluez.Error.Failed
このエラーはBluetoothのハードウェアブロック、ドライバの競合、サービスエラーで発生します。
まず、ターミナルで rfkill unblock bluetooth を実行し、その後 sudo systemctl restart bluetooth でサービスを再起動してください。

トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS