chakokuのブログ(rev4)

テック・コミック・ごくまれにチャリ

RaspberryPi-Zero-W上でPythonを使ってBLEペリフェラルを作ってみる

目標:BLE MIDIを喋るペリフェラルを作る。Windowsから認識させて、MIDI入力装置として使ってみる。最終的にはESP32を使いたいけど、ライブラリとか揃っていそうなRaspberryPI + Linuxの組み合わせで試作してみる。
簡単に書くと、、BLE MIDIを喋るためのUUIDは規定されているので、それらを返答できるようにサンプルコードにServiceとCharacteristicを加える。NOTIFYできるようにメソッドを追加する。出来上がった試作をWindowsから見つけ出してペアリングして入力装置として使う。
結論:BLE用ライブラリ、Pyblenoを使った場合、ペアリングメソッド内で鍵交換が未実装のためWindows10との間では接続できない状況

うまく行かなった記録
試作がうまくいくかどうか?のポイントは、ペアリングのキー交換が実装されているかどうか?と予想され、ペアリングできないBLE機器はWindowsでは接続させないようである。

pyblenoを使うサンプルが紹介されていて、プログラムをラスパイ上で走らせてWindows10から接続してみると、cryptoが不明とエラーになった。(self.handlePairingConfirm(data) から呼び出されている)

  File "/usr/local/lib/python3.7/dist-packages/pybleno/hci_socket/Smp.py", line 101, in handlePairingConfirm
    self._r = crypto.r()
NameError: name 'crypto' is not defined

GitHubでも議論されていて、cryptoは開発中とのことであった。
NameError: name 'crypto' is not defined · Issue #36 · Adam-Langley/pybleno · GitHub
鍵交換の部分はなかなかやっかいなのであった。

Pythonで使えるBLEライブラリは少し調べた範囲では鍵交換が実装されておらずWindows環境からは接続できないと判断した。今後の取り組みとしては、、nRF51822でCで組むか、ESP32のESP-IDFを使ってCで組むか、Arduinoを使うか。。

■参考URL
pyblenoライブラリを使ってBLE Peripheralの作成 | TomoSoft
https://www.dialog-semiconductor.com/sites/default/files/training_05_ble_security_example_v1.2.pdf

www.denshi.club
CirtuitPython用BLEライブラリだとPairingも実装されているような。。