⬅️
Raspberry Pi同士でBluetooth通信
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」と表示されます。
参考資料
Discussion