BLEの導入

投稿者: | 2021年10月23日

序論

引っ越し早々に家の鍵をなくし再発防止策としてTileを導入しました。
折角BLE(Bluetooth Low Energy)ビーコンを身につけるならどうせならもう少し遊びたい、ということでBLE関連の開発をはじめました。

ただし、TileをハックすることはToSで禁止されています

12.一般的禁止

お客様が下記を行なうことは禁止です。

(〜中略〜)

Tile ハードウェアとモバイル機器の間の通信パケットを「傍受」し、またはTile
Bluetooth Low EnergyプロファイルあるいはTile プロトコールのリバースエンジニアリングを試みること。

よってTile以外のBLEビーコンを用いる必要が出てきたため、今更ながらBLEビーコンについて調査をしてみました。
(Bluetooth Device Addressで個人所有のTileを見るくらいなら事実上問題ないでしょうけど)

BLEビーコンの規格

TileはTile Inc.による独自の規格で通信を行っていますが、一般的なBLEビーコンの規格としては以下の2種類があります。

iBeaconはAppleによる規格で、EddyStoneはGoogleが定めた規格です。

iBeaconはMFi認証の対象であり、色々と面倒そうです。(ライセンスを受けないと公に「iBeacon対応」とは謡えない?)
一方、EddyStoneはApache 2.0のオープンライセンスであり誰でも自由に使うことができます。

技術的に大差はないですが、ライセンスの問題からEddyStoneを前提とした開発を行うことにしました。

ビーコンの選定

iBeacon、EddyStoneに問わず、国内では安価な汎用のビーコンはあまり出回っていないようです。
EddyStone対応のビーコンとしては以下の2つが見つかりました。

FeasyBeacon Mini

FeasyBeacon Miniの技適取得状況について検索サイトにヒットしたため技適対応かと思い購入したのですが、届いたものには技適マークが記載されていませんでした。
技適のサイトをよく見たら、申請者が製造・販売メーカとは無関係な会社が申請してます。製造会社が日本で売るために取得したわけでは無さそうです。
工事設計認証なので内部構造・製造方法が認証時と変わっていなければ技適マークを貼れば使えるはずですが、確認する術がないので泣く泣く廃棄しました。

ReUdo R1Beacon

ReUdo R1Beaconは製造メーカであるReUdo自体が技適認証を申請・取得しているため、きちんと技適マークがデバイス本体に記載されている可能性が高いです。
Amazonの販売ページでも製造・販売が直営ショップであり「技適取得済み」を謳っています。
技適マークがあるかは未確認ですが、購入する場合はReUdo R1Beaconをお薦めします。(使用電池がCR2477でデバイスのサイズ自体が少し大きいのが難点です)

自作

また、市販のものを使用する以外に、BLEビーコンモジュール自体を自作する方法もあります。
秋月電子ので販売されているBluetoothモジュール基板AE-TYBLE16を用いて小型のビーコンを自作した事例もあります。
外部電源が確保できる環境での使用を想定しているのであればM5StackやESP32でも良さそうです。

私はESP32を使っています。

スマホ

接触確認アプリのように、スマホ自体をビーコンにしてしまう手もあります。

スマートフォンでのBLEスキャナの作成

Android / iPhone両対応のマルチプラットフォームなアプリケーションを作成する場合、FlutterかReact Nativeを用いることが一般的なようです。
Flutterの場合、flutter_blueパッケージを利用することで、Bluetooth関連のコードについてもマルチプラットフォームで対応可能です。

ただ、iPhoneエミュレータではBluetoothの動作確認ができず、また実機で動作確認するためにはApple Developer programに加入する必要があります(11,800円/年)

flutter_blueにはスキャン結果一覧を表示するサンプルコードが公開されているので、一部を書き換えてやればEddyStone-UIDのデバイス一覧を取得するプログラムを簡単に作成できます。
(EddyStone-UIDのUUIDでスキャン結果のリストをフィルタするだけです)

StreamBuilder<List<ScanResult>>(
  stream: FlutterBlue.instance.scanResults,
  initialData: [],
  builder: (c, snapshot) => Column(
    children: snapshot.data
        .where((r) => r.advertisementData.serviceUuids
            .contains('0000feaa-0000-1000-8000-00805f9b34fb'))
        .map(
          (r) => ScanResultTile(
            result: r,

おまけ

ESP32にNDIR式CO2センサを接続してデータをBLEで飛ばし、スマホで表示できるようにしました。

コメントを残す

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