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


関連記事

Apple製のフレームワークCombineを触ってみた

1 はじめに2 Combineとは3 Publishers3.1 Future4 Subscribers4.1 sink4.2 assign5 Operators5.1 Prepend5.2 Appe ...

【Unity】Animatorを利用するための基本知識

1 はじめに2 Animator3 Stateの追加4 Transitionの追加5 パラメーターの作成6 さいごに7 おすすめ書籍 はじめに こんにちはsuzukiです。今回はunityのanima ...

ReactNativeでアニメーションの実装

1 はじめに2 準備3 実装3.1 イベントを通しての実行3.2 アニメーションについて4 lottie-react-native4.1 Lottieとは5 準備6 実装7 さいごに8 おすすめ書籍 ...

[Unity] Terrain(地形)を使ってみた

1 はじめに2 Terrainの追加方法3 Terrainの使い方4 Create Neighbor Terrain5 Paint Terrain5.1 Raise or Lower Terrain5 ...

ReactNative入門

1 はじめに2 そもそもReact Nativeとは3 JSXとは3.1 JSXに値を埋め込む3.2 属性の値を設定する3.3 関数でJSXを作る4 コンポーネントとは4.1 再利用性4.2 新規コン ...

フォロー

blog-page_side_responsive

2021年9月
 1234
567891011
12131415161718
19202122232425
2627282930  

アプリ情報

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