Rasberry Pi 4 で iBeacon

# 0. はじめに

とあるQ&Aがきっかけで、Rasberry Pi 4で[iBeacon](https://en.wikipedia.org/wiki/IBeacon)を受信する方法を調べたので、ここにまとめておくことにした。

最初は、『iBeaconも所詮は、BLEペリフェラルだから、簡単に受信できるだろう』と考えていたが、汎用のBluetoothセントラルのスキャンでは、見つけるのが大変だった。

BLEやiBeaconの細かいことは省いて、Rasberry Pi 4 で必要なコマンド等を書いておく。

以下のPDFを参考にさせていただいた。多謝

https://pages.rohm.co.jp/rs/247-PYD-578/images/DevicePlus_Manual_vol5.pdf

# 1. 環境

- 使用した Raspberry Pi 4 の諸元は、以下のとおり。

```terminal
$ cat /sys/firmware/devicetree/base/model
Raspberry Pi 4 Model B Rev 1.5

$ cat /proc/cpuinfo
processor       : 0
BogoMIPS        : 108.00
Features        : fp asimd evtstrm crc32 cpuid
CPU implementer : 0x41
CPU architecture: 8
CPU variant     : 0x0
CPU part        : 0xd08
CPU revision    : 3
（以下省略）

$ cat /etc/debian_version
11.8

$ cat /etc/issue
Raspbian GNU/Linux 11 \n \l

$ lsb_release -a
No LSB modules are available.
Distributor ID: Raspbian
Description:    Raspbian GNU/Linux 11 (bullseye)
Release:        11
Codename:       bullseye

$ uname -a
Linux raspberrypi4 6.1.21-v8+ #1642 SMP PREEMPT Mon Apr  3 17:24:16 BST 2023 aarch64 GNU/Linux

$ cat /proc/version
Linux version 6.1.21-v8+ (dom@buildbot) (aarch64-linux-gnu-gcc-8 (Ubuntu/Linaro 8.4.0-3ubuntu1) 8.4.0, GNU ld (GNU Binutils for Ubuntu) 2.34) #1642 SMP PREEMPT Mon Apr  3 17:24:16 BST 2023
```

まずは、送信側から説明する。

# 2. Rasberry Pi 4 を iBeacon の送信側にする

以下のコマンドを投入する。

```terminal:Bluetooth デバイスを確認する
$ hciconfig
hci0:   Type: Primary  Bus: UART
        BD Address: E4:5F:01:AF:B5:2B  ACL MTU: 1021:8  SCO MTU: 64:1
        UP RUNNING 
        RX bytes:1548 acl:0 sco:0 events:94 errors:0
        TX bytes:2564 acl:0 sco:0 commands:94 errors:0
```

```terminal:Bluetooth デバイスを起動する
$ sudo hciconfig hci0 up     #先の確認ですでにUPであったが念の為
$ sudo hciconfig hci0 noscan #ペリフェラルのスキャンを停止
$ sudo hciconfig hci0 leadv3 #アドバタイズLv3を開始
```

```terminal:iBeacon信号の発信(アドバタイズ)
$ sudo hcitool -i hci0 cmd 0x08 0x0008 1E 02 01 1A 1A FF 4C 00 02 15  48 53 44 42 4C 45 41 44 80 C0 18 00 FF FF FF FF  00 01 00 10 C8 00
```

上記コマンドで送信したiBeacon固有情報（自由に設定可）は以下の内容。

|proximity UUID | 48534442-4C45-4144-80C0-1800FFFFFFFF|
|:-|:-|
|major | 0001（1）|
|minor | 0010（16）|

Androidスマホのアプリ「[Beacon Scope](https://play.google.com/store/apps/details?id=com.davidgyoungtech.beaconscanner&pcampaignid=web_share)」で受信を確認。Rasberry Pi 4 から iBeacon 情報を送信できていることが確認できた。

<img width="280" alt="5C99A0C90844303D3F3F1EB3D2CA6C293316168A.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/e13751d5-238d-11f3-c916-e7ec919dc27d.jpeg" />
<br><br>

次のコマンドを投入して、iBeacon信号の発信を停止する。

```terminal:アドバタイズの停止
$ sudo hciconfig hci0 noleadv
```

<br><br>
次は、Rasberry Pi 4 で iBeacon を受信する方法を説明する。

# 3. Rasberry Pi 4 で iBeacon を受信する

iBeaconのアドバタイズデータを確認するため、hcidumpコマンドをインストールする。


```terminal:hcidumpコマンドをインストール
$ sudo apt install bluez-hcidump
```


```terminal:iBeacon信号を受信する
$ sudo hcidump –R & #バックグラウンドで実行
$ sudo hcitool lescan
```

<img width="400" alt="scr22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/6ee6187e-03da-5c1e-0230-2fead5ed875f.png" />

_iBeacon信号の受信を停止するには`Ctrl+C`を打つ。バックグラウンドのhcidumpプロセスは、psコマンドでプロセス番号を調べてkillするか、fgコマンドでフォアグランドに移してから`Ctrl+C`を打つ。_

ちゃんと受信できているが、他にBLEデバイスがたくさん存在していると、探すのに手間がかかる。

冒頭で引用したPDFで紹介されているシェルを利用すると、簡単に見ることができる。そのために、まず、bcコマンドをインストールする。

```terminal:bcコマンドをインストール
$ sudo apt install bc
```

次に、シェルファイル（ibeacon_scan）をダウンロードして、実行権限を付与する。

```terminal:PDFに書かれているURLからシェルをダウンロード
$ sudo wget http://developer.radiusnetworks.com/ibeacon/idk/ibeacon_scan

$ sudo chmod 755 ibeacon_scan
```

```terminal:シェル起動
$ ./ibeacon_scan 
Set scan parameters failed: Input/output error
UUID: 48534442-4C45-4144-80C0-1800FFFFFFFF MAJOR: 100 MINOR: 10 POWER: -59
UUID: 48534442-4C45-4144-80C0-1800FFFFFFFF MAJOR: 100 MINOR: 10 POWER: -59
^C
```

原因は未調査だが、シェルに書いてある`read`コマンドがエラーとなり大量に出力されてしまうが、編集されていて見やすい。

# 4. おわりに

電池駆動できる安価なBLEモジュールがあれば、iBeaconを何個か自作して、家じゅうに隠して、スマホを持って宝探しするのも面白そうである。

何かの参考になれば幸いです。**以上**