Tech

BlueZとは? bluetoothctlとPythonから使用する方法を紹介!

投稿日:2021年9月21日 更新日:

はじめに

前回に引き続き、今回もBluetooth編です。
Bluetoothは、様々なプロトコルから構成される「プロトコルスタック」です。そのLinux版の実装といえるのが、BlueZになります。
今回は、BlueZをCLIとPythonで使う方法を紹介していきます。

BlueZとは?

BlueZでは主に次のようなことができます。

  • Bluetoothデバイスとのペアリング・ボンディング(鍵の保管)
  • Bluetoothの各種プロトコルを使用した通信 (以前紹介したBLEなども含みます)

BlueZはデーモンとして起動させて使用します。また、BlueZはD-Busでのプロセス間通信をサポートしているので、D-Bus経由でBlueZと会話することで、Bluetoothを使ったプログラミングをすることができます。
もちろん、Linuxのデスクトップ環境でBluetoothのペアリングをしたり、接続したりするのも、裏ではBlueZが動いています。

BlueZと会話するには、CLIも用意されています。代表的なものでは、bluetoothctlやbt-agentなどがあり、BlueZデーモンと会話することで、Bluetoothの機能を使用することができるようになっています。この記事では、BlueZを使用してデバイスとのペアリングをする方法について、bletoothctlとPythonでの実装方法を紹介していきます。

D-Busとは?

本題に入る前に、D-Busについて簡単に触れておきます。D-Busとは、プロセス間通信をするためのシステムです。D-Bus自体はデーモン起動していて表に出ることはありませんが、プロセス同士がD-Busを経由して通信することができます。
主に、次のようなD-Busの機能を経由することで、BlueZとやり取りすることができます。

  • メソッド呼び出し
    例: デバイスのスキャン開始・停止、ペアリングなど
  • シグナル
    例: デバイスのスキャンが見つかった時に通知される時など
  • プロパティの読み書き
    例: ペアリング済みのデバイス一覧を取得など

Pythonでは、dbus-pythonというパッケージを使用することで、D-Busとの通信ができるようになります。
ただ、D-Busの理解した上でないと使うのがむずかしいので、今回はBlueZが提供しているD-Busインターフェイスを、Pythonでラップした bluezeroというパッケージを使用します。

bluetoothctlでのペアリング

bluetoothctlはBlueZに付属するCLIです。対話型でBlueZとやり取りすることができます。まずは、bluetoothctlを立ち上げます。

ペアリング

ペアリングをするために、周りのデバイスをスキャンします。スキャンをするには scan on コマンドです。(MACアドレスはマスクしています。)

このように、付近で見つかったデバイスが出力されます。ここにはMACアドレスとデバイス名が表示されていています。スキャンを止めるには、 scan off コマンドです。

目的のデバイスが見つかったら pair MACアドレス でペアリングを開始します。今回は先ほどん見つかったiPhoneとペアリングしてみます。

すると、iPhone側にはペアリング要求のアラートが表示されました。bluetoothctl側と同じpasskeyがiPhone側に表示されています。

iPhone側で「ペアリング」を押すと、ペアリング完了です。ペアリング済みのデバイスを確認する paired-devices コマンドを実行してみます。

先ほどペアリングしたデバイスが表示されています。前回の記事で触れましたが、この時にボンディングもされていて、BlueZ内に交換した鍵が格納されているので、以降BlueZ経由で相手のデバイスとセキュア通信をすることができます。

Pythonでの実装

今度は、ペアリングをPythonで実装してみます。冒頭で触れたとおり、bluezeroを使用して実装します。
https://github.com/ukBaz/python-bluezero

bluezeroでのペアリング実装

まず、bluezeroをpipでインストールします

次に、Pythonスクリプトを実装していきます。

実装ポイントです。

  • dongle.nearby_discovery(timeout=20) でスキャン開始します。このメソッド内では、EventLoopが回るようになっていて、引数のtimeoutの時間分、スキャンし続けます。
  • デバイスのスキャン結果は、D-Busで通知されます。その通知を受け取るには、 dongle.on_device_found に関数を代入しておきます。
    第一引数に、device.Device型で検出したデバイスが渡されるので、保持しておく必要があります。
  • ペアリングするには、スキャンで見つかったデバイスのオブジェクトの pair() メソッドでペアリングを行います。

さいごに

BlueZはD-Busを経由してやり取りできるので、CLIでもPythonでも同じことができるということが分かりました。

おすすめ書籍

Bluetooth Low Energyをはじめよう (Make:PROJECTS) iOS×BLE Core Bluetoothプログラミング

blog-page_footer_336




blog-page_footer_336




-Tech
-

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


関連記事

ReactNative画面遷移

1 はじめに2 React Navigation3 React Navigationのインストール4 実装5 さいごに6 おすすめ書籍 はじめに こんにちはnukkyです。 ブログを書きながらアプリを ...

[React]MUIのコンポーネントを使用したUI作成(Button、Alert編)

1 はじめに2 MUI3 Button3.1 Buttonの実装3.2 Buttonの使い分け3.2.1 不可逆な操作など、より強調したい時の使い方4 Alert4.1 Alertの実装4.2 Ale ...

【Unity】StarterAssetのThirdPersonControllerにアニメーションを追加する

1 はじめに2 Animationの追加3 Animatorの編集4 コードの修正5 さいごに6 おすすめ書籍 はじめに こんにちはsuzukiです。今回はThirdPersonControllerに ...

Go言語

[Go初心者]テストについて学習

1 はじめに2 テスト2.1 エラーの値を比較する2.2 エラーの型を比較する3 httptest3.1 httptestの使い方4 さいごに5 おすすめ書籍 はじめに 今回はGo言語のテストについて ...

iOS13で申請するために押さえておきたいポイント

1 はじめに2 presentViewController3 DeviceToken4 Launch Storyboard5 Dark Mode6 Sign In with Apple7 さいごに8 ...

フォロー

blog-page_side_responsive

2021年9月
 1234
567891011
12131415161718
19202122232425
2627282930  

アプリ情報

私たちは無料アプリもリリースしています、ぜひご覧ください。 下記のアイコンから無料でダウンロードできます。