Amazonのアソシエイトとして、ラズパイダ(raspida.com)は適格販売により収入を得ています。詳しくは当サイトの プライバシーポリシーをご覧ください。
Raspberry PiにはBluetoothが搭載されています。Raspberry Pi 4だとBluetooth 5.0 BLEに対応しています。
BLE Beacon(ビーコン)を使ってRaspberry Pi で受信サーバ化するのは面白そうです。
マルチアドバタイズビーコンなら、製品1つで複数の信号を同時発信可能で、取得したいデータ毎にビーコンを用意する必要がない点がメリットです。
ラズパイなら受信することも、ラズパイをビーコンにすることもできます。今回は、Raspberry Pi 4で飛んでいるパケットデータを受信させ、中身を解析することを試しました。
今回の環境
BLE = Bluetooth Low Energy
今回はサンワサプライ製品で試しました。
用意されたスマホアプリでデータを閲覧できる製品ですが、これをRaspberry Pi 4で生データを受信してみます。

先っぽの金属板がセンサーになっている。
製品のセンサー精度
今回に主に取得したい情報は、取り付けられたセンサーから得られる”温度&湿度”のデータです。
温度管理したい倉庫や、商品棚、冷蔵・冷凍保存庫など、活用できる範囲は広そいと想像できます。
温度の測定範囲が一40~60°Cで、0℃以上は±0.5℃、マイナス領域は±1℃の精度とあり、通常では困らない範囲と精度でしょう。
一方で湿度は、測定範囲0〜100%で、精度は±7%RHとありました。(相対湿度(RH)は0〜90%以上) 湿度の精度としては、安価な湿度計でも±3~5%の製品があることを考えると、少し心許ないのかな? それとも相対湿度の測定範囲が0〜90%以上とあるのはまだマシなのか、専門ではないので判断できません。
簡単に購入できる製品として、メーカーや価格からすれば及第点だと思います。
扱えるデータ
この製品を簡単に説明しておきます。
マルチアドバタイズビーコンとなっていて、次の情報を扱えます。
- UID ユーザーID
- URL WebサイトURL
- TLM ビーコンの設定
- info ビーコンの情報
- Acc 温度&湿度
製品から送信されるデータフォーマット
- iBeacon・Eddystone (UID、URL、TLM)
- 製品独自規格(Info、Acc)
iBeaconはiPhoneなどApple社由来で、EddystoneはAndroidなどGoogle社由来の規格です。
この辺りは複雑で、独自フォーマットもあるせいかとても分かりにくい。
ビーコン製品の外観

単4電池×2本で動作します。電池付属と説明書にはありましが、既に取り付けられています。
購入直後は裏蓋を取り外す必要はありません。電池交換する場合に、裏面のシリコンゴムを外してネジ4箇所でアクセスできます。
シリコンゴムは両面テープで貼り付けられているだけなので、再度貼り付けるには新たに両面テープを使わと良いでしょう。粘着製は残っていて一応は付きますが、剥がさないとシリコンゴムは外せないため、ちょっと面倒だなと思います。

電池の寿命は設定によりますが、数ヶ月〜3年くらいは保つとありましたので、購入後からしばらくは気にしないで済みそうです。
購入後、そのまますぐに使用できるのはお手軽です。電源ON/OFFのボタン1つだけのシンプルな作りです。
在庫限りか?
今回のサンワサプライ製ビーコンは、2019年頃の発売で1台売りは既に在庫は少なくなっていました。単品の他、3台セットが発売されていて、そちらはまだ充分に購入可能でした。(記事執筆時点)
パケットデータの受信
早速、飛んでいるパケットデータを受信してみます。
プログラミングするなら、node.jsとnpmにあるbleaconの情報がネットには多くありました。それは次回にして、今回は単に受信して拾えたバイナリデータを解析してみました。
デバイスに電源が入っていますか? 入っていればデータは飛んでいます。ターミナルから以下のコマンドでキャプチャしてみましょう。
sudo hcidump -R &
sudo hcitool lescan
sudo hcidump -R &と叩いて、続けてコマンドを入力します。
こんな感じ。
HCI sniffer - Bluetooth packet analyzer ver 5.55
device: hci0 snap_len: 1500 filter: 0xffffffffffffffff
sudo hcitool lescan
周りにBluetooth製品が多いと、ズラズラっと出てきます。
この中からお目当ての今回の製品を探します。MACアドレスで見つかるハズです。MACアドレスは製品の裏にシールにも貼ってあります。今回はACから始まる12桁です。

