Ubuntu 22.04 で,Python を使って Bluetooth 通信する場合の注意点

スクリプト
スポンサーリンク

多分他にもハマる方が出てくるきそうな気がするので簡単に紹介します.

スポンサーリンク

問題

Ubuntu 22.04 になると Python 3.10 以降になるのですが,このバージョンでは apt や pip でインストールされる PyBluez が正常に動作しなくなります.具体的には,そのまま実行すると下記のようなエラーが出ると思います.

Python 3.10 対応

この問題自体は,下記で議論されており,GitHub にある最新版で既に修正されています.

pybluez with python 3.10 requires PY_SSIZE_T_CLEAN macro in # format · Issue #426 · pybluez/pybluez
PyBluez is not under active development but we are seeking new contributors to investigate bugs and submit patches. Syst...

そのため,下記のように GitHub から pip でインストールすれば回避可能です.

GitHub 版 PyBluez の問題

上記の対応で上手くいけばよいのですが,PyBluez の使い方によっては,次のエラーが発生していしまうと思います.

これは,Python 3 に対応するため,2019に行われた下記の commit での変更に起因します.

Remove port3.h · pybluez/pybluez@2b200c2
Bluetooth Python extension module. Contribute to pybluez/pybluez development by creating an account on GitHub.

この変更において,PyString_FromStringAndSize は一律 PyUnicode_FromStringAndSize に置き換えられています.

ほとんどの場合,これはうまく動くのですが,Bluez が返した値が utf-8 として不正な値になっていた場合,上記のエラーが発生します.これを回避するには,該当部分を PyUnicode_FromStringAndSize から PyBytes_FromStringAndSize に変更すれば OK です.

hci_send_req に関してこの置き換えを行ったものを,下記に置きました.

GitHub - kimata/pybluez: Bluetooth Python extension module
Bluetooth Python extension module. Contribute to kimata/pybluez development by creating an account on GitHub.

hci_send_req でエラーが出て困っている方は,次のようにして PyBluez をインストールしてもらえれば解決すると思います.

まとめ

現時点(22年6月)において,Python 3.10 以降で PyBluez を使うには色々課題がありそうです.
必要に応じてソースを修正すると動くようになります.

コメント