趣味の電子工作向けBLE情報のまとめ

BLE(Bluetooth Low Energy)を支える要素技術はアナログ無線通信からスマホのプログラミングまで多岐に渡る。電子工作の一環でBLEの情報収集を試みた当初はネットに溢れかえる無関係な情報に途方に暮れたものだが、色々試行錯誤を重ねてLinux上で自力でBLE通信をコントロール出来る所まで辿り着けた。そこで今回は電子工作など趣味レベルの目的でBLE開発する上で役に立ちそうな最低限の情報をまとめてみようと思う。

スポンサーリンク

BLEに関する情報源

目的が趣味の電子工作なので、無線の周波数が幾つとかパケットの物理フォーマットがどうとか殆ど無関係。実際ネットにはその類の情報が沢山出てたりするのだが、そんな中でデバイスメーカーのロームが運営する”Tech Web”サイトにBLEの通信プロトコルを中心としたまとめが書かれていて個人的には非常にわかりやすく、ためになった。

Bluetooth® v4の上位プロトコルとプロファイル | TechWeb
通信にはプロトコルが必要です。通信プロトコルは、ネットワーク上でデータを通信するための手順や規約をまとめたものです。機器が通信する場合の、送信するデータの形式や

最低限覚えたいBLE用語

体系的な知識は上記サイトで学ぶとして、BLE用語の幾つかを以下にピックアップしておく。

アドレス

Bluetooth(クラシックも含む)ではEthernetのMACアドレスと同じ48ビットのアドレスで通信デバイスとしての個体識別をする。ヘキサ表現の数値を8bitずつコロン(:)で区切ってXX:XX:XX:XX:XX:XXのように表現する。

UUID

色々な対象を識別するためのIDとしてBLEではやたらとUUIDが使われる。一般的なUUIDは128bitの値(Wikipediaの解説)だが、16bitの短縮版UUIDも使うことが出来る。16bit短縮UUIDは実際には下記の128bit UUIDからXXXXの部分を抜き出した物で、下記UUIDに基づいて16bitと128bitの相互変換変換が可能。

  • 0000XXXX-0000-1000-8000-00805F9B34FB

短縮版UUIDは個人で勝手に使えるわけではなく、Bluetooth SIGに申請/承認が必要。

「セントラル」と「ペリフェラル」

「ペリフェラル」は聞き覚えあっても「セントラル」は聞き慣れない感じだが、ざっくり以下のようなニュアンス。

  • セントラル→中央で制御を行うデバイス(マスタとも呼ばれる)
  • ペリフェラル→周辺デバイス(スレーブとも呼ばれる)

「セントラル」または「マスタ」がPCやスマホ、「ペリフェラル」または「スレーブ」がBLE対応機器だと思っていれば大体OK(例外もある)。

「クライアント」と「サーバ」

これは文字通りの意味。

  • サーバ→データを供給する側
  • クライアント→データを受け取る側

例えばセンサデータを送る側のデバイスが「サーバ」となり、センサデータを収集するスマホは「クライアント」となる。なんとなく大きい方がサーバというイメージがありスマホを「サーバ」だと勘違いしそうだが逆なので気をつけよう。

GATTの「サービス」と「キャラクタリスティック」

GATTとは、汎用アトリビュートプロファイル(Generic ATTribute profile)のこと。BLEでは沢山の決めごとがあって覚えるのが大変だが、ホビーでプログラミングするのにGATTさえ押さえれば十分じゃないかと思う。GATTは以下の3要素による階層構造で定義される(但し「ディスクリプタ」は必須でないので、とりあえず省いて考えても良いかも)。

名称役割
サービスデバイスの機能の記述(何をするデバイスか?)環境センシング
キャラクタリスティック個別データ(何のデータか?)温度の測定値
ディスクリプタデータの補助情報(必須ではない)測定値のデータ型

上の表の右端に「温度センサ」の例を書いてみたが、デバイスは「環境センシング」という「サービス」を、「温度」という「キャラクタリスティック」によって提供する、といった具合に対象のデバイスが何をしてくれるかがGATTを見れば一目瞭然となる。

ボンディング

「ボンディング」もBLE以外で聞き慣れない言葉だが、ボンディングとペアリングは殆ど同じ意味で、鍵交換を行って暗号化通信が出来る事を言う。

Bluetoothクラシックではペアリングが必須だったが、BLEではいきなり通信開始が可能でセンサのデータを手軽に扱いたい場合は便利。但し、ボンディングしない通信は暗号化がされず簡単に盗聴出来てしまうため、セキュリティを気にする場合はボンディングは必須。

まずはGATTを押さえよう

上にも書いた通りGATTの「サービス」と「キャラクタリスティック」の2つでデバイスの機能やデータの種類が概ね決まる。

BLEではセンサなどのデータ自体は「キャラクタリスティック」の中身として送受信されるわけだが、キャラクタリスティックには必ずUUIDが割り振られている。つまりUUIDが分かればデータの中身が何か特定出来るため「BLE通信とはUUIDに紐付けて送受信する事」ぐらいに思っていれば、センサデータをBLEで送受信する実験くらいは出来る筈。

関連記事

当ブログでも、Linux上でBLEを動かして送受信する実験について幾つか記事にまとめた。

BlueZのPythonテストコードでGATTサーバを動かす
「GATTサーバ」はBLE通信を用いてGATTクライアントからの接続要求に応じると共にデータをGATTクライアントに送信する。例えば、BLE対応の体温計などのセンサ類はGATTサーバの役割を担い、それらのデータを受け取るスマホはGATTクラ...
2台のLinuxマシン間でBLE通信する実験
前回記事では、LinuxマシンにGATTサーバを立て、サーバから送信されるデータをスマホのGATTクライアントに受信させた。今回は、別のLinuxマシンでPythonコードによるGATTクライアントを動作させ、2台のLinuxマシン間でBL...
BlueZのbluetoothctlコマンドでGATTサーバのデータを受信する
bluetoothctlにはペアリングなどデバイス間の接続管理だけでなく、データの送受信機能も備わっている。今回は、別のLinuxマシンで動作しているGATTサーバからのデータをbluetoothctlで受信する実験を行ったので、手順をメモ...

まとめ

元来BLEの規格はものすごい情報量の仕様書にまとめられており、趣味レベルで扱おうとする事自体に無理があるのだが、断片的な情報をつなぎ合わせながら試行錯誤でなんとかLinux上でBLE通信を動かす事が出来た。単に同じような事をしようとする人が少ないだけかもしれないが、類似の記事が見当たらなかったし、もしこの記事が趣味でBLEを扱う誰かの役に立てたら嬉しい。

コメント