受信したバイナリデータ例(長いためスマホ注意!)
このように受信できます。1行は20byte分です。
LE Scan ...
< 01 0C 20 02 01 01
< 01 0C 20 02 01 01
> 04 0E 04 01 0C 20 00
> 04 0E 04 01 0C 20 00
< 01 0C 20 02 01 01
< 01 0C 20 02 01 01
> 04 0E 04 01 0C 20 00
> 04 0E 04 01 0C 20 00
< 01 0C 20 02 01 01
> 04 0E 04 01 0C 20 00
> 04 0E 04 01 0C 20 00
> 04 3E 28 02 01 03 00 33 38 A9 3F 23 AC 1C 02 01 06 03 03 E1
> 04 3E 28 02 01 03 00 33 38 A9 3F 23 AC 1C 02 01 06 03 03 E1
FF 14 16 E1 FF A1 08 64 33 38 A9 3F 23 AC 48 54 62 65 61 63
FF 14 16 E1 FF A1 08 64 33 38 A9 3F 23 AC 48 54 62 65 61 63
> 04 3E 28 02 01 03 00 33 38 A9 3F 23 AC 1C 02 01 06 03 03 E1
6F 6E CF
6F 6E CF
FF 14 16 E1 FF A1 08 64 33 38 A9 3F 23 AC 48 54 62 65 61 63
6F 6E CF
> 04 3E 28 02 01 03 00 33 38 A9 3F 23 AC 1C 02 01 06 03 03 E1
> 04 3E 28 02 01 03 00 33 38 A9 3F 23 AC 1C 02 01 06 03 03 E1
FF 14 16 E1 FF A1 08 64 33 38 A9 3F 23 AC 48 54 62 65 61 63
> 04 3E 28 02 01 03 00 33 38 A9 3F 23 AC 1C 02 01 06 03 03 E1
FF 14 16 E1 FF A1 08 64 33 38 A9 3F 23 AC 48 54 62 65 61 63
6F 6E CF
FF 14 16 E1 FF A1 08 64 33 38 A9 3F 23 AC 48 54 62 65 61 63
6F 6E CF
6F 6E CF
> 04 3E 28 02 01 03 00 33 38 A9 3F 23 AC 1C 02 01 06 03 03 E1
> 04 3E 28 02 01 03 00 33 38 A9 3F 23 AC 1C 02 01 06 03 03 E1
FF 14 16 E1 FF A1 08 64 33 38 A9 3F 23 AC 48 54 62 65 61 63
> 04 3E 28 02 01 03 00 33 38 A9 3F 23 AC 1C 02 01 06 03 03 E1
> 04 3E 28 02 01 03 00 33 38 A9 3F 23 AC 1C 02 01 06 03 03 E1
FF 14 16 E1 FF A1 08 64 33 38 A9 3F 23 AC 48 54 62 65 61 63
> 04 3E 28 02 01 03 00 33 38 A9 3F 23 AC 1C 02 01 06 03 03 E1
6F 6E CF
AC:23:3F:A9:38:33 (unknown)
FF 14 16 E1 FF A1 08 64 33 38 A9 3F 23 AC 48 54 62 65 61 63
FF 14 16 E1 FF A1 08 64 33 38 A9 3F 23 AC 48 54 62 65 61 63
6F 6E CF
6F 6E CF
> 04 3E 28 02 01 03 00 33 38 A9 3F 23 AC 1C 02 01 06 03 03 E1
FF 14 16 E1 FF A1 08 64 33 38 A9 3F 23 AC 48 54 62 65 61 63
FF 14 16 E1 FF A1 08 64 33 38 A9 3F 23 AC 48 54 62 65 61 63
6F 6E CF
> 04 3E 28 02 01 03 00 33 38 A9 3F 23 AC 1C 02 01 06 03 03 E1
> 04 3E 28 02 01 03 00 33 38 A9 3F 23 AC 1C 02 01 06 03 03 E1
6F 6E CF
> 04 3E 28 02 01 03 00 33 38 A9 3F 23 AC 1C 02 01 06 03 03 E1
FF 14 16 E1 FF A1 08 64 33 38 A9 3F 23 AC 48 54 62 65 61 63
> 04 3E 28 02 01 03 00 33 38 A9 3F 23 AC 1C 02 01 06 03 03 E1
> 04 3E 28 02 01 03 00 33 38 A9 3F 23 AC 1C 02 01 06 03 03 E1
> 04 3E 28 02 01 03 00 33 38 A9 3F 23 AC 1C 02 01 06 03 03 E1
FF 14 16 E1 FF A1 08 64 33 38 A9 3F 23 AC 48 54 62 65 61 63
6F 6E CF
> 04 3E 28 02 01 03 00 33 38 A9 3F 23 AC 1C 02 01 06 03 03 E1
> 04 3E 28 02 01 03 00 33 38 A9 3F 23 AC 1C 02 01 06 03 03 E1
FF 14 16 E1 FF A1 08 64 33 38 A9 3F 23 AC 48 54 62 65 61 63
> 04 3E 28 02 01 03 00 33 38 A9 3F 23 AC 1C 02 01 06 03 03 E1
> 04 3E 28 02 01 03 00 33 38 A9 3F 23 AC 1C 02 01 06 03 03 E1
FF 14 16 E1 FF A1 08 64 33 38 A9 3F 23 AC 48 54 62 65 61 63
6F 6E CF
FF 14 16 E1 FF A1 08 64 33 38 A9 3F 23 AC 48 54 62 65 61 63
6F 6E CF
6F 6E CF
6F 6E CF
FF 14 16 E1 FF A1 08 64 33 38 A9 3F 23 AC 48 54 62 65 61 63
6F 6E CF
FF 14 16 E1 FF A1 08 64 33 38 A9 3F 23 AC 48 54 62 65 61 63
6F 6E CF
FF 14 16 E1 FF A1 08 64 33 38 A9 3F 23 AC 48 54 62 65 61 63
FF 14 16 E1 FF A1 08 64 33 38 A9 3F 23 AC 48 54 62 65 61 63
6F 6E CF
6F 6E CF
FF 14 16 E1 FF A1 08 64 33 38 A9 3F 23 AC 48 54 62 65 61 63
6F 6E CF
6F 6E CF
> 04 3E 0C 02 01 04 00 33 38 A9 3F 23 AC 00 DF
> 04 3E 0C 02 01 04 00 33 38 A9 3F 23 AC 00 DF
> 04 3E 0C 02 01 04 00 33 38 A9 3F 23 AC 00 DF
> 04 3E 0C 02 01 04 00 33 38 A9 3F 23 AC 00 DF
> 04 3E 0C 02 01 04 00 33 38 A9 3F 23 AC 00 DF
> 04 3E 0C 02 01 04 00 33 38 A9 3F 23 AC 00 DF
AC:23:3F:A9:38:33 (unknown)
> 04 3E 0C 02 01 04 00 33 38 A9 3F 23 AC 00 DF
> 04 3E 0C 02 01 04 00 33 38 A9 3F 23 AC 00 DF
> 04 3E 0C 02 01 04 00 33 38 A9 3F 23 AC 00 DF
> 04 3E 0C 02 01 04 00 33 38 A9 3F 23 AC 00 DF
> 04 3E 0C 02 01 04 00 33 38 A9 3F 23 AC 00 DF
> 04 3E 0C 02 01 04 00 33 38 A9 3F 23 AC 00 DF
> 04 3E 0C 02 01 04 00 33 38 A9 3F 23 AC 00 DF
> 04 3E 0C 02 01 04 00 33 38 A9 3F 23 AC 00 DF
> 04 3E 0C 02 01 04 00 33 38 A9 3F 23 AC 00 DF
> 04 3E 0C 02 01 04 00 33 38 A9 3F 23 AC 00 DF
> 04 3E 0C 02 01 04 00 33 38 A9 3F 23 AC 00 DF
> 04 3E 0C 02 01 04 00 33 38 A9 3F 23 AC 00 DF
> 04 3E 0C 02 01 04 00 33 38 A9 3F 23 AC 00 DF
> 04 3E 0C 02 01 04 00 33 38 A9 3F 23 AC 00 DF
> 04 3E 0C 02 01 04 00 33 38 A9 3F 23 AC 00 DF
> 04 3E 0C 02 01 04 00 33 38 A9 3F 23 AC 00 DF
■Pi 5は8GBモデルがオススメ
データフォーマットの読み解き
ターミナルに表示されたバイナリデータをみていきましょう。
たくさんありますが、例えばこれ。
AC:23:3F:A9:38:33 (unknown)
> 04 3E 24 02 01 00 00 33 38 A9 3F 23 AC 18 02 01 06 03 03 E1
FF 10 16 E1 FF A1 01 64 1B CC 38 A3 33 38 A9 3F 23 AC D6
> 04 3E 24 02 01 00 00 33 38 A9 3F 23 AC 18 02 01 06 03 03 E1
FF 10 16 E1 FF A1 01 64 1B CC 38 A3 33 38 A9 3F 23 AC D6
.....
2行毎に同じ数字が並んでいます。このバイナリデータは16進数です。
それぞれがフォーマットに従って並んでいます。
抜き出して色で分けてみました。

