⬅️

Raspberry Pi同士でBluetooth通信

2024/11/06に公開

Raspberry Pi同士でBluetooth通信にだいぶ苦労したので備忘録として記録します。

まずは受信側・送信側、双方にpybluezをインストールします。

pip install git+https://github.com/pybluez/pybluez.git#egg=pybluez

次に送信側でbluetoothをスキャンしてラズパイのが接続可能なデバイスを確認します。

pi@raspberrypi:~ $ sudo bluetoothctl
Agent registered
[bluetooth]# scan on
Discovery started

ズラズラとデバイスが表示されていきます。
ラズパイのユーザ名の表示が出てくれば、受信側のMACアドレス検索まで飛ばして大丈夫です。
もしも、しばらく待って表示されなければ、受信側を他デバイスから検索可能な状態に設定をします。

pi@raspberrypi:~ $ sudo bluetoothctl
Agent registered
[bluetooth]# discoverable on

受信側のMACアドレスを調べます。

pi@raspberrypi:~ $hciconfig
hci0:   Type: Primary  Bus: USB
        BD Address: 11:22:33:44:55:66  ACL MTU: 1021:8  SCO MTU: 64:1
        UP RUNNING PSCAN ISCAN
        RX bytes:57435 acl:1256 sco:0 events:3393 errors:0
        TX bytes:35431 acl:1109 sco:0 commands:2426 errors:0

この場合、BluetoothアダプターのMACアドレスは11:22:33:44:55:66になります。

次に送信側・受信側、双方にbluetooth通信用のプログラムを作成します。

送信側プログラム

import bluetooth

# Bluetoothデバイスのアドレスとポート番号
bd_addr = "XX:XX:XX:XX:XX:XX" # 受信側のMACアドレス
port = 1 # ポート番号

# Bluetoothソケットを作成
sock = bluetooth.BluetoothSocket(bluetooth.RFCOMM)
sock.connect((bd_addr, port)) # 受信側に接続要求を送信

# データを送信
data = "Hello, world!"
sock.send(data)

# ソケットをクローズ
sock.close() 

受信側プログラム

import bluetooth

# Bluetoothポート番号
port = 1

# Bluetoothソケットを作成して接続を待機
sock = bluetooth.BluetoothSocket(bluetooth.RFCOMM)
sock.bind(("", port))
sock.listen(1)
client_sock, client_info = sock.accept()
print("Accepted connection from", client_info)

# データを受信
data = client_sock.recv(1024)
print("Received:", data)

# ソケットをクローズ
client_sock.close()
sock.close() 

まず受信側のプログラムを起動してclient_sock, client_info = sock.accept() の部分で、接続待機状態にします。
次に、送信側の sock.connect((bd_addr, port)) の部分で接続要求を行い、うまく接続できると、受信側で「Hello World」と表示されます。

参考資料
https://rb-sapiens-shop.com/blogs/software/python-bluetooth-connection
https://rb-sapiens-shop.com/blogs/software/pc-get-bluetooth-mac-address
https://qiita.com/takashi53/items/f6a866f0081609dbb8d6
https://stackoverflow.com/questions/71341540/how-to-fix-installation-error-by-pybluez-error-on-subprocess

Discussion