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


関連記事

祝!iOS15でハーフモーダルが追加

1 はじめに2 早速使ってみる2.1 準備2.2 実装2.3 detents2.4 コードでの高さ切り替え2.5 モーダル内のスクロール許可2.6 グラバーの表示2.7 角丸2.8 親Viewとの併用 ...

React+axiosでhttpリクエスト

1 はじめに2 axiosとは2.1 XMLHttpRequest2.2 Promise3 準備4 実装4.1 resultsの中身4.2 エラーハンドリング4.3 カスタムヘッダーの付与5 Reac ...

ReactNative環境構築[Android/iOS]

1 はじめに2 準備2.1 HomeBrewをインストール2.2 node.jsのインストール2.3 Watchmanのインストール2.4 React Native CLIのインストール2.5 サンプ ...

【Swift】Xcode13XCTestの新機能、繰り返し実行で遊んでみた。

1 はじめに2 XCTestについて3 繰り返しのテストについて4 実際に使ってみる5 テストコードについて6 テストの設定7 さいごに8 おすすめ書籍 はじめに こんにちは、suzukiです。とうと ...

[C#]Genericsの使い方をまとめてみた。その2

1 はじめに2 Genericsの構文3 型パラメーター4 制約条件5 規定値6 さいごに7 おすすめ書籍 はじめに こんにちはsuzukiです。ブログを書いているときAndroid10が発表され、ア ...

フォロー

blog-page_side_responsive

2021年9月
 1234
567891011
12131415161718
19202122232425
2627282930  

アプリ情報

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