冒頭のMACアドレスまでは次のような形式のようです。
| 04 | プリアンブル(Preamble) |
| 3E 24 02 01 | アクセスアドレス(4byte) |
| 00 00 | ヘッダー(2byte)0=固定値、1はランダム値 |
| 33 38 A9 3F 23 AC | MACアドレス |
オレンジ色前までのデータフォーマット
この製品だと始めの04やアクセスアドレスは大体こんな感じで共通です。
ヘッダー部分が0なので、固定値=MACアドレスになっています。ここがランダムの場合はMACアドレスではありません。
MACアドレスに続く18 02・・・以降が主なデータ部分です。
続けて調べてみました。どうやらHTセンサーの値になっています。
| 18 | データ長:25(以下、24byte分) |
| 02 01 06 03 03 E1 FF 10 16 E1 FF | EddystoneのUUID DeviceInfo |
| A1 | フレームタイプ |
| 01 | バージョン番号 |
| 64 | バッテリー残100% |
| 1B.CC | 温度27.79℃ |
| 3B.A3 | 湿度59.63% |
| 33 38 A9 3F 23 AC | MACアドレス |
| D6 | (恐らく)RSSI値-42dBm |
このフォーマットは、製品の説明書にあったHTセンサーのフォーマットです。

最後のD6はCRCか(でもCRCは3byte)、数値としてRSSI値-42dBmのような気もしますが、ちょっと確証がありません。
この形式は独自フォーマットです。iBeaconの特徴よりもEddystoneのフォーマットと似ています。
他のパケットデータ
他のもみていきます。
> 04 3E 0C 02 01 04 00 33 38 A9 3F 23 AC 00 D7
こちらも04はプリアンブルですし、3E 0C 02 01はアクセスアドレスでしょう。
04 00はヘッダーと思われ、BLE DocsにあったPDU Headerでしょうか。

続く33 38 A9 3F 23 ACはMACアドレスです。
00の後、最後にD7とあります。D7はRSSI値だったとしたら、-41dBmですね。
ちょっとこのデータはよく分かりません。
Eddystone-TLMフォーマット
次のようなデータもありました。
04 3E 25 02 01 00 00 33 38 A9 3F 23 AC 19 02 01 06 03 03 AA
FE 11 16 AA FE 20 00 0E 01 1F E8 00 05 85 C9 2D 45 6C 94 D4
Macアドレス以降がAdvData(最大31バイト)
19 02 01 06 03 03 AA
FE 11 16 AA FE 20 00 0E 01 1F E8 00 05 85 C9 2D 45 6C 94 D4
MACアドレス(33 38 A9 3F 23 AC)以下、どうやらこのフォーマットはEddystone-TLMパケットのようですね。
| 19 | データ長 25byte |
| 02 01 06 03 03 AA FE 11 16 AA FE | Eddystone共通パケット |
| 20 | フレームタイプ=TLM |
| 00 | バージョン番号 |
| 0E 01 | バッテリー電圧 3585mV (USB給電だとここは0になる) |
| 1F E8 | 温度 31.90℃ サポートされていない場合は80(0x8000、-128°C) |
| 00 05 85 C9 | ADV_CNT[0]~[3] PDU数 361929 |
| 2D 45 6C 94 | SEC_CNT[0]~[3] 75952450.0秒=879日と1時間54分10秒 電源投入または再起動してからの時間 0.1×秒 |
| D4 | RSSI[0] -44dBm |
スマホアプリからデータを覗いてみたところ、概ね同じ数字なのが分かります。

製品公式のスマホアプリで閲覧

別のスマホアプリでも確認

iBeacon形式
こちらはiBeaconです。
> 04 3E 14 02 01 03 01 2D D0 A4 1E 62 CC 08 07 FF 4C 00 12 02
00 02 D3
ここですぐに目が行くのが、4C 00です。4C00はApple company identifierを表していてiBeacon形式となります。
ただ、前後のフォーマットタイプが分かりませんでした。
先頭は先程と同じような値です。似ているデータセットがありましたが、どうでしょう。
Event Type Scan Response 0x04 Event Code LE Meta 0x3E Data Length 0x2A Sub Envent LE Advertising Report 0x02 Num Reports 0x01 Peer Address Type[0] Public Device Address 0x00 BD_ADDR[0] 0x41 0xF3 0xB9 0x5C 0x59 0xCA Length[0] 0x1E 引用:https://qiita.com/nanbuwks/items/ceaad2530b9afe0d8805
08がデータタイプ、07はデータ長なのかな。iBeaconならMajor、Minorがそれぞれ2byteで取得できると思うので、FF はヘッダー、4C00以降の1202、0002がMajor、Minorだろうか。んー。
最後のD3はやはりRSSI値だったとしたら、-45dBmになりますね。
用語とデータフォーマットが難しい
AD Typeといったアドバタイズタイプ、PDU Header、PDU Payload、CRCと聞き慣れない言葉です。
データフォーマットも、今回の製品のように独自のフォーマットが使われていることが多いです。発売メーカーから詳しく情報があれば良いのですけど、なかなか見つからないこともあります。
非エンジニアとしては、体系的に理解するのが難しいと思いました。以下のURL先などで理解を深めてください。
ハードウェアリファレンス | KC4-C-100A/KC4-C-101A | ユーザーガイド | IoT通信機器・IoT通信モジュール |…
次回はプログラムで取り出すことをしてみようかと思います。(いつもの元気玉で)
APIが公開されているオムロンconnectが気になる
まだ試していませんが、オムロンのようにBLE製品とRaspberry Pi でもデータ連携できるようAPIが公開されているメーカーが良いでしょう。(法人が)登録すれば無償でAPI KEYを発行してもらえます。
USB型の環境センサーが販売されていて、温度、湿度、照度、気圧、騒音、3軸加速度などが測定可能です。
気になったので試しました!
こちらの方が少しお高いですが、情報も多くありオススメです。——こちらも在庫が少ないみたい